Skip to content

Commit cc57197

Browse files
committed
Handle template render error
1 parent ae38388 commit cc57197

File tree

7 files changed

+140
-35
lines changed

7 files changed

+140
-35
lines changed

app/handlers/home.handlers.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
package handlers
22

33
import (
4+
"log/slog"
45
"net/http"
56

67
"github.com/nicolashery/simply-shared-notes/app/views/pages"
78
)
89

9-
func handleHome() http.HandlerFunc {
10+
func handleHome(logger *slog.Logger) http.HandlerFunc {
1011
return func(w http.ResponseWriter, r *http.Request) {
11-
pages.Home().Render(r.Context(), w)
12+
err := pages.Home().Render(r.Context(), w)
13+
if err != nil {
14+
logger.Error(
15+
"failed to render template",
16+
slog.Any("error", err),
17+
slog.String("template", "Home"),
18+
)
19+
http.Error(w, "internal server error", http.StatusInternalServerError)
20+
}
1221
}
1322
}

app/handlers/identity.handlers.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,23 @@ func handleIdentitySelect(logger *slog.Logger, queries *db.Queries) http.Handler
3333
return
3434
}
3535

36-
pages.IdentitySelect(members).Render(r.Context(), w)
36+
err = pages.IdentitySelect(members).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", "IdentitySelect"),
42+
)
43+
http.Error(w, "internal server error", http.StatusInternalServerError)
44+
}
3745
}
3846
}
3947

4048
type SelectIdentityForm struct {
4149
MemberPublicId string
4250
}
4351

