Skip to content

Commit bf85f1d

Browse files
committed
fix: fill out missing user properties to /audit
All except the organization IDs. We can add this as well if needed, but the complaint was specifically about last_seen_at.
1 parent 3a1fa04 commit bf85f1d

File tree

5 files changed

+77
-56
lines changed

5 files changed

+77
-56
lines changed

coderd/audit.go

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"github.com/coder/coder/v2/coderd/database/db2sdk"
2121
"github.com/coder/coder/v2/coderd/httpapi"
2222
"github.com/coder/coder/v2/coderd/httpmw"
23-
"github.com/coder/coder/v2/coderd/rbac"
2423
"github.com/coder/coder/v2/coderd/searchquery"
2524
"github.com/coder/coder/v2/codersdk"
2625
)
@@ -182,31 +181,10 @@ func (api *API) convertAuditLog(ctx context.Context, dblog database.GetAuditLogs
182181
diff := codersdk.AuditDiff{}
183182
_ = json.Unmarshal(dblog.Diff, &diff)
184183

185-
var user *codersdk.User
186-
187-
if dblog.UserUsername.Valid {
188-
user = &codersdk.User{
189-
ReducedUser: codersdk.ReducedUser{
190-
MinimalUser: codersdk.MinimalUser{
191-
ID: dblog.UserID,
192-
Username: dblog.UserUsername.String,
193-
AvatarURL: dblog.UserAvatarUrl.String,
194-
},
195-
Email: dblog.UserEmail.String,
196-
CreatedAt: dblog.UserCreatedAt.Time,
197-
Status: codersdk.UserStatus(dblog.UserStatus.UserStatus),
198-
},
199-
Roles: []codersdk.SlimRole{},
200-
}
201-
202-
for _, input := range dblog.UserRoles {
203-
roleName, _ := rbac.RoleNameFromString(input)
204-
rbacRole, _ := rbac.RoleByName(roleName)
205-
user.Roles = append(user.Roles, db2sdk.SlimRole(rbacRole))
206-
}
207-
}
208-
209184
var (
185+
// For now leaving the organization IDs blank; not sure they are useful for
186+
// the audit query anyway?
187+
user = db2sdk.User(dblog.User, []uuid.UUID{})
210188
additionalFieldsBytes = []byte(dblog.AdditionalFields)
211189
additionalFields audit.AdditionalFields
212190
err = json.Unmarshal(additionalFieldsBytes, &additionalFields)
@@ -249,7 +227,7 @@ func (api *API) convertAuditLog(ctx context.Context, dblog database.GetAuditLogs
249227
Diff: diff,
250228
StatusCode: dblog.StatusCode,
251229
AdditionalFields: dblog.AdditionalFields,
252-
User: user,
230+
User: &user,
253231
Description: auditLogDescription(dblog),
254232
ResourceLink: resourceLink,
255233
IsDeleted: isDeleted,

coderd/audit_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import (
88
"testing"
99
"time"
1010

11+
"github.com/google/uuid"
1112
"github.com/stretchr/testify/require"
1213

1314
"github.com/coder/coder/v2/coderd/audit"
1415
"github.com/coder/coder/v2/coderd/coderdtest"
1516
"github.com/coder/coder/v2/coderd/database"
17+
"github.com/coder/coder/v2/coderd/rbac"
1618
"github.com/coder/coder/v2/codersdk"
1719
)
1820

@@ -42,6 +44,53 @@ func TestAuditLogs(t *testing.T) {
4244
require.Len(t, alogs.AuditLogs, 1)
4345
})
4446

47+
t.Run("User", func(t *testing.T) {
48+
t.Parallel()
49+
50+
ctx := context.Background()
51+
client := coderdtest.New(t, nil)
52+
user := coderdtest.CreateFirstUser(t, client)
53+
client2, user2 := coderdtest.CreateAnotherUser(t, client, user.OrganizationID, rbac.RoleOwner())
54+
55+
err := client2.CreateTestAuditLog(ctx, codersdk.CreateTestAuditLogRequest{
56+
ResourceID: user2.ID,
57+
})
58+
require.NoError(t, err)
59+
60+
alogs, err := client.AuditLogs(ctx, codersdk.AuditLogsRequest{
61+
Pagination: codersdk.Pagination{
62+
Limit: 1,
63+
},
64+
})
65+
require.NoError(t, err)
66+
require.Equal(t, int64(1), alogs.Count)
67+
require.Len(t, alogs.AuditLogs, 1)
68+
69+
// Make sure the returned user is fully populated.
70+
foundUser, err := client.User(ctx, user2.ID.String())
71+
foundUser.OrganizationIDs = []uuid.UUID{} // Not included.
72+
require.NoError(t, err)
73+
require.Equal(t, foundUser, *alogs.AuditLogs[0].User)
74+
75+
// Delete the user and try again.
76+
err = client.DeleteUser(ctx, user2.ID)
77+
require.NoError(t, err)
78+
79+
alogs, err = client.AuditLogs(ctx, codersdk.AuditLogsRequest{
80+
Pagination: codersdk.Pagination{
81+
Limit: 1,
82+
},
83+
})
84+
require.NoError(t, err)
85+
require.Equal(t, int64(1), alogs.Count)
86+
require.Len(t, alogs.AuditLogs, 1)
87+
88+
foundUser, err = client.User(ctx, user2.ID.String())
89+
foundUser.OrganizationIDs = []uuid.UUID{} // Not included.
90+
require.NoError(t, err)
91+
require.Equal(t, foundUser, *alogs.AuditLogs[0].User)
92+
})
93+
4594
t.Run("WorkspaceBuildAuditLink", func(t *testing.T) {
4695
t.Parallel()
4796

coderd/database/dbmem/dbmem.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1947,8 +1947,12 @@ func (q *FakeQuerier) GetAuditLogsOffset(_ context.Context, arg database.GetAudi
19471947
}
19481948
}
19491949

1950+
// The query is a left join, so allow no user here, although this probably
1951+
// does not happen in practice since users are soft deleted?
19501952
user, err := q.getUserByIDNoLock(alog.UserID)
1951-
userValid := err == nil
1953+
if err != nil && !errors.Is(err, sql.ErrNoRows) {
1954+
return logs, err
1955+
}
19521956

19531957
logs = append(logs, database.GetAuditLogsOffsetRow{
19541958
ID: alog.ID,
@@ -1965,11 +1969,7 @@ func (q *FakeQuerier) GetAuditLogsOffset(_ context.Context, arg database.GetAudi
19651969
StatusCode: alog.StatusCode,
19661970
AdditionalFields: alog.AdditionalFields,
19671971
UserID: alog.UserID,
1968-
UserUsername: sql.NullString{String: user.Username, Valid: userValid},
1969-
UserEmail: sql.NullString{String: user.Email, Valid: userValid},
1970-
UserCreatedAt: sql.NullTime{Time: user.CreatedAt, Valid: userValid},
1971-
UserStatus: database.NullUserStatus{UserStatus: user.Status, Valid: userValid},
1972-
UserRoles: user.RBACRoles,
1972+
User: user,
19731973
Count: 0,
19741974
})
19751975

coderd/database/queries.sql.go

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

coderd/database/queries/auditlogs.sql

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@
33
-- name: GetAuditLogsOffset :many
44
SELECT
55
audit_logs.*,
6-
users.username AS user_username,
7-
users.email AS user_email,
8-
users.created_at AS user_created_at,
9-
users.status AS user_status,
10-
users.rbac_roles AS user_roles,
11-
users.avatar_url AS user_avatar_url,
6+
sqlc.embed(users),
127
COUNT(audit_logs.*) OVER () AS count
138
FROM
149
audit_logs

0 commit comments

Comments
 (0)