Skip to content

Commit 158ccdb

Browse files
committed
Space settings
1 parent 31f5743 commit 158ccdb

File tree

9 files changed

+252
-19
lines changed

9 files changed

+252
-19
lines changed

app/db/spaces.queries.sql.go

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/forms/spaces.forms.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@ type CreateSpace struct {
1414
Code string `zog:"code"`
1515
}
1616

17+
var spaceNameSchema = z.String().Trim().Required().Max(255)
18+
1719
func createSpaceSchema(requiresCode bool) *z.StructSchema {
1820
codeSchema := z.String().Trim()
1921
if requiresCode {
2022
codeSchema = codeSchema.Required()
2123
}
2224

2325
return z.Struct(z.Shape{
24-
"name": z.String().Trim().Required().Max(255),
26+
"name": spaceNameSchema,
2527
"identity": z.String().Trim().Required().Max(255),
2628
"email": z.String().Trim().Required().Email().Max(255),
2729
"code": codeSchema,
@@ -41,3 +43,21 @@ func ParseCreateSpace(r *http.Request, requiresCode bool) (CreateSpace, map[stri
4143

4244
return form, z.Issues.SanitizeMap(errs)
4345
}
46+
47+
type UpdateSpace struct {
48+
Name string `zog:"name"`
49+
}
50+
51+
var updateSpaceSchema = z.Struct(z.Shape{
52+
"name": spaceNameSchema,
53+
})
54+
55+
func ParseUpdateSpace(r *http.Request) (UpdateSpace, map[string][]string) {
56+
var form UpdateSpace
57+
errs := updateSpaceSchema.Parse(zhttp.Request(r), &form)
58+
if errs == nil {
59+
return form, nil
60+
}
61+
62+
return form, z.Issues.SanitizeMap(errs)
63+
}

app/handlers/routes.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ func RegisterRoutes(r chi.Router, cfg *config.Config, logger *slog.Logger, sqlDB
3333

3434
r.Get("/", handleSpacesShow(logger))
3535
r.Get("/settings", handleSpacesEdit(logger))
36+
r.Post("/settings", handleSpacesUpdate(logger, queries, sessionStore))
3637

3738
r.Get("/share", handleTokensShow(logger))
3839

app/handlers/spaces.handlers.go

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,11 @@ func handleSpacesCreate(cfg *config.Config, logger *slog.Logger, sqlDB *sql.DB,
101101
http.Error(w, "internal server error", http.StatusInternalServerError)
102102
return
103103
}
104-
105104
sess.Values[session.IdentityKey] = member.ID
106105
sess.AddFlash(session.FlashMessage{
107106
Type: session.FlashType_Info,
108107
Content: fmt.Sprintf("%s, welcome to the space %s!", member.Name, space.Name),
109108
})
110-
111109
err = sess.Save(r, w)
112110
if err != nil {
113111
logger.Error("failed to save session", slog.Any("error", err))
@@ -206,7 +204,12 @@ func handleSpacesShow(logger *slog.Logger) http.HandlerFunc {
206204

207205
func handleSpacesEdit(logger *slog.Logger) http.HandlerFunc {
208206
return func(w http.ResponseWriter, r *http.Request) {
209-
err := pages.SpacesEdit().Render(r.Context(), w)
207+
space := rctx.GetSpace(r.Context())
208+
form := forms.UpdateSpace{
209+
Name: space.Name,
210+
}
211+
212+
err := pages.SpacesEdit(&form, forms.EmptyErrors()).Render(r.Context(), w)
210213
if err != nil {
211214
logger.Error(
212215
"failed to render template",
@@ -218,6 +221,63 @@ func handleSpacesEdit(logger *slog.Logger) http.HandlerFunc {
218221
}
219222
}
220223

224+
func handleSpacesUpdate(logger *slog.Logger, queries *db.Queries, sessionStore *sessions.CookieStore) http.HandlerFunc {
225+
return func(w http.ResponseWriter, r *http.Request) {
226+
form, errors := forms.ParseUpdateSpace(r)
227+
if errors != nil {
228+
w.WriteHeader(http.StatusUnprocessableEntity)
229+
err := pages.SpacesEdit(&form, errors).Render(r.Context(), w)
230+
if err != nil {
231+
logger.Error(
232+
"failed to render template",
233+
slog.Any("error", err),
234+
slog.String("template", "SpacesEdit"),
235+
)
236+
http.Error(w, "internal server error", http.StatusInternalServerError)
237+
}
238+
return
239+
}
240+
241+
now := time.Now().UTC()
242+
identity := rctx.GetIdentity(r.Context())
243+
space := rctx.GetSpace(r.Context())
244+
err := queries.UpdateSpace(
245+
r.Context(),
246+
db.UpdateSpaceParams{
247+
UpdatedAt: now,
248+
UpdatedBy: sql.NullInt64{Int64: identity.Member.ID, Valid: true},
249+
Name: form.Name,
250+
SpaceID: space.ID,
251+
},
252+
)
253+
if err != nil {
254+
logger.Error("error creating space and first member in database", slog.Any("error", err))
255+
http.Error(w, "error creating space", http.StatusInternalServerError)
256+
return
257+
}
258+
259+
sess, err := sessionStore.Get(r, session.CookieName)
260+
if err != nil {
261+
logger.Error("failed to get session", slog.Any("error", err))
262+
http.Error(w, "internal server error", http.StatusInternalServerError)
263+
return
264+
}
265+
sess.AddFlash(session.FlashMessage{
266+
Type: session.FlashType_Success,
267+
Content: fmt.Sprintf("%s updated successfully.", space.Name),
268+
})
269+
err = sess.Save(r, w)
270+
if err != nil {
271+
logger.Error("failed to save session", slog.Any("error", err))
272+
http.Error(w, "internal server error", http.StatusInternalServerError)
273+
return
274+
}
275+
276+
access := rctx.GetAccess(r.Context())
277+
http.Redirect(w, r, fmt.Sprintf("/s/%s/settings", access.Token), http.StatusSeeOther)
278+
}
279+
}
280+
221281
func handleTokensShow(logger *slog.Logger) http.HandlerFunc {
222282
return func(w http.ResponseWriter, r *http.Request) {
223283
space := rctx.GetSpace(r.Context())
Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,45 @@
11
package pages
22

3-
import "github.com/nicolashery/simply-shared-notes/app/views/layouts"
3+
import (
4+
"fmt"
5+
"github.com/nicolashery/simply-shared-notes/app/forms"
6+
"github.com/nicolashery/simply-shared-notes/app/rctx"
7+
"github.com/nicolashery/simply-shared-notes/app/views/layouts"
8+
)
49

5-
templ SpacesEdit() {
10+
templ SpacesEdit(form *forms.UpdateSpace, errors forms.Errors) {
11+
{{ access := rctx.GetAccess(ctx) }}
612
@layouts.Space() {
7-
<div>Settings</div>
13+
<div>
14+
<h1 class="text-2xl font-bold mb-4">Space settings</h1>
15+
<form
16+
method="POST"
17+
action={ templ.URL(fmt.Sprintf("/s/%s/settings", access.Token)) }
18+
class="flex flex-col gap-4"
19+
>
20+
<fieldset class="flex flex-col gap-1.5">
21+
<label for="name" class="text-sm font-semibold">Name</label>
22+
<input
23+
type="text"
24+
name="name"
25+
id="name"
26+
value={ form.Name }
27+
class={ "input w-full", templ.KV("input-error", forms.HasError(errors, "name")) }
28+
/>
29+
for _, e := range forms.GetErrors(errors, "name") {
30+
<p class="text-sm text-error">
31+
{ e }
32+
</p>
33+
}
34+
</fieldset>
35+
<div class="flex items-center gap-4 mt-4">
36+
<button type="submit" class="btn btn-primary">Save</button>
37+
<a
38+
href={ templ.URL(fmt.Sprintf("/s/%s/settings", access.Token)) }
39+
class="btn btn-soft"
40+
>Reset</a>
41+
</div>
42+
</form>
43+
</div>
844
}
945
}

app/views/pages/spaces_edit.page_templ.go

Lines changed: 85 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/views/pages/tokens_show.page.templ

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ import (
99
templ TokensShow(baseURL string, tokens access.AccessTokens) {
1010
@layouts.Space() {
1111
<div>
12-
<h1 class="text-2xl font-bold mb-1.5">Share space</h1>
13-
<p class="mb-4 text-sm opacity-60">
14-
Share these links to give friends and collaborators access to this space and all its notes.
15-
Each access link grants different permissions to this space.
16-
</p>
12+
<div class="mb-4">
13+
<h1 class="text-2xl font-bold mb-1.5">Share space</h1>
14+
<p class="text-sm opacity-60">
15+
Share these links to give friends and collaborators access to this space and all its notes.
16+
Each access link grants different permissions to this space.
17+
</p>
18+
</div>
1719
<div class="flex flex-col gap-4">
1820
<fieldset class="flex flex-col gap-1.5">
1921
<label for="admin" class="text-sm font-semibold">Admin</label>

app/views/pages/tokens_show.page_templ.go

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sql/queries/spaces.queries.sql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,10 @@ UPDATE spaces
2929
SET created_by = @created_by,
3030
updated_by = @created_by
3131
WHERE id = @space_id;
32+
33+
-- name: UpdateSpace :exec
34+
UPDATE spaces
35+
SET updated_at = @updated_at,
36+
updated_by = @updated_by,
37+
name = @name
38+
WHERE id = @space_id;

0 commit comments

Comments
 (0)