Files
goyco/internal/services/post_queries.go

124 lines
2.9 KiB
Go

package services
import (
"goyco/internal/database"
"goyco/internal/repositories"
)
type PostQueries struct {
postRepo repositories.PostRepository
voteService *VoteService
}
func NewPostQueries(postRepo repositories.PostRepository, voteService *VoteService) *PostQueries {
return &PostQueries{
postRepo: postRepo,
voteService: voteService,
}
}
type QueryOptions struct {
Limit int
Offset int
Sort string
}
type VoteContext struct {
UserID uint
IPAddress string
UserAgent string
}
func (pq *PostQueries) enrichPostsWithVotes(posts []database.Post, ctx VoteContext) []database.Post {
if pq.voteService == nil {
return posts
}
enriched := make([]database.Post, len(posts))
for i := range posts {
enriched[i] = posts[i]
vote, err := pq.voteService.GetUserVote(ctx.UserID, posts[i].ID, ctx.IPAddress, ctx.UserAgent)
if err == nil && vote != nil {
enriched[i].CurrentVote = vote.Type
}
}
return enriched
}
func (pq *PostQueries) enrichPostWithVote(post *database.Post, ctx VoteContext) *database.Post {
if pq.voteService == nil || post == nil {
return post
}
vote, err := pq.voteService.GetUserVote(ctx.UserID, post.ID, ctx.IPAddress, ctx.UserAgent)
if err == nil && vote != nil {
post.CurrentVote = vote.Type
}
return post
}
func (pq *PostQueries) GetAll(opts QueryOptions, ctx VoteContext) ([]database.Post, error) {
posts, err := pq.postRepo.GetAll(opts.Limit, opts.Offset)
if err != nil {
return nil, err
}
return pq.enrichPostsWithVotes(posts, ctx), nil
}
func (pq *PostQueries) GetTop(limit int, ctx VoteContext) ([]database.Post, error) {
posts, err := pq.postRepo.GetTopPosts(limit)
if err != nil {
return nil, err
}
return pq.enrichPostsWithVotes(posts, ctx), nil
}
func (pq *PostQueries) GetNewest(limit int, ctx VoteContext) ([]database.Post, error) {
posts, err := pq.postRepo.GetNewestPosts(limit)
if err != nil {
return nil, err
}
return pq.enrichPostsWithVotes(posts, ctx), nil
}
func (pq *PostQueries) GetBySort(sort string, limit int, ctx VoteContext) ([]database.Post, error) {
switch sort {
case "new", "newest", "latest":
return pq.GetNewest(limit, ctx)
default:
return pq.GetTop(limit, ctx)
}
}
func (pq *PostQueries) GetSearch(query string, opts QueryOptions, ctx VoteContext) ([]database.Post, error) {
posts, err := pq.postRepo.Search(query, opts.Limit, opts.Offset)
if err != nil {
return nil, err
}
return pq.enrichPostsWithVotes(posts, ctx), nil
}
func (pq *PostQueries) GetByID(postID uint, ctx VoteContext) (*database.Post, error) {
post, err := pq.postRepo.GetByID(postID)
if err != nil {
return nil, err
}
return pq.enrichPostWithVote(post, ctx), nil
}
func (pq *PostQueries) GetByUserID(userID uint, opts QueryOptions, ctx VoteContext) ([]database.Post, error) {
posts, err := pq.postRepo.GetByUserID(userID, opts.Limit, opts.Offset)
if err != nil {
return nil, err
}
return pq.enrichPostsWithVotes(posts, ctx), nil
}