Skip to content

Commit e24c3fb

Browse files
committed
Database implementation
Signed-off-by: Danny Kopping <danny@coder.com>
1 parent 09f82b4 commit e24c3fb

25 files changed

+810
-15
lines changed

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/coderd.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,6 +1247,17 @@ func New(options *Options) *API {
12471247
r.Get("/settings", api.notificationsSettings)
12481248
r.Put("/settings", api.putNotificationsSettings)
12491249
})
1250+
r.Route("/frobulators", func(r chi.Router) {
1251+
r.Use(apiKeyMiddleware)
1252+
r.Get("/", api.listAllFrobulators)
1253+
r.Route("/{user}", func(r chi.Router) {
1254+
r.Use(
1255+
httpmw.ExtractUserParam(options.Database),
1256+
)
1257+
r.Get("/", api.listUserFrobulators)
1258+
r.Post("/", api.createFrobulator)
1259+
})
1260+
})
12501261
})
12511262

12521263
if options.SwaggerEndpoint {

coderd/database/dbauthz/dbauthz.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,6 +1204,13 @@ func (q *querier) GetActiveWorkspaceBuildsByTemplateID(ctx context.Context, temp
12041204
return q.db.GetActiveWorkspaceBuildsByTemplateID(ctx, templateID)
12051205
}
12061206

1207+
func (q *querier) GetAllFrobulators(ctx context.Context) ([]database.Frobulator, error) {
1208+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceFrobulator); err != nil {
1209+
return nil, err
1210+
}
1211+
return q.db.GetAllFrobulators(ctx)
1212+
}
1213+
12071214
func (q *querier) GetAllTailnetAgents(ctx context.Context) ([]database.TailnetAgent, error) {
12081215
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTailnetCoordinator); err != nil {
12091216
return []database.TailnetAgent{}, err
@@ -2052,6 +2059,13 @@ func (q *querier) GetUserCount(ctx context.Context) (int64, error) {
20522059
return q.db.GetUserCount(ctx)
20532060
}
20542061

2062+
func (q *querier) GetUserFrobulators(ctx context.Context, userID uuid.UUID) ([]database.Frobulator, error) {
2063+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceFrobulator.WithOwner(userID.String())); err != nil {
2064+
return nil, err
2065+
}
2066+
return q.db.GetUserFrobulators(ctx, userID)
2067+
}
2068+
20552069
func (q *querier) GetUserLatencyInsights(ctx context.Context, arg database.GetUserLatencyInsightsParams) ([]database.GetUserLatencyInsightsRow, error) {
20562070
// Used by insights endpoints. Need to check both for auditors and for regular users with template acl perms.
20572071
if err := q.authorizeContext(ctx, policy.ActionViewInsights, rbac.ResourceTemplate); err != nil {
@@ -2537,6 +2551,14 @@ func (q *querier) InsertFile(ctx context.Context, arg database.InsertFileParams)
25372551
return insert(q.log, q.auth, rbac.ResourceFile.WithOwner(arg.CreatedBy.String()), q.db.InsertFile)(ctx, arg)
25382552
}
25392553

2554+
func (q *querier) InsertFrobulator(ctx context.Context, arg database.InsertFrobulatorParams) error {
2555+
if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceFrobulator.WithOwner(arg.UserID.String())); err != nil {
2556+
return err
2557+
}
2558+
2559+
return q.db.InsertFrobulator(ctx, arg)
2560+
}
2561+
25402562
func (q *querier) InsertGitSSHKey(ctx context.Context, arg database.InsertGitSSHKeyParams) (database.GitSSHKey, error) {
25412563
return insertWithAction(q.log, q.auth, rbac.ResourceUser.WithOwner(arg.UserID.String()).WithID(arg.UserID), policy.ActionUpdatePersonal, q.db.InsertGitSSHKey)(ctx, arg)
25422564
}

coderd/database/dbmem/dbmem.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ func New() database.Store {
6262
groups: make([]database.Group, 0),
6363
groupMembers: make([]database.GroupMember, 0),
6464
auditLogs: make([]database.AuditLog, 0),
65+
frobulators: make([]database.Frobulator, 0),
6566
files: make([]database.File, 0),
6667
gitSSHKey: make([]database.GitSSHKey, 0),
6768
notificationMessages: make([]database.NotificationMessage, 0),
@@ -192,6 +193,7 @@ type data struct {
192193
workspaces []database.Workspace
193194
workspaceProxies []database.WorkspaceProxy
194195
customRoles []database.CustomRole
196+
frobulators []database.Frobulator
195197
// Locks is a map of lock names. Any keys within the map are currently
196198
// locked.
197199
locks map[int64]struct{}
@@ -2047,6 +2049,13 @@ func (q *FakeQuerier) GetActiveWorkspaceBuildsByTemplateID(ctx context.Context,
20472049
return filteredBuilds, nil
20482050
}
20492051

2052+
func (q *FakeQuerier) GetAllFrobulators(_ context.Context) ([]database.Frobulator, error) {
2053+
q.mutex.RLock()
2054+
defer q.mutex.RUnlock()
2055+
2056+
return q.frobulators, nil
2057+
}
2058+
20502059
func (*FakeQuerier) GetAllTailnetAgents(_ context.Context) ([]database.TailnetAgent, error) {
20512060
return nil, ErrUnimplemented
20522061
}
@@ -4838,6 +4847,22 @@ func (q *FakeQuerier) GetUserCount(_ context.Context) (int64, error) {
48384847
return existing, nil
48394848
}
48404849

4850+
func (q *FakeQuerier) GetUserFrobulators(_ context.Context, userID uuid.UUID) ([]database.Frobulator, error) {
4851+
q.mutex.RLock()
4852+
defer q.mutex.RUnlock()
4853+
4854+
out := make([]database.Frobulator, 0, len(q.frobulators))
4855+
for _, frob := range q.frobulators {
4856+
if frob.UserID != userID {
4857+
continue
4858+
}
4859+
4860+
out = append(out, frob)
4861+
}
4862+
4863+
return out, nil
4864+
}
4865+
48414866
func (q *FakeQuerier) GetUserLatencyInsights(_ context.Context, arg database.GetUserLatencyInsightsParams) ([]database.GetUserLatencyInsightsRow, error) {
48424867
err := validateDatabaseType(arg)
48434868
if err != nil {
@@ -6217,6 +6242,25 @@ func (q *FakeQuerier) InsertFile(_ context.Context, arg database.InsertFileParam
62176242
return file, nil
62186243
}
62196244

6245+
func (q *FakeQuerier) InsertFrobulator(_ context.Context, arg database.InsertFrobulatorParams) error {
6246+
err := validateDatabaseType(arg)
6247+
if err != nil {
6248+
return err
6249+
}
6250+
6251+
q.mutex.Lock()
6252+
defer q.mutex.Unlock()
6253+
6254+
// nolint:gosimple // This is fine as it is.
6255+
q.frobulators = append(q.frobulators, database.Frobulator{
6256+
ID: arg.ID,
6257+
UserID: arg.UserID,
6258+
ModelNumber: arg.ModelNumber,
6259+
})
6260+
6261+
return nil
6262+
}
6263+
62206264
func (q *FakeQuerier) InsertGitSSHKey(_ context.Context, arg database.InsertGitSSHKeyParams) (database.GitSSHKey, error) {
62216265
if err := validateDatabaseType(arg); err != nil {
62226266
return database.GitSSHKey{}, err

coderd/database/dbmetrics/dbmetrics.go

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

coderd/database/dbmock/dbmock.go

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

0 commit comments

Comments
 (0)