feat: get news by slug and and author detail

This commit is contained in:
ericprd 2025-03-06 11:06:06 +08:00
parent d217ec8a62
commit 85247643e6
9 changed files with 76 additions and 1 deletions

View File

@ -18,4 +18,6 @@ type News struct {
CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
DeletedAt time.Time `gorm:"default:null" json:"deleted_at"`
Author Staff `gorm:"foreignKey:AuthorID" json:"author"`
}

View File

@ -5,7 +5,11 @@ import newsdomain "legalgo-BE-go/internal/domain/news"
func (a *accessor) GetAll() ([]newsdomain.News, error) {
var news []newsdomain.News
if err := a.db.Preload("Tags").Preload("Categories").Find(&news).Error; err != nil {
if err := a.db.
Preload("Tags").
Preload("Categories").
Preload("Author").
Find(&news).Error; err != nil {
return nil, err
}

View File

@ -0,0 +1,17 @@
package newsrepository
import newsdomain "legalgo-BE-go/internal/domain/news"
func (a *accessor) GetBySlug(slug string) (*newsdomain.News, error) {
var news newsdomain.News
if err := a.db.
Preload("Tags").
Preload("Categories").
Preload("Author").
First(&news, "slug = ?", slug).Error; err != nil {
return nil, err
}
return &news, nil
}

View File

@ -11,6 +11,7 @@ type accessor struct {
type News interface {
GetAll() ([]newsdomain.News, error)
GetBySlug(string) (*newsdomain.News, error)
Create(newsdomain.News) error
Delete(string) error
}

View File

@ -0,0 +1,34 @@
package newshttp
import (
newssvc "legalgo-BE-go/internal/services/news"
"legalgo-BE-go/internal/utilities/response"
"net/http"
"github.com/go-chi/chi/v5"
)
func GetBySlug(
router chi.Router,
newsSvc newssvc.News,
) {
router.Get("/news/{slug}", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
slug := chi.URLParam(r, "slug")
news, err := newsSvc.GetBySlug(slug)
if err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
response.RespondJsonSuccess(ctx, w, news)
})
}

View File

@ -4,6 +4,7 @@ import "go.uber.org/fx"
var Module = fx.Module("news", fx.Invoke(
GetAll,
GetBySlug,
Create,
Delete,
))

View File

@ -16,6 +16,12 @@ type NewsReq struct {
LiveAt string `json:"live_at" validate:"required"`
}
type Staff struct {
ID string `json:"id"`
Name string `json:"name"`
ProfilePicture string `json:"profile_picture"`
}
type News struct {
ID string `json:"id" gorm:"primaryKey"`
Title string `json:"title"`
@ -29,4 +35,6 @@ type News struct {
LiveAt time.Time `json:"live_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Author Staff `json:"author"`
}

View File

@ -0,0 +1,7 @@
package newssvc
import newsdomain "legalgo-BE-go/internal/domain/news"
func (i *impl) GetBySlug(slug string) (*newsdomain.News, error) {
return i.newsRepo.GetBySlug(slug)
}

View File

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