134 lines
3.1 KiB
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())
|
|
}
|