44-
func parseSelectIdendityForm(r *http.Request, f *SelectIdentityForm) error {
52+
func parseSelectIdentityForm(r *http.Request, f *SelectIdentityForm) error {
4553
err := r.ParseForm()
4654
if err != nil {
4755
return err
@@ -61,7 +69,7 @@ func handleIdentitySet(logger *slog.Logger, queries *db.Queries, sessionStore *s
6169
}
6270

6371
var form SelectIdentityForm
64-
err := parseSelectIdendityForm(r, &form)
72+
err := parseSelectIdentityForm(r, &form)
6573
if err != nil {
6674
http.Error(w, "failed to parse form", http.StatusBadRequest)
6775
return

app/handlers/language.handlers.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
package handlers
22

33
import (
4+
"log/slog"
45
"net/http"
56

67
"github.com/nicolashery/simply-shared-notes/app/views/pages"
78
)
89

9-
func handleLanguageSelect() http.HandlerFunc {
10+
func handleLanguageSelect(logger *slog.Logger) http.HandlerFunc {
1011
return func(w http.ResponseWriter, r *http.Request) {
11-
pages.LanguageSelect().Render(r.Context(), w)
12+
err := pages.LanguageSelect().Render(r.Context(), w)
13+
if err != nil {
14+
logger.Error(
15+
"failed to render template",
16+
slog.Any("error", err),
17+
slog.String("template", "LanguageSelect"),
18+
)
19+
http.Error(w, "internal server error", http.StatusInternalServerError)
20+
}
1221
}
1322
}

app/handlers/members.handlers.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,36 @@
11
package handlers
22

33
import (
4+
"log/slog"
45
"net/http"
56

67
"github.com/nicolashery/simply-shared-notes/app/views/pages"
78
)
89

9-
func handleMembersList() http.HandlerFunc {
10+
func handleMembersList(logger *slog.Logger) http.HandlerFunc {
1011
return func(w http.ResponseWriter, r *http.Request) {
11-
pages.MembersList().Render(r.Context(), w)
12+
err := pages.MembersList().Render(r.Context(), w)
13+
if err != nil {
14+
logger.Error(
15+
"failed to render template",
16+
slog.Any("error", err),
17+
slog.String("template", "MembersList"),
18+
)
19+
http.Error(w, "internal server error", http.StatusInternalServerError)
20+
}
1221
}
1322
}
1423

15-
func handleMembersEdit() http.HandlerFunc {
24+
func handleMembersEdit(logger *slog.Logger) http.HandlerFunc {
1625
return func(w http.ResponseWriter, r *http.Request) {
17-
pages.MembersEdit().Render(r.Context(), w)
26+
err := pages.MembersEdit().Render(r.Context(), w)
27+
if err != nil {
28+
logger.Error(
29+
"failed to render template",
30+
slog.Any("error", err),
31+
slog.String("template", "MembersEdit"),
32+
)
33+
http.Error(w, "internal server error", http.StatusInternalServerError)
34+
}
1835
}
1936
}

app/handlers/notes.handlers.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
package handlers
22

33
import (
4+
"log/slog"
45
"net/http"
56

67
"github.com/nicolashery/simply-shared-notes/app/views/pages"
78
)
89

9-
func handleNotesList() http.HandlerFunc {
10+
func handleNotesList(logger *slog.Logger) http.HandlerFunc {
1011
return func(w http.ResponseWriter, r *http.Request) {
11-
pages.NotesList().Render(r.Context(), w)
12+
err := pages.NotesList().Render(r.Context(), w)
13+
if err != nil {
14+
logger.Error(
15+
"failed to render template",
16+
slog.Any("error", err),
17+
slog.String("template", "NotesList"),
18+
)
19+
http.Error(w, "internal server error", http.StatusInternalServerError)
20+
}
1221
}
1322
}

app/handlers/routes.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ import (
1212
)
1313

1414
func RegisterRoutes(r chi.Router, cfg *config.Config, logger *slog.Logger, sqlDB *sql.DB, queries *db.Queries, sessionStore *sessions.CookieStore) {
15-
r.Get("/", handleHome())
15+
r.Get("/", handleHome(logger))
1616

17-
r.Get("/new", handleSpacesNew(cfg))
17+
r.Get("/new", handleSpacesNew(cfg, logger))
1818
r.Post("/new", handleSpacesCreate(cfg, logger, sqlDB, queries, sessionStore))
1919

20-
r.Get("/language", handleLanguageSelect())
20+
r.Get("/language", handleLanguageSelect(logger))
2121

2222
r.Route("/s/{token}", func(r chi.Router) {
2323
r.Use(rctx.SpaceCtxMiddleware(queries))
@@ -31,17 +31,17 @@ func RegisterRoutes(r chi.Router, cfg *config.Config, logger *slog.Logger, sqlDB
3131
r.Use(rctx.IdentityCtxMiddleware(logger, sessionStore, queries))
3232
r.Use(rctx.FlashCtxMiddleware(logger, sessionStore))
3333

34-
r.Get("/", handleSpacesShow())
35-
r.Get("/settings", handleSpacesEdit())
34+
r.Get("/", handleSpacesShow(logger))
35+
r.Get("/settings", handleSpacesEdit(logger))
3636

37-
r.Get("/share", handleTokensShow())
37+
r.Get("/share", handleTokensShow(logger))
3838

39-
r.Get("/notes", handleNotesList())
39+
r.Get("/notes", handleNotesList(logger))
4040

41-
r.Get("/members", handleMembersList())
42-
r.Get("/members/{memberId}/edit", handleMembersEdit())
41+
r.Get("/members", handleMembersList(logger))
42+
r.Get("/members/{memberId}/edit", handleMembersEdit(logger))
4343

44-
r.Get("/activity", handleActivityList())
44+
r.Get("/activity", handleActivityList(logger))
4545
})
4646
})
4747
}

app/handlers/spaces.handlers.go

Lines changed: 65 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"github.com/nicolashery/simply-shared-notes/app/views/pages"
2020
)
2121

22-
func handleSpacesNew(cfg *config.Config) http.HandlerFunc {
22+
func handleSpacesNew(cfg *config.Config, logger *slog.Logger) http.HandlerFunc {
2323
return func(w http.ResponseWriter, r *http.Request) {
2424
requiresCode := cfg.RequiresInvitationCode()
2525

@@ -28,7 +28,15 @@ func handleSpacesNew(cfg *config.Config) http.HandlerFunc {
2828
form.Code = r.URL.Query().Get("code")
2929
}
3030

31-
pages.SpacesNew(requiresCode, &form, forms.EmptyErrors()).Render(r.Context(), w)
31+
err := pages.SpacesNew(requiresCode, &form, forms.EmptyErrors()).Render(r.Context(), w)
32+
if err != nil {
33+
logger.Error(
34+
"failed to render template",
35+
slog.Any("error", err),
36+
slog.String("template", "SpacesNew"),
37+
)
38+
http.Error(w, "internal server error", http.StatusInternalServerError)
39+
}
3240
}
3341
}
3442

@@ -39,7 +47,15 @@ func handleSpacesCreate(cfg *config.Config, logger *slog.Logger, sqlDB *sql.DB,
3947
form, errors := forms.ParseCreateSpace(r, requiresCode)
4048
if errors != nil {
4149
w.WriteHeader(http.StatusUnprocessableEntity)
42-
pages.SpacesNew(requiresCode, &form, errors).Render(r.Context(), w)
50+
err := pages.SpacesNew(requiresCode, &form, errors).Render(r.Context(), w)
51+
if err != nil {
52+
logger.Error(
53+
"failed to render template",
54+
slog.Any("error", err),
55+
slog.String("template", "SpacesNew"),
56+
)
57+
http.Error(w, "internal server error", http.StatusInternalServerError)
58+
}
4359
return
4460
}
4561

@@ -116,7 +132,12 @@ func createSpaceAndFirstMember(
116132
if err != nil {
117133
return nil, nil, err
118134
}
119-
defer tx.Rollback()
135+
defer func() {
136+
if rbErr := tx.Rollback(); rbErr != nil && err == nil {
137+
// Only overwrite main err if it's nil and rollback failed
138+
err = fmt.Errorf("tx rollback error: %w", rbErr)
139+
}
140+
}()
120141
qtx := queries.WithTx(tx)
121142

122143
space, err := qtx.CreateSpace(ctx, db.CreateSpaceParams{
@@ -169,19 +190,35 @@ func createSpaceAndFirstMember(
169190
return &space, &member, nil
170191
}
171192

172-
func handleSpacesShow() http.HandlerFunc {
193+
func handleSpacesShow(logger *slog.Logger) http.HandlerFunc {
173194
return func(w http.ResponseWriter, r *http.Request) {
174-
pages.SpacesShow().Render(r.Context(), w)
195+
err := pages.SpacesShow().Render(r.Context(), w)
196+
if err != nil {
197+
logger.Error(
198+
"failed to render template",
199+
slog.Any("error", err),
200+
slog.String("template", "SpacesShow"),
201+
)
202+
http.Error(w, "internal server error", http.StatusInternalServerError)
203+
}
175204
}
176205
}
177206

178-
func handleSpacesEdit() http.HandlerFunc {
207+
func handleSpacesEdit(logger *slog.Logger) http.HandlerFunc {
179208
return func(w http.ResponseWriter, r *http.Request) {
180-
pages.SpacesEdit().Render(r.Context(), w)
209+
err := pages.SpacesEdit().Render(r.Context(), w)
210+
if err != nil {
211+
logger.Error(
212+
"failed to render template",
213+
slog.Any("error", err),
214+
slog.String("template", "SpacesEdit"),
215+
)
216+
http.Error(w, "internal server error", http.StatusInternalServerError)
217+
}
181218
}
182219
}
183220

184-
func handleTokensShow() http.HandlerFunc {
221+
func handleTokensShow(logger *slog.Logger) http.HandlerFunc {
185222
return func(w http.ResponseWriter, r *http.Request) {
186223
space := rctx.GetSpace(r.Context())
187224
tokens := access.AccessTokens{
@@ -196,12 +233,28 @@ func handleTokensShow() http.HandlerFunc {
196233
}
197234
baseURL := scheme + "://" + r.Host
198235

199-
pages.TokensShow(baseURL, tokens).Render(r.Context(), w)
236+
err := pages.TokensShow(baseURL, tokens).Render(r.Context(), w)
237+
if err != nil {
238+
logger.Error(
239+
"failed to render template",
240+
slog.Any("error", err),
241+
slog.String("template", "TokensShow"),
242+
)
243+
http.Error(w, "internal server error", http.StatusInternalServerError)
244+
}
200245
}
201246
}
202247

203-
func handleActivityList() http.HandlerFunc {
248+
func handleActivityList(logger *slog.Logger) http.HandlerFunc {
204249
return func(w http.ResponseWriter, r *http.Request) {
205-
pages.ActivityList().Render(r.Context(), w)
250+
err := pages.ActivityList().Render(r.Context(), w)
251+
if err != nil {
252+
logger.Error(
253+
"failed to render template",
254+
slog.Any("error", err),
255+
slog.String("template", "ActivityList"),
256+
)
257+
http.Error(w, "internal server error", http.StatusInternalServerError)
258+
}
206259
}
207260
}

0 commit comments

Comments
 (0)