fix: get news by query category and tags filters

This commit is contained in:
ericprd 2025-03-07 00:55:50 +08:00
parent e3a9b67e28
commit 51b50a3132
10 changed files with 114 additions and 10 deletions

View File

@ -0,0 +1,19 @@
package categoryrepository
import (
categorydomain "legalgo-BE-go/internal/domain/category"
)
func (a *accessor) GetIDByCode(code string) (string, error) {
var category string
if err := a.db.
Model(&categorydomain.Category{}).
Select("id").Where("code = ?", code).
Pluck("id", &category).
Error; err != nil {
return "", err
}
return category, nil
}

View File

@ -12,6 +12,7 @@ type accessor struct {
type Category interface { type Category interface {
GetAllModel() ([]categorydomain.Category, error) GetAllModel() ([]categorydomain.Category, error)
GetByIDs([]string) ([]categorydomain.Category, error) GetByIDs([]string) ([]categorydomain.Category, error)
GetIDByCode(string) (string, error)
CreateModel(categorydomain.CategoryReq) error CreateModel(categorydomain.CategoryReq) error
Update(categorydomain.Category) error Update(categorydomain.Category) error
Delete(string) error Delete(string) error

View File

@ -2,13 +2,24 @@ package newsrepository
import newsdomain "legalgo-BE-go/internal/domain/news" import newsdomain "legalgo-BE-go/internal/domain/news"
func (a *accessor) GetAll() ([]newsdomain.News, error) { func (a *accessor) GetAll(filter newsdomain.NewsFilter) ([]newsdomain.News, error) {
var news []newsdomain.News var news []newsdomain.News
query := a.db.
if err := a.db.
Preload("Tags"). Preload("Tags").
Preload("Categories"). Preload("Categories").
Preload("Author"). Preload("Author")
if filter.Category != "" {
query = query.Joins("JOIN news_categories nc ON nc.news_id = news.id").
Where("nc.category_id = ?", filter.Category)
}
if len(filter.Tags) > 0 {
query = query.Joins("JOIN news_tags nt ON nt.news_id = news.id").
Where("nt.tag_id IN (?)", filter.Tags)
}
if err := query.
Find(&news).Error; err != nil { Find(&news).Error; err != nil {
return nil, err return nil, err
} }

View File

@ -10,7 +10,7 @@ type accessor struct {
} }
type News interface { type News interface {
GetAll() ([]newsdomain.News, error) GetAll(filter newsdomain.NewsFilter) ([]newsdomain.News, error)
GetBySlug(string) (*newsdomain.News, error) GetBySlug(string) (*newsdomain.News, error)
Create(newsdomain.News) error Create(newsdomain.News) error
Update(newsdomain.News) error Update(newsdomain.News) error

View File

@ -0,0 +1,17 @@
package tagrepository
import tagdomain "legalgo-BE-go/internal/domain/tag"
func (a *accessor) GetIDsByCodes(codes []string) ([]string, error) {
var tags []string
if err := a.db.
Model(&tagdomain.Tag{}).
Select("id").Where("code IN ?", codes).
Pluck("id", &tags).
Error; err != nil {
return nil, err
}
return tags, nil
}

View File

@ -13,6 +13,7 @@ type TagAccessor interface {
Create(tagdomain.TagReq) error Create(tagdomain.TagReq) error
GetAll() ([]tagdomain.Tag, error) GetAll() ([]tagdomain.Tag, error)
GetByIDs([]string) ([]tagdomain.Tag, error) GetByIDs([]string) ([]tagdomain.Tag, error)
GetIDsByCodes([]string) ([]string, error)
Update(tagdomain.Tag) error Update(tagdomain.Tag) error
Delete(string) error Delete(string) error
} }

View File

@ -1,6 +1,7 @@
package newshttp package newshttp
import ( import (
newsdomain "legalgo-BE-go/internal/domain/news"
newssvc "legalgo-BE-go/internal/services/news" newssvc "legalgo-BE-go/internal/services/news"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"net/http" "net/http"
@ -13,8 +14,18 @@ func GetAll(
newsSvc newssvc.News, newsSvc newssvc.News,
) { ) {
router.Get("/news", func(w http.ResponseWriter, r *http.Request) { router.Get("/news", func(w http.ResponseWriter, r *http.Request) {
var (
news []newsdomain.News
err error
)
ctx := r.Context() ctx := r.Context()
news, err := newsSvc.GetAll() query := r.URL.Query()
category := query.Get("category")
tags := query.Get("tags")
news, err = newsSvc.GetAll(category, tags)
if err != nil { if err != nil {
response.ResponseWithErrorCode( response.ResponseWithErrorCode(
ctx, ctx,

View File

@ -49,3 +49,8 @@ type NewsUpdate struct {
IsPremium bool `json:"is_premium"` IsPremium bool `json:"is_premium"`
LiveAt time.Time `json:"live_at"` LiveAt time.Time `json:"live_at"`
} }
type NewsFilter struct {
Tags []string
Category string
}

View File

@ -1,7 +1,46 @@
package newssvc package newssvc
import newsdomain "legalgo-BE-go/internal/domain/news" import (
newsdomain "legalgo-BE-go/internal/domain/news"
"strings"
)
func (i *impl) GetAll() ([]newsdomain.News, error) { func (i *impl) GetAll(categoryCode, tagCodes string) ([]newsdomain.News, error) {
return i.newsRepo.GetAll() var (
category string
err error
)
tags := []string{}
news := []newsdomain.News{}
tagCodeArr := strings.Split(tagCodes, " ")
if len(tagCodeArr) > 0 && tagCodeArr[0] != "" {
tags, err = i.tagRepo.GetIDsByCodes(tagCodeArr)
if err != nil {
return news, err
}
if len(tags) < 1 {
return news, nil
}
}
if categoryCode != "" {
category, err = i.categoryRepo.GetIDByCode(categoryCode)
if err != nil {
return news, err
}
if category == "" {
return news, nil
}
}
filter := newsdomain.NewsFilter{
Tags: tags,
Category: category,
}
return i.newsRepo.GetAll(filter)
} }

View File

@ -16,7 +16,7 @@ type impl struct {
} }
type News interface { type News interface {
GetAll() ([]newsdomain.News, error) GetAll(string, string) ([]newsdomain.News, error)
GetBySlug(string) (*newsdomain.News, error) GetBySlug(string) (*newsdomain.News, error)
Create(newsdomain.NewsReq, string) error Create(newsdomain.NewsReq, string) error
Update(string, newsdomain.NewsUpdate) error Update(string, newsdomain.NewsUpdate) error