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 } func NewHandler(move *useCases.MoveStoryUseCase) *Handler { return &Handler{MoveUseCase: move} } 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 := strconv.ParseUint(chi.URLParam(r, "story_id"), 10, 32) 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: uint32(id), SiteKey: *request.Site, Caller: access.CallerOf(r)}) if err != nil { writeError(w, err) 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 writeError(w http.ResponseWriter, err error) { if access.WriteIfMissingPermission(w, err) { return } if articleerr.Write(w, err) { return } http.Error(w, "Failed to move story", http.StatusInternalServerError) }