feat: add bought check

This commit is contained in:
Rogee
2025-05-06 16:33:46 +08:00
parent 5fafdd9d69
commit dd5e1e86d8
2 changed files with 31 additions and 0 deletions

View File

@@ -51,6 +51,11 @@ func (ctl *posts) List(ctx fiber.Ctx, pagination *requests.Pagination, query *Li
postIds := lo.Map(pager.Items.([]model.Posts), func(item model.Posts, _ int) int64 { return item.ID }) postIds := lo.Map(pager.Items.([]model.Posts), func(item model.Posts, _ int) int64 { return item.ID })
if len(postIds) > 0 { if len(postIds) > 0 {
userBoughtIds, err := models.Users.BatchCheckHasBought(ctx.Context(), user.ID, postIds)
if err != nil {
log.WithError(err).Errorf("BatchCheckHasBought err: %v", err)
}
items := lo.FilterMap(pager.Items.([]model.Posts), func(item model.Posts, _ int) (PostItem, bool) { items := lo.FilterMap(pager.Items.([]model.Posts), func(item model.Posts, _ int) (PostItem, bool) {
medias, err := models.Posts.GetMediaByIds(ctx.Context(), item.HeadImages.Data) medias, err := models.Posts.GetMediaByIds(ctx.Context(), item.HeadImages.Data)
if err != nil { if err != nil {
@@ -67,6 +72,8 @@ func (ctl *posts) List(ctx fiber.Ctx, pagination *requests.Pagination, query *Li
return url, true return url, true
}) })
_, bought := userBoughtIds[item.ID]
return PostItem{ return PostItem{
ID: item.ID, ID: item.ID,
Title: item.Title, Title: item.Title,
@@ -77,6 +84,7 @@ func (ctl *posts) List(ctx fiber.Ctx, pagination *requests.Pagination, query *Li
Likes: item.Likes, Likes: item.Likes,
Tags: item.Tags.Data, Tags: item.Tags.Data,
HeadImages: mediaUrls, HeadImages: mediaUrls,
Bought: bought,
}, true }, true
}) })

View File

@@ -322,6 +322,29 @@ func (m *usersModel) GetUsersMapByIDs(ctx context.Context, ids []int64) (map[int
}), nil }), nil
} }
func (m *usersModel) BatchCheckHasBought(ctx context.Context, userID int64, postIDs []int64) (map[int64]bool, error) {
tbl := table.UserPosts
stmt := tbl.SELECT(tbl.PostID.AS("post_id")).WHERE(
tbl.UserID.EQ(Int64(userID)).AND(
tbl.PostID.IN(lo.Map(postIDs, func(id int64, _ int) Expression { return Int64(id) })...),
),
)
var userPosts []struct {
PostID int64
}
if err := stmt.QueryContext(ctx, db, &userPosts); err != nil {
m.log.Errorf("error querying user posts: %v", err)
return nil, err
}
result := make(map[int64]bool)
for _, post := range userPosts {
result[post.PostID] = true
}
return result, nil
}
// HasBought // HasBought
func (m *usersModel) HasBought(ctx context.Context, userID, postID int64) (bool, error) { func (m *usersModel) HasBought(ctx context.Context, userID, postID int64) (bool, error) {
tbl := table.UserPosts tbl := table.UserPosts