132 lines
3.9 KiB
Go
132 lines
3.9 KiB
Go
package userProfile
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
filePb "sundynix-micro-go/app/file/rpc/file"
|
|
"sundynix-micro-go/app/plant/api/internal/svc"
|
|
plantModel "sundynix-micro-go/app/plant/model"
|
|
"sundynix-micro-go/app/plant/rpc/plant"
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
)
|
|
|
|
type GetUserProfileLogic struct {
|
|
logx.Logger
|
|
ctx context.Context
|
|
svcCtx *svc.ServiceContext
|
|
}
|
|
|
|
// 获取用户资料
|
|
func NewGetUserProfileLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserProfileLogic {
|
|
return &GetUserProfileLogic{
|
|
Logger: logx.WithContext(ctx),
|
|
ctx: ctx,
|
|
svcCtx: svcCtx,
|
|
}
|
|
}
|
|
|
|
func (l *GetUserProfileLogic) GetUserProfile() (interface{}, error) {
|
|
userId := fmt.Sprintf("%v", l.ctx.Value("userId"))
|
|
result, err := l.svcCtx.PlantRpc.GetUserProfile(l.ctx, &plant.GetProfileReq{UserId: userId})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 1. 获取 Avatar 详情
|
|
var avatarData map[string]interface{}
|
|
if result.AvatarId != "" {
|
|
avatarData = l.fetchAvatar(result.AvatarId)
|
|
}
|
|
|
|
// 2. 获取 Level 详情
|
|
var levelData map[string]interface{}
|
|
var lvl plantModel.LevelConfig
|
|
levelFound := false
|
|
|
|
if result.LevelId != "" {
|
|
if errLvl := l.svcCtx.DB.Where("id = ?", result.LevelId).First(&lvl).Error; errLvl == nil {
|
|
levelFound = true
|
|
}
|
|
}
|
|
|
|
// 如果没有在数据库中找到 level_id,或者 level_id 为空,根据用户 totalSunlight 动态查找最匹配的等级
|
|
if !levelFound {
|
|
var matchedLvl plantModel.LevelConfig
|
|
// 查找最匹配的等级:total_sunlight >= min_sunlight 中 level 最大的那一个
|
|
errLvl := l.svcCtx.DB.Order("level desc").Where("min_sunlight <= ?", result.TotalSunlight).First(&matchedLvl).Error
|
|
if errLvl == nil {
|
|
lvl = matchedLvl
|
|
levelFound = true
|
|
// 自动更新用户资料表的 level_id,保证后续一致性
|
|
l.svcCtx.DB.Model(&plantModel.UserProfile{}).Where("id = ?", result.Id).Update("level_id", matchedLvl.ID)
|
|
} else {
|
|
// 如果没有等级配置,使用 level = 1 的配置作为默认
|
|
var firstLvl plantModel.LevelConfig
|
|
if l.svcCtx.DB.Order("level asc").First(&firstLvl).Error == nil {
|
|
lvl = firstLvl
|
|
levelFound = true
|
|
l.svcCtx.DB.Model(&plantModel.UserProfile{}).Where("id = ?", result.Id).Update("level_id", firstLvl.ID)
|
|
}
|
|
}
|
|
}
|
|
|
|
if levelFound {
|
|
levelData = map[string]interface{}{
|
|
"id": lvl.ID,
|
|
"level": lvl.Level,
|
|
"title": lvl.Title,
|
|
"minSunlight": lvl.MinSunlight,
|
|
"perks": lvl.Perks,
|
|
"createdAt": lvl.CreatedAt.Format("2006-01-02 15:04:05"),
|
|
}
|
|
}
|
|
|
|
// 3. 构造兼容新旧版本的复合 JSON 数据
|
|
res := map[string]interface{}{
|
|
"id": result.Id,
|
|
"userId": result.UserId,
|
|
"nickName": result.NickName,
|
|
"nickname": result.NickName, // 兼容旧版 json tag
|
|
"avatarId": result.AvatarId,
|
|
"levelId": result.LevelId,
|
|
"currentSunlight": result.CurrentSunlight,
|
|
"totalSunlight": result.TotalSunlight,
|
|
"plantCount": result.PlantCount,
|
|
"careCount": result.CareCount,
|
|
"postCount": result.PostCount,
|
|
"waterCount": result.WaterCount,
|
|
"fertilizeCount": result.FertilizeCount,
|
|
"repotCount": result.RepotCount,
|
|
"pruneCount": result.PruneCount,
|
|
"photoCount": result.PhotoCount,
|
|
"avatar": avatarData,
|
|
"level": levelData,
|
|
}
|
|
|
|
return res, nil
|
|
}
|
|
|
|
func (l *GetUserProfileLogic) fetchAvatar(avatarId string) map[string]interface{} {
|
|
if avatarId == "" {
|
|
return nil
|
|
}
|
|
resp, err := l.svcCtx.FileRpc.GetFilesByIds(l.ctx, &filePb.GetFilesByIdsReq{Ids: []string{avatarId}})
|
|
if err != nil || resp == nil || len(resp.Files) == 0 {
|
|
return nil
|
|
}
|
|
f := resp.Files[0]
|
|
return map[string]interface{}{
|
|
"id": f.Id,
|
|
"name": f.Name,
|
|
"url": f.Url,
|
|
"tag": f.Tag,
|
|
"key": f.Key,
|
|
"suffix": f.Suffix,
|
|
"md5": f.Md5,
|
|
"createdAt": time.Unix(f.CreatedAt, 0).Format(time.RFC3339),
|
|
}
|
|
}
|