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.
146 lines
4.0 KiB
146 lines
4.0 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 FriendlinkAPIService struct {
|
|
pb.UnimplementedFriendlinkAPIServer
|
|
dbModel *model.DBModel
|
|
logger *zap.Logger
|
|
}
|
|
|
|
func NewFriendlinkAPIService(dbModel *model.DBModel, logger *zap.Logger) (service *FriendlinkAPIService) {
|
|
return &FriendlinkAPIService{dbModel: dbModel, logger: logger.Named("FriendlinkAPIService")}
|
|
}
|
|
|
|
// checkPermission 检查用户权限
|
|
func (s *FriendlinkAPIService) checkPermission(ctx context.Context) (userClaims *auth.UserClaims, err error) {
|
|
return checkGRPCPermission(s.dbModel, ctx)
|
|
}
|
|
|
|
// CreateFriendlink 创建友情链接,需要鉴权
|
|
func (s *FriendlinkAPIService) CreateFriendlink(ctx context.Context, req *pb.Friendlink) (*pb.Friendlink, error) {
|
|
s.logger.Debug("CreateFriendlink", zap.Any("req", req))
|
|
_, err := s.checkPermission(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
friendlink := &model.Friendlink{}
|
|
util.CopyStruct(req, friendlink)
|
|
err = s.dbModel.CreateFriendlink(friendlink)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, err.Error())
|
|
}
|
|
|
|
pbFriendlink := &pb.Friendlink{}
|
|
util.CopyStruct(friendlink, pbFriendlink)
|
|
return pbFriendlink, nil
|
|
}
|
|
|
|
// UpdateFriendlink 更新友情链接,需要鉴权
|
|
func (s *FriendlinkAPIService) UpdateFriendlink(ctx context.Context, req *pb.Friendlink) (*emptypb.Empty, error) {
|
|
_, err := s.checkPermission(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if req.Id <= 0 {
|
|
return nil, status.Errorf(codes.InvalidArgument, "参数不正确")
|
|
}
|
|
|
|
friendlink := &model.Friendlink{}
|
|
util.CopyStruct(req, friendlink)
|
|
err = s.dbModel.UpdateFriendlink(friendlink)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, err.Error())
|
|
}
|
|
|
|
return &emptypb.Empty{}, nil
|
|
}
|
|
|
|
// DeleteFriendlink 删除友情链接,需要鉴权
|
|
func (s *FriendlinkAPIService) DeleteFriendlink(ctx context.Context, req *pb.DeleteFriendlinkRequest) (*emptypb.Empty, error) {
|
|
_, err := s.checkPermission(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = s.dbModel.DeleteFriendlink(req.Id)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, err.Error())
|
|
}
|
|
|
|
return &emptypb.Empty{}, nil
|
|
}
|
|
|
|
// GetFriendlink 查询友情链接
|
|
func (s *FriendlinkAPIService) GetFriendlink(ctx context.Context, req *pb.GetFriendlinkRequest) (*pb.Friendlink, error) {
|
|
// _, err := s.checkPermission(ctx)
|
|
// if err != nil {
|
|
// return nil, err
|
|
// }
|
|
|
|
friendlink, err := s.dbModel.GetFriendlink(req.Id)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, err.Error())
|
|
}
|
|
|
|
pbFriendlink := &pb.Friendlink{}
|
|
util.CopyStruct(friendlink, pbFriendlink)
|
|
|
|
s.logger.Debug("GetFriendlink", zap.Any("pbFriendlink", pbFriendlink), zap.Any("friendlink", friendlink))
|
|
|
|
return pbFriendlink, nil
|
|
}
|
|
|
|
func (s *FriendlinkAPIService) ListFriendlink(ctx context.Context, req *pb.ListFriendlinkRequest) (*pb.ListFriendlinkReply, error) {
|
|
opt := &model.OptionGetFriendlinkList{
|
|
WithCount: true,
|
|
Page: int(req.Page),
|
|
Size: int(req.Size_),
|
|
SelectFields: req.Field,
|
|
}
|
|
|
|
_, err := s.checkPermission(ctx)
|
|
if err == nil {
|
|
// 管理员可使用like查询
|
|
if req.Wd != "" {
|
|
wd := "%" + req.Wd + "%"
|
|
opt.QueryLike = map[string][]interface{}{
|
|
"title": {wd},
|
|
"description": {wd},
|
|
}
|
|
}
|
|
// 管理员可查询指定状态的友链
|
|
if len(req.Enable) > 0 {
|
|
opt.QueryIn = map[string][]interface{}{"enable": util.Slice2Interface(req.Enable)}
|
|
}
|
|
} else {
|
|
// 非管理员可查询的字段
|
|
opt.SelectFields = s.dbModel.GetFriendlinkPublicFields()
|
|
opt.QueryIn = map[string][]interface{}{"enable": {true}}
|
|
}
|
|
|
|
friendlink, total, err := s.dbModel.GetFriendlinkList(opt)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, err.Error())
|
|
}
|
|
|
|
var pbFriendlink []*pb.Friendlink
|
|
util.CopyStruct(friendlink, &pbFriendlink)
|
|
|
|
return &pb.ListFriendlinkReply{Friendlink: pbFriendlink, Total: total}, nil
|
|
}
|