update
This commit is contained in:
@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user