BrainMinder/cmd/web/quickbox_handlers.go

303 lines
8.2 KiB
Go
Raw Normal View History

2024-08-22 10:13:16 +02:00
package main
import (
"bytes"
"fmt"
"net/http"
"strconv"
"strings"
"brainminder.speedtech.it/internal/request"
"brainminder.speedtech.it/internal/response"
"brainminder.speedtech.it/internal/validator"
"brainminder.speedtech.it/models"
"github.com/alexedwards/flow"
)
type quicknoteForm struct {
2025-02-04 18:03:31 +01:00
Id int64 `form:"Id"`
Note string `form:"Note"`
NoteRendered string `form:"Note_rendered"`
Validator validator.Validator `form:"-"`
2024-08-22 10:13:16 +02:00
}
type quicknoteTransformForm struct {
2025-02-04 18:03:31 +01:00
Title string `form:"Title"`
TypeId int64 `form:"Type_id"`
Description string `form:"Description"`
Tags string `form:"Tags"`
Categories []string `form:"Categories"`
Notebooks []string `form:"Notebooks"`
KeepInQuickbox int `form:"Keep_in_quickbox"`
2024-08-22 10:13:16 +02:00
}
func (app *application) quickboxAll(w http.ResponseWriter, r *http.Request) {
var fullBuf = new(bytes.Buffer)
data := app.newTemplateData(r)
quicknoteModel := &models.QuicknoteModel{BaseModel: &models.BaseModel{DB: app.db}}
params := r.URL.Query()
2025-02-04 18:03:31 +01:00
offsetStr := params.Get("offset")
2024-08-22 10:13:16 +02:00
var offset int64 = 0
2025-02-04 18:03:31 +01:00
if len(offsetStr) == 0 {
2024-08-22 10:13:16 +02:00
offset = 0
} else {
2025-02-04 18:03:31 +01:00
offset, _ = strconv.ParseInt(offsetStr, 10, 64)
2024-08-22 10:13:16 +02:00
}
data["offset"] = offset
rows, _, _ := quicknoteModel.AllQB(offset)
data["quicknotes"] = rows
err := response.HXFragment(fullBuf, []string{"quickbox/list.tmpl"}, "quickbox:list", data)
if err != nil {
app.serverError(w, r, err)
}
fullBuf.WriteTo(w)
w.WriteHeader(http.StatusOK)
}
func (app *application) quickboxAdd(w http.ResponseWriter, r *http.Request) {
quicknoteModel := models.NewQuicknoteModel(app.db)
var fullBuf = new(bytes.Buffer)
2025-02-04 18:03:31 +01:00
var quicknoteId int64
2024-08-22 10:13:16 +02:00
data := app.newTemplateData(r)
var quicknoteFromForm quicknoteForm
err := request.DecodePostForm(r, &quicknoteFromForm)
if err != nil {
app.serverError(w, r, err)
}
quicknote := &models.Quicknote{
Note: quicknoteFromForm.Note,
}
2025-02-04 18:03:31 +01:00
quicknoteId, err = quicknoteModel.Create(quicknote)
2024-08-22 10:13:16 +02:00
if err != nil {
app.badRequest(w, err)
return
}
data["quicknote"] = quicknoteForm{
2025-02-04 18:03:31 +01:00
Id: quicknoteId,
Note: quicknote.Note,
NoteRendered: quicknote.NoteRendered,
2024-08-22 10:13:16 +02:00
}
err = response.HXFragment(fullBuf, []string{"quickbox/add.tmpl"}, "quickbox:add", data)
if err != nil {
app.serverError(w, r, err)
return
}
w.Header().Add("HX-Trigger", `{"quickboxNoteClear": ""}`)
fullBuf.WriteTo(w)
w.WriteHeader(http.StatusUnprocessableEntity)
}
func (app *application) quickboxTransform(w http.ResponseWriter, r *http.Request) {
quicknoteModel := models.NewQuicknoteModel(app.db)
2025-02-04 18:03:31 +01:00
quicknoteIdStr := flow.Param(r.Context(), "quicknote_id")
quicknoteId, _ := strconv.ParseInt(quicknoteIdStr, 10, 64)
quicknote, _, _ := quicknoteModel.One(quicknoteId)
2024-08-22 10:13:16 +02:00
data := app.newTemplateData(r)
var fullBuf = new(bytes.Buffer)
switch r.Method {
case http.MethodGet:
data["quicknote"] = quicknoteForm{
Id: quicknote.Id,
Note: quicknote.Note,
}
data["categories"] = app.getCategoriesAsOptions()
data["categoriesMap"] = app.getCategoriesAsMap()
data["types"] = app.getTypesAsOptions(r)
data["notebooks"] = app.getNotebooksAsOptions()
err := response.HXFragment(fullBuf, []string{"quickbox/transform.tmpl"}, "page:content", data)
if err != nil {
app.serverError(w, r, err)
}
w.Header().Add("HX-Trigger-After-Settle", `{"showModalDialog": ""}`)
2024-08-22 10:13:16 +02:00
fullBuf.WriteTo(w)
case http.MethodPost:
itemModel := models.NewItemModel(app.db)
var quicknoteTransformFromForm quicknoteTransformForm
err := request.DecodePostForm(r, &quicknoteTransformFromForm)
if err != nil {
app.serverError(w, r, err)
}
item := &models.Item{
2025-02-04 18:03:31 +01:00
TypeId: quicknoteTransformFromForm.TypeId,
2024-08-22 10:13:16 +02:00
Title: quicknoteTransformFromForm.Title,
Description: quicknoteTransformFromForm.Description,
Tags: quicknoteTransformFromForm.Tags,
}
2025-02-04 18:03:31 +01:00
notebookStr := strings.Join(quicknoteTransformFromForm.Notebooks, "|")
if len(notebookStr) > 0 {
notebookStr = "|" + notebookStr + "|"
2024-08-22 10:13:16 +02:00
}
2025-02-04 18:03:31 +01:00
item.Notebooks = notebookStr
2024-08-22 10:13:16 +02:00
2025-02-04 18:03:31 +01:00
categoriesStr := strings.Join(quicknoteTransformFromForm.Categories, "|")
if len(categoriesStr) > 0 {
categoriesStr = "|" + categoriesStr + "|"
2024-08-22 10:13:16 +02:00
}
2025-02-04 18:03:31 +01:00
item.Categories = categoriesStr
2024-08-22 10:13:16 +02:00
2025-02-04 18:03:31 +01:00
itemId, err := itemModel.Create(item)
item.Id = itemId
2024-08-22 10:13:16 +02:00
typeModel := &models.TypeModel{DB: app.db}
2025-02-04 18:03:31 +01:00
aType, _, _ := typeModel.One(item.TypeId)
item.TypeTitle = aType.Title
2024-08-22 10:13:16 +02:00
fieldModel := &models.FieldModel{DB: app.db}
2025-02-04 18:03:31 +01:00
var fields, _, _ = fieldModel.ByType(item.TypeId)
2024-08-22 10:13:16 +02:00
fieldsValues := make(map[int64]map[int]string)
itemModel.SaveKeywords(item, &fields, fieldsValues)
if err != nil {
app.badRequest(w, err)
return
}
data["messageType"] = "success"
data["messageContent"] = "Quicknote transformed successfully"
err = response.HXFragment(fullBuf, []string{"partials/message.tmpl"}, "message", data)
if err != nil {
app.serverError(w, r, err)
}
2025-02-04 18:03:31 +01:00
triggerResponse := fmt.Sprintf(`{"closeQuickboxTransformModal":{"quickNoteId": "%d", "keepQuickNote": "%d"}}`, quicknoteId, quicknoteTransformFromForm.KeepInQuickbox)
2024-12-20 18:08:51 +01:00
w.Header().Add("HX-Trigger-After-Settle", triggerResponse)
2024-08-22 10:13:16 +02:00
fullBuf.WriteTo(w)
w.WriteHeader(http.StatusUnprocessableEntity)
}
}
func (app *application) quickboxUpdate(w http.ResponseWriter, r *http.Request) {
quicknoteModel := models.NewQuicknoteModel(app.db)
2025-02-04 18:03:31 +01:00
quicknoteIdStr := flow.Param(r.Context(), "quicknote_id")
quicknoteId, _ := strconv.ParseInt(quicknoteIdStr, 10, 64)
quicknote, _, _ := quicknoteModel.One(quicknoteId)
2024-08-22 10:13:16 +02:00
data := app.newTemplateData(r)
2025-02-04 18:03:31 +01:00
data["formAction"] = "/quicknote/update/" + quicknoteIdStr
2024-08-22 10:13:16 +02:00
data["formTarget"] = "#message"
data["messageType"] = ""
data["messageContent"] = ""
var fullBuf = new(bytes.Buffer)
switch r.Method {
case http.MethodGet:
data["quicknote"] = quicknoteForm{
Id: quicknote.Id,
Note: quicknote.Note,
}
if r.Header.Get("HX-Request") == "true" {
buf, err := response.Fragment([]string{"quicknotes/form.tmpl", "partials/message.tmpl"}, "page:content", data)
if err != nil {
app.serverError(w, r, err)
}
fullBuf.Write(buf.Bytes())
fullBuf.WriteString("<div hx-swap-oob=\"true\" id=\"page-title\">")
buf, err = response.Fragment([]string{"quicknotes/update_title.tmpl"}, "page:title", data)
if err != nil {
app.serverError(w, r, err)
}
fullBuf.Write(buf.Bytes())
fullBuf.WriteString("</div>")
fullBuf.WriteTo(w)
} else {
err := response.Page(w, http.StatusOK, data, []string{"quicknotes/update_title.tmpl", "quicknotes/form.tmpl", "partials/message.tmpl"})
if err != nil {
app.serverError(w, r, err)
}
}
case http.MethodPost:
var quicknoteFromForm quicknoteForm
err := request.DecodePostForm(r, &quicknoteFromForm)
if err != nil {
app.serverError(w, r, err)
}
quicknote.Note = quicknoteFromForm.Note
err = quicknoteModel.Update(quicknote)
if err != nil {
app.badRequest(w, err)
return
}
data["quicknote"] = quicknoteForm{
Id: quicknote.Id,
Note: quicknote.Note,
}
data["messageType"] = "success"
data["messageContent"] = "Quicknote saved successfully"
buf, err := response.Fragment([]string{"partials/message.tmpl"}, "message", data)
if err != nil {
app.serverError(w, r, err)
}
fullBuf.Write(buf.Bytes())
fullBuf.WriteString("<div hx-swap-oob=\"true\" id=\"page-title\">")
buf, err = response.Fragment([]string{"quicknotes/update_title.tmpl"}, "page:title", data)
if err != nil {
app.serverError(w, r, err)
}
fullBuf.Write(buf.Bytes())
fullBuf.WriteString("</div>")
fullBuf.WriteString("<div hx-swap-oob=\"true\" id=\"current_quicknote_id\">")
buf, err = response.Fragment([]string{"partials/quicknotes-list.tmpl"}, "partial:quicknotes-list", data)
if err != nil {
app.serverError(w, r, err)
}
fullBuf.Write(buf.Bytes())
fullBuf.WriteString("</div>")
fullBuf.WriteTo(w)
w.WriteHeader(http.StatusUnprocessableEntity)
}
}
func (app *application) quickboxDelete(w http.ResponseWriter, r *http.Request) {
quicknoteModel := models.NewQuicknoteModel(app.db)
2025-02-04 18:03:31 +01:00
quicknoteIdStr := flow.Param(r.Context(), "quicknote_id")
quicknoteId, _ := strconv.ParseInt(quicknoteIdStr, 10, 64)
2024-08-22 10:13:16 +02:00
2025-02-04 18:03:31 +01:00
_, err := quicknoteModel.Delete(quicknoteId)
2024-08-22 10:13:16 +02:00
if err != nil {
app.serverError(w, r, err)
}
}