From f84f58a460b17a68ab25a86c8d7d98c01ab40181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A7=E9=A9=8A?= Date: Fri, 21 Mar 2025 11:12:41 +0800 Subject: [PATCH] feat: create product usecase --- pkg/domain/usecase/product.go | 129 ++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 pkg/domain/usecase/product.go diff --git a/pkg/domain/usecase/product.go b/pkg/domain/usecase/product.go new file mode 100644 index 0000000..110c413 --- /dev/null +++ b/pkg/domain/usecase/product.go @@ -0,0 +1,129 @@ +package usecase + +import ( + "code.30cm.net/digimon/app-cloudep-product-service/pkg/domain/product" + "context" +) + +type ProductUseCase interface { + Create(ctx context.Context, product *Product) error + Update(ctx context.Context, id string, product *Product) error + Delete(ctx context.Context, id string) error + Get(ctx context.Context, id string) (*ProductResp, error) + List(ctx context.Context, data ProductQueryParams) ([]*ProductResp, int64, error) + // IncOrders 新增訂單數 + IncOrders(ctx context.Context, productID string, count int64) error + // DecOrders 減少訂單數。-> 退貨時專用 + DecOrders(ctx context.Context, productID string, count int64) error + // UpdateAverageRating 只更新綜合評價及其更新時間 + UpdateAverageRating(ctx context.Context, productID string, averageRating float64) error + // IncFansCount 新增粉絲數 + IncFansCount(ctx context.Context, productID string, fansCount uint64) error + // DecFansCount 減少粉絲數。 + DecFansCount(ctx context.Context, productID string, fansCount uint64) error + // BindTag 建立一筆 tag 與其他資料(例如專案)的綁定關係 + BindTag(ctx context.Context, binding TagsBindingTable) error + // UnbindTag 刪除一筆綁定資料 + UnbindTag(ctx context.Context, binding TagsBindingTable) error + // GetBindingsByReference 根據參照 ID 取得所有綁定資料 + GetBindingsByReference(ctx context.Context, referenceID string) ([]TagsBindingTableResp, error) + // ListTagBinding 根據查詢條件取得 tag binding 的資料列表 + ListTagBinding(ctx context.Context, params TagBindingQueryParams) ([]TagsBindingTableResp, int64, error) +} + +type Product struct { + UID *string // 專案擁有者 UID + Title *string // 專案名稱 + ShortTitle *string // 計畫簡短標題 -> 不一定要有 + Details *string // 詳細內容 + ShortDescription *string // 簡短描述 + Media []Media // 專案動態內容(圖片或者影片) + Slug *string // URL 後綴(查詢用) + IsPublished *bool // 是否已上架 + Amount uint64 // 目標金額 + StartTime *string // 專案開始時間 + EndTime *string // 專案結束時間 + Category *string // 類別 + CustomFields []CustomFields // 自定義屬性 + Tags []string // 這個專案專屬的 tagID +} + +type ProductResp struct { + ID string + UID string // 專案擁有者 UID + Title string // 專案名稱 + ShortTitle string // 計畫簡短標題 -> 不一定要有 + Details string // 詳細內容 + ShortDescription string // 簡短描述 + Media []Media // 專案動態內容(圖片或者影片) + Slug string // URL 後綴(查詢用) + IsPublished bool // 是否已上架 + Amount uint64 // 目標金額 + StartTime string // 專案開始時間 + EndTime string // 專案結束時間 + Category string // 類別 + CustomFields []CustomFields // 自定義屬性 + Tags []Tags // 這個專案專屬的 tagID + Orders uint64 // 總接單數 + OrdersUpdateTime string // 更新總接單數的時間 + AverageRating float64 // 綜合評價(如:4.5 顆星) + AverageRatingUpdateTime string // 更新評價的時間 + FansCount uint64 // 追蹤數量 + FansCountUpdateTime string // 更新追蹤的時間 + UpdatedAt string // 更新時間 + CreatedAt string // 建立時間 +} + +type Media struct { + Sort uint64 + Type string + URL string +} + +type CustomFields struct { + Key string `bson:"key"` + Value string `bson:"value"` +} + +type ProductQueryParams struct { + UID *string // 專案擁有者 UID + IsPublished *bool // 是否已上架 + Category *string // 類別 + StartTime *int64 // 起始時間(Unix 時間戳) + EndTime *int64 // 結束時間(Unix 時間戳) + Slug *string // URL 後綴 + + PageIndex int64 // 頁碼 + PageSize int64 // 每頁數量 +} + +type Tags struct { + ID string // 專案 ID + Types product.ItemType // Tag 類型 + Name string // tag 名稱 + ShowType product.ShowType // 顯示筐 + Cover string // 封面圖片 + UpdatedAt string // 更新時間 + CreatedAt string // 創建時間 +} + +type TagsBindingTable struct { + ReferenceID string // 參照 id (可能為專案或其他的東西) + TagID string // tag id +} + +type TagsBindingTableResp struct { + ID string + ReferenceID string // 參照 id (可能為專案或其他的東西) + TagID string // tag id + UpdatedAt string // 更新時間 + CreatedAt string // 創建時間 +} + +// TagBindingQueryParams 為查詢 TagBindingTable 時的參數結構 +type TagBindingQueryParams struct { + ReferenceID *string // 過濾參照 ID + TagID *string // 過濾 Tag ID + PageSize int64 + PageIndex int64 +}