From dd5e1e86d8cf7700a9e25679bbc5e53e0989f842 Mon Sep 17 00:00:00 2001 From: Rogee Date: Tue, 6 May 2025 16:33:46 +0800 Subject: [PATCH] feat: add bought check --- backend/app/http/posts.go | 8 ++++++++ backend/app/models/users.go | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/backend/app/http/posts.go b/backend/app/http/posts.go index 13bf360..d5220dc 100644 --- a/backend/app/http/posts.go +++ b/backend/app/http/posts.go @@ -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 }) 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) { medias, err := models.Posts.GetMediaByIds(ctx.Context(), item.HeadImages.Data) if err != nil { @@ -67,6 +72,8 @@ func (ctl *posts) List(ctx fiber.Ctx, pagination *requests.Pagination, query *Li return url, true }) + _, bought := userBoughtIds[item.ID] + return PostItem{ ID: item.ID, Title: item.Title, @@ -77,6 +84,7 @@ func (ctl *posts) List(ctx fiber.Ctx, pagination *requests.Pagination, query *Li Likes: item.Likes, Tags: item.Tags.Data, HeadImages: mediaUrls, + Bought: bought, }, true }) diff --git a/backend/app/models/users.go b/backend/app/models/users.go index fc9599d..01810fc 100644 --- a/backend/app/models/users.go +++ b/backend/app/models/users.go @@ -322,6 +322,29 @@ func (m *usersModel) GetUsersMapByIDs(ctx context.Context, ids []int64) (map[int }), 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 func (m *usersModel) HasBought(ctx context.Context, userID, postID int64) (bool, error) { tbl := table.UserPosts