package dto import ( pbGallery "github.com/topfans/backend/pkg/proto/gallery" ) // ========== Proto 转 DTO ========== // ConvertGalleryData 转换展馆数据 func ConvertGalleryData(pbData *pbGallery.GalleryData) *GetMyGalleryResponseDTO { if pbData == nil { return nil } dto := &GetMyGalleryResponseDTO{ GalleryOwnerID: pbData.GalleryOwnerId, SlotTotal: pbData.SlotTotal, Slots: make([]SlotInfoDTO, 0, len(pbData.Slots)), Nickname: pbData.Nickname, } // 转换展位列表 for _, slot := range pbData.Slots { dto.Slots = append(dto.Slots, ConvertSlotInfo(slot)) } return dto } // ConvertGalleryDataToUser 转换展馆数据(用于他人展馆) func ConvertGalleryDataToUser(pbData *pbGallery.GalleryData) *GetUserGalleryResponseDTO { if pbData == nil { return nil } dto := &GetUserGalleryResponseDTO{ GalleryOwnerID: pbData.GalleryOwnerId, SlotTotal: pbData.SlotTotal, Slots: make([]SlotInfoDTO, 0, len(pbData.Slots)), Nickname: pbData.Nickname, } // 转换展位列表 for _, slot := range pbData.Slots { dto.Slots = append(dto.Slots, ConvertSlotInfo(slot)) } return dto } // ConvertSlotInfo 转换展位信息 func ConvertSlotInfo(pbSlot *pbGallery.SlotInfo) SlotInfoDTO { dto := SlotInfoDTO{ SlotID: pbSlot.SlotId, SlotIndex: pbSlot.SlotIndex, Status: pbSlot.Status, IsEnabled: pbSlot.IsEnabled, Visibility: pbSlot.Visibility, CanOperate: pbSlot.CanOperate, Operation: pbSlot.Operation, } // 转换资产信息(仅当status为OCCUPIED时存在) if pbSlot.Asset != nil { dto.Asset = ConvertAssetInfo(pbSlot.Asset) } // 转换占位者信息(仅当status为OCCUPIED时存在) if pbSlot.OccupierUid > 0 { dto.OccupierUID = pbSlot.OccupierUid } if pbSlot.OccupiedAt > 0 { dto.OccupiedAt = pbSlot.OccupiedAt } if pbSlot.ExpireAt > 0 { dto.ExpireAt = pbSlot.ExpireAt } // 转换解锁条件(仅当status为LOCKED时存在) if pbSlot.UnlockCondition != nil { dto.UnlockCondition = ConvertUnlockCondition(pbSlot.UnlockCondition) } return dto } // ConvertAssetInfo 转换资产信息 func ConvertAssetInfo(pbAsset *pbGallery.AssetInfo) *AssetInfoDTO { if pbAsset == nil { return nil } return &AssetInfoDTO{ AssetID: pbAsset.AssetId, Name: pbAsset.Name, CoverURL: pbAsset.CoverUrl, LikeCount: pbAsset.LikeCount, RemainTime: pbAsset.RemainTime, } } // ConvertUnlockCondition 转换解锁条件 func ConvertUnlockCondition(pbCondition *pbGallery.UnlockCondition) *UnlockConditionDTO { if pbCondition == nil { return nil } return &UnlockConditionDTO{ Type: pbCondition.Type, Value: pbCondition.Value, } } // ConvertPlaceAssetData 转换放置资产数据 func ConvertPlaceAssetData(pbData *pbGallery.PlaceAssetData) *PlaceAssetResponseDTO { if pbData == nil { return nil } return &PlaceAssetResponseDTO{ Status: pbData.Status, OccupiedUntil: pbData.OccupiedUntil, OccupierUID: pbData.OccupierUid, } } // ConvertUnlockSlotData 转换解锁展位数据 func ConvertUnlockSlotData(pbData *pbGallery.UnlockSlotData) *UnlockSlotResponseDTO { if pbData == nil { return nil } return &UnlockSlotResponseDTO{ SlotTotal: pbData.SlotTotal, CrystalBalance: pbData.CrystalBalance, } } // ========== DTO 转 Proto ========== // ConvertPlaceAssetRequest 转换放置资产请求 func ConvertPlaceAssetRequest(dto *PlaceAssetRequestDTO) *pbGallery.PlaceAssetRequest { if dto == nil { return nil } return &pbGallery.PlaceAssetRequest{ AssetId: dto.AssetID, GalleryOwnerId: dto.GalleryOwnerID, SlotId: dto.SlotID, } } // ConvertInspirationFlowData 转换灵感瀑布数据 func ConvertInspirationFlowData(pbData *pbGallery.InspirationFlowData) *GetInspirationFlowResponseDTO { if pbData == nil { return nil } dto := &GetInspirationFlowResponseDTO{ Cursor: pbData.Cursor, HasMore: pbData.HasMore, SessionID: pbData.SessionId, Items: make([]*InspirationFlowItemDTO, 0, len(pbData.Items)), } for _, item := range pbData.Items { dto.Items = append(dto.Items, &InspirationFlowItemDTO{ AssetID: item.AssetId, Name: item.Name, CoverURL: item.CoverUrl, LikeCount: item.LikeCount, OwnerNickname: item.OwnerNickname, }) } return dto }