mirror of
https://github.com/coder/coder.git
synced 2025-07-21 01:28:49 +00:00
fix: add postgres triggers to remove deleted users from user_links (#12117)
* chore: add database test fixture to insert non-unique linked_ids * chore: create unit test to exercise failed email change bug * fix: add postgres triggers to keep user_links clear of deleted users * Add migrations to prevent deleted users with links * Force soft delete of users, do not allow un-delete
This commit is contained in:
@ -607,16 +607,6 @@ func (q *querier) SoftDeleteTemplateByID(ctx context.Context, id uuid.UUID) erro
|
||||
return deleteQ(q.log, q.auth, q.db.GetTemplateByID, deleteF)(ctx, id)
|
||||
}
|
||||
|
||||
func (q *querier) SoftDeleteUserByID(ctx context.Context, id uuid.UUID) error {
|
||||
deleteF := func(ctx context.Context, id uuid.UUID) error {
|
||||
return q.db.UpdateUserDeletedByID(ctx, database.UpdateUserDeletedByIDParams{
|
||||
ID: id,
|
||||
Deleted: true,
|
||||
})
|
||||
}
|
||||
return deleteQ(q.log, q.auth, q.db.GetUserByID, deleteF)(ctx, id)
|
||||
}
|
||||
|
||||
func (q *querier) SoftDeleteWorkspaceByID(ctx context.Context, id uuid.UUID) error {
|
||||
return deleteQ(q.log, q.auth, q.db.GetWorkspaceByID, func(ctx context.Context, id uuid.UUID) error {
|
||||
return q.db.UpdateWorkspaceDeletedByID(ctx, database.UpdateWorkspaceDeletedByIDParams{
|
||||
@ -2881,16 +2871,8 @@ func (q *querier) UpdateUserAppearanceSettings(ctx context.Context, arg database
|
||||
return q.db.UpdateUserAppearanceSettings(ctx, arg)
|
||||
}
|
||||
|
||||
// UpdateUserDeletedByID
|
||||
// Deprecated: Delete this function in favor of 'SoftDeleteUserByID'. Deletes are
|
||||
// irreversible.
|
||||
func (q *querier) UpdateUserDeletedByID(ctx context.Context, arg database.UpdateUserDeletedByIDParams) error {
|
||||
fetch := func(ctx context.Context, arg database.UpdateUserDeletedByIDParams) (database.User, error) {
|
||||
return q.db.GetUserByID(ctx, arg.ID)
|
||||
}
|
||||
// This uses the rbac.ActionDelete action always as this function should always delete.
|
||||
// We should delete this function in favor of 'SoftDeleteUserByID'.
|
||||
return deleteQ(q.log, q.auth, fetch, q.db.UpdateUserDeletedByID)(ctx, arg)
|
||||
func (q *querier) UpdateUserDeletedByID(ctx context.Context, id uuid.UUID) error {
|
||||
return deleteQ(q.log, q.auth, q.db.GetUserByID, q.db.UpdateUserDeletedByID)(ctx, id)
|
||||
}
|
||||
|
||||
func (q *querier) UpdateUserHashedPassword(ctx context.Context, arg database.UpdateUserHashedPasswordParams) error {
|
||||
|
@ -1015,17 +1015,10 @@ func (s *MethodTestSuite) TestUser() {
|
||||
LoginType: database.LoginTypeOIDC,
|
||||
}).Asserts(u, rbac.ActionUpdate)
|
||||
}))
|
||||
s.Run("SoftDeleteUserByID", s.Subtest(func(db database.Store, check *expects) {
|
||||
s.Run("UpdateUserDeletedByID", s.Subtest(func(db database.Store, check *expects) {
|
||||
u := dbgen.User(s.T(), db, database.User{})
|
||||
check.Args(u.ID).Asserts(u, rbac.ActionDelete).Returns()
|
||||
}))
|
||||
s.Run("UpdateUserDeletedByID", s.Subtest(func(db database.Store, check *expects) {
|
||||
u := dbgen.User(s.T(), db, database.User{Deleted: true})
|
||||
check.Args(database.UpdateUserDeletedByIDParams{
|
||||
ID: u.ID,
|
||||
Deleted: true,
|
||||
}).Asserts(u, rbac.ActionDelete).Returns()
|
||||
}))
|
||||
s.Run("UpdateUserHashedPassword", s.Subtest(func(db database.Store, check *expects) {
|
||||
u := dbgen.User(s.T(), db, database.User{})
|
||||
check.Args(database.UpdateUserHashedPasswordParams{
|
||||
|
Reference in New Issue
Block a user