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.
117 lines
2.9 KiB
117 lines
2.9 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"
|
|
)
|
|
|
|
type FavoriteAPIService struct {
|
|
pb.UnimplementedFavoriteAPIServer
|
|
dbModel *model.DBModel
|
|
logger *zap.Logger
|
|
}
|
|
|
|
func NewFavoriteAPIService(dbModel *model.DBModel, logger *zap.Logger) (service *FavoriteAPIService) {
|
|
return &FavoriteAPIService{dbModel: dbModel, logger: logger.Named("FavoriteAPIService")}
|
|
}
|
|
|
|
func (s *FavoriteAPIService) checkLogin(ctx context.Context) (*auth.UserClaims, error) {
|
|
return checkGRPCLogin(s.dbModel, ctx)
|
|
}
|
|
|
|
func (s *FavoriteAPIService) CreateFavorite(ctx context.Context, req *pb.Favorite) (*pb.Favorite, error) {
|
|
userClaims, err := s.checkLogin(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
yes, _ := s.dbModel.CanIAccessFavorite(userClaims.UserId)
|
|
if !yes {
|
|
return nil, status.Errorf(codes.PermissionDenied, "您已经被禁止收藏文档")
|
|
}
|
|
|
|
favorite := &model.Favorite{
|
|
UserId: userClaims.UserId,
|
|
DocumentId: req.DocumentId,
|
|
}
|
|
|
|
exsit, _ := s.dbModel.GetUserFavorite(favorite.UserId, favorite.DocumentId)
|
|
if exsit.Id > 0 {
|
|
return nil, status.Errorf(codes.AlreadyExists, "您已经收藏过了")
|
|
}
|
|
|
|
err = s.dbModel.CreateFavorite(favorite)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "收藏失败:"+err.Error())
|
|
}
|
|
|
|
pbFavorite := &pb.Favorite{}
|
|
util.CopyStruct(favorite, pbFavorite)
|
|
|
|
return pbFavorite, nil
|
|
}
|
|
|
|
func (s *FavoriteAPIService) DeleteFavorite(ctx context.Context, req *pb.DeleteFavoriteRequest) (*emptypb.Empty, error) {
|
|
userClaims, err := s.checkLogin(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = s.dbModel.DeleteFavorite(userClaims.UserId, req.Id)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "删除失败:"+err.Error())
|
|
}
|
|
|
|
return &emptypb.Empty{}, nil
|
|
}
|
|
|
|
func (s *FavoriteAPIService) GetFavorite(ctx context.Context, req *pb.GetFavoriteRequest) (*pb.Favorite, error) {
|
|
userClaims, err := s.checkLogin(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
favorite, _ := s.dbModel.GetUserFavorite(userClaims.UserId, req.DocumentId)
|
|
|
|
pbFavorite := &pb.Favorite{}
|
|
if favorite.Id > 0 {
|
|
util.CopyStruct(&favorite, pbFavorite)
|
|
}
|
|
|
|
return pbFavorite, nil
|
|
}
|
|
|
|
// 获取用户自身的收藏列表
|
|
func (s *FavoriteAPIService) ListFavorite(ctx context.Context, req *pb.ListFavoriteRequest) (*pb.ListFavoriteReply, error) {
|
|
userClaims, err := s.checkLogin(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
favorites, total, err := s.dbModel.GetFavoriteList(&model.OptionGetFavoriteList{
|
|
Page: int(req.Page),
|
|
Size: int(req.Size_),
|
|
WithCount: true,
|
|
QueryIn: map[string][]interface{}{
|
|
"user_id": {userClaims.UserId},
|
|
},
|
|
})
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "获取失败:"+err.Error())
|
|
}
|
|
resp := &pb.ListFavoriteReply{
|
|
Total: total,
|
|
Favorite: favorites,
|
|
}
|
|
return resp, nil
|
|
}
|