uni/WEB43-diary/internal/routes/image.go

134 lines
3.1 KiB
Go

package routes
import (
"fmt"
"io"
"net/http"
"os"
"strconv"
"gitea.zokki.net/zokki/uni/web43-diary/context"
"gitea.zokki.net/zokki/uni/web43-diary/internal/database"
"gitea.zokki.net/zokki/uni/web43-diary/internal/models"
"gitea.zokki.net/zokki/uni/web43-diary/internal/session"
)
func createImage(writer http.ResponseWriter, req *http.Request) {
sess := session.GetSession(req)
currentUser := sess.GetUser()
if currentUser.ID <= 0 {
errorJson(writer, &models.HTTPError{
Message: "Sie müssen angemeldet sein",
Code: http.StatusUnauthorized,
})
return
}
title := req.FormValue("title")
if title == "" {
errorJson(writer, &models.HTTPError{
Message: "Titel darf nicht leer sein",
Code: http.StatusBadRequest,
})
return
}
// Parse the multipart form, with a max memory of 1GB
err := req.ParseMultipartForm(1 << 23)
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Parsen der Daten",
Code: http.StatusBadRequest,
Data: err,
})
return
}
// Retrieve the file from form data
file, handler, err := req.FormFile("file")
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Parsen vom Bild",
Code: http.StatusBadRequest,
Data: err,
})
return
}
defer file.Close()
image := &models.Image{
Owner: currentUser,
OwnerID: currentUser.ID,
Title: title,
Type: handler.Header.Get("Content-Type"),
}
insertedId, err := database.InsertInto(req.Context().(*context.Context), image)
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Einfügen des Bildes in die Datenbank",
Code: http.StatusInternalServerError,
Data: err,
})
}
image.ID = uint32(insertedId)
err = os.MkdirAll(image.Dir(), 0777)
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Erstellen vom Pfad auf dem Server",
Code: http.StatusInternalServerError,
Data: err,
})
return
}
dst, err := os.Create(image.Path())
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Erstellen der Datei auf dem Server",
Code: http.StatusInternalServerError,
Data: err,
})
return
}
defer dst.Close()
_, err = io.Copy(dst, file)
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Kopieren der Datei auf den Server",
Code: http.StatusInternalServerError,
Data: err,
})
return
}
fmt.Fprint(writer, image.ID)
}
func getImage(writer http.ResponseWriter, req *http.Request) {
idToGet, err := strconv.ParseUint(req.PathValue(ImageIDValue), 10, 32)
if err != nil || idToGet == 0 {
errorJson(writer, &models.HTTPError{
Message: "Malformed image ID",
Code: http.StatusBadRequest,
})
return
}
getID := uint32(idToGet)
image, err := database.GetOne(req.Context().(*context.Context), &models.Image{ID: getID})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Bild nicht gefunden",
Code: http.StatusNotFound,
Data: err,
})
return
}
writer.Header().Set("Content-Type", image.Type)
http.ServeFile(writer, req, image.Path())
}