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/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") } 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, 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 }