diff --git a/database/news_model.go b/database/news_model.go index 25e4f6a..64acb6e 100644 --- a/database/news_model.go +++ b/database/news_model.go @@ -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"` } diff --git a/internal/accessor/news/get_all.go b/internal/accessor/news/get_all.go index ee82cec..df7c3b5 100644 --- a/internal/accessor/news/get_all.go +++ b/internal/accessor/news/get_all.go @@ -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 } diff --git a/internal/accessor/news/get_by_slug.go b/internal/accessor/news/get_by_slug.go new file mode 100644 index 0000000..d336233 --- /dev/null +++ b/internal/accessor/news/get_by_slug.go @@ -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 +} diff --git a/internal/accessor/news/impl.go b/internal/accessor/news/impl.go index d7b7fba..da8f4b3 100644 --- a/internal/accessor/news/impl.go +++ b/internal/accessor/news/impl.go @@ -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 } diff --git a/internal/api/http/news/get_by_slug.go b/internal/api/http/news/get_by_slug.go new file mode 100644 index 0000000..69a3d19 --- /dev/null +++ b/internal/api/http/news/get_by_slug.go @@ -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) + }) +} diff --git a/internal/api/http/news/module.go b/internal/api/http/news/module.go index a239911..2756220 100644 --- a/internal/api/http/news/module.go +++ b/internal/api/http/news/module.go @@ -4,6 +4,7 @@ import "go.uber.org/fx" var Module = fx.Module("news", fx.Invoke( GetAll, + GetBySlug, Create, Delete, )) diff --git a/internal/domain/news/spec.go b/internal/domain/news/spec.go index e7fe2be..9d6dc13 100644 --- a/internal/domain/news/spec.go +++ b/internal/domain/news/spec.go @@ -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"` } diff --git a/internal/services/news/get_by_slug.go b/internal/services/news/get_by_slug.go new file mode 100644 index 0000000..fa3c05c --- /dev/null +++ b/internal/services/news/get_by_slug.go @@ -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) +} diff --git a/internal/services/news/impl.go b/internal/services/news/impl.go index c82579c..675e527 100644 --- a/internal/services/news/impl.go +++ b/internal/services/news/impl.go @@ -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 }