To gitea and beyond, let's go(-yco)
This commit is contained in:
123
internal/services/post_queries.go
Normal file
123
internal/services/post_queries.go
Normal file
@@ -0,0 +1,123 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user