Files
RenewCMS/api/handlers/story/storyHandler.go
T

89 lines
2.5 KiB
Go

package story
import (
"RenewCMS/api/pkg/access"
"RenewCMS/api/pkg/apperr"
"RenewCMS/api/pkg/articleerr"
"RenewCMS/internal/infrastructure/useCases"
"encoding/json"
"log"
"net/http"
"strconv"
"github.com/go-chi/chi/v5"
)
type Handler struct {
MoveUseCase *useCases.MoveStoryUseCase
DeleteUseCase *useCases.DeleteStoryUseCase
}
func NewHandler(move *useCases.MoveStoryUseCase, delete *useCases.DeleteStoryUseCase) *Handler {
return &Handler{MoveUseCase: move, DeleteUseCase: delete}
}
func parseStoryID(r *http.Request) (uint32, error) {
id, err := strconv.ParseUint(chi.URLParam(r, "story_id"), 10, 32)
return uint32(id), err
}
type moveRequest struct {
Site *string `json:"site"`
}
type moveResponse struct {
StoryID uint32 `json:"story_id"`
Site string `json:"site"`
SiteID uint32 `json:"site_id"`
ArticleIDs []uint32 `json:"article_ids"`
}
func (h *Handler) Move(w http.ResponseWriter, r *http.Request) {
id, err := parseStoryID(r)
if err != nil {
http.Error(w, apperr.IdUint32ErrorMessage, http.StatusBadRequest)
return
}
var request moveRequest
if err := json.NewDecoder(r.Body).Decode(&request); err != nil || request.Site == nil || *request.Site == "" {
http.Error(w, apperr.BodyErrorMessage, http.StatusBadRequest)
return
}
result, err := h.MoveUseCase.MoveStory(r.Context(), useCases.MoveStoryCommand{StoryID: id, SiteKey: *request.Site, Caller: access.CallerOf(r)})
if err != nil {
writeError(w, err, apperr.MoveStoryFailedErrorMessage)
return
}
body, err := json.Marshal(moveResponse{StoryID: result.StoryID, Site: result.Site.Key, SiteID: result.Site.ID, ArticleIDs: result.ArticleIDs})
if err != nil {
http.Error(w, "Failed to encode response", http.StatusInternalServerError)
return
}
if _, err := w.Write(body); err != nil {
log.Printf("Failed to write response: %v", err)
}
}
func (h *Handler) Delete(w http.ResponseWriter, r *http.Request) {
id, err := parseStoryID(r)
if err != nil {
http.Error(w, apperr.IdUint32ErrorMessage, http.StatusBadRequest)
return
}
if err := h.DeleteUseCase.DeleteStory(r.Context(), useCases.DeleteStoryCommand{StoryID: id, Caller: access.CallerOf(r)}); err != nil {
writeError(w, err, apperr.DeleteArticleFailedErrorMessage)
return
}
w.WriteHeader(http.StatusNoContent)
}
func writeError(w http.ResponseWriter, err error, failure string) {
if access.WriteIfMissingPermission(w, err) {
return
}
if articleerr.Write(w, err) {
return
}
http.Error(w, failure, http.StatusInternalServerError)
}