This commit is contained in:
toom1996
2026-09-07 00:01:48 +08:00
parent b049104a0b
commit 74ba700598
31 changed files with 1113 additions and 606 deletions

View File

@ -2,7 +2,10 @@ package service
import (
"context"
"errors"
"net/http"
"sort"
"time"
"fashionapi/internal/dto"
"fashionapi/internal/model"
@ -17,8 +20,20 @@ type BrandService interface {
// 供 SSG 构建期(RunwayLooks 侧栏 / 品牌弹窗 HOT 标签)一次性取前 N 个热门品牌;
// 复用 List 的 featured 收窄逻辑(FeaturedIDs("images", limit)),与首页精选口径一致。
Hot(ctx context.Context, limit int, locale string) ([]dto.PublicBrand, error)
// Get 按编码 id 取单个品牌(后台编辑用)。不存在返回 ErrBrandNotFound。
Get(ctx context.Context, uid string) (*model.Brand, error)
// Create 新建品牌,返回编码后的 id。
Create(ctx context.Context, nameEn, nameCn string) (string, error)
// Update 按编码 id 更新品牌名称。
Update(ctx context.Context, uid, nameEn, nameCn string) error
// CrawlTasks 返回爬虫抓取所需的品牌列表(编码 brand_uid + 英文品牌名)。
// brandID>0 时仅返回该品牌(对应 --brand 单品牌调试)。
CrawlTasks(ctx context.Context, brandID uint32) ([]dto.CrawlBrand, error)
}
// ErrBrandNotFound 品牌不存在。
var ErrBrandNotFound = NewError(http.StatusNotFound, "brand not found")
type brandService struct {
brands repository.BrandRepository
}
@ -96,3 +111,63 @@ func (s *brandService) toPublicBrands(items []model.Brand, locale string) []dto.
}
return list
}
// Get 按编码 id 取单个品牌(后台编辑用)。
func (s *brandService) Get(ctx context.Context, uid string) (*model.Brand, error) {
id, err := hashid.Decode(uid)
if err != nil {
return nil, ErrBrandNotFound
}
b, err := s.brands.FindByID(ctx, id)
if err != nil {
if errors.Is(err, repository.ErrNotFound) {
return nil, ErrBrandNotFound
}
return nil, internalErr(err.Error())
}
return b, nil
}
// Create 新建品牌,返回编码后的 id。
func (s *brandService) Create(ctx context.Context, nameEn, nameCn string) (string, error) {
now := uint32(time.Now().Unix())
id, err := s.brands.Create(ctx, &model.Brand{
NameEn: nameEn,
NameCn: nameCn,
CreatedAt: now,
UpdatedAt: now,
})
if err != nil {
return "", internalErr(err.Error())
}
return hashid.Encode(id), nil
}
// Update 按编码 id 更新品牌名称。
func (s *brandService) Update(ctx context.Context, uid, nameEn, nameCn string) error {
id, err := hashid.Decode(uid)
if err != nil {
return ErrBrandNotFound
}
if err := s.brands.Update(ctx, id, nameEn, nameCn); err != nil {
return internalErr(err.Error())
}
return nil
}
// CrawlTasks 返回爬虫取任务所需的品牌列表:编码 brand_uid + 英文品牌名。
// 爬虫直接拿 brand_uid 上送 ingest,无需自己编码;name 用于拼 vogue 抓取 URL。
func (s *brandService) CrawlTasks(ctx context.Context, brandID uint32) ([]dto.CrawlBrand, error) {
brands, err := s.brands.CrawlBrands(ctx, brandID)
if err != nil {
return nil, internalErr(err.Error())
}
out := make([]dto.CrawlBrand, 0, len(brands))
for _, b := range brands {
out = append(out, dto.CrawlBrand{
BrandUID: hashid.Encode(b.ID),
Name: b.NameEn,
})
}
return out, nil
}