11package handlers
22
33import (
4+ "database/sql"
5+ "fmt"
46 "log/slog"
57 "net/http"
8+ "time"
69
10+ "github.com/nicolashery/simply-shared-notes/app/db"
11+ "github.com/nicolashery/simply-shared-notes/app/forms"
12+ "github.com/nicolashery/simply-shared-notes/app/publicid"
13+ "github.com/nicolashery/simply-shared-notes/app/rctx"
14+ "github.com/nicolashery/simply-shared-notes/app/session"
715 "github.com/nicolashery/simply-shared-notes/app/views/pages"
816)
917
@@ -20,3 +28,83 @@ func handleNotesList(logger *slog.Logger) http.HandlerFunc {
2028 }
2129 }
2230}
31+
32+ func handleNotesNew (logger * slog.Logger ) http.HandlerFunc {
33+ return func (w http.ResponseWriter , r * http.Request ) {
34+ var form forms.CreateNote
35+
36+ err := pages .NotesNew (& form , forms .EmptyErrors ()).Render (r .Context (), w )
37+ if err != nil {
38+ logger .Error (
39+ "failed to render template" ,
40+ slog .Any ("error" , err ),
41+ slog .String ("template" , "NotesNew" ),
42+ )
43+ http .Error (w , "internal server error" , http .StatusInternalServerError )
44+ }
45+ }
46+ }
47+
48+ func handleNotesCreate (logger * slog.Logger , queries * db.Queries ) http.HandlerFunc {
49+ return func (w http.ResponseWriter , r * http.Request ) {
50+ form , errors := forms .ParseCreateNote (r )
51+ if errors != nil {
52+ w .WriteHeader (http .StatusUnprocessableEntity )
53+ err := pages .NotesNew (& form , errors ).Render (r .Context (), w )
54+ if err != nil {
55+ logger .Error (
56+ "failed to render template" ,
57+ slog .Any ("error" , err ),
58+ slog .String ("template" , "NotesNew" ),
59+ )
60+ http .Error (w , "internal server error" , http .StatusInternalServerError )
61+ }
62+ return
63+ }
64+
65+ notePublicID , err := publicid .Generate ()
66+ if err != nil {
67+ logger .Error ("error generating note public ID" , slog .Any ("error" , err ))
68+ http .Error (w , "error creating note" , http .StatusInternalServerError )
69+ return
70+ }
71+ identity := rctx .GetIdentity (r .Context ())
72+ space := rctx .GetSpace (r .Context ())
73+ now := time .Now ().UTC ()
74+
75+ note , err := queries .CreateNote (
76+ r .Context (),
77+ db.CreateNoteParams {
78+ CreatedAt : now ,
79+ UpdatedAt : now ,
80+ CreatedBy : sql.NullInt64 {Int64 : identity .Member .ID , Valid : true },
81+ UpdatedBy : sql.NullInt64 {Int64 : identity .Member .ID , Valid : true },
82+ SpaceID : space .ID ,
83+ PublicID : notePublicID ,
84+ Title : form .Title ,
85+ Content : form .Content ,
86+ },
87+ )
88+ if err != nil {
89+ logger .Error ("error creating note in database" , slog .Any ("error" , err ))
90+ http .Error (w , "error creating note" , http .StatusInternalServerError )
91+ return
92+ }
93+
94+ sess := rctx .GetSession (r .Context ())
95+ sess .AddFlash (session.FlashMessage {
96+ Type : session .FlashType_Info ,
97+ Content : fmt .Sprintf ("Created new note: %s" , note .Title ),
98+ })
99+ err = sess .Save (r , w )
100+ if err != nil {
101+ logger .Error ("failed to save session" , slog .Any ("error" , err ))
102+ http .Error (w , "internal server error" , http .StatusInternalServerError )
103+ return
104+ }
105+
106+ access := rctx .GetAccess (r .Context ())
107+
108+ http .Redirect (w , r , fmt .Sprintf ("/s/%s/notes" , access .Token ), http .StatusSeeOther )
109+ }
110+ }
0 commit comments