fix: create and get news

This commit is contained in:
ericprd 2025-03-05 22:15:39 +08:00
parent dd109c8aa0
commit 5c699dfa53
22 changed files with 46 additions and 159 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -1,15 +0,0 @@
package categoryrepository
import (
"legalgo-BE-go/database"
)
func (a *accessor) GetByIDs(ids []string) ([]database.Category, error) {
var categories []database.Category
if err := a.DB.Find(&categories, "id IN ?", ids).Error; err != nil {
return nil, err
}
return categories, nil
}

View File

@ -0,0 +1,15 @@
package categoryrepository
import (
categorydomain "legalgo-BE-go/internal/domain/category"
)
func (a *accessor) GetByIDs(ids []string) ([]categorydomain.Category, error) {
var categories []categorydomain.Category
if err := a.DB.Find(&categories, "id IN ?", ids).Error; err != nil {
return nil, err
}
return categories, nil
}

View File

@ -14,7 +14,7 @@ type Category interface {
Update(categorydomain.Category) error Update(categorydomain.Category) error
GetAllModel() ([]categorydomain.Category, error) GetAllModel() ([]categorydomain.Category, error)
GetByIDs([]string) ([]database.Category, error) GetByIDs([]string) ([]categorydomain.Category, error)
} }
func New( func New(

View File

@ -5,7 +5,7 @@ import (
newsdomain "legalgo-BE-go/internal/domain/news" newsdomain "legalgo-BE-go/internal/domain/news"
) )
func (a *accessor) Create(spec *newsdomain.News) error { func (a *accessor) Create(spec newsdomain.News) error {
if err := a.db.Create(&spec).Error; err != nil { if err := a.db.Create(&spec).Error; err != nil {
return fmt.Errorf("failed to create news: %w", err) return fmt.Errorf("failed to create news: %w", err)
} }

View File

@ -1,13 +0,0 @@
package newsrepository
import (
"fmt"
"legalgo-BE-go/database"
)
func (a *accessor) CreateModel(spec database.News) error {
if err := a.db.Create(&spec).Error; err != nil {
return fmt.Errorf("failed to create news: %w", err)
}
return nil
}

View File

@ -1,13 +0,0 @@
package newsrepository
import "legalgo-BE-go/database"
func (a *accessor) GetAllModel() ([]database.News, error) {
var news []database.News
if err := a.db.Preload("Tags").Preload("Categories").Find(&news).Error; err != nil {
return nil, err
}
return news, nil
}

View File

@ -11,9 +11,7 @@ type accessor struct {
type News interface { type News interface {
GetAll() ([]newsdomain.News, error) GetAll() ([]newsdomain.News, error)
GetAllModel() ([]database.News, error) Create(newsdomain.News) error
Create(*newsdomain.News) error
CreateModel(database.News) error
} }
func New(db *database.DB) News { func New(db *database.DB) News {

View File

@ -1,13 +0,0 @@
package tagrepository
import "legalgo-BE-go/database"
func (acc *accessor) GetAllModel() ([]database.Tag, error) {
var tags []database.Tag
if err := acc.DB.Find(&tags).Error; err != nil {
return nil, err
}
return tags, nil
}

View File

@ -1,13 +0,0 @@
package tagrepository
import "legalgo-BE-go/database"
func (a *accessor) GetBulks(ids []string) ([]database.Tag, error) {
var tags []database.Tag
if err := a.DB.Find(&tags, "id IN ?", ids).Error; err != nil {
return nil, err
}
return tags, nil
}

View File

@ -13,9 +13,7 @@ type TagAccessor interface {
Create(tagdomain.TagReq) error Create(tagdomain.TagReq) error
CreateModel(tagdomain.TagReq) error CreateModel(tagdomain.TagReq) error
GetAll() ([]tagdomain.Tag, error) GetAll() ([]tagdomain.Tag, error)
GetAllModel() ([]database.Tag, error)
GetByIDs([]string) ([]tagdomain.Tag, error) GetByIDs([]string) ([]tagdomain.Tag, error)
GetBulks(ids []string) ([]database.Tag, error)
} }
func New( func New(

View File

@ -72,7 +72,7 @@ func Create(
return return
} }
if err := newsSvc.CreateModel(spec, staffProfile.ID); err != nil { if err := newsSvc.Create(spec, staffProfile.ID); err != nil {
response.ResponseWithErrorCode( response.ResponseWithErrorCode(
ctx, ctx,
w, w,

View File

@ -14,7 +14,7 @@ func GetAll(
) { ) {
router.Get("/news", func(w http.ResponseWriter, r *http.Request) { router.Get("/news", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
news, err := newsSvc.GetAllModel() news, err := newsSvc.GetAll()
if err != nil { if err != nil {
response.ResponseWithErrorCode( response.ResponseWithErrorCode(
ctx, ctx,

View File

@ -3,7 +3,7 @@ package categorydomain
import "time" import "time"
type Category struct { type Category struct {
ID string `json:"id"` ID string `json:"id" gorm:"primaryKey"`
Name string `json:"name"` Name string `json:"name"`
Code string `json:"code"` Code string `json:"code"`
CreatedAt time.Time `json:"created_at"` CreatedAt time.Time `json:"created_at"`

View File

@ -1,7 +1,7 @@
package newsdomain package newsdomain
import ( import (
"legalgo-BE-go/database" categorydomain "legalgo-BE-go/internal/domain/category"
tagdomain "legalgo-BE-go/internal/domain/tag" tagdomain "legalgo-BE-go/internal/domain/tag"
"time" "time"
) )
@ -17,16 +17,16 @@ type NewsReq struct {
} }
type News struct { type News struct {
ID string `json:"id"` ID string `json:"id" gorm:"primaryKey"`
Title string `json:"title"` Title string `json:"title"`
Content string `json:"content"` Content string `json:"content"`
FeaturedImage string `json:"featured_image"` FeaturedImage string `json:"featured_image"`
Tags []tagdomain.Tag `json:"tags"` Tags []tagdomain.Tag `gorm:"many2many:news_tags" json:"tags"`
Categories []database.Category `json:"categories"` Categories []categorydomain.Category `gorm:"many2many:news_categories" json:"categories"`
IsPremium bool `json:"is_premium"` IsPremium bool `json:"is_premium"`
Slug string `json:"slug"` Slug string `json:"slug"`
AuthorID string `json:"author_id"` AuthorID string `json:"author_id"`
LiveAt time.Time `json:"live_at"` LiveAt time.Time `json:"live_at"`
CreatedAt time.Time `json:"created_at"` CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"` UpdatedAt time.Time `json:"updated_at"`
} }

View File

@ -1,12 +1,16 @@
package tagdomain package tagdomain
import "time"
type TagReq struct { type TagReq struct {
Code string `json:"code" validate:"required"` Code string `json:"code" validate:"required"`
Name string `json:"name" validate:"required"` Name string `json:"name" validate:"required"`
} }
type Tag struct { type Tag struct {
ID string `json:"id" gorm:"primaryKey"` ID string `json:"id" gorm:"primaryKey"`
Code string `json:"code"` Code string `json:"code"`
Name string `json:"name"` Name string `json:"name"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
} }

View File

@ -26,7 +26,7 @@ func (i *impl) Create(spec newsdomain.NewsReq, staffId string) error {
return err return err
} }
newSpec := &newsdomain.News{ newSpec := newsdomain.News{
ID: uuid.NewString(), ID: uuid.NewString(),
Title: spec.Title, Title: spec.Title,
Content: spec.Content, Content: spec.Content,

View File

@ -1,48 +0,0 @@
package newssvc
import (
"legalgo-BE-go/database"
newsdomain "legalgo-BE-go/internal/domain/news"
"strings"
"time"
"github.com/google/uuid"
)
func (i *impl) CreateModel(spec newsdomain.NewsReq, staffId string) error {
slug := strings.ToLower(strings.ReplaceAll(spec.Title, " ", "-"))
tags, err := i.tagRepo.GetBulks(spec.Tags)
if err != nil {
return err
}
categories, err := i.categoryRepo.GetByIDs(spec.Categories)
if err != nil {
return err
}
parsedTime, err := time.Parse(time.RFC3339, spec.LiveAt)
if err != nil {
return err
}
newSpec := database.News{
ID: uuid.NewString(),
Title: spec.Title,
Content: spec.Content,
FeaturedImage: spec.FeaturedImage,
IsPremium: spec.IsPremium,
Slug: slug,
LiveAt: parsedTime,
AuthorID: staffId,
Tags: tags,
Categories: categories,
}
if err := i.newsRepo.CreateModel(newSpec); err != nil {
return err
}
return nil
}

View File

@ -1,9 +0,0 @@
package newssvc
import (
"legalgo-BE-go/database"
)
func (i *impl) GetAllModel() ([]database.News, error) {
return i.newsRepo.GetAllModel()
}

View File

@ -1,7 +1,6 @@
package newssvc package newssvc
import ( import (
"legalgo-BE-go/database"
categoryrepository "legalgo-BE-go/internal/accessor/category" categoryrepository "legalgo-BE-go/internal/accessor/category"
newsrepository "legalgo-BE-go/internal/accessor/news" newsrepository "legalgo-BE-go/internal/accessor/news"
tagrepository "legalgo-BE-go/internal/accessor/tag" tagrepository "legalgo-BE-go/internal/accessor/tag"
@ -16,9 +15,7 @@ type impl struct {
type News interface { type News interface {
GetAll() ([]newsdomain.News, error) GetAll() ([]newsdomain.News, error)
GetAllModel() ([]database.News, error)
Create(newsdomain.NewsReq, string) error Create(newsdomain.NewsReq, string) error
CreateModel(newsdomain.NewsReq, string) error
} }
func New( func New(

View File

@ -1,9 +1,9 @@
package tagsvc package tagsvc
import ( import (
"legalgo-BE-go/database" tagdomain "legalgo-BE-go/internal/domain/tag"
) )
func (i *impl) GetAllModel() ([]database.Tag, error) { func (i *impl) GetAllModel() ([]tagdomain.Tag, error) {
return i.tagRepo.GetAllModel() return i.tagRepo.GetAll()
} }

View File

@ -1,7 +1,6 @@
package tagsvc package tagsvc
import ( import (
"legalgo-BE-go/database"
tagrepository "legalgo-BE-go/internal/accessor/tag" tagrepository "legalgo-BE-go/internal/accessor/tag"
tagdomain "legalgo-BE-go/internal/domain/tag" tagdomain "legalgo-BE-go/internal/domain/tag"
) )
@ -13,7 +12,7 @@ type impl struct {
type Tag interface { type Tag interface {
Create(tagdomain.TagReq) error Create(tagdomain.TagReq) error
GetAll() ([]tagdomain.Tag, error) GetAll() ([]tagdomain.Tag, error)
GetAllModel() ([]database.Tag, error) GetAllModel() ([]tagdomain.Tag, error)
} }
func New( func New(