feat(scum): add versioned gift grants

This commit is contained in:
npc0-hue
2026-07-28 16:40:35 +08:00
parent 4527175a6f
commit e2d0bc0595
26 changed files with 1224 additions and 14 deletions
+121
View File
@@ -0,0 +1,121 @@
package dto
import (
"browser.local/platform/domain"
"time"
)
type GameGiftItemRequest struct {
CatalogItemKey string `json:"catalogItemKey"`
Quantity int `json:"quantity"`
}
type GameGiftItemResponse struct {
CatalogItemKey string `json:"catalogItemKey"`
Label string `json:"label"`
Quantity int `json:"quantity"`
}
type GameGiftCatalogRequest struct {
ID string `json:"id,omitempty"`
Name string `json:"name"`
GameVersion string `json:"gameVersion"`
Items []GameGiftItemRequest `json:"items"`
}
type GameGiftCatalogResponse struct {
ID string `json:"id"`
Name string `json:"name"`
GameVersion string `json:"gameVersion"`
DraftItems []GameGiftItemResponse `json:"draftItems"`
LatestRevisionID string `json:"latestRevisionId,omitempty"`
UpdatedAt time.Time `json:"updatedAt"`
}
type GameGiftCatalogListResponse struct {
Items []GameGiftCatalogResponse `json:"items"`
}
type GameGiftRevisionResponse struct {
ID string `json:"id"`
CatalogID string `json:"catalogId"`
Revision int `json:"revision"`
GameVersion string `json:"gameVersion"`
Items []GameGiftItemResponse `json:"items"`
PublishedBy string `json:"publishedBy"`
PublishedAt time.Time `json:"publishedAt"`
}
type GameGiftRevisionListResponse struct {
Items []GameGiftRevisionResponse `json:"items"`
}
type GameGiftGrantRequest struct {
RevisionID string `json:"revisionId"`
GamePlayerRecordID string `json:"gamePlayerRecordId"`
Notice string `json:"notice"`
IdempotencyKey string `json:"idempotencyKey"`
}
type GameGiftGrantResponse struct {
ID string `json:"id"`
RevisionID string `json:"revisionId"`
RevisionNumber int `json:"revisionNumber"`
GameVersion string `json:"gameVersion"`
Items []GameGiftItemResponse `json:"items"`
GamePlayerRecordID string `json:"gamePlayerRecordId"`
PlayerDisplayName string `json:"playerDisplayName"`
Notice string `json:"notice"`
RequesterID string `json:"requesterId"`
ApproverID string `json:"approverId,omitempty"`
Status string `json:"status"`
DeliverySummary string `json:"deliverySummary,omitempty"`
NotificationSummary string `json:"notificationSummary,omitempty"`
CreatedAt time.Time `json:"createdAt"`
ApprovedAt time.Time `json:"approvedAt,omitempty"`
CompletedAt time.Time `json:"completedAt,omitempty"`
}
type GameGiftGrantListResponse struct {
Items []GameGiftGrantResponse `json:"items"`
}
func (r GameGiftCatalogRequest) ToDomain() domain.GameGiftCatalogRequest {
items := make([]domain.GameGiftItem, len(r.Items))
for i, item := range r.Items {
def, _ := domain.SCUMGiftItemForVersion(r.GameVersion, item.CatalogItemKey)
items[i] = domain.GameGiftItem{CatalogItemKey: item.CatalogItemKey, Label: def.Label, Quantity: item.Quantity}
}
return domain.GameGiftCatalogRequest{ID: r.ID, Name: r.Name, GameVersion: r.GameVersion, Items: items}
}
func (r GameGiftGrantRequest) ToDomain() domain.GameGiftGrantRequest {
return domain.GameGiftGrantRequest{RevisionID: r.RevisionID, GamePlayerRecordID: r.GamePlayerRecordID, Notice: r.Notice, IdempotencyKey: r.IdempotencyKey}
}
func giftItems(items []domain.GameGiftItem) []GameGiftItemResponse {
out := make([]GameGiftItemResponse, len(items))
for i, item := range items {
out[i] = GameGiftItemResponse{CatalogItemKey: item.CatalogItemKey, Label: item.Label, Quantity: item.Quantity}
}
return out
}
func GameGiftCatalogFromDomain(v domain.GameGiftCatalog) GameGiftCatalogResponse {
return GameGiftCatalogResponse{ID: v.ID, Name: v.Name, GameVersion: v.GameVersion, DraftItems: giftItems(v.DraftItems), LatestRevisionID: v.LatestRevisionID, UpdatedAt: v.UpdatedAt}
}
func GameGiftCatalogsFromDomain(v []domain.GameGiftCatalog) GameGiftCatalogListResponse {
out := make([]GameGiftCatalogResponse, len(v))
for i, x := range v {
out[i] = GameGiftCatalogFromDomain(x)
}
return GameGiftCatalogListResponse{Items: out}
}
func GameGiftRevisionFromDomain(v domain.GameGiftRevision) GameGiftRevisionResponse {
return GameGiftRevisionResponse{ID: v.ID, CatalogID: v.CatalogID, Revision: v.Revision, GameVersion: v.GameVersion, Items: giftItems(v.Items), PublishedBy: v.PublishedBy, PublishedAt: v.PublishedAt}
}
func GameGiftRevisionsFromDomain(v []domain.GameGiftRevision) GameGiftRevisionListResponse {
out := make([]GameGiftRevisionResponse, len(v))
for i, x := range v {
out[i] = GameGiftRevisionFromDomain(x)
}
return GameGiftRevisionListResponse{Items: out}
}
func GameGiftGrantFromDomain(v domain.GameGiftGrant) GameGiftGrantResponse {
return GameGiftGrantResponse{ID: v.ID, RevisionID: v.RevisionID, RevisionNumber: v.RevisionNumber, GameVersion: v.GameVersion, Items: giftItems(v.Items), GamePlayerRecordID: v.GamePlayerRecordID, PlayerDisplayName: v.PlayerDisplayName, Notice: v.Notice, RequesterID: v.RequesterID, ApproverID: v.ApproverID, Status: string(v.Status), DeliverySummary: v.DeliverySummary, NotificationSummary: v.NotificationSummary, CreatedAt: v.CreatedAt, ApprovedAt: v.ApprovedAt, CompletedAt: v.CompletedAt}
}
func GameGiftGrantsFromDomain(v []domain.GameGiftGrant) GameGiftGrantListResponse {
out := make([]GameGiftGrantResponse, len(v))
for i, x := range v {
out[i] = GameGiftGrantFromDomain(x)
}
return GameGiftGrantListResponse{Items: out}
}