fix: get news by query category and tags filters
This commit is contained in:
parent
e3a9b67e28
commit
51b50a3132
19
internal/accessor/category/get_by_codes.go
Normal file
19
internal/accessor/category/get_by_codes.go
Normal 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
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
17
internal/accessor/tag/get_by_codes.go
Normal file
17
internal/accessor/tag/get_by_codes.go
Normal 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
|
||||||
|
}
|
||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user