2026-07-15 09:43:33 +08:00

131 lines
5.1 KiB
Go

package activitytemplate
import (
"strings"
activityv1 "hyapp.local/api/proto/activity/v1"
)
type localeRequest struct {
Locale string `json:"locale"`
Title string `json:"title"`
Rules string `json:"rules"`
}
type giftRequest struct {
GiftID string `json:"gift_id"`
SortOrder int32 `json:"sort_order"`
Name string `json:"name"`
IconURL string `json:"icon_url"`
CoinPrice int64 `json:"coin_price"`
PriceVersion string `json:"price_version"`
}
type taskRequest struct {
TaskKey string `json:"task_key"`
TaskType string `json:"task_type"`
TargetValue int64 `json:"target_value"`
RewardResourceGroupID int64 `json:"reward_resource_group_id"`
SortOrder int32 `json:"sort_order"`
}
type rankRewardRequest struct {
BoardType string `json:"board_type"`
RankFrom int32 `json:"rank_from"`
RankTo int32 `json:"rank_to"`
ResourceGroupID int64 `json:"resource_group_id"`
SortOrder int32 `json:"sort_order"`
}
type assetRequest struct {
AssetKey string `json:"asset_key"`
Locale string `json:"locale"`
URL string `json:"url"`
MediaType string `json:"media_type"`
SortOrder int32 `json:"sort_order"`
}
// templateRequest 与 HTTP JSON 一一对应;不在 admin 层重复业务校验,确保保存和发布都复用 activity-service 的同一规则。
type templateRequest struct {
TemplateCode string `json:"template_code"`
Name string `json:"name"`
ActivityType string `json:"activity_type"`
StartMS int64 `json:"start_ms"`
EndMS int64 `json:"end_ms"`
AllRegions bool `json:"all_regions"`
RegionIDs []int64 `json:"region_ids"`
Locales []localeRequest `json:"locales"`
Gifts []giftRequest `json:"gifts"`
Tasks []taskRequest `json:"tasks"`
DailyLeaderboardSize int32 `json:"daily_leaderboard_size"`
TotalLeaderboardSize int32 `json:"total_leaderboard_size"`
RankRewards []rankRewardRequest `json:"rank_rewards"`
Assets []assetRequest `json:"assets"`
DisplayConfigJSON string `json:"display_config_json"`
ExpectedRevision int64 `json:"expected_revision,omitempty"`
}
type statusRequest struct {
Status string `json:"status"`
ExpectedRevision int64 `json:"expected_revision"`
}
type cloneRequest struct {
SourceVersion int64 `json:"source_version"`
TemplateCode string `json:"template_code"`
Name string `json:"name"`
}
type validateRequest struct {
Template templateRequest `json:"template"`
ForPublish bool `json:"for_publish"`
}
func (r templateRequest) toProto(templateID string) *activityv1.ActivityTemplate {
item := &activityv1.ActivityTemplate{
TemplateId: strings.TrimSpace(templateID),
TemplateCode: strings.TrimSpace(r.TemplateCode),
Name: strings.TrimSpace(r.Name),
ActivityType: strings.TrimSpace(r.ActivityType),
StartMs: r.StartMS,
EndMs: r.EndMS,
AllRegions: r.AllRegions,
RegionIds: append([]int64(nil), r.RegionIDs...),
Locales: make([]*activityv1.ActivityTemplateLocale, 0, len(r.Locales)),
Gifts: make([]*activityv1.ActivityTemplateGift, 0, len(r.Gifts)),
Tasks: make([]*activityv1.ActivityTemplateTask, 0, len(r.Tasks)),
DailyLeaderboardSize: r.DailyLeaderboardSize,
TotalLeaderboardSize: r.TotalLeaderboardSize,
RankRewards: make([]*activityv1.ActivityTemplateRankReward, 0, len(r.RankRewards)),
Assets: make([]*activityv1.ActivityTemplateAsset, 0, len(r.Assets)),
DisplayConfigJson: strings.TrimSpace(r.DisplayConfigJSON),
}
for _, locale := range r.Locales {
item.Locales = append(item.Locales, &activityv1.ActivityTemplateLocale{Locale: locale.Locale, Title: locale.Title, Rules: locale.Rules})
}
for _, gift := range r.Gifts {
item.Gifts = append(item.Gifts, &activityv1.ActivityTemplateGift{
GiftId: gift.GiftID, SortOrder: gift.SortOrder, Name: gift.Name, IconUrl: gift.IconURL,
CoinPrice: gift.CoinPrice, PriceVersion: gift.PriceVersion,
})
}
for _, task := range r.Tasks {
item.Tasks = append(item.Tasks, &activityv1.ActivityTemplateTask{
TaskKey: task.TaskKey, TaskType: task.TaskType, TargetValue: task.TargetValue,
RewardResourceGroupId: task.RewardResourceGroupID, SortOrder: task.SortOrder,
})
}
for _, reward := range r.RankRewards {
item.RankRewards = append(item.RankRewards, &activityv1.ActivityTemplateRankReward{
BoardType: reward.BoardType, RankFrom: reward.RankFrom, RankTo: reward.RankTo,
ResourceGroupId: reward.ResourceGroupID, SortOrder: reward.SortOrder,
})
}
for _, asset := range r.Assets {
item.Assets = append(item.Assets, &activityv1.ActivityTemplateAsset{
AssetKey: asset.AssetKey, Locale: asset.Locale, Url: asset.URL, MediaType: asset.MediaType, SortOrder: asset.SortOrder,
})
}
return item
}