Skip to content

Commit 3b2fdf3

Browse files
committed
Delete activity tracking
1 parent b89a1c6 commit 3b2fdf3

File tree

5 files changed

+139
-7
lines changed

5 files changed

+139
-7
lines changed

app/db/activity.queries.sql.go

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

app/handlers/members.handlers.go

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,23 +327,77 @@ func handleMembersDeleteConfirm(logger *slog.Logger) http.HandlerFunc {
327327
}
328328
}
329329

330-
func handleMembersDelete(logger *slog.Logger, queries *db.Queries) http.HandlerFunc {
330+
func handleMembersDelete(logger *slog.Logger, sqlDB *sql.DB, queries *db.Queries) http.HandlerFunc {
331331
return func(w http.ResponseWriter, r *http.Request) {
332+
now := time.Now().UTC()
332333
member := rctx.GetMember(r.Context())
333334
identity := rctx.GetIdentity(r.Context())
335+
space := rctx.GetSpace(r.Context())
334336

335337
if member.ID == identity.Member.ID {
336338
http.Error(w, "cannot delete session identity member", http.StatusConflict)
337339
return
338340
}
339341

340-
err := queries.DeleteMember(r.Context(), member.ID)
342+
activityPublicID, err := publicid.Generate()
343+
if err != nil {
344+
logger.Error("error generating activity public ID", slog.Any("error", err))
345+
http.Error(w, "error deleting member", http.StatusInternalServerError)
346+
return
347+
}
348+
349+
tx, err := sqlDB.Begin()
350+
if err != nil {
351+
logger.Error("error starting transaction", slog.Any("error", err))
352+
http.Error(w, "error deleting member", http.StatusInternalServerError)
353+
return
354+
}
355+
defer func() {
356+
if rbErr := tx.Rollback(); rbErr != nil && err == nil {
357+
logger.Error("error rolling back transaction", slog.Any("error", rbErr))
358+
}
359+
}()
360+
qtx := queries.WithTx(tx)
361+
362+
err = qtx.DeleteMember(r.Context(), member.ID)
341363
if err != nil {
342364
logger.Error("error deleting member in database", slog.Any("error", err))
343365
http.Error(w, "error deleting member", http.StatusInternalServerError)
344366
return
345367
}
346368

369+
_, err = qtx.CreateActivity(r.Context(), db.CreateActivityParams{
370+
CreatedAt: now,
371+
SpaceID: space.ID,
372+
PublicID: activityPublicID,
373+
MemberID: sql.NullInt64{Int64: identity.Member.ID, Valid: true},
374+
Action: db.ActivityAction_Delete,
375+
EntityType: db.ActivityEntity_Member,
376+
EntityID: sql.NullInt64{Valid: false},
377+
})
378+
if err != nil {
379+
logger.Error("error creating activity in database", slog.Any("error", err))
380+
http.Error(w, "error deleting member", http.StatusInternalServerError)
381+
return
382+
}
383+
384+
err = qtx.SetActivityEntityIDToNull(r.Context(), db.SetActivityEntityIDToNullParams{
385+
EntityType: db.ActivityEntity_Member,
386+
EntityID: sql.NullInt64{Int64: member.ID, Valid: true},
387+
})
388+
if err != nil {
389+
logger.Error("error updating activity in database", slog.Any("error", err))
390+
http.Error(w, "error deleting member", http.StatusInternalServerError)
391+
return
392+
}
393+
394+
err = tx.Commit()
395+
if err != nil {
396+
logger.Error("error committing transaction", slog.Any("error", err))
397+
http.Error(w, "error deleting member", http.StatusInternalServerError)
398+
return
399+
}
400+
347401
sess := rctx.GetSession(r.Context())
348402
sess.AddFlash(session.FlashMessage{
349403
Type: session.FlashType_Success,

app/handlers/notes.handlers.go

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,17 +369,72 @@ func handleNotesDeleteConfirm(logger *slog.Logger) http.HandlerFunc {
369369
}
370370
}
371371

372-
func handleNotesDelete(logger *slog.Logger, queries *db.Queries) http.HandlerFunc {
372+
func handleNotesDelete(logger *slog.Logger, sqlDB *sql.DB, queries *db.Queries) http.HandlerFunc {
373373
return func(w http.ResponseWriter, r *http.Request) {
374+
now := time.Now().UTC()
375+
identity := rctx.GetIdentity(r.Context())
374376
note := rctx.GetNote(r.Context())
377+
space := rctx.GetSpace(r.Context())
378+
379+
activityPublicID, err := publicid.Generate()
380+
if err != nil {
381+
logger.Error("error generating activity public ID", slog.Any("error", err))
382+
http.Error(w, "error deleting note", http.StatusInternalServerError)
383+
return
384+
}
385+
386+
tx, err := sqlDB.Begin()
387+
if err != nil {
388+
logger.Error("error starting transaction", slog.Any("error", err))
389+
http.Error(w, "error deleting note", http.StatusInternalServerError)
390+
return
391+
}
392+
defer func() {
393+
if rbErr := tx.Rollback(); rbErr != nil && err == nil {
394+
logger.Error("error rolling back transaction", slog.Any("error", rbErr))
395+
}
396+
}()
397+
qtx := queries.WithTx(tx)
375398

376-
err := queries.DeleteNote(r.Context(), note.ID)
399+
err = qtx.DeleteNote(r.Context(), note.ID)
377400
if err != nil {
378401
logger.Error("error deleting note in database", slog.Any("error", err))
379402
http.Error(w, "error deleting note", http.StatusInternalServerError)
380403
return
381404
}
382405

406+
_, err = qtx.CreateActivity(r.Context(), db.CreateActivityParams{
407+
CreatedAt: now,
408+
SpaceID: space.ID,
409+
PublicID: activityPublicID,
410+
MemberID: sql.NullInt64{Int64: identity.Member.ID, Valid: true},
411+
Action: db.ActivityAction_Delete,
412+
EntityType: db.ActivityEntity_Note,
413+
EntityID: sql.NullInt64{Valid: false},
414+
})
415+
if err != nil {
416+
logger.Error("error creating activity in database", slog.Any("error", err))
417+
http.Error(w, "error deleting note", http.StatusInternalServerError)
418+
return
419+
}
420+
421+
err = qtx.SetActivityEntityIDToNull(r.Context(), db.SetActivityEntityIDToNullParams{
422+
EntityType: db.ActivityEntity_Note,
423+
EntityID: sql.NullInt64{Int64: note.ID, Valid: true},
424+
})
425+
if err != nil {
426+
logger.Error("error updating activity in database", slog.Any("error", err))
427+
http.Error(w, "error deleting note", http.StatusInternalServerError)
428+
return
429+
}
430+
431+
err = tx.Commit()
432+
if err != nil {
433+
logger.Error("error committing transaction", slog.Any("error", err))
434+
http.Error(w, "error deleting note", http.StatusInternalServerError)
435+
return
436+
}
437+
383438
sess := rctx.GetSession(r.Context())
384439
sess.AddFlash(session.FlashMessage{
385440
Type: session.FlashType_Success,

app/handlers/routes.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ func RegisterRoutes(r chi.Router, cfg *config.Config, logger *slog.Logger, sqlDB
6262
r.Post("/edit", handleNotesUpdate(logger, sqlDB, queries))
6363
})
6464

65-
r.With(Authorize(access.Action_DeleteMember)).Group(func(r chi.Router) {
65+
r.With(Authorize(access.Action_DeleteNote)).Group(func(r chi.Router) {
6666
r.Get("/delete", handleNotesDeleteConfirm(logger))
67-
r.Post("/delete", handleNotesDelete(logger, queries))
67+
r.Post("/delete", handleNotesDelete(logger, sqlDB, queries))
6868
})
6969
})
7070

@@ -83,7 +83,7 @@ func RegisterRoutes(r chi.Router, cfg *config.Config, logger *slog.Logger, sqlDB
8383

8484
r.With(Authorize(access.Action_DeleteMember)).Group(func(r chi.Router) {
8585
r.Get("/delete", handleMembersDeleteConfirm(logger))
86-
r.Post("/delete", handleMembersDelete(logger, queries))
86+
r.Post("/delete", handleMembersDelete(logger, sqlDB, queries))
8787
})
8888
})
8989

sql/queries/activity.queries.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,9 @@ INSERT INTO activity (
1616
@entity_type,
1717
@entity_id
1818
) RETURNING *;
19+
20+
-- name: SetActivityEntityIDToNull :exec
21+
UPDATE activity
22+
SET entity_id = NULL
23+
WHERE entity_type = @entity_type
24+
AND entity_id = @entity_id;

0 commit comments

Comments
 (0)