This commit is contained in:
toom1996
2026-09-13 21:38:32 +08:00
parent 580697f17a
commit 0185ecd0df
6 changed files with 60 additions and 8 deletions

View File

@ -17,11 +17,12 @@ import (
// ArticleHandler 对外公开的文章接口。
type ArticleHandler struct {
articles service.ArticleService
favs service.FavoriteService
}
// NewArticleHandler 创建文章 handler。
func NewArticleHandler(articles service.ArticleService) *ArticleHandler {
return &ArticleHandler{articles: articles}
func NewArticleHandler(articles service.ArticleService, favs service.FavoriteService) *ArticleHandler {
return &ArticleHandler{articles: articles, favs: favs}
}
// List 走秀列表(分页 + 单值筛选 + 排序)。
@ -109,5 +110,29 @@ func (h *ArticleHandler) Detail(c *gin.Context) {
detail.Images = detail.Images[:dto.PreviewLimit]
preview = true
}
// 已登录:把当前用户对该图集(gallery 级)与每张图片(image 级)的收藏态随详情返回,
// 前端无需再单独调 /me/favorites/checks。gallery uid(r=)与图片 id(i=)前缀不同,
// 混传 FilterExisting 不影响查询;匿名请求不查(保持公开接口无用户态、可缓存)。
if uid, ok := middleware.UserIDFrom(c); ok {
ids := make([]string, 0, len(detail.Images)+1)
ids = append(ids, detail.UID)
for _, im := range detail.Images {
if im.ID != "" {
ids = append(ids, im.ID)
}
}
if hit, err := h.favs.Check(c.Request.Context(), uid, ids); err == nil {
set := make(map[string]bool, len(hit))
for _, id := range hit {
set[id] = true
}
detail.Favorited = set[detail.UID]
for i := range detail.Images {
detail.Images[i].Favorited = set[detail.Images[i].ID]
}
}
}
response.DataPreview(c, http.StatusOK, detail, preview, imageTotal)
}

View File

@ -6,6 +6,7 @@ import (
"strings"
"fashionapi/internal/dto"
"fashionapi/internal/middleware"
"fashionapi/internal/pkg/hashid"
"fashionapi/internal/pkg/response"
"fashionapi/internal/service"
@ -15,12 +16,13 @@ import (
// StreetSnapHandler 对外公开的街拍接口。
type StreetSnapHandler struct {
svc service.StreetSnapService
svc service.StreetSnapService
favs service.FavoriteService
}
// NewStreetSnapHandler 创建街拍 handler。
func NewStreetSnapHandler(svc service.StreetSnapService) *StreetSnapHandler {
return &StreetSnapHandler{svc: svc}
func NewStreetSnapHandler(svc service.StreetSnapService, favs service.FavoriteService) *StreetSnapHandler {
return &StreetSnapHandler{svc: svc, favs: favs}
}
// List 街拍列表(分页 + 排序 + 年份过滤)。
@ -93,5 +95,28 @@ func (h *StreetSnapHandler) Detail(c *gin.Context) {
detail.Images = detail.Images[:dto.PreviewLimit]
preview = true
}
// 已登录:图集(gallery 级 s=)与每张图片(image 级 j=)收藏态随详情返回,
// 前端无需再单独调 /me/favorites/checks。
if uid, ok := middleware.UserIDFrom(c); ok {
ids := make([]string, 0, len(detail.Images)+1)
ids = append(ids, detail.UID)
for _, im := range detail.Images {
if im.ID != "" {
ids = append(ids, im.ID)
}
}
if hit, err := h.favs.Check(c.Request.Context(), uid, ids); err == nil {
set := make(map[string]bool, len(hit))
for _, id := range hit {
set[id] = true
}
detail.Favorited = set[detail.UID]
for i := range detail.Images {
detail.Images[i].Favorited = set[detail.Images[i].ID]
}
}
}
response.DataPreview(c, http.StatusOK, detail, preview, imageTotal)
}