From 0b659ba124c977e4992bffa90eea04aaf013fd56 Mon Sep 17 00:00:00 2001 From: Steven Date: Sun, 9 Jul 2023 01:37:20 +0800 Subject: [PATCH] chore: add vacuum functions --- api/v1/shortcut.go | 3 +++ store/shortcut.go | 19 +++++++++++++++++++ store/user.go | 8 ++++++++ store/user_setting.go | 19 +++++++++++++++++++ test/store/user_test.go | 10 ++++++++++ 5 files changed, 59 insertions(+) diff --git a/api/v1/shortcut.go b/api/v1/shortcut.go index 02ee75f..f840c30 100644 --- a/api/v1/shortcut.go +++ b/api/v1/shortcut.go @@ -303,6 +303,9 @@ func (s *APIV1Service) composeShortcut(ctx context.Context, shortcut *Shortcut) if err != nil { return nil, errors.Wrap(err, "Failed to get creator") } + if user == nil { + return nil, errors.New("Creator not found") + } shortcut.Creator = convertUserFromStore(user) activityList, err := s.Store.ListActivities(ctx, &store.FindActivity{ diff --git a/store/shortcut.go b/store/shortcut.go index 68f3e7b..b8e8914 100644 --- a/store/shortcut.go +++ b/store/shortcut.go @@ -309,3 +309,22 @@ func listShortcuts(ctx context.Context, tx *sql.Tx, find *FindShortcut) ([]*Shor return list, nil } + +func vacuumShortcut(ctx context.Context, tx *sql.Tx) error { + stmt := ` + DELETE FROM + shortcut + WHERE + creator_id NOT IN ( + SELECT + id + FROM + user + )` + _, err := tx.ExecContext(ctx, stmt) + if err != nil { + return err + } + + return nil +} diff --git a/store/user.go b/store/user.go index 2a98e72..49b8406 100644 --- a/store/user.go +++ b/store/user.go @@ -208,6 +208,14 @@ func (s *Store) DeleteUser(ctx context.Context, delete *DeleteUser) error { return err } + if err := vacuumUserSetting(ctx, tx); err != nil { + return err + } + + if err := vacuumShortcut(ctx, tx); err != nil { + return err + } + if err := tx.Commit(); err != nil { // do nothing here to prevent linter warning. return err diff --git a/store/user_setting.go b/store/user_setting.go index f21b60b..58a6fd9 100644 --- a/store/user_setting.go +++ b/store/user_setting.go @@ -132,3 +132,22 @@ func listUserSettings(ctx context.Context, tx *sql.Tx, find *FindUserSetting) ([ return userSettingMessageList, nil } + +func vacuumUserSetting(ctx context.Context, tx *sql.Tx) error { + stmt := ` + DELETE FROM + user_setting + WHERE + user_id NOT IN ( + SELECT + id + FROM + user + )` + _, err := tx.ExecContext(ctx, stmt) + if err != nil { + return err + } + + return nil +} diff --git a/test/store/user_test.go b/test/store/user_test.go index 52de45f..588fbab 100644 --- a/test/store/user_test.go +++ b/test/store/user_test.go @@ -26,6 +26,13 @@ func TestUserStore(t *testing.T) { Nickname: &userPatchNickname, }) require.NoError(t, err) + _, err = ts.CreateShortcut(ctx, &store.Shortcut{ + CreatorID: user.ID, + Name: "test_shortcut", + Link: "https://www.google.com", + Visibility: store.VisibilityPublic, + }) + require.NoError(t, err) require.Equal(t, userPatchNickname, user.Nickname) err = ts.DeleteUser(ctx, &store.DeleteUser{ ID: user.ID, @@ -34,6 +41,9 @@ func TestUserStore(t *testing.T) { users, err = ts.ListUsers(ctx, &store.FindUser{}) require.NoError(t, err) require.Equal(t, 0, len(users)) + shortcuts, err := ts.ListShortcuts(ctx, &store.FindShortcut{}) + require.NoError(t, err) + require.Equal(t, 0, len(shortcuts)) } // createTestingAdminUser creates a testing admin user.