initial commit
This commit is contained in:
138
internal/dto/asset.go
Normal file
138
internal/dto/asset.go
Normal file
@@ -0,0 +1,138 @@
|
||||
package dto
|
||||
|
||||
import (
|
||||
"base/pkg/validation"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type CreateAssetRequest struct {
|
||||
ProfileID string `json:"profile_id"`
|
||||
AssetCategoryID string `json:"asset_category_id"`
|
||||
Title string `json:"title"`
|
||||
Description string `json:"description"`
|
||||
Link string `json:"link"`
|
||||
}
|
||||
|
||||
func (*CreateAssetRequest) Schema() validation.Schema {
|
||||
return validation.Schema{
|
||||
"profile_id": validation.Rule{Field: "profile_id", Type: validation.ValidationTypeString, Required: true},
|
||||
"asset_category_id": validation.Rule{Field: "asset_category_id", Type: validation.ValidationTypeString, Required: true},
|
||||
"title": validation.Rule{Field: "title", Type: validation.ValidationTypeString, Required: true},
|
||||
}
|
||||
}
|
||||
|
||||
type UpdateAssetRequest struct {
|
||||
ID string `uri:"id"`
|
||||
AssetCategoryID string `json:"asset_category_id"`
|
||||
Title string `json:"title"`
|
||||
Description string `json:"description"`
|
||||
Link string `json:"link"`
|
||||
Status *int `json:"status"`
|
||||
}
|
||||
|
||||
func (*UpdateAssetRequest) Schema() validation.Schema {
|
||||
return validation.Schema{
|
||||
"id": validation.Rule{Field: "id", Type: validation.ValidationTypeString, Required: true},
|
||||
}
|
||||
}
|
||||
|
||||
type GetAssetRequest struct {
|
||||
ID string `uri:"id"`
|
||||
}
|
||||
|
||||
func (*GetAssetRequest) Schema() validation.Schema {
|
||||
return validation.Schema{
|
||||
"id": validation.Rule{Field: "id", Type: validation.ValidationTypeString, Required: true},
|
||||
}
|
||||
}
|
||||
|
||||
type ListAssetsByProfileRequest struct {
|
||||
ProfileID string `uri:"id"`
|
||||
}
|
||||
|
||||
func (*ListAssetsByProfileRequest) Schema() validation.Schema {
|
||||
return validation.Schema{
|
||||
"ProfileID": validation.Rule{Field: "profile_id", Type: validation.ValidationTypeString, Required: true},
|
||||
}
|
||||
}
|
||||
|
||||
type DeleteAssetRequest struct {
|
||||
ID string `uri:"id"`
|
||||
}
|
||||
|
||||
func (*DeleteAssetRequest) Schema() validation.Schema {
|
||||
return validation.Schema{
|
||||
"id": validation.Rule{Field: "id", Type: validation.ValidationTypeString, Required: true},
|
||||
}
|
||||
}
|
||||
|
||||
type AssetResponse struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
ProfileID uuid.UUID `json:"profile_id"`
|
||||
OwnerID *uuid.UUID `json:"owner_id,omitempty"`
|
||||
AssetCategoryID uuid.UUID `json:"asset_category_id"`
|
||||
Title string `json:"title"`
|
||||
Description string `json:"description"`
|
||||
Link string `json:"link"`
|
||||
CoverImage string `json:"cover_image,omitempty"`
|
||||
Status int `json:"status"`
|
||||
Category CategoryDTO `json:"category"`
|
||||
CreatedAt string `json:"created_at"`
|
||||
UpdatedAt string `json:"updated_at"`
|
||||
}
|
||||
|
||||
type CategoryDTO struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Icon string `json:"icon"`
|
||||
Color string `json:"color"`
|
||||
CardType string `json:"card_type"`
|
||||
Featured bool `json:"featured"`
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
||||
type ListAssetsResponse struct {
|
||||
Assets []AssetResponse `json:"assets"`
|
||||
}
|
||||
|
||||
// ListAssetsByCategoryIDResponse is paginated assets for a single category (Phase 2 of two-phase loading).
|
||||
type ListAssetsByCategoryIDResponse struct {
|
||||
Category CategoryDTO `json:"category"`
|
||||
Assets []AssetResponse `json:"assets"`
|
||||
Total int `json:"total"`
|
||||
Page int `json:"page"`
|
||||
PageSize int `json:"page_size"`
|
||||
TotalPages int `json:"total_pages"`
|
||||
}
|
||||
|
||||
type ListCategoriesResponse struct {
|
||||
Categories []CategoryDTO `json:"categories"`
|
||||
}
|
||||
|
||||
// CategoriesPreviewRequest holds the request body for POST /assets/categories/preview.
|
||||
type CategoriesPreviewRequest struct {
|
||||
CategoryIDs []string `json:"category_ids"`
|
||||
AssetsPerCategory int `json:"assets_per_category"`
|
||||
FeaturedOnly bool `json:"featured_only"`
|
||||
}
|
||||
|
||||
func (*CategoriesPreviewRequest) Schema() validation.Schema {
|
||||
return validation.Schema{
|
||||
"category_ids": validation.Rule{Field: "category_ids", Type: validation.ValidationTypeArray, Required: false},
|
||||
"assets_per_category": validation.Rule{Field: "assets_per_category", Type: validation.ValidationTypeInt, Required: false},
|
||||
"featured_only": validation.Rule{Field: "featured_only", Type: validation.ValidationTypeBool, Required: false},
|
||||
}
|
||||
}
|
||||
|
||||
// CategoryWithPreviewAssetsDTO groups a category with up to N sample assets.
|
||||
type CategoryWithPreviewAssetsDTO struct {
|
||||
Category CategoryDTO `json:"category"`
|
||||
Assets []AssetResponse `json:"assets"`
|
||||
TotalAssets int `json:"total_assets,omitempty"`
|
||||
HasMore bool `json:"has_more,omitempty"`
|
||||
}
|
||||
|
||||
// CategoriesPreviewResponse is the response for POST /assets/categories/preview.
|
||||
type CategoriesPreviewResponse struct {
|
||||
Categories []CategoryWithPreviewAssetsDTO `json:"categories"`
|
||||
}
|
||||
Reference in New Issue
Block a user