90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
package image
|
|
|
|
import (
|
|
"RenewCMS/api/pkg/apperr"
|
|
domainArticle "RenewCMS/internal/domain/article"
|
|
domainImage "RenewCMS/internal/domain/image"
|
|
"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
|
|
UpdateUseCase *useCases.UpdateArticleUseCase
|
|
}
|
|
|
|
func NewHandler(create *useCases.CreateImageUseCase, get *useCases.GetArticleUseCase, update *useCases.UpdateArticleUseCase) *Handler {
|
|
return &Handler{
|
|
CreateUseCase: create,
|
|
GetUseCase: get,
|
|
UpdateUseCase: update,
|
|
}
|
|
}
|
|
|
|
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) PostImage(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
|
|
}
|
|
|
|
file, fileHeader, err := r.FormFile("file")
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
newImage, err := h.CreateUseCase.CreateImage(domainImage.ImageInput{
|
|
Content: file,
|
|
Filename: fileHeader.Filename,
|
|
Size: fileHeader.Size,
|
|
ContentType: fileHeader.Header.Get("Content-Type"),
|
|
})
|
|
if err != nil {
|
|
if errors.Is(err, domainImage.ErrImageTypeNotAllowed) || errors.Is(err, domainImage.ErrImageTooLarge) {
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
writeInternalServerError(w)
|
|
return
|
|
}
|
|
|
|
if err := h.UpdateUseCase.AddImage(uint32(articleId), newImage.ID); err != nil {
|
|
writeArticleError(w, err)
|
|
return
|
|
}
|
|
|
|
responseJson, err := json.Marshal(map[string]any{"location": newImage.Path})
|
|
if err != nil {
|
|
writeInternalServerError(w)
|
|
return
|
|
}
|
|
|
|
w.WriteHeader(http.StatusCreated)
|
|
_, _ = w.Write(responseJson)
|
|
}
|