Skip to content

Commit e5a2f01

Browse files
committed
fix: enable livereload on error page too
1 parent f800fb9 commit e5a2f01

File tree

19 files changed

+222
-202
lines changed

19 files changed

+222
-202
lines changed

internal/auth/team_web.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func (h *webHandlers) addTeamHandlers(r *mux.Router) {
2626
func (h *webHandlers) newTeam(w http.ResponseWriter, r *http.Request) {
2727
org, err := decode.Param("organization_name", r)
2828
if err != nil {
29-
html.Error(w, err.Error(), http.StatusUnprocessableEntity)
29+
h.Error(w, err.Error(), http.StatusUnprocessableEntity)
3030
return
3131
}
3232

@@ -40,7 +40,7 @@ func (h *webHandlers) newTeam(w http.ResponseWriter, r *http.Request) {
4040
func (h *webHandlers) createTeam(w http.ResponseWriter, r *http.Request) {
4141
var opts CreateTeamOptions
4242
if err := decode.All(&opts, r); err != nil {
43-
html.Error(w, err.Error(), http.StatusUnprocessableEntity)
43+
h.Error(w, err.Error(), http.StatusUnprocessableEntity)
4444
return
4545
}
4646

@@ -51,7 +51,7 @@ func (h *webHandlers) createTeam(w http.ResponseWriter, r *http.Request) {
5151
return
5252
}
5353
if err != nil {
54-
html.Error(w, err.Error(), http.StatusInternalServerError)
54+
h.Error(w, err.Error(), http.StatusInternalServerError)
5555
return
5656
}
5757

@@ -62,18 +62,18 @@ func (h *webHandlers) createTeam(w http.ResponseWriter, r *http.Request) {
6262
func (h *webHandlers) getTeam(w http.ResponseWriter, r *http.Request) {
6363
teamID, err := decode.Param("team_id", r)
6464
if err != nil {
65-
html.Error(w, err.Error(), http.StatusUnprocessableEntity)
65+
h.Error(w, err.Error(), http.StatusUnprocessableEntity)
6666
return
6767
}
6868

6969
team, err := h.svc.GetTeamByID(r.Context(), teamID)
7070
if err != nil {
71-
html.Error(w, err.Error(), http.StatusInternalServerError)
71+
h.Error(w, err.Error(), http.StatusInternalServerError)
7272
return
7373
}
7474
members, err := h.svc.ListTeamMembers(r.Context(), teamID)
7575
if err != nil {
76-
html.Error(w, err.Error(), http.StatusInternalServerError)
76+
h.Error(w, err.Error(), http.StatusInternalServerError)
7777
return
7878
}
7979

@@ -82,14 +82,14 @@ func (h *webHandlers) getTeam(w http.ResponseWriter, r *http.Request) {
8282
// retrieve the list.
8383
subject, err := internal.SubjectFromContext(r.Context())
8484
if err != nil {
85-
html.Error(w, err.Error(), http.StatusInternalServerError)
85+
h.Error(w, err.Error(), http.StatusInternalServerError)
8686
return
8787
}
8888
var users []*User
8989
if subject.CanAccessSite(rbac.ListUsersAction) {
9090
users, err = h.svc.ListUsers(r.Context())
9191
if err != nil {
92-
html.Error(w, err.Error(), http.StatusInternalServerError)
92+
h.Error(w, err.Error(), http.StatusInternalServerError)
9393
return
9494
}
9595
}
@@ -119,13 +119,13 @@ func (h *webHandlers) updateTeam(w http.ResponseWriter, r *http.Request) {
119119
UpdateTeamOptions
120120
}
121121
if err := decode.All(&params, r); err != nil {
122-
html.Error(w, err.Error(), http.StatusUnprocessableEntity)
122+
h.Error(w, err.Error(), http.StatusUnprocessableEntity)
123123
return
124124
}
125125

126126
team, err := h.svc.UpdateTeam(r.Context(), params.TeamID, params.UpdateTeamOptions)
127127
if err != nil {
128-
html.Error(w, err.Error(), http.StatusInternalServerError)
128+
h.Error(w, err.Error(), http.StatusInternalServerError)
129129
return
130130
}
131131

@@ -136,13 +136,13 @@ func (h *webHandlers) updateTeam(w http.ResponseWriter, r *http.Request) {
136136
func (h *webHandlers) listTeams(w http.ResponseWriter, r *http.Request) {
137137
org, err := decode.Param("organization_name", r)
138138
if err != nil {
139-
html.Error(w, err.Error(), http.StatusUnprocessableEntity)
139+
h.Error(w, err.Error(), http.StatusUnprocessableEntity)
140140
return
141141
}
142142

143143
teams, err := h.svc.ListTeams(r.Context(), org)
144144
if err != nil {
145-
html.Error(w, err.Error(), http.StatusInternalServerError)
145+
h.Error(w, err.Error(), http.StatusInternalServerError)
146146
return
147147
}
148148

@@ -162,18 +162,18 @@ func (h *webHandlers) listTeams(w http.ResponseWriter, r *http.Request) {
162162
func (h *webHandlers) deleteTeam(w http.ResponseWriter, r *http.Request) {
163163
teamID, err := decode.Param("team_id", r)
164164
if err != nil {
165-
html.Error(w, err.Error(), http.StatusUnprocessableEntity)
165+
h.Error(w, err.Error(), http.StatusUnprocessableEntity)
166166
return
167167
}
168168

169169
team, err := h.svc.GetTeamByID(r.Context(), teamID)
170170
if err != nil {
171-
html.Error(w, err.Error(), http.StatusInternalServerError)
171+
h.Error(w, err.Error(), http.StatusInternalServerError)
172172
return
173173
}
174174
err = h.svc.DeleteTeam(r.Context(), teamID)
175175
if err != nil {
176-
html.Error(w, err.Error(), http.StatusInternalServerError)
176+
h.Error(w, err.Error(), http.StatusInternalServerError)
177177
return
178178
}
179179

@@ -184,12 +184,12 @@ func (h *webHandlers) deleteTeam(w http.ResponseWriter, r *http.Request) {
184184
func (h *webHandlers) addTeamMember(w http.ResponseWriter, r *http.Request) {
185185
var params TeamMembershipOptions
186186
if err := decode.All(&params, r); err != nil {
187-
html.Error(w, err.Error(), http.StatusUnprocessableEntity)
187+
h.Error(w, err.Error(), http.StatusUnprocessableEntity)
188188
return
189189
}
190190

191191
if err := h.svc.AddTeamMembership(r.Context(), params); err != nil {
192-
html.Error(w, err.Error(), http.StatusInternalServerError)
192+
h.Error(w, err.Error(), http.StatusInternalServerError)
193193
return
194194
}
195195

@@ -200,12 +200,12 @@ func (h *webHandlers) addTeamMember(w http.ResponseWriter, r *http.Request) {
200200
func (h *webHandlers) removeTeamMember(w http.ResponseWriter, r *http.Request) {
201201
var params TeamMembershipOptions
202202
if err := decode.All(&params, r); err != nil {
203-
html.Error(w, err.Error(), http.StatusUnprocessableEntity)
203+
h.Error(w, err.Error(), http.StatusUnprocessableEntity)
204204
return
205205
}
206206

207207
if err := h.svc.RemoveTeamMembership(r.Context(), params); err != nil {
208-
html.Error(w, err.Error(), http.StatusInternalServerError)
208+
h.Error(w, err.Error(), http.StatusInternalServerError)
209209
return
210210
}
211211

internal/auth/web.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ func (h *webHandlers) addHandlers(r *mux.Router) {
3333
func (h *webHandlers) listOrganizationUsers(w http.ResponseWriter, r *http.Request) {
3434
name, err := decode.Param("name", r)
3535
if err != nil {
36-
html.Error(w, err.Error(), http.StatusUnprocessableEntity)
36+
h.Error(w, err.Error(), http.StatusUnprocessableEntity)
3737
return
3838
}
3939

4040
users, err := h.svc.ListOrganizationUsers(r.Context(), name)
4141
if err != nil {
42-
html.Error(w, err.Error(), http.StatusInternalServerError)
42+
h.Error(w, err.Error(), http.StatusInternalServerError)
4343
return
4444
}
4545

@@ -55,7 +55,7 @@ func (h *webHandlers) listOrganizationUsers(w http.ResponseWriter, r *http.Reque
5555
func (h *webHandlers) profileHandler(w http.ResponseWriter, r *http.Request) {
5656
user, err := internal.SubjectFromContext(r.Context())
5757
if err != nil {
58-
html.Error(w, err.Error(), http.StatusInternalServerError)
58+
h.Error(w, err.Error(), http.StatusInternalServerError)
5959
return
6060
}
6161
h.Render("profile.tmpl", w, struct {

internal/authenticator/oauth_authenticator.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func (a *oauthAuthenticator) ResponseHandler(w http.ResponseWriter, r *http.Requ
3434

3535
client, err := a.NewClient(r.Context(), token)
3636
if err != nil {
37-
html.Error(w, err.Error(), http.StatusInternalServerError)
37+
html.Error(w, err.Error(), http.StatusInternalServerError, false)
3838
return
3939
}
4040

@@ -44,15 +44,15 @@ func (a *oauthAuthenticator) ResponseHandler(w http.ResponseWriter, r *http.Requ
4444
// Get cloud user
4545
cuser, err := client.GetUser(ctx)
4646
if err != nil {
47-
html.Error(w, err.Error(), http.StatusInternalServerError)
47+
html.Error(w, err.Error(), http.StatusInternalServerError, false)
4848
return
4949
}
5050

5151
err = a.StartSession(w, r, tokens.StartSessionOptions{
5252
Username: &cuser.Name,
5353
})
5454
if err != nil {
55-
html.Error(w, err.Error(), http.StatusInternalServerError)
55+
html.Error(w, err.Error(), http.StatusInternalServerError, false)
5656
return
5757
}
5858
}

internal/authenticator/oidc_authenticator.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,36 +88,36 @@ func (o oidcAuthenticator) ResponseHandler(w http.ResponseWriter, r *http.Reques
8888
// Extract the ID Token from OAuth2 token.
8989
rawIDToken, ok := token.Extra("id_token").(string)
9090
if !ok {
91-
html.Error(w, "id_token missing", http.StatusInternalServerError)
91+
html.Error(w, "id_token missing", http.StatusInternalServerError, false)
9292
return
9393
}
9494

9595
// Parse and verify ID Token payload.
9696
idt, err := o.verifier.Verify(r.Context(), rawIDToken)
9797
if err != nil {
98-
html.Error(w, err.Error(), http.StatusInternalServerError)
98+
html.Error(w, err.Error(), http.StatusInternalServerError, false)
9999
return
100100
}
101101

102102
// Extract custom claims
103103
var claims oidcClaims
104104
if err := idt.Claims(&claims); err != nil {
105-
html.Error(w, err.Error(), http.StatusInternalServerError)
105+
html.Error(w, err.Error(), http.StatusInternalServerError, false)
106106
return
107107
}
108108

109109
// Get claims user
110110
user, err := o.getUserFromClaims(claims)
111111
if err != nil {
112-
html.Error(w, err.Error(), http.StatusInternalServerError)
112+
html.Error(w, err.Error(), http.StatusInternalServerError, false)
113113
return
114114
}
115115

116116
err = o.StartSession(w, r, tokens.StartSessionOptions{
117117
Username: &user.Name,
118118
})
119119
if err != nil {
120-
html.Error(w, err.Error(), http.StatusInternalServerError)
120+
html.Error(w, err.Error(), http.StatusInternalServerError, false)
121121
return
122122
}
123123
}

internal/http/html/error.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const errorTemplateContent = `
1212
<meta charset="utf-8">
1313
<meta name="viewport" content="width=device-width, initial-scale=1">
1414
<title>error | otf</title>
15+
{{ if .DevMode }}<script src="http://localhost:35729/livereload.js"></script>{{ end }}
1516
<style>
1617
pre {
1718
margin: auto;
@@ -25,15 +26,21 @@ const errorTemplateContent = `
2526
</style>
2627
</head>
2728
<body>
28-
<pre>{{ . }}</pre>
29+
<pre>{{ .Error }}</pre>
2930
</body>
3031
</html>
3132
`
3233

3334
var errorTemplate = template.Must(template.New("error").Parse(errorTemplateContent))
3435

35-
func Error(w http.ResponseWriter, err string, code int) {
36+
func Error(w http.ResponseWriter, err string, code int, devMode bool) {
3637
w.WriteHeader(code)
3738

38-
errorTemplate.Execute(w, err)
39+
errorTemplate.Execute(w, struct {
40+
Error string
41+
DevMode bool
42+
}{
43+
Error: err,
44+
DevMode: devMode,
45+
})
3946
}

internal/http/html/renderer.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,20 @@ type (
3030
templateRenderer
3131
}
3232

33-
renderer struct {
34-
templateRenderer
35-
}
36-
3733
// pageRenderer renders an html page using the named template.
3834
pageRenderer interface {
3935
Render(name string, w http.ResponseWriter, page any)
4036
}
41-
// renderer locates and renders a template.
37+
38+
// templateRenderer locates and renders a template (a lower-level
39+
// alternative to pageRenderer for rendering partial content).
4240
templateRenderer interface {
4341
RenderTemplate(name string, w io.Writer, data any) error
42+
Error(w http.ResponseWriter, err string, code int)
43+
}
44+
45+
renderer struct {
46+
templateRenderer
4447
}
4548
)
4649

@@ -66,7 +69,7 @@ func (r *renderer) Render(name string, w http.ResponseWriter, page any) {
6669
// purge flash messages from cookie store prior to rendering template
6770
purgeFlashes(w)
6871
if err := r.RenderTemplate(name, w, page); err != nil {
69-
Error(w, err.Error(), http.StatusInternalServerError)
72+
r.Error(w, err.Error(), http.StatusInternalServerError)
7073
}
7174
}
7275

internal/http/html/renderer_dev.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package html
22

33
import (
44
"io"
5+
"net/http"
56
)
67

78
// devRenderer reads templates from disk. Intended for development purposes.
@@ -17,3 +18,7 @@ func (r *devRenderer) RenderTemplate(name string, w io.Writer, data any) error {
1718

1819
return renderTemplateFromCache(cache, name, w, data)
1920
}
21+
22+
func (r *devRenderer) Error(w http.ResponseWriter, err string, code int) {
23+
Error(w, err, code, true)
24+
}

internal/http/html/renderer_embedded.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package html
33
import (
44
"html/template"
55
"io"
6+
"net/http"
67
)
78

89
// embeddedRenderer renders templates embedded in the go bin. Uses cache for
@@ -29,3 +30,7 @@ func newEmbeddedRenderer() (*embeddedRenderer, error) {
2930
func (r *embeddedRenderer) RenderTemplate(name string, w io.Writer, data any) error {
3031
return renderTemplateFromCache(r.cache, name, w, data)
3132
}
33+
34+
func (r *embeddedRenderer) Error(w http.ResponseWriter, err string, code int) {
35+
Error(w, err, code, false)
36+
}

internal/logs/web.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (h *webHandlers) tailRun(w http.ResponseWriter, r *http.Request) {
4141
Offset int `schema:"offset,required"`
4242
}
4343
if err := decode.All(&params, r); err != nil {
44-
html.Error(w, err.Error(), http.StatusUnprocessableEntity)
44+
html.Error(w, err.Error(), http.StatusUnprocessableEntity, false)
4545
return
4646
}
4747

@@ -51,7 +51,7 @@ func (h *webHandlers) tailRun(w http.ResponseWriter, r *http.Request) {
5151
Offset: params.Offset,
5252
})
5353
if err != nil {
54-
html.Error(w, err.Error(), http.StatusInternalServerError)
54+
html.Error(w, err.Error(), http.StatusInternalServerError, false)
5555
return
5656
}
5757

0 commit comments

Comments
 (0)