You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.1 KiB

package biz
import (
"context"
pb "moredoc/api/v1"
"moredoc/middleware/auth"
"moredoc/model"
"moredoc/util"
"go.uber.org/zap"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/emptypb"
"gorm.io/gorm"
)
type ReportAPIService struct {
pb.UnimplementedReportAPIServer
dbModel *model.DBModel
logger *zap.Logger
}
func NewReportAPIService(dbModel *model.DBModel, logger *zap.Logger) (service *ReportAPIService) {
return &ReportAPIService{dbModel: dbModel, logger: logger.Named("ReportAPIService")}
}
func (s *ReportAPIService) checkLogin(ctx context.Context) (*auth.UserClaims, error) {
return checkGRPCLogin(s.dbModel, ctx)
}
func (s *ReportAPIService) checkPermission(ctx context.Context) (*auth.UserClaims, error) {
return checkGRPCPermission(s.dbModel, ctx)
}
func (s *ReportAPIService) CreateReport(ctx context.Context, req *pb.Report) (*emptypb.Empty, error) {
UserClaims, err := s.checkLogin(ctx)
if err != nil {
return nil, err
}
if req.DocumentId == 0 {
return nil, status.Error(codes.InvalidArgument, "文档参数不正确")
}
report, _ := s.dbModel.GetReportByDocUser(req.DocumentId, UserClaims.UserId)
if report.Id > 0 {
return nil, status.Error(codes.AlreadyExists, "您已举报过当前文档")
}
util.CopyStruct(req, &report)
report.UserId = UserClaims.UserId
err = s.dbModel.CreateReport(&report)
if err != nil {
return nil, status.Error(codes.Internal, "创建举报失败")
}
return &emptypb.Empty{}, nil
}
func (s *ReportAPIService) UpdateReport(ctx context.Context, req *pb.Report) (*emptypb.Empty, error) {
_, err := s.checkPermission(ctx)
if err != nil {
return nil, err
}
report := &model.Report{}
util.CopyStruct(req, report)
err = s.dbModel.UpdateReport(report, "status", "remark")
if err != nil {
return nil, status.Error(codes.Internal, "更新举报失败")
}
return &emptypb.Empty{}, nil
}
func (s *ReportAPIService) DeleteReport(ctx context.Context, req *pb.DeleteReportRequest) (*emptypb.Empty, error) {
_, err := s.checkPermission(ctx)
if err != nil {
return nil, err
}
err = s.dbModel.DeleteReport(req.Id)
if err != nil {
return nil, status.Error(codes.Internal, "删除举报失败")
}
return &emptypb.Empty{}, nil
}
func (s *ReportAPIService) ListReport(ctx context.Context, req *pb.ListReportRequest) (*pb.ListReportReply, error) {
_, err := s.checkPermission(ctx)
if err != nil {
return nil, err
}
opt := &model.OptionGetReportList{
WithCount: true,
Page: int(req.Page),
Size: int(req.Size_),
QueryLike: make(map[string][]interface{}),
QueryIn: make(map[string][]interface{}),
}
if req.Wd != "" {
opt.QueryLike["document_title"] = []interface{}{req.Wd}
}
if len(req.Status) > 0 {
opt.QueryIn["status"] = util.Slice2Interface(req.Status)
}
reports, total, err := s.dbModel.GetReportList(opt)
if err != nil && err != gorm.ErrRecordNotFound {
return nil, status.Error(codes.Internal, "获取举报列表失败")
}
pbReport := &pb.ListReportReply{
Total: total,
Report: reports,
}
return pbReport, nil
}