114 lines
3.3 KiB
Go
114 lines
3.3 KiB
Go
package logic
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"juwan-backend/app/snowflake/rpc/snowflake"
|
|
"juwan-backend/app/user_verifications/rpc/internal/models"
|
|
"juwan-backend/app/user_verifications/rpc/internal/models/schema"
|
|
"juwan-backend/app/user_verifications/rpc/internal/models/userverifications"
|
|
"juwan-backend/app/user_verifications/rpc/internal/svc"
|
|
"juwan-backend/app/user_verifications/rpc/pb"
|
|
"juwan-backend/app/users/rpc/usercenter"
|
|
"slices"
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
)
|
|
|
|
type AddOrUpdateUserVerificationsLogic struct {
|
|
ctx context.Context
|
|
svcCtx *svc.ServiceContext
|
|
logx.Logger
|
|
}
|
|
|
|
func NewAddOrUpdateUserVerificationsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AddOrUpdateUserVerificationsLogic {
|
|
return &AddOrUpdateUserVerificationsLogic{
|
|
ctx: ctx,
|
|
svcCtx: svcCtx,
|
|
Logger: logx.WithContext(ctx),
|
|
}
|
|
}
|
|
|
|
func (l *AddOrUpdateUserVerificationsLogic) AddOrUpdateUserVerifications(in *pb.AddOrUpdateUserVerificationsReq) (*pb.AddOrUpdateUserVerificationsResp, error) {
|
|
NotFoundError := &models.NotFoundError{}
|
|
var materials schema.MaterialStruct
|
|
|
|
uv, vErr := l.svcCtx.UserVeriModelRO.Query().
|
|
Where(
|
|
userverifications.UserIDEQ(in.UserId),
|
|
userverifications.RoleEQ(in.Role),
|
|
userverifications.StatusNEQ("rejected"),
|
|
).
|
|
First(l.ctx)
|
|
if vErr != nil && !errors.As(vErr, &NotFoundError) {
|
|
logx.Errorf("add or update user verifications: get user err:%v", vErr)
|
|
return nil, errors.New("")
|
|
}
|
|
|
|
isRole, err := l.checkIsRole(in.UserId, in.Role)
|
|
|
|
if err != nil {
|
|
logx.Errorf("add or update user verifications: check user err:%v", err)
|
|
return nil, errors.New("check user role failed")
|
|
}
|
|
if isRole {
|
|
return nil, errors.New("user already has the role")
|
|
}
|
|
|
|
jsonErr := json.Unmarshal([]byte(in.Material), &materials)
|
|
if jsonErr != nil {
|
|
logx.Errorf("add or update user verifications: marshal materials err:%v", jsonErr)
|
|
return nil, errors.New("invalid materials")
|
|
}
|
|
|
|
idResp, rpcErr := l.svcCtx.SnowflakeRpc.NextId(l.ctx, &snowflake.NextIdReq{})
|
|
if errors.As(vErr, &NotFoundError) {
|
|
if rpcErr != nil {
|
|
logx.Errorf("add or update user verifications: get next id err:%v", rpcErr)
|
|
return nil, errors.New("generate id failed: ")
|
|
}
|
|
|
|
uv, err = l.svcCtx.UserVeriModelRW.Create().
|
|
SetID(idResp.Id).
|
|
SetUserID(in.UserId).
|
|
SetRole(in.Role).
|
|
SetMaterials(materials).
|
|
SetRejectReason("").
|
|
SetReviewedBy(0).
|
|
Save(l.ctx)
|
|
if err != nil {
|
|
logx.Errorf("add or update user verifications: create user verifications err:%v", err)
|
|
return nil, errors.New("create user verifications failed")
|
|
}
|
|
} else {
|
|
uv, err = uv.Update().
|
|
SetRole(in.Role).
|
|
SetMaterials(materials).
|
|
Save(l.ctx)
|
|
if err != nil {
|
|
logx.Errorf("add or update user verifications: update user verifications err:%v", err)
|
|
return nil, errors.New("update user verifications failed")
|
|
}
|
|
}
|
|
|
|
return &pb.AddOrUpdateUserVerificationsResp{
|
|
Success: true,
|
|
}, nil
|
|
}
|
|
|
|
func (l *AddOrUpdateUserVerificationsLogic) checkIsRole(userid int64, role string) (bool, error) {
|
|
user, err := l.svcCtx.UserRpc.GetUsersById(l.ctx, &usercenter.GetUsersByIdReq{
|
|
Id: userid,
|
|
})
|
|
logx.Debug("checkIsRole user:", user)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
logx.Debug("checkIsRole user verified roles:", user.Users.VerifiedRoles)
|
|
if slices.Contains(user.Users.VerifiedRoles, role) {
|
|
return true, nil
|
|
}
|
|
return false, nil
|
|
}
|