All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m34s
118 lines
3.6 KiB
Go
118 lines
3.6 KiB
Go
package user
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
|
|
modelUser "github.com/perfect-panel/server/internal/model/user"
|
|
"github.com/perfect-panel/server/internal/svc"
|
|
"github.com/perfect-panel/server/internal/types"
|
|
"github.com/perfect-panel/server/pkg/logger"
|
|
"github.com/perfect-panel/server/pkg/tool"
|
|
"github.com/perfect-panel/server/pkg/xerr"
|
|
"github.com/pkg/errors"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type GetFamilyDetailLogic struct {
|
|
ctx context.Context
|
|
svcCtx *svc.ServiceContext
|
|
logger.Logger
|
|
}
|
|
|
|
func NewGetFamilyDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetFamilyDetailLogic {
|
|
return &GetFamilyDetailLogic{
|
|
ctx: ctx,
|
|
svcCtx: svcCtx,
|
|
Logger: logger.WithContext(ctx),
|
|
}
|
|
}
|
|
|
|
func (l *GetFamilyDetailLogic) GetFamilyDetail(req *types.GetFamilyDetailRequest) (*types.FamilyDetail, error) {
|
|
var family modelUser.UserFamily
|
|
err := l.svcCtx.DB.WithContext(l.ctx).
|
|
Where("id = ? AND deleted_at IS NULL", req.Id).
|
|
First(&family).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.FamilyNotExist), "family does not exist")
|
|
}
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query family detail failed")
|
|
}
|
|
|
|
var members []modelUser.UserFamilyMember
|
|
if err = l.svcCtx.DB.WithContext(l.ctx).
|
|
Where("family_id = ? AND deleted_at IS NULL", family.Id).
|
|
Order("joined_at DESC").
|
|
Find(&members).Error; err != nil {
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query family members failed")
|
|
}
|
|
|
|
userIDs := make([]int64, 0, len(members)+1)
|
|
userIDs = append(userIDs, family.OwnerUserId)
|
|
activeMemberCount := int64(0)
|
|
for _, member := range members {
|
|
userIDs = append(userIDs, member.UserId)
|
|
if member.Status == modelUser.FamilyMemberActive {
|
|
activeMemberCount++
|
|
}
|
|
}
|
|
|
|
identifierMap, identifierErr := findUserIdentifiers(l.ctx, l.svcCtx.DB, userIDs)
|
|
if identifierErr != nil {
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query family member identifiers failed")
|
|
}
|
|
|
|
// 查出所有成员的设备,构建 userId → deviceNo 映射
|
|
deviceNoMap := make(map[int64]string)
|
|
devices, _, _ := l.svcCtx.UserModel.QueryDeviceListByUserIds(l.ctx, userIDs)
|
|
for _, d := range devices {
|
|
if _, exists := deviceNoMap[d.UserId]; !exists {
|
|
deviceNoMap[d.UserId] = tool.DeviceIdToHash(d.Id)
|
|
}
|
|
}
|
|
|
|
memberItems := make([]types.FamilyMemberItem, 0, len(members))
|
|
for _, member := range members {
|
|
identifier := identifierMap[member.UserId]
|
|
if identifier == "" {
|
|
identifier = strconv.FormatInt(member.UserId, 10)
|
|
}
|
|
|
|
memberItem := types.FamilyMemberItem{
|
|
UserId: member.UserId,
|
|
Identifier: identifier,
|
|
DeviceID: deviceNoMap[member.UserId],
|
|
Role: member.Role,
|
|
RoleName: mapFamilyRoleName(member.Role),
|
|
Status: member.Status,
|
|
StatusName: mapFamilyMemberStatusName(member.Status),
|
|
JoinSource: member.JoinSource,
|
|
JoinedAt: member.JoinedAt.Unix(),
|
|
}
|
|
if member.LeftAt != nil {
|
|
memberItem.LeftAt = member.LeftAt.Unix()
|
|
}
|
|
memberItems = append(memberItems, memberItem)
|
|
}
|
|
|
|
ownerIdentifier := identifierMap[family.OwnerUserId]
|
|
if ownerIdentifier == "" {
|
|
ownerIdentifier = strconv.FormatInt(family.OwnerUserId, 10)
|
|
}
|
|
|
|
return &types.FamilyDetail{
|
|
Summary: types.FamilySummary{
|
|
FamilyId: family.Id,
|
|
OwnerUserId: family.OwnerUserId,
|
|
OwnerIdentifier: ownerIdentifier,
|
|
Status: mapFamilyStatus(family.Status),
|
|
ActiveMemberCount: activeMemberCount,
|
|
MaxMembers: family.MaxMembers,
|
|
CreatedAt: family.CreatedAt.Unix(),
|
|
UpdatedAt: family.UpdatedAt.Unix(),
|
|
},
|
|
Members: memberItems,
|
|
}, nil
|
|
}
|