124 lines
2.9 KiB
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
|
|
}
|