111 lines
2.7 KiB
Go
111 lines
2.7 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"crypto/rand"
|
||
|
"encoding/hex"
|
||
|
"log/slog"
|
||
|
"net/http"
|
||
|
"strconv"
|
||
|
"sync"
|
||
|
|
||
|
"brainminder.speedtech.it/internal/database"
|
||
|
"brainminder.speedtech.it/internal/funcs"
|
||
|
"brainminder.speedtech.it/internal/smtp"
|
||
|
"brainminder.speedtech.it/models"
|
||
|
"github.com/gorilla/sessions"
|
||
|
)
|
||
|
|
||
|
type application struct {
|
||
|
config config
|
||
|
db *database.DB
|
||
|
logger *slog.Logger
|
||
|
mailer *smtp.Mailer
|
||
|
sessionStore *sessions.CookieStore
|
||
|
wg sync.WaitGroup
|
||
|
}
|
||
|
|
||
|
func (app *application) getCurrentNotebok_id(r *http.Request) int64 {
|
||
|
session, _ := app.sessionStore.Get(r, "session")
|
||
|
current_notebook_id := session.Values["current_notebook_id"]
|
||
|
var notebook_id int64 = -1
|
||
|
if current_notebook_id != nil {
|
||
|
notebook_id, _ = strconv.ParseInt(current_notebook_id.(string), 10, 64)
|
||
|
}
|
||
|
return notebook_id
|
||
|
}
|
||
|
|
||
|
func (app *application) saveSessionValue(w http.ResponseWriter, r *http.Request, name string, value any) {
|
||
|
session, err := app.sessionStore.Get(r, "sessions")
|
||
|
if err != nil {
|
||
|
app.serverError(w, r, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
session.Values[name] = value
|
||
|
|
||
|
err = session.Save(r, w)
|
||
|
if err != nil {
|
||
|
app.serverError(w, r, err)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (app *application) getSessionValue(w http.ResponseWriter, r *http.Request, name string) any {
|
||
|
session, err := app.sessionStore.Get(r, "sessions")
|
||
|
if err != nil {
|
||
|
app.serverError(w, r, err)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
if value, isMapContainsKey := session.Values[name]; isMapContainsKey {
|
||
|
return value
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (app *application) removeSessionValue(w http.ResponseWriter, r *http.Request, name string) {
|
||
|
session, err := app.sessionStore.Get(r, "sessions")
|
||
|
if err != nil {
|
||
|
app.serverError(w, r, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
delete(session.Values, name)
|
||
|
|
||
|
err = session.Save(r, w)
|
||
|
if err != nil {
|
||
|
app.serverError(w, r, err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (app *application) getCategoriesAsOptions() []funcs.WidgetOption {
|
||
|
categoryModel := &models.CategoryModel{DB: app.db}
|
||
|
return categoryModel.AllAsOptions()
|
||
|
}
|
||
|
|
||
|
func (app *application) getCategoriesAsMap() map[string]string {
|
||
|
categoryModel := &models.CategoryModel{DB: app.db}
|
||
|
return categoryModel.AllAsMap()
|
||
|
}
|
||
|
|
||
|
func (app *application) getTypesAsOptions(r *http.Request) []funcs.WidgetOption {
|
||
|
typeModel := &models.TypeModel{DB: app.db}
|
||
|
criteria := map[string]any{
|
||
|
"notebook_id": app.getCurrentNotebok_id(r),
|
||
|
}
|
||
|
return typeModel.FindAsOptions(criteria)
|
||
|
}
|
||
|
|
||
|
func (app *application) getNotebooksAsOptions() []funcs.WidgetOption {
|
||
|
notebookModel := &models.NotebookModel{DB: app.db}
|
||
|
return notebookModel.AllAsOptions(false)
|
||
|
}
|
||
|
|
||
|
func (app *application) generateSecureToken(length int) string {
|
||
|
b := make([]byte, length)
|
||
|
if _, err := rand.Read(b); err != nil {
|
||
|
return ""
|
||
|
}
|
||
|
return hex.EncodeToString(b)
|
||
|
}
|