Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions coderd/coderd.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,7 @@ func New(options *Options) *API {
})
r.Route("/{user}", func(r chi.Router) {
r.Use(httpmw.ExtractUserParam(options.Database))
r.Delete("/", api.deleteUser)
r.Get("/", api.userByName)
r.Put("/profile", api.putUserProfile)
r.Route("/status", func(r chi.Router) {
Expand Down
51 changes: 42 additions & 9 deletions coderd/database/databasefake/databasefake.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ func (q *fakeQuerier) GetUserByEmailOrUsername(_ context.Context, arg database.G
defer q.mutex.RUnlock()

for _, user := range q.users {
if user.Email == arg.Email || user.Username == arg.Username {
if (user.Email == arg.Email || user.Username == arg.Username) && user.Deleted == arg.Deleted {
return user, nil
}
}
Expand All @@ -307,7 +307,13 @@ func (q *fakeQuerier) GetUserCount(_ context.Context) (int64, error) {
q.mutex.RLock()
defer q.mutex.RUnlock()

return int64(len(q.users)), nil
existing := int64(0)
for _, u := range q.users {
if !u.Deleted {
existing++
}
}
return existing, nil
}

func (q *fakeQuerier) GetActiveUserCount(_ context.Context) (int64, error) {
Expand All @@ -316,13 +322,27 @@ func (q *fakeQuerier) GetActiveUserCount(_ context.Context) (int64, error) {

active := int64(0)
for _, u := range q.users {
if u.Status == database.UserStatusActive {
if u.Status == database.UserStatusActive && !u.Deleted {
active++
}
}
return active, nil
}

func (q *fakeQuerier) UpdateUserDeletedByID(_ context.Context, params database.UpdateUserDeletedByIDParams) error {
q.mutex.Lock()
defer q.mutex.Unlock()

for i, u := range q.users {
if u.ID == params.ID {
u.Deleted = params.Deleted
q.users[i] = u
return nil
}
}
return sql.ErrNoRows
}

func (q *fakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams) ([]database.User, error) {
q.mutex.RLock()
defer q.mutex.RUnlock()
Expand All @@ -341,6 +361,16 @@ func (q *fakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams
return a.CreatedAt.Before(b.CreatedAt)
})

if params.Deleted {
tmp := make([]database.User, 0, len(users))
for _, user := range users {
if user.Deleted {
tmp = append(tmp, user)
}
}
users = tmp
}

if params.AfterID != uuid.Nil {
found := false
for i, v := range users {
Expand Down Expand Up @@ -409,16 +439,19 @@ func (q *fakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams
return users, nil
}

func (q *fakeQuerier) GetUsersByIDs(_ context.Context, ids []uuid.UUID) ([]database.User, error) {
func (q *fakeQuerier) GetUsersByIDs(_ context.Context, params database.GetUsersByIDsParams) ([]database.User, error) {
q.mutex.RLock()
defer q.mutex.RUnlock()

users := make([]database.User, 0)
for _, user := range q.users {
for _, id := range ids {
for _, id := range params.IDs {
if user.ID.String() != id.String() {
continue
}
if user.Deleted != params.Deleted {
continue
}
users = append(users, user)
}
}
Expand Down Expand Up @@ -879,8 +912,8 @@ func (q *fakeQuerier) ParameterValues(_ context.Context, arg database.ParameterV
}
}

if len(arg.Ids) > 0 {
if !slice.Contains(arg.Ids, parameterValue.ID) {
if len(arg.IDs) > 0 {
if !slice.Contains(arg.IDs, parameterValue.ID) {
continue
}
}
Expand Down Expand Up @@ -961,9 +994,9 @@ func (q *fakeQuerier) GetTemplatesWithFilter(_ context.Context, arg database.Get
continue
}

if len(arg.Ids) > 0 {
if len(arg.IDs) > 0 {
match := false
for _, id := range arg.Ids {
for _, id := range arg.IDs {
if template.ID == id {
match = true
break
Expand Down
9 changes: 5 additions & 4 deletions coderd/database/dump.sql

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions coderd/database/migrations/000048_userdelete.down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE users
DROP COLUMN deleted;
9 changes: 9 additions & 0 deletions coderd/database/migrations/000048_userdelete.up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
ALTER TABLE users
ADD COLUMN deleted boolean DEFAULT false NOT NULL;

DROP INDEX idx_users_email;
DROP INDEX idx_users_username;
DROP INDEX users_username_lower_idx;
CREATE UNIQUE INDEX idx_users_email ON users USING btree (email) WHERE deleted = false;
CREATE UNIQUE INDEX idx_users_username ON users USING btree (username) WHERE deleted = false;
CREATE UNIQUE INDEX users_username_lower_idx ON users USING btree (lower(username)) WHERE deleted = false;
1 change: 1 addition & 0 deletions coderd/database/models.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion coderd/database/querier.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading