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

260 lines
6.8 KiB
Go

package routes
import (
"fmt"
"net/http"
"slices"
"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 createDiary(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
}
markdown := req.FormValue("markdown")
if markdown == "" {
errorJson(writer, &models.HTTPError{
Message: "Markdown darf nicht leer sein",
Code: http.StatusBadRequest,
})
return
}
diary := &models.Diary{
Owner: currentUser,
OwnerID: currentUser.ID,
Title: title,
Content: markdown,
}
insertedId, err := database.InsertInto(req.Context().(*context.Context), diary)
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Einfügen vom Tagebucheintrag in die Datenbank",
Code: http.StatusInternalServerError,
Data: err,
})
}
diary.ID = uint32(insertedId)
tags := req.Form["tags"]
if len(tags) > 0 {
dbTags, err := database.GetAll(req.Context().(*context.Context), &models.Tag{})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Lesen von Tags aus der Datenbank",
Code: http.StatusInternalServerError,
Data: err,
})
}
for _, tag := range tags {
if slices.ContainsFunc(dbTags, func(t *models.Tag) bool { return t.Title == tag }) {
continue
}
tagId, err := database.InsertInto(req.Context().(*context.Context), &models.Tag{Title: tag})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Erstellen von Tag",
Code: http.StatusInternalServerError,
Data: err,
})
}
_, err = database.InsertInto(req.Context().(*context.Context), &models.DiaryTags{DiaryID: diary.ID, TagID: uint32(tagId)})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Erstellen von Tag",
Code: http.StatusInternalServerError,
Data: err,
})
}
}
}
http.Redirect(writer, req, fmt.Sprintf("/diary/%d", diary.ID), http.StatusSeeOther)
}
func updateDiary(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
}
idToGet, err := strconv.ParseUint(req.PathValue(DiaryIDValue), 10, 32)
if err != nil || idToGet == 0 {
errorJson(writer, &models.HTTPError{
Message: "Malformed Tagebuch ID",
Code: http.StatusBadRequest,
})
return
}
diary, err := database.GetOne(req.Context().(*context.Context), &models.Diary{ID: uint32(idToGet)})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Tagebucheintrag nicht gefunden",
Code: http.StatusBadRequest,
Data: err,
})
return
}
if diary.OwnerID != currentUser.ID && !currentUser.Role.IsAdminUser() {
errorJson(writer, &models.HTTPError{
Message: "Sie dürfen diesen Tagebucheintrag nicht bearbeiten",
Code: http.StatusUnauthorized,
})
return
}
title := req.FormValue("title")
if title == "" {
errorJson(writer, &models.HTTPError{
Message: "Titel darf nicht leer sein",
Code: http.StatusBadRequest,
})
return
}
markdown := req.FormValue("markdown")
if markdown == "" {
errorJson(writer, &models.HTTPError{
Message: "Markdown darf nicht leer sein",
Code: http.StatusBadRequest,
})
return
}
newDiary := &models.Diary{
Owner: currentUser,
OwnerID: currentUser.ID,
Title: title,
Content: markdown,
}
err = database.Update(req.Context().(*context.Context), diary, newDiary)
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Einfügen vom Tagebucheintrag in die Datenbank",
Code: http.StatusInternalServerError,
Data: err,
})
}
err = database.Delete(req.Context().(*context.Context), &models.DiaryTags{DiaryID: diary.ID})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim bearbeiten von Tags",
Code: http.StatusInternalServerError,
Data: err,
})
}
tags := req.Form["tags"]
if len(tags) > 0 {
dbTags, err := database.GetAll(req.Context().(*context.Context), &models.Tag{})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Lesen von Tags aus der Datenbank",
Code: http.StatusInternalServerError,
Data: err,
})
}
for _, tag := range tags {
index := slices.IndexFunc(dbTags, func(t *models.Tag) bool { return t.Title == tag })
if index >= 0 {
_, err = database.InsertInto(req.Context().(*context.Context), &models.DiaryTags{DiaryID: diary.ID, TagID: dbTags[index].ID})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Erstellen von Tag",
Code: http.StatusInternalServerError,
Data: err,
})
}
continue
}
tagId, err := database.InsertInto(req.Context().(*context.Context), &models.Tag{Title: tag})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Erstellen von Tag",
Code: http.StatusInternalServerError,
Data: err,
})
}
_, err = database.InsertInto(req.Context().(*context.Context), &models.DiaryTags{DiaryID: diary.ID, TagID: uint32(tagId)})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Erstellen von Tag",
Code: http.StatusInternalServerError,
Data: err,
})
}
}
}
http.Redirect(writer, req, fmt.Sprintf("/diary/%d", diary.ID), http.StatusSeeOther)
}
func deleteDiary(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
}
idToDelete, err := strconv.ParseUint(req.PathValue(DiaryIDValue), 10, 32)
if err != nil || idToDelete == 0 {
errorJson(writer, &models.HTTPError{
Message: "Malformed Tagebuch ID",
Code: http.StatusBadRequest,
})
return
}
err = database.Delete(req.Context().(*context.Context), &models.Diary{ID: uint32(idToDelete)})
if err != nil {
errorJson(writer, &models.HTTPError{
Message: "Fehler beim Löschen des Tagebucheintrags",
Code: http.StatusBadRequest,
Data: err,
})
return
}
}