diff --git a/internal/accessor/category/get_by_codes.go b/internal/accessor/category/get_by_codes.go new file mode 100644 index 0000000..d716263 --- /dev/null +++ b/internal/accessor/category/get_by_codes.go @@ -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 +} diff --git a/internal/accessor/category/impl.go b/internal/accessor/category/impl.go index e654299..bf0c1d9 100644 --- a/internal/accessor/category/impl.go +++ b/internal/accessor/category/impl.go @@ -12,6 +12,7 @@ type accessor struct { type Category interface { GetAllModel() ([]categorydomain.Category, error) GetByIDs([]string) ([]categorydomain.Category, error) + GetIDByCode(string) (string, error) CreateModel(categorydomain.CategoryReq) error Update(categorydomain.Category) error Delete(string) error diff --git a/internal/accessor/news/get_all.go b/internal/accessor/news/get_all.go index df7c3b5..048f0a5 100644 --- a/internal/accessor/news/get_all.go +++ b/internal/accessor/news/get_all.go @@ -2,13 +2,24 @@ package newsrepository 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 - - if err := a.db. + query := a.db. Preload("Tags"). 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 { return nil, err } diff --git a/internal/accessor/news/impl.go b/internal/accessor/news/impl.go index 1948ac3..f1f5945 100644 --- a/internal/accessor/news/impl.go +++ b/internal/accessor/news/impl.go @@ -10,7 +10,7 @@ type accessor struct { } type News interface { - GetAll() ([]newsdomain.News, error) + GetAll(filter newsdomain.NewsFilter) ([]newsdomain.News, error) GetBySlug(string) (*newsdomain.News, error) Create(newsdomain.News) error Update(newsdomain.News) error diff --git a/internal/accessor/tag/get_by_codes.go b/internal/accessor/tag/get_by_codes.go new file mode 100644 index 0000000..fda3581 --- /dev/null +++ b/internal/accessor/tag/get_by_codes.go @@ -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 +} diff --git a/internal/accessor/tag/impl.go b/internal/accessor/tag/impl.go index 0e2b2e8..d4d2c93 100644 --- a/internal/accessor/tag/impl.go +++ b/internal/accessor/tag/impl.go @@ -13,6 +13,7 @@ type TagAccessor interface { Create(tagdomain.TagReq) error GetAll() ([]tagdomain.Tag, error) GetByIDs([]string) ([]tagdomain.Tag, error) + GetIDsByCodes([]string) ([]string, error) Update(tagdomain.Tag) error Delete(string) error } diff --git a/internal/api/http/news/get_all.go b/internal/api/http/news/get_all.go index dd03164..d74d550 100644 --- a/internal/api/http/news/get_all.go +++ b/internal/api/http/news/get_all.go @@ -1,6 +1,7 @@ package newshttp import ( + newsdomain "legalgo-BE-go/internal/domain/news" newssvc "legalgo-BE-go/internal/services/news" "legalgo-BE-go/internal/utilities/response" "net/http" @@ -13,8 +14,18 @@ func GetAll( newsSvc newssvc.News, ) { router.Get("/news", func(w http.ResponseWriter, r *http.Request) { + var ( + news []newsdomain.News + err error + ) 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 { response.ResponseWithErrorCode( ctx, diff --git a/internal/domain/news/spec.go b/internal/domain/news/spec.go index 2c6c1a9..0d123cb 100644 --- a/internal/domain/news/spec.go +++ b/internal/domain/news/spec.go @@ -49,3 +49,8 @@ type NewsUpdate struct { IsPremium bool `json:"is_premium"` LiveAt time.Time `json:"live_at"` } + +type NewsFilter struct { + Tags []string + Category string +} diff --git a/internal/services/news/get_all.go b/internal/services/news/get_all.go index 0ceb6e1..b064422 100644 --- a/internal/services/news/get_all.go +++ b/internal/services/news/get_all.go @@ -1,7 +1,46 @@ 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) { - return i.newsRepo.GetAll() +func (i *impl) GetAll(categoryCode, tagCodes string) ([]newsdomain.News, error) { + 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) } diff --git a/internal/services/news/impl.go b/internal/services/news/impl.go index c4ed51d..ac7f300 100644 --- a/internal/services/news/impl.go +++ b/internal/services/news/impl.go @@ -16,7 +16,7 @@ type impl struct { } type News interface { - GetAll() ([]newsdomain.News, error) + GetAll(string, string) ([]newsdomain.News, error) GetBySlug(string) (*newsdomain.News, error) Create(newsdomain.NewsReq, string) error Update(string, newsdomain.NewsUpdate) error