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) }