Skip to content

Commit be883b8

Browse files
committed
Created updated at by
1 parent 5370798 commit be883b8

15 files changed

+476
-147
lines changed

app/handlers/helpers.handlers.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,14 @@ func collectCreatedUpdatedByIDsFromMembers(members []db.Member) []int64 {
9393
return ids
9494
}
9595

96-
func collectCreatedUpdatedByIDsFromSpaces(spaces []db.Space) []int64 {
96+
func collectCreatedUpdatedByIDsFromSpace(space *db.Space) []int64 {
9797
idSet := make(map[int64]bool)
9898

99-
for _, space := range spaces {
100-
if space.CreatedBy.Valid {
101-
idSet[space.CreatedBy.Int64] = true
102-
}
103-
if space.UpdatedBy.Valid {
104-
idSet[space.UpdatedBy.Int64] = true
105-
}
99+
if space.CreatedBy.Valid {
100+
idSet[space.CreatedBy.Int64] = true
101+
}
102+
if space.UpdatedBy.Valid {
103+
idSet[space.UpdatedBy.Int64] = true
106104
}
107105

108106
ids := make([]int64, 0, len(idSet))

app/handlers/members.handlers.go

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,31 @@ func handleMembersCreate(logger *slog.Logger, queries *db.Queries) http.HandlerF
120120
}
121121
}
122122

123-
func handleMembersEdit(logger *slog.Logger) http.HandlerFunc {
123+
func handleMembersEdit(logger *slog.Logger, queries *db.Queries) http.HandlerFunc {
124124
return func(w http.ResponseWriter, r *http.Request) {
125125
member := rctx.GetMember(r.Context())
126126
form := forms.UpdateMember{
127127
Name: member.Name,
128128
}
129129

130-
err := pages.MembersEdit(&form, forms.EmptyErrors()).Render(r.Context(), w)
130+
space := rctx.GetSpace(r.Context())
131+
memberIDs := collectCreatedUpdatedByIDsFromMembers([]db.Member{*member})
132+
members, err := queries.ListMembersByIDs(r.Context(), db.ListMembersByIDsParams{
133+
SpaceID: space.ID,
134+
MemberIds: memberIDs,
135+
})
136+
if err != nil {
137+
logger.Error(
138+
"error getting members from database",
139+
slog.Any("error", err),
140+
slog.Int64("space_id", space.ID),
141+
)
142+
http.Error(w, "internal server err", http.StatusInternalServerError)
143+
return
144+
}
145+
membersByID := memberListToMap(members)
146+
147+
err = pages.MembersEdit(&form, forms.EmptyErrors(), membersByID).Render(r.Context(), w)
131148
if err != nil {
132149
logger.Error(
133150
"failed to render template",
@@ -143,8 +160,26 @@ func handleMembersUpdate(logger *slog.Logger, queries *db.Queries) http.HandlerF
143160
return func(w http.ResponseWriter, r *http.Request) {
144161
form, errors := forms.ParseUpdateMember(r)
145162
if errors != nil {
163+
space := rctx.GetSpace(r.Context())
164+
member := rctx.GetMember(r.Context())
165+
memberIDs := collectCreatedUpdatedByIDsFromMembers([]db.Member{*member})
166+
members, err := queries.ListMembersByIDs(r.Context(), db.ListMembersByIDsParams{
167+
SpaceID: space.ID,
168+
MemberIds: memberIDs,
169+
})
170+
if err != nil {
171+
logger.Error(
172+
"error getting members from database",
173+
slog.Any("error", err),
174+
slog.Int64("space_id", space.ID),
175+
)
176+
http.Error(w, "internal server err", http.StatusInternalServerError)
177+
return
178+
}
179+
membersByID := memberListToMap(members)
180+
146181
w.WriteHeader(http.StatusUnprocessableEntity)
147-
err := pages.MembersEdit(&form, errors).Render(r.Context(), w)
182+
err = pages.MembersEdit(&form, errors, membersByID).Render(r.Context(), w)
148183
if err != nil {
149184
logger.Error(
150185
"failed to render template",

app/handlers/notes.handlers.go

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,18 @@ func handleNotesList(logger *slog.Logger, queries *db.Queries) http.HandlerFunc
3535
SpaceID: space.ID,
3636
MemberIds: memberIDs,
3737
})
38-
memberByIDs := memberListToMap(members)
38+
if err != nil {
39+
logger.Error(
40+
"error getting members from database",
41+
slog.Any("error", err),
42+
slog.Int64("space_id", space.ID),
43+
)
44+
http.Error(w, "internal server err", http.StatusInternalServerError)
45+
return
46+
}
47+
membersByID := memberListToMap(members)
3948

40-
err = pages.NotesList(notes, memberByIDs).Render(r.Context(), w)
49+
err = pages.NotesList(notes, membersByID).Render(r.Context(), w)
4150
if err != nil {
4251
logger.Error(
4352
"failed to render template",
@@ -151,15 +160,32 @@ func handleNotesShow(logger *slog.Logger) http.HandlerFunc {
151160
}
152161
}
153162

154-
func handleNotesEdit(logger *slog.Logger) http.HandlerFunc {
163+
func handleNotesEdit(logger *slog.Logger, queries *db.Queries) http.HandlerFunc {
155164
return func(w http.ResponseWriter, r *http.Request) {
156165
note := rctx.GetNote(r.Context())
157166
form := forms.UpdateNote{
158167
Title: note.Title,
159168
Content: note.Content,
160169
}
161170

162-
err := pages.NotesEdit(&form, forms.EmptyErrors()).Render(r.Context(), w)
171+
space := rctx.GetSpace(r.Context())
172+
memberIDs := collectCreatedUpdatedByIDsFromNotes([]db.Note{*note})
173+
members, err := queries.ListMembersByIDs(r.Context(), db.ListMembersByIDsParams{
174+
SpaceID: space.ID,
175+
MemberIds: memberIDs,
176+
})
177+
if err != nil {
178+
logger.Error(
179+
"error getting members from database",
180+
slog.Any("error", err),
181+
slog.Int64("space_id", space.ID),
182+
)
183+
http.Error(w, "internal server err", http.StatusInternalServerError)
184+
return
185+
}
186+
membersByID := memberListToMap(members)
187+
188+
err = pages.NotesEdit(&form, forms.EmptyErrors(), membersByID).Render(r.Context(), w)
163189
if err != nil {
164190
logger.Error(
165191
"failed to render template",
@@ -175,8 +201,26 @@ func handleNotesUpdate(logger *slog.Logger, queries *db.Queries) http.HandlerFun
175201
return func(w http.ResponseWriter, r *http.Request) {
176202
form, errors := forms.ParseUpdateNote(r)
177203
if errors != nil {
204+
space := rctx.GetSpace(r.Context())
205+
note := rctx.GetNote(r.Context())
206+
memberIDs := collectCreatedUpdatedByIDsFromNotes([]db.Note{*note})
207+
members, err := queries.ListMembersByIDs(r.Context(), db.ListMembersByIDsParams{
208+
SpaceID: space.ID,
209+
MemberIds: memberIDs,
210+
})
211+
if err != nil {
212+
logger.Error(
213+
"error getting members from database",
214+
slog.Any("error", err),
215+
slog.Int64("space_id", space.ID),
216+
)
217+
http.Error(w, "internal server err", http.StatusInternalServerError)
218+
return
219+
}
220+
membersByID := memberListToMap(members)
221+
178222
w.WriteHeader(http.StatusUnprocessableEntity)
179-
err := pages.NotesEdit(&form, errors).Render(r.Context(), w)
223+
err = pages.NotesEdit(&form, errors, membersByID).Render(r.Context(), w)
180224
if err != nil {
181225
logger.Error(
182226
"failed to render template",

app/handlers/routes.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func RegisterRoutes(r chi.Router, cfg *config.Config, logger *slog.Logger, sqlDB
4040

4141
r.Get("/", handleSpacesShow(logger))
4242
r.With(Authorize(access.Action_UpdateSpace)).Group(func(r chi.Router) {
43-
r.Get("/settings", handleSpacesEdit(logger))
43+
r.Get("/settings", handleSpacesEdit(logger, queries))
4444
r.Post("/settings", handleSpacesUpdate(logger, queries))
4545
})
4646

@@ -58,7 +58,7 @@ func RegisterRoutes(r chi.Router, cfg *config.Config, logger *slog.Logger, sqlDB
5858
r.Get("/", handleNotesShow(logger))
5959

6060
r.With(Authorize(access.Action_UpdateNote)).Group(func(r chi.Router) {
61-
r.Get("/edit", handleNotesEdit(logger))
61+
r.Get("/edit", handleNotesEdit(logger, queries))
6262
r.Post("/edit", handleNotesUpdate(logger, queries))
6363
})
6464

@@ -77,7 +77,7 @@ func RegisterRoutes(r chi.Router, cfg *config.Config, logger *slog.Logger, sqlDB
7777
r.Use(rctx.MemberCtxMiddleware(queries))
7878

7979
r.With(Authorize(access.Action_UpdateMember)).Group(func(r chi.Router) {
80-
r.Get("/edit", handleMembersEdit(logger))
80+
r.Get("/edit", handleMembersEdit(logger, queries))
8181
r.Post("/edit", handleMembersUpdate(logger, queries))
8282
})
8383

app/handlers/spaces.handlers.go

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,14 +196,30 @@ func handleSpacesShow(logger *slog.Logger) http.HandlerFunc {
196196
}
197197
}
198198

199-
func handleSpacesEdit(logger *slog.Logger) http.HandlerFunc {
199+
func handleSpacesEdit(logger *slog.Logger, queries *db.Queries) http.HandlerFunc {
200200
return func(w http.ResponseWriter, r *http.Request) {
201201
space := rctx.GetSpace(r.Context())
202202
form := forms.UpdateSpace{
203203
Name: space.Name,
204204
}
205205

206-
err := pages.SpacesEdit(&form, forms.EmptyErrors()).Render(r.Context(), w)
206+
memberIDs := collectCreatedUpdatedByIDsFromSpace(space)
207+
members, err := queries.ListMembersByIDs(r.Context(), db.ListMembersByIDsParams{
208+
SpaceID: space.ID,
209+
MemberIds: memberIDs,
210+
})
211+
if err != nil {
212+
logger.Error(
213+
"error getting members from database",
214+
slog.Any("error", err),
215+
slog.Int64("space_id", space.ID),
216+
)
217+
http.Error(w, "internal server err", http.StatusInternalServerError)
218+
return
219+
}
220+
membersByID := memberListToMap(members)
221+
222+
err = pages.SpacesEdit(&form, forms.EmptyErrors(), membersByID).Render(r.Context(), w)
207223
if err != nil {
208224
logger.Error(
209225
"failed to render template",
@@ -219,8 +235,25 @@ func handleSpacesUpdate(logger *slog.Logger, queries *db.Queries) http.HandlerFu
219235
return func(w http.ResponseWriter, r *http.Request) {
220236
form, errors := forms.ParseUpdateSpace(r)
221237
if errors != nil {
238+
space := rctx.GetSpace(r.Context())
239+
memberIDs := collectCreatedUpdatedByIDsFromSpace(space)
240+
members, err := queries.ListMembersByIDs(r.Context(), db.ListMembersByIDsParams{
241+
SpaceID: space.ID,
242+
MemberIds: memberIDs,
243+
})
244+
if err != nil {
245+
logger.Error(
246+
"error getting members from database",
247+
slog.Any("error", err),
248+
slog.Int64("space_id", space.ID),
249+
)
250+
http.Error(w, "internal server err", http.StatusInternalServerError)
251+
return
252+
}
253+
membersByID := memberListToMap(members)
254+
222255
w.WriteHeader(http.StatusUnprocessableEntity)
223-
err := pages.SpacesEdit(&form, errors).Render(r.Context(), w)
256+
err = pages.SpacesEdit(&form, errors, membersByID).Render(r.Context(), w)
224257
if err != nil {
225258
logger.Error(
226259
"failed to render template",
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package components
2+
3+
import (
4+
"database/sql"
5+
"github.com/nicolashery/simply-shared-notes/app/db"
6+
"github.com/nicolashery/simply-shared-notes/app/views/helpers"
7+
"time"
8+
)
9+
10+
templ CreatedUpdatedAtBy(
11+
createdAt time.Time, updatedAt time.Time,
12+
createdBy sql.NullInt64, updatedBy sql.NullInt64,
13+
membersByID map[int64]db.Member,
14+
) {
15+
<div class="flex flex-col gap-1.5">
16+
@CreatedAtBy(createdAt, createdBy, membersByID)
17+
if updatedAt != createdAt {
18+
@UpdatedAtBy(updatedAt, updatedBy, membersByID)
19+
}
20+
</div>
21+
}
22+
23+
templ CreatedAtBy(
24+
createdAt time.Time,
25+
createdBy sql.NullInt64,
26+
membersByID map[int64]db.Member,
27+
) {
28+
<div class="text-xs">
29+
<span class="opacity-50">Created by </span>
30+
<span class="opacity-75">{ helpers.DisplayMemberName(createdBy, membersByID) }</span>
31+
<span class="opacity-50">on </span>
32+
<span class="opacity-75">{ helpers.FormatDate(createdAt) }</span>
33+
<span class="opacity-50">at </span>
34+
<span class="opacity-75">{ helpers.FormatTime(createdAt) }</span>
35+
</div>
36+
}
37+
38+
templ UpdatedAtBy(
39+
updatedAt time.Time,
40+
updatedBy sql.NullInt64,
41+
membersByID map[int64]db.Member,
42+
) {
43+
<div class="text-xs">
44+
<span class="opacity-50">Updated by </span>
45+
<span class="opacity-75">{ helpers.DisplayMemberName(updatedBy, membersByID) }</span>
46+
<span class="opacity-50">on </span>
47+
<span class="opacity-75">{ helpers.FormatDate(updatedAt) }</span>
48+
<span class="opacity-50">at </span>
49+
<span class="opacity-75">{ helpers.FormatTime(updatedAt) }</span>
50+
</div>
51+
}

0 commit comments

Comments
 (0)