package image import ( "RenewCMS/api/pkg/apperr" "RenewCMS/api/pkg/claims" "RenewCMS/api/pkg/upload" domainArticle "RenewCMS/internal/domain/article" "RenewCMS/internal/infrastructure/useCases" "encoding/json" "errors" "net/http" "strconv" "github.com/go-chi/chi/v5" ) type Handler struct { CreateUseCase *useCases.CreateImageUseCase GetUseCase *useCases.GetArticleUseCase } func NewHandler(create *useCases.CreateImageUseCase, get *useCases.GetArticleUseCase) *Handler { return &Handler{ CreateUseCase: create, GetUseCase: get, } } func writeInternalServerError(w http.ResponseWriter) { http.Error(w, "Internal server error", http.StatusInternalServerError) } func writeArticleError(w http.ResponseWriter, err error) { if errors.Is(err, domainArticle.ErrArticleNotFound) { http.Error(w, apperr.ArticleNotFoundErrorMessage, http.StatusNotFound) return } writeInternalServerError(w) } func (h *Handler) PostLegacyArticleImage(w http.ResponseWriter, r *http.Request) { articleId, err := strconv.ParseUint(chi.URLParam(r, "id"), 10, 32) if err != nil { http.Error(w, apperr.IdUint32ErrorMessage, http.StatusBadRequest) return } if _, err := h.GetUseCase.GetArticle(uint32(articleId)); err != nil { writeArticleError(w, err) return } userId, _ := claims.UserId(r) input, closeFile, ok := upload.ReadImageInput(w, r, userId) if !ok { return } defer closeFile() newImage, err := h.CreateUseCase.CreateImage(input) if err != nil { upload.WriteCreateError(w, err) return } responseJson, err := json.Marshal(map[string]any{"id": newImage.ID, "location": newImage.Path}) if err != nil { writeInternalServerError(w) return } w.WriteHeader(http.StatusCreated) _, _ = w.Write(responseJson) }