756 lines
28 KiB
Go

package grpc
import (
"context"
walletv1 "hyapp.local/api/proto/wallet/v1"
"hyapp/pkg/appcode"
"hyapp/pkg/xerr"
resourcedomain "hyapp/services/wallet-service/internal/domain/resource"
)
func (s *Server) ListResources(ctx context.Context, req *walletv1.ListResourcesRequest) (*walletv1.ListResourcesResponse, error) {
items, total, err := s.svc.ListResources(ctx, resourcedomain.ListResourcesQuery{
AppCode: req.GetAppCode(),
ResourceType: req.GetResourceType(),
Status: req.GetStatus(),
Keyword: req.GetKeyword(),
Page: req.GetPage(),
PageSize: req.GetPageSize(),
ActiveOnly: req.GetActiveOnly(),
ManagerGrantOnly: req.GetManagerGrantOnly(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &walletv1.ListResourcesResponse{Resources: make([]*walletv1.Resource, 0, len(items)), Total: total}
for _, item := range items {
resp.Resources = append(resp.Resources, resourceToProto(item))
}
return resp, nil
}
func (s *Server) GetResource(ctx context.Context, req *walletv1.GetResourceRequest) (*walletv1.GetResourceResponse, error) {
resource, err := s.svc.GetResource(ctx, req.GetAppCode(), req.GetResourceId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.GetResourceResponse{Resource: resourceToProto(resource)}, nil
}
func (s *Server) CreateResource(ctx context.Context, req *walletv1.CreateResourceRequest) (*walletv1.ResourceResponse, error) {
resource, err := s.svc.CreateResource(ctx, resourceCommandFromCreate(req))
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ResourceResponse{Resource: resourceToProto(resource)}, nil
}
func (s *Server) UpdateResource(ctx context.Context, req *walletv1.UpdateResourceRequest) (*walletv1.ResourceResponse, error) {
resource, err := s.svc.UpdateResource(ctx, resourceCommandFromUpdate(req))
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ResourceResponse{Resource: resourceToProto(resource)}, nil
}
func (s *Server) SetResourceStatus(ctx context.Context, req *walletv1.SetResourceStatusRequest) (*walletv1.ResourceResponse, error) {
resource, err := s.svc.SetResourceStatus(ctx, resourcedomain.StatusCommand{
AppCode: req.GetAppCode(),
ID: req.GetResourceId(),
Status: req.GetStatus(),
OperatorUserID: req.GetOperatorUserId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ResourceResponse{Resource: resourceToProto(resource)}, nil
}
func (s *Server) ListResourceGroups(ctx context.Context, req *walletv1.ListResourceGroupsRequest) (*walletv1.ListResourceGroupsResponse, error) {
items, total, err := s.svc.ListResourceGroups(ctx, resourcedomain.ListResourceGroupsQuery{
AppCode: req.GetAppCode(),
Status: req.GetStatus(),
Keyword: req.GetKeyword(),
Page: req.GetPage(),
PageSize: req.GetPageSize(),
ActiveOnly: req.GetActiveOnly(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &walletv1.ListResourceGroupsResponse{Groups: make([]*walletv1.ResourceGroup, 0, len(items)), Total: total}
for _, item := range items {
resp.Groups = append(resp.Groups, resourceGroupToProto(item))
}
return resp, nil
}
func (s *Server) GetResourceGroup(ctx context.Context, req *walletv1.GetResourceGroupRequest) (*walletv1.GetResourceGroupResponse, error) {
group, err := s.svc.GetResourceGroup(ctx, req.GetAppCode(), req.GetGroupId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.GetResourceGroupResponse{Group: resourceGroupToProto(group)}, nil
}
func (s *Server) CreateResourceGroup(ctx context.Context, req *walletv1.CreateResourceGroupRequest) (*walletv1.ResourceGroupResponse, error) {
group, err := s.svc.CreateResourceGroup(ctx, resourceGroupCommandFromCreate(req))
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ResourceGroupResponse{Group: resourceGroupToProto(group)}, nil
}
func (s *Server) UpdateResourceGroup(ctx context.Context, req *walletv1.UpdateResourceGroupRequest) (*walletv1.ResourceGroupResponse, error) {
group, err := s.svc.UpdateResourceGroup(ctx, resourceGroupCommandFromUpdate(req))
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ResourceGroupResponse{Group: resourceGroupToProto(group)}, nil
}
func (s *Server) SetResourceGroupStatus(ctx context.Context, req *walletv1.SetResourceGroupStatusRequest) (*walletv1.ResourceGroupResponse, error) {
group, err := s.svc.SetResourceGroupStatus(ctx, resourcedomain.StatusCommand{
AppCode: req.GetAppCode(),
ID: req.GetGroupId(),
Status: req.GetStatus(),
OperatorUserID: req.GetOperatorUserId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ResourceGroupResponse{Group: resourceGroupToProto(group)}, nil
}
func (s *Server) ListGiftConfigs(ctx context.Context, req *walletv1.ListGiftConfigsRequest) (*walletv1.ListGiftConfigsResponse, error) {
items, total, err := s.svc.ListGiftConfigs(ctx, resourcedomain.ListGiftConfigsQuery{
AppCode: req.GetAppCode(),
Status: req.GetStatus(),
Keyword: req.GetKeyword(),
GiftTypeCode: req.GetGiftTypeCode(),
Page: req.GetPage(),
PageSize: req.GetPageSize(),
ActiveOnly: req.GetActiveOnly(),
RegionID: req.GetRegionId(),
FilterRegion: req.GetFilterRegion(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &walletv1.ListGiftConfigsResponse{Gifts: make([]*walletv1.GiftConfig, 0, len(items)), Total: total}
for _, item := range items {
resp.Gifts = append(resp.Gifts, giftConfigToProto(item))
}
return resp, nil
}
func (s *Server) ListGiftTypeConfigs(ctx context.Context, req *walletv1.ListGiftTypeConfigsRequest) (*walletv1.ListGiftTypeConfigsResponse, error) {
items, err := s.svc.ListGiftTypeConfigs(ctx, resourcedomain.ListGiftTypeConfigsQuery{
AppCode: req.GetAppCode(),
Status: req.GetStatus(),
ActiveOnly: req.GetActiveOnly(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &walletv1.ListGiftTypeConfigsResponse{GiftTypes: make([]*walletv1.GiftTypeConfig, 0, len(items))}
for _, item := range items {
resp.GiftTypes = append(resp.GiftTypes, giftTypeConfigToProto(item))
}
return resp, nil
}
func (s *Server) CreateGiftConfig(ctx context.Context, req *walletv1.CreateGiftConfigRequest) (*walletv1.GiftConfigResponse, error) {
gift, err := s.svc.CreateGiftConfig(ctx, giftConfigCommandFromCreate(req))
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.GiftConfigResponse{Gift: giftConfigToProto(gift)}, nil
}
func (s *Server) UpdateGiftConfig(ctx context.Context, req *walletv1.UpdateGiftConfigRequest) (*walletv1.GiftConfigResponse, error) {
gift, err := s.svc.UpdateGiftConfig(ctx, giftConfigCommandFromUpdate(req))
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.GiftConfigResponse{Gift: giftConfigToProto(gift)}, nil
}
func (s *Server) UpsertGiftTypeConfig(ctx context.Context, req *walletv1.UpsertGiftTypeConfigRequest) (*walletv1.GiftTypeConfigResponse, error) {
item, err := s.svc.UpsertGiftTypeConfig(ctx, resourcedomain.GiftTypeConfigCommand{
AppCode: req.GetAppCode(),
TypeCode: req.GetTypeCode(),
Name: req.GetName(),
TabKey: req.GetTabKey(),
Status: req.GetStatus(),
SortOrder: req.GetSortOrder(),
OperatorUserID: req.GetOperatorUserId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.GiftTypeConfigResponse{GiftType: giftTypeConfigToProto(item)}, nil
}
func (s *Server) SetGiftConfigStatus(ctx context.Context, req *walletv1.SetGiftConfigStatusRequest) (*walletv1.GiftConfigResponse, error) {
gift, err := s.svc.SetGiftConfigStatus(ctx, resourcedomain.StatusCommand{
AppCode: req.GetAppCode(),
StringID: req.GetGiftId(),
Status: req.GetStatus(),
OperatorUserID: req.GetOperatorUserId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.GiftConfigResponse{Gift: giftConfigToProto(gift)}, nil
}
func (s *Server) GrantResource(ctx context.Context, req *walletv1.GrantResourceRequest) (*walletv1.ResourceGrantResponse, error) {
grant, err := s.svc.GrantResource(ctx, resourcedomain.GrantResourceCommand{
AppCode: req.GetAppCode(),
CommandID: req.GetCommandId(),
TargetUserID: req.GetTargetUserId(),
ResourceID: req.GetResourceId(),
Quantity: req.GetQuantity(),
DurationMS: req.GetDurationMs(),
Reason: req.GetReason(),
OperatorUserID: req.GetOperatorUserId(),
GrantSource: req.GetGrantSource(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ResourceGrantResponse{Grant: resourceGrantToProto(grant)}, nil
}
func (s *Server) GrantResourceGroup(ctx context.Context, req *walletv1.GrantResourceGroupRequest) (*walletv1.ResourceGrantResponse, error) {
grant, err := s.svc.GrantResourceGroup(ctx, resourcedomain.GrantResourceGroupCommand{
AppCode: req.GetAppCode(),
CommandID: req.GetCommandId(),
TargetUserID: req.GetTargetUserId(),
GroupID: req.GetGroupId(),
Reason: req.GetReason(),
OperatorUserID: req.GetOperatorUserId(),
GrantSource: req.GetGrantSource(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ResourceGrantResponse{Grant: resourceGrantToProto(grant)}, nil
}
func (s *Server) ListUserResources(ctx context.Context, req *walletv1.ListUserResourcesRequest) (*walletv1.ListUserResourcesResponse, error) {
items, err := s.svc.ListUserResources(ctx, resourcedomain.ListUserResourcesQuery{
AppCode: req.GetAppCode(),
UserID: req.GetUserId(),
ResourceType: req.GetResourceType(),
ActiveOnly: req.GetActiveOnly(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &walletv1.ListUserResourcesResponse{Resources: make([]*walletv1.UserResourceEntitlement, 0, len(items))}
for _, item := range items {
resp.Resources = append(resp.Resources, userResourceToProto(item))
}
return resp, nil
}
func (s *Server) EquipUserResource(ctx context.Context, req *walletv1.EquipUserResourceRequest) (*walletv1.EquipUserResourceResponse, error) {
item, err := s.svc.EquipUserResource(ctx, resourcedomain.EquipUserResourceCommand{
AppCode: req.GetAppCode(),
UserID: req.GetUserId(),
ResourceID: req.GetResourceId(),
EntitlementID: req.GetEntitlementId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.EquipUserResourceResponse{Resource: userResourceToProto(item)}, nil
}
func (s *Server) UnequipUserResource(ctx context.Context, req *walletv1.UnequipUserResourceRequest) (*walletv1.UnequipUserResourceResponse, error) {
result, err := s.svc.UnequipUserResource(ctx, resourcedomain.UnequipUserResourceCommand{
AppCode: req.GetAppCode(),
UserID: req.GetUserId(),
ResourceType: req.GetResourceType(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.UnequipUserResourceResponse{
ResourceType: result.ResourceType,
Unequipped: result.Unequipped,
UpdatedAtMs: result.UpdatedAtMS,
}, nil
}
func (s *Server) BatchGetUserEquippedResources(ctx context.Context, req *walletv1.BatchGetUserEquippedResourcesRequest) (*walletv1.BatchGetUserEquippedResourcesResponse, error) {
items, err := s.svc.BatchGetUserEquippedResources(ctx, resourcedomain.BatchGetUserEquippedResourcesQuery{
AppCode: req.GetAppCode(),
UserIDs: req.GetUserIds(),
ResourceTypes: req.GetResourceTypes(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &walletv1.BatchGetUserEquippedResourcesResponse{Users: make([]*walletv1.UserEquippedResources, 0, len(items))}
for _, item := range items {
user := &walletv1.UserEquippedResources{
UserId: item.UserID,
Resources: make([]*walletv1.UserResourceEntitlement, 0, len(item.Resources)),
}
for _, resource := range item.Resources {
user.Resources = append(user.Resources, userResourceToProto(resource))
}
resp.Users = append(resp.Users, user)
}
return resp, nil
}
func (s *Server) ListResourceGrants(ctx context.Context, req *walletv1.ListResourceGrantsRequest) (*walletv1.ListResourceGrantsResponse, error) {
items, total, err := s.svc.ListResourceGrants(ctx, resourcedomain.ListResourceGrantsQuery{
AppCode: req.GetAppCode(),
TargetUserID: req.GetTargetUserId(),
Status: req.GetStatus(),
Page: req.GetPage(),
PageSize: req.GetPageSize(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &walletv1.ListResourceGrantsResponse{Grants: make([]*walletv1.ResourceGrant, 0, len(items)), Total: total}
for _, item := range items {
resp.Grants = append(resp.Grants, resourceGrantToProto(item))
}
return resp, nil
}
func (s *Server) ListResourceShopItems(ctx context.Context, req *walletv1.ListResourceShopItemsRequest) (*walletv1.ListResourceShopItemsResponse, error) {
items, total, err := s.svc.ListResourceShopItems(ctx, resourcedomain.ListResourceShopItemsQuery{
AppCode: req.GetAppCode(),
ResourceType: req.GetResourceType(),
Status: req.GetStatus(),
Keyword: req.GetKeyword(),
Page: req.GetPage(),
PageSize: req.GetPageSize(),
ActiveOnly: req.GetActiveOnly(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &walletv1.ListResourceShopItemsResponse{Items: make([]*walletv1.ResourceShopItem, 0, len(items)), Total: total}
for _, item := range items {
resp.Items = append(resp.Items, resourceShopItemToProto(item))
}
return resp, nil
}
func (s *Server) UpsertResourceShopItems(ctx context.Context, req *walletv1.UpsertResourceShopItemsRequest) (*walletv1.UpsertResourceShopItemsResponse, error) {
items, err := s.svc.UpsertResourceShopItems(ctx, resourcedomain.ResourceShopItemsCommand{
AppCode: req.GetAppCode(),
Items: resourceShopItemInputs(req.GetItems()),
OperatorUserID: req.GetOperatorUserId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &walletv1.UpsertResourceShopItemsResponse{Items: make([]*walletv1.ResourceShopItem, 0, len(items))}
for _, item := range items {
resp.Items = append(resp.Items, resourceShopItemToProto(item))
}
return resp, nil
}
func (s *Server) SetResourceShopItemStatus(ctx context.Context, req *walletv1.SetResourceShopItemStatusRequest) (*walletv1.ResourceShopItemResponse, error) {
item, err := s.svc.SetResourceShopItemStatus(ctx, resourcedomain.ResourceShopItemStatusCommand{
AppCode: req.GetAppCode(),
ShopItemID: req.GetShopItemId(),
Status: req.GetStatus(),
OperatorUserID: req.GetOperatorUserId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ResourceShopItemResponse{Item: resourceShopItemToProto(item)}, nil
}
func (s *Server) PurchaseResourceShopItem(ctx context.Context, req *walletv1.PurchaseResourceShopItemRequest) (*walletv1.PurchaseResourceShopItemResponse, error) {
receipt, err := s.svc.PurchaseResourceShopItem(ctx, resourcedomain.ResourceShopPurchaseCommand{
AppCode: req.GetAppCode(),
CommandID: req.GetCommandId(),
UserID: req.GetUserId(),
ShopItemID: req.GetShopItemId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return resourceShopPurchaseReceiptToProto(receipt), nil
}
func resourceCommandFromCreate(req *walletv1.CreateResourceRequest) resourcedomain.ResourceCommand {
return resourcedomain.ResourceCommand{
AppCode: req.GetAppCode(),
ResourceCode: req.GetResourceCode(),
ResourceType: req.GetResourceType(),
Name: req.GetName(),
Status: req.GetStatus(),
Grantable: req.GetGrantable(),
GrantStrategy: req.GetGrantStrategy(),
WalletAssetType: req.GetWalletAssetType(),
WalletAssetAmount: req.GetWalletAssetAmount(),
PriceType: req.GetPriceType(),
CoinPrice: req.GetCoinPrice(),
GiftPointAmount: 0,
UsageScopes: req.GetUsageScopes(),
AssetURL: req.GetAssetUrl(),
PreviewURL: req.GetPreviewUrl(),
AnimationURL: req.GetAnimationUrl(),
MetadataJSON: req.GetMetadataJson(),
SortOrder: req.GetSortOrder(),
OperatorUserID: req.GetOperatorUserId(),
ManagerGrantEnabled: managerGrantEnabledOrDefault(req.ManagerGrantEnabled),
}
}
func resourceCommandFromUpdate(req *walletv1.UpdateResourceRequest) resourcedomain.ResourceCommand {
command := resourceCommandFromCreate(&walletv1.CreateResourceRequest{
AppCode: req.GetAppCode(),
ResourceCode: req.GetResourceCode(),
ResourceType: req.GetResourceType(),
Name: req.GetName(),
Status: req.GetStatus(),
Grantable: req.GetGrantable(),
GrantStrategy: req.GetGrantStrategy(),
WalletAssetType: req.GetWalletAssetType(),
WalletAssetAmount: req.GetWalletAssetAmount(),
PriceType: req.GetPriceType(),
CoinPrice: req.GetCoinPrice(),
GiftPointAmount: 0,
UsageScopes: req.GetUsageScopes(),
AssetUrl: req.GetAssetUrl(),
PreviewUrl: req.GetPreviewUrl(),
AnimationUrl: req.GetAnimationUrl(),
MetadataJson: req.GetMetadataJson(),
SortOrder: req.GetSortOrder(),
OperatorUserId: req.GetOperatorUserId(),
ManagerGrantEnabled: req.ManagerGrantEnabled,
})
command.ResourceID = req.GetResourceId()
return command
}
func resourceGroupCommandFromCreate(req *walletv1.CreateResourceGroupRequest) resourcedomain.ResourceGroupCommand {
return resourcedomain.ResourceGroupCommand{
AppCode: req.GetAppCode(),
GroupCode: req.GetGroupCode(),
Name: req.GetName(),
Status: req.GetStatus(),
Description: req.GetDescription(),
SortOrder: req.GetSortOrder(),
Items: groupItemInputs(req.GetItems()),
OperatorUserID: req.GetOperatorUserId(),
}
}
func resourceGroupCommandFromUpdate(req *walletv1.UpdateResourceGroupRequest) resourcedomain.ResourceGroupCommand {
return resourcedomain.ResourceGroupCommand{
AppCode: req.GetAppCode(),
GroupID: req.GetGroupId(),
GroupCode: req.GetGroupCode(),
Name: req.GetName(),
Status: req.GetStatus(),
Description: req.GetDescription(),
SortOrder: req.GetSortOrder(),
Items: groupItemInputs(req.GetItems()),
OperatorUserID: req.GetOperatorUserId(),
}
}
func giftConfigCommandFromCreate(req *walletv1.CreateGiftConfigRequest) resourcedomain.GiftConfigCommand {
return resourcedomain.GiftConfigCommand{
AppCode: req.GetAppCode(),
GiftID: req.GetGiftId(),
ResourceID: req.GetResourceId(),
Status: req.GetStatus(),
Name: req.GetName(),
SortOrder: req.GetSortOrder(),
PresentationJSON: req.GetPresentationJson(),
PriceVersion: req.GetPriceVersion(),
CoinPrice: req.GetCoinPrice(),
GiftPointAmount: 0,
HeatValue: req.GetHeatValue(),
EffectiveAtMS: req.GetEffectiveAtMs(),
GiftTypeCode: req.GetGiftTypeCode(),
CPRelationType: req.GetCpRelationType(),
ChargeAssetType: req.GetChargeAssetType(),
EffectiveFromMS: req.GetEffectiveFromMs(),
EffectiveToMS: req.GetEffectiveToMs(),
EffectTypes: req.GetEffectTypes(),
OperatorUserID: req.GetOperatorUserId(),
RegionIDs: req.GetRegionIds(),
}
}
func giftConfigCommandFromUpdate(req *walletv1.UpdateGiftConfigRequest) resourcedomain.GiftConfigCommand {
return resourcedomain.GiftConfigCommand{
AppCode: req.GetAppCode(),
GiftID: req.GetGiftId(),
ResourceID: req.GetResourceId(),
Status: req.GetStatus(),
Name: req.GetName(),
SortOrder: req.GetSortOrder(),
PresentationJSON: req.GetPresentationJson(),
PriceVersion: req.GetPriceVersion(),
CoinPrice: req.GetCoinPrice(),
GiftPointAmount: 0,
HeatValue: req.GetHeatValue(),
EffectiveAtMS: req.GetEffectiveAtMs(),
GiftTypeCode: req.GetGiftTypeCode(),
CPRelationType: req.GetCpRelationType(),
ChargeAssetType: req.GetChargeAssetType(),
EffectiveFromMS: req.GetEffectiveFromMs(),
EffectiveToMS: req.GetEffectiveToMs(),
EffectTypes: req.GetEffectTypes(),
OperatorUserID: req.GetOperatorUserId(),
RegionIDs: req.GetRegionIds(),
}
}
func groupItemInputs(items []*walletv1.ResourceGroupItemInput) []resourcedomain.ResourceGroupItemInput {
out := make([]resourcedomain.ResourceGroupItemInput, 0, len(items))
for _, item := range items {
if item == nil {
continue
}
out = append(out, resourcedomain.ResourceGroupItemInput{
ItemType: item.GetItemType(),
ResourceID: item.GetResourceId(),
WalletAssetType: item.GetWalletAssetType(),
WalletAssetAmount: item.GetWalletAssetAmount(),
Quantity: item.GetQuantity(),
DurationMS: item.GetDurationMs(),
SortOrder: item.GetSortOrder(),
})
}
return out
}
func resourceShopItemInputs(items []*walletv1.ResourceShopItemInput) []resourcedomain.ResourceShopItemInput {
out := make([]resourcedomain.ResourceShopItemInput, 0, len(items))
for _, item := range items {
if item == nil {
continue
}
out = append(out, resourcedomain.ResourceShopItemInput{
ShopItemID: item.GetShopItemId(),
ResourceID: item.GetResourceId(),
Status: item.GetStatus(),
DurationDays: item.GetDurationDays(),
EffectiveFromMS: item.GetEffectiveFromMs(),
EffectiveToMS: item.GetEffectiveToMs(),
SortOrder: item.GetSortOrder(),
})
}
return out
}
func resourceToProto(resource resourcedomain.Resource) *walletv1.Resource {
return &walletv1.Resource{
AppCode: appcode.Normalize(resource.AppCode),
ResourceId: resource.ResourceID,
ResourceCode: resource.ResourceCode,
ResourceType: resource.ResourceType,
Name: resource.Name,
Status: resource.Status,
Grantable: resource.Grantable,
GrantStrategy: resource.GrantStrategy,
WalletAssetType: resource.WalletAssetType,
WalletAssetAmount: resource.WalletAssetAmount,
PriceType: resource.PriceType,
CoinPrice: resource.CoinPrice,
GiftPointAmount: 0,
UsageScopes: resource.UsageScopes,
AssetUrl: resource.AssetURL,
PreviewUrl: resource.PreviewURL,
AnimationUrl: resource.AnimationURL,
MetadataJson: resource.MetadataJSON,
SortOrder: resource.SortOrder,
CreatedByUserId: resource.CreatedByUserID,
UpdatedByUserId: resource.UpdatedByUserID,
CreatedAtMs: resource.CreatedAtMS,
UpdatedAtMs: resource.UpdatedAtMS,
ManagerGrantEnabled: resource.ManagerGrantEnabled,
}
}
func resourceShopItemToProto(item resourcedomain.ResourceShopItem) *walletv1.ResourceShopItem {
return &walletv1.ResourceShopItem{
AppCode: appcode.Normalize(item.AppCode),
ShopItemId: item.ShopItemID,
ResourceId: item.ResourceID,
Resource: resourceToProto(item.Resource),
Status: item.Status,
DurationDays: item.DurationDays,
PriceType: item.PriceType,
CoinPrice: item.CoinPrice,
EffectiveFromMs: item.EffectiveFromMS,
EffectiveToMs: item.EffectiveToMS,
SortOrder: item.SortOrder,
CreatedByUserId: item.CreatedByUserID,
UpdatedByUserId: item.UpdatedByUserID,
CreatedAtMs: item.CreatedAtMS,
UpdatedAtMs: item.UpdatedAtMS,
}
}
func resourceShopPurchaseReceiptToProto(receipt resourcedomain.ResourceShopPurchaseReceipt) *walletv1.PurchaseResourceShopItemResponse {
return &walletv1.PurchaseResourceShopItemResponse{
OrderId: receipt.OrderID,
TransactionId: receipt.TransactionID,
ResourceGrantId: receipt.GrantID,
ShopItem: resourceShopItemToProto(receipt.ShopItem),
Resource: userResourceToProto(receipt.Resource),
Balance: balanceToProto(receipt.Balance),
CoinSpent: receipt.CoinSpent,
}
}
func managerGrantEnabledOrDefault(value *bool) bool {
if value == nil {
// 新建/编辑入口如果没显式携带开关,按产品规则默认关闭经理中心赠送。
return false
}
return *value
}
func resourceGroupToProto(group resourcedomain.ResourceGroup) *walletv1.ResourceGroup {
items := make([]*walletv1.ResourceGroupItem, 0, len(group.Items))
for _, item := range group.Items {
items = append(items, &walletv1.ResourceGroupItem{
GroupItemId: item.GroupItemID,
GroupId: item.GroupID,
ResourceId: item.ResourceID,
Resource: resourceToProto(item.Resource),
Quantity: item.Quantity,
DurationMs: item.DurationMS,
SortOrder: item.SortOrder,
CreatedAtMs: item.CreatedAtMS,
UpdatedAtMs: item.UpdatedAtMS,
ItemType: item.ItemType,
WalletAssetType: item.WalletAssetType,
WalletAssetAmount: item.WalletAssetAmount,
})
}
return &walletv1.ResourceGroup{
AppCode: appcode.Normalize(group.AppCode),
GroupId: group.GroupID,
GroupCode: group.GroupCode,
Name: group.Name,
Status: group.Status,
Description: group.Description,
SortOrder: group.SortOrder,
Items: items,
CreatedByUserId: group.CreatedByUserID,
UpdatedByUserId: group.UpdatedByUserID,
CreatedAtMs: group.CreatedAtMS,
UpdatedAtMs: group.UpdatedAtMS,
}
}
func giftConfigToProto(gift resourcedomain.GiftConfig) *walletv1.GiftConfig {
return &walletv1.GiftConfig{
AppCode: appcode.Normalize(gift.AppCode),
GiftId: gift.GiftID,
ResourceId: gift.ResourceID,
Resource: resourceToProto(gift.Resource),
Status: gift.Status,
Name: gift.Name,
SortOrder: gift.SortOrder,
PresentationJson: gift.PresentationJSON,
PriceVersion: gift.PriceVersion,
ChargeAssetType: gift.ChargeAssetType,
CoinPrice: gift.CoinPrice,
GiftPointAmount: 0,
HeatValue: gift.HeatValue,
GiftTypeCode: gift.GiftTypeCode,
CpRelationType: gift.CPRelationType,
EffectiveFromMs: gift.EffectiveFromMS,
EffectiveToMs: gift.EffectiveToMS,
EffectTypes: gift.EffectTypes,
CreatedByUserId: gift.CreatedByUserID,
UpdatedByUserId: gift.UpdatedByUserID,
CreatedAtMs: gift.CreatedAtMS,
UpdatedAtMs: gift.UpdatedAtMS,
RegionIds: gift.RegionIDs,
}
}
func giftTypeConfigToProto(item resourcedomain.GiftTypeConfig) *walletv1.GiftTypeConfig {
return &walletv1.GiftTypeConfig{
AppCode: appcode.Normalize(item.AppCode),
TypeCode: item.TypeCode,
Name: item.Name,
TabKey: item.TabKey,
Status: item.Status,
SortOrder: item.SortOrder,
CreatedByUserId: item.CreatedByUserID,
UpdatedByUserId: item.UpdatedByUserID,
CreatedAtMs: item.CreatedAtMS,
UpdatedAtMs: item.UpdatedAtMS,
}
}
func userResourceToProto(item resourcedomain.UserResourceEntitlement) *walletv1.UserResourceEntitlement {
return &walletv1.UserResourceEntitlement{
AppCode: appcode.Normalize(item.AppCode),
EntitlementId: item.EntitlementID,
UserId: item.UserID,
ResourceId: item.ResourceID,
Resource: resourceToProto(item.Resource),
Status: item.Status,
Quantity: item.Quantity,
RemainingQuantity: item.RemainingQuantity,
EffectiveAtMs: item.EffectiveAtMS,
ExpiresAtMs: item.ExpiresAtMS,
SourceGrantId: item.SourceGrantID,
CreatedAtMs: item.CreatedAtMS,
UpdatedAtMs: item.UpdatedAtMS,
Equipped: item.Equipped,
}
}
func resourceGrantToProto(grant resourcedomain.ResourceGrant) *walletv1.ResourceGrant {
items := make([]*walletv1.ResourceGrantItem, 0, len(grant.Items))
for _, item := range grant.Items {
items = append(items, &walletv1.ResourceGrantItem{
GrantItemId: item.GrantItemID,
GrantId: item.GrantID,
ResourceId: item.ResourceID,
ResourceSnapshotJson: item.ResourceSnapshotJSON,
Quantity: item.Quantity,
DurationMs: item.DurationMS,
ResultType: item.ResultType,
WalletTransactionId: item.WalletTransactionID,
EntitlementId: item.EntitlementID,
CreatedAtMs: item.CreatedAtMS,
})
}
return &walletv1.ResourceGrant{
AppCode: appcode.Normalize(grant.AppCode),
GrantId: grant.GrantID,
CommandId: grant.CommandID,
TargetUserId: grant.TargetUserID,
GrantSource: grant.GrantSource,
GrantSubjectType: grant.GrantSubjectType,
GrantSubjectId: grant.GrantSubjectID,
Status: grant.Status,
Reason: grant.Reason,
OperatorUserId: grant.OperatorUserID,
Items: items,
CreatedAtMs: grant.CreatedAtMS,
UpdatedAtMs: grant.UpdatedAtMS,
}
}