260 lines
6.8 KiB
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
|
|
}
|
|
}
|