initial commit

This commit is contained in:
m.zare
2026-04-10 18:25:21 +03:30
commit 77ca6c34a3
263 changed files with 34470 additions and 0 deletions

138
internal/dto/asset.go Normal file
View 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"`
}