diff --git a/apis/types.api b/apis/types.api index 8249711..638415a 100644 --- a/apis/types.api +++ b/apis/types.api @@ -567,6 +567,7 @@ type ( FamilyId int64 `json:"family_id"` OwnerUserId int64 `json:"owner_user_id"` OwnerIdentifier string `json:"owner_identifier"` + OwnerAuthType string `json:"owner_auth_type"` Status string `json:"status"` ActiveMemberCount int64 `json:"active_member_count"` MaxMembers int64 `json:"max_members"` @@ -576,7 +577,9 @@ type ( FamilyMemberItem { UserId int64 `json:"user_id"` Identifier string `json:"identifier"` + AuthType string `json:"auth_type"` DeviceNo string `json:"device_no"` + DeviceType string `json:"device_type"` Role uint8 `json:"role"` RoleName string `json:"role_name"` Status uint8 `json:"status"` diff --git a/internal/logic/admin/user/familyCommon.go b/internal/logic/admin/user/familyCommon.go index 9e34456..f34fc5a 100644 --- a/internal/logic/admin/user/familyCommon.go +++ b/internal/logic/admin/user/familyCommon.go @@ -53,8 +53,13 @@ func normalizeFamilyStatusInput(status string) (uint8, bool) { } } -func findUserIdentifiers(ctx context.Context, db *gorm.DB, userIDs []int64) (map[int64]string, error) { - identifierMap := make(map[int64]string) +type identifierInfo struct { + Identifier string + AuthType string +} + +func findUserIdentifiers(ctx context.Context, db *gorm.DB, userIDs []int64) (map[int64]identifierInfo, error) { + identifierMap := make(map[int64]identifierInfo) if len(userIDs) == 0 { return identifierMap, nil } @@ -92,8 +97,31 @@ func findUserIdentifiers(ctx context.Context, db *gorm.DB, userIDs []int64) (map continue } selectedPriority[row.UserId] = currentPriority - identifierMap[row.UserId] = row.AuthIdentifier + identifierMap[row.UserId] = identifierInfo{ + Identifier: row.AuthIdentifier, + AuthType: row.AuthType, + } } return identifierMap, nil } + +func parseDeviceType(userAgent string) string { + ua := strings.ToLower(userAgent) + switch { + case strings.Contains(ua, "iphone"): + return "iPhone" + case strings.Contains(ua, "ipad"): + return "iPad" + case strings.Contains(ua, "android"): + return "Android" + case strings.Contains(ua, "windows"): + return "Windows" + case strings.Contains(ua, "macintosh"), strings.Contains(ua, "mac os"): + return "Mac" + case strings.Contains(ua, "linux"): + return "Linux" + default: + return "" + } +} diff --git a/internal/logic/admin/user/getFamilyDetailLogic.go b/internal/logic/admin/user/getFamilyDetailLogic.go index b3ed335..6f71369 100644 --- a/internal/logic/admin/user/getFamilyDetailLogic.go +++ b/internal/logic/admin/user/getFamilyDetailLogic.go @@ -63,18 +63,22 @@ func (l *GetFamilyDetailLogic) GetFamilyDetail(req *types.GetFamilyDetailRequest return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query family member identifiers failed") } - // 查出所有成员的设备,构建 userId → deviceNo 映射 + // 查出所有成员的设备,构建 userId → deviceNo 映射 + deviceType 映射 deviceNoMap := make(map[int64]string) + deviceTypeMap := 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) + deviceTypeMap[d.UserId] = parseDeviceType(d.UserAgent) } } memberItems := make([]types.FamilyMemberItem, 0, len(members)) for _, member := range members { - identifier := identifierMap[member.UserId] + info := identifierMap[member.UserId] + identifier := info.Identifier + authType := info.AuthType if identifier == "" { identifier = strconv.FormatInt(member.UserId, 10) } @@ -82,7 +86,9 @@ func (l *GetFamilyDetailLogic) GetFamilyDetail(req *types.GetFamilyDetailRequest memberItem := types.FamilyMemberItem{ UserId: member.UserId, Identifier: identifier, - DeviceNo : deviceNoMap[member.UserId], + AuthType: authType, + DeviceNo: deviceNoMap[member.UserId], + DeviceType: deviceTypeMap[member.UserId], Role: member.Role, RoleName: mapFamilyRoleName(member.Role), Status: member.Status, @@ -96,7 +102,9 @@ func (l *GetFamilyDetailLogic) GetFamilyDetail(req *types.GetFamilyDetailRequest memberItems = append(memberItems, memberItem) } - ownerIdentifier := identifierMap[family.OwnerUserId] + ownerInfo := identifierMap[family.OwnerUserId] + ownerIdentifier := ownerInfo.Identifier + ownerAuthType := ownerInfo.AuthType if ownerIdentifier == "" { ownerIdentifier = strconv.FormatInt(family.OwnerUserId, 10) } @@ -106,6 +114,7 @@ func (l *GetFamilyDetailLogic) GetFamilyDetail(req *types.GetFamilyDetailRequest FamilyId: family.Id, OwnerUserId: family.OwnerUserId, OwnerIdentifier: ownerIdentifier, + OwnerAuthType: ownerAuthType, Status: mapFamilyStatus(family.Status), ActiveMemberCount: activeMemberCount, MaxMembers: family.MaxMembers, diff --git a/internal/logic/admin/user/getFamilyListLogic.go b/internal/logic/admin/user/getFamilyListLogic.go index 741edcb..89f394e 100644 --- a/internal/logic/admin/user/getFamilyListLogic.go +++ b/internal/logic/admin/user/getFamilyListLogic.go @@ -123,7 +123,9 @@ func (l *GetFamilyListLogic) GetFamilyList(req *types.GetFamilyListRequest) (*ty list := make([]types.FamilySummary, 0, len(families)) for _, family := range families { - ownerIdentifier := identifierMap[family.OwnerUserId] + ownerInfo := identifierMap[family.OwnerUserId] + ownerIdentifier := ownerInfo.Identifier + ownerAuthType := ownerInfo.AuthType if ownerIdentifier == "" { ownerIdentifier = strconv.FormatInt(family.OwnerUserId, 10) } @@ -132,6 +134,7 @@ func (l *GetFamilyListLogic) GetFamilyList(req *types.GetFamilyListRequest) (*ty FamilyId: family.Id, OwnerUserId: family.OwnerUserId, OwnerIdentifier: ownerIdentifier, + OwnerAuthType: ownerAuthType, Status: mapFamilyStatus(family.Status), ActiveMemberCount: countMap[family.Id], MaxMembers: family.MaxMembers, diff --git a/internal/types/types.go b/internal/types/types.go index 92beb42..0b8866f 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -715,7 +715,9 @@ type FamilyDetail struct { type FamilyMemberItem struct { UserId int64 `json:"user_id"` Identifier string `json:"identifier"` + AuthType string `json:"auth_type"` DeviceNo string `json:"device_no"` + DeviceType string `json:"device_type"` Role uint8 `json:"role"` RoleName string `json:"role_name"` Status uint8 `json:"status"` @@ -729,6 +731,7 @@ type FamilySummary struct { FamilyId int64 `json:"family_id"` OwnerUserId int64 `json:"owner_user_id"` OwnerIdentifier string `json:"owner_identifier"` + OwnerAuthType string `json:"owner_auth_type"` Status string `json:"status"` ActiveMemberCount int64 `json:"active_member_count"` MaxMembers int64 `json:"max_members"`