diff --git a/internal/accessor/news/get_by_id.go b/internal/accessor/news/get_by_id.go new file mode 100644 index 0000000..6d1d1e7 --- /dev/null +++ b/internal/accessor/news/get_by_id.go @@ -0,0 +1,17 @@ +package newsrepository + +import newsdomain "legalgo-BE-go/internal/domain/news" + +func (a *accessor) GetByID(id string) (*newsdomain.News, error) { + var news newsdomain.News + + if err := a.db. + Preload("Tags"). + Preload("Categories"). + Preload("Author"). + First(&news, "id = ?", id).Error; err != nil { + return nil, err + } + + return &news, nil +} diff --git a/internal/accessor/news/impl.go b/internal/accessor/news/impl.go index f1f5945..dadaf07 100644 --- a/internal/accessor/news/impl.go +++ b/internal/accessor/news/impl.go @@ -12,6 +12,7 @@ type accessor struct { type News interface { GetAll(filter newsdomain.NewsFilter) ([]newsdomain.News, error) GetBySlug(string) (*newsdomain.News, error) + GetByID(string) (*newsdomain.News, error) Create(newsdomain.News) error Update(newsdomain.News) error Delete(string) error diff --git a/internal/api/http/news/get_by_id.go b/internal/api/http/news/get_by_id.go new file mode 100644 index 0000000..5d34a88 --- /dev/null +++ b/internal/api/http/news/get_by_id.go @@ -0,0 +1,77 @@ +package newshttp + +import ( + authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth" + logssvc "legalgo-BE-go/internal/services/logs" + newssvc "legalgo-BE-go/internal/services/news" + "legalgo-BE-go/internal/utilities/response" + "legalgo-BE-go/internal/utilities/utils" + "net/http" + + "github.com/go-chi/chi/v5" +) + +func GetByID( + router chi.Router, + newsSvc newssvc.News, + logSvc logssvc.Log, +) { + router.With(authmiddleware.Authorize()).Get("/staff/news/{id}", func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + id := chi.URLParam(r, "id") + + token, err := utils.GetToken(r) + if err != nil { + response.ResponseWithErrorCode( + ctx, + w, + err, + response.ErrBadRequest.Code, + response.ErrBadRequest.HttpCode, + err.Error(), + ) + return + } + + staffDetail, err := utils.DestructToken(token) + + if err != nil { + response.ResponseWithErrorCode( + ctx, + w, + err, + response.ErrBadRequest.Code, + response.ErrBadRequest.HttpCode, + err.Error(), + ) + return + } + + if staffDetail.Role != "staff" { + response.ResponseWithErrorCode( + ctx, + w, + err, + response.ErrUnauthorized.Code, + response.ErrUnauthorized.HttpCode, + "unauthorized", + ) + return + } + + news, err := newsSvc.GetByID(id) + 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 14f5e73..a43a89c 100644 --- a/internal/api/http/news/module.go +++ b/internal/api/http/news/module.go @@ -5,6 +5,7 @@ import "go.uber.org/fx" var Module = fx.Module("news", fx.Invoke( GetAll, GetBySlug, + GetByID, Create, Update, Delete, diff --git a/internal/services/news/get_by_id.go b/internal/services/news/get_by_id.go new file mode 100644 index 0000000..2abd7ee --- /dev/null +++ b/internal/services/news/get_by_id.go @@ -0,0 +1,7 @@ +package newssvc + +import newsdomain "legalgo-BE-go/internal/domain/news" + +func (i *impl) GetByID(id string) (*newsdomain.News, error) { + return i.newsRepo.GetByID(id) +} diff --git a/internal/services/news/impl.go b/internal/services/news/impl.go index 59054e8..a5626c6 100644 --- a/internal/services/news/impl.go +++ b/internal/services/news/impl.go @@ -18,6 +18,7 @@ type impl struct { type News interface { GetAll(filter newsdomain.Filter) ([]newsdomain.News, error) GetBySlug(string) (*newsdomain.News, error) + GetByID(string) (*newsdomain.News, error) Create(newsdomain.NewsReq, string) error Update(string, newsdomain.NewsUpdate) error Delete(string) error