Skip to content

Commit 0a221e8

Browse files
authored
feat: create database tables and queries for notifications (#13536)
1 parent 4213560 commit 0a221e8

17 files changed

+999
-0
lines changed

coderd/database/dbauthz/dbauthz.go

+42
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,13 @@ func (q *querier) AcquireLock(ctx context.Context, id int64) error {
817817
return q.db.AcquireLock(ctx, id)
818818
}
819819

820+
func (q *querier) AcquireNotificationMessages(ctx context.Context, arg database.AcquireNotificationMessagesParams) ([]database.AcquireNotificationMessagesRow, error) {
821+
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceSystem); err != nil {
822+
return nil, err
823+
}
824+
return q.db.AcquireNotificationMessages(ctx, arg)
825+
}
826+
820827
// TODO: We need to create a ProvisionerJob resource type
821828
func (q *querier) AcquireProvisionerJob(ctx context.Context, arg database.AcquireProvisionerJobParams) (database.ProvisionerJob, error) {
822829
// if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceSystem); err != nil {
@@ -861,6 +868,20 @@ func (q *querier) BatchUpdateWorkspaceLastUsedAt(ctx context.Context, arg databa
861868
return q.db.BatchUpdateWorkspaceLastUsedAt(ctx, arg)
862869
}
863870

871+
func (q *querier) BulkMarkNotificationMessagesFailed(ctx context.Context, arg database.BulkMarkNotificationMessagesFailedParams) (int64, error) {
872+
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceSystem); err != nil {
873+
return 0, err
874+
}
875+
return q.db.BulkMarkNotificationMessagesFailed(ctx, arg)
876+
}
877+
878+
func (q *querier) BulkMarkNotificationMessagesSent(ctx context.Context, arg database.BulkMarkNotificationMessagesSentParams) (int64, error) {
879+
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceSystem); err != nil {
880+
return 0, err
881+
}
882+
return q.db.BulkMarkNotificationMessagesSent(ctx, arg)
883+
}
884+
864885
func (q *querier) CleanTailnetCoordinators(ctx context.Context) error {
865886
if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil {
866887
return err
@@ -1010,6 +1031,13 @@ func (q *querier) DeleteOAuth2ProviderAppTokensByAppAndUserID(ctx context.Contex
10101031
return q.db.DeleteOAuth2ProviderAppTokensByAppAndUserID(ctx, arg)
10111032
}
10121033

1034+
func (q *querier) DeleteOldNotificationMessages(ctx context.Context) error {
1035+
if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceSystem); err != nil {
1036+
return err
1037+
}
1038+
return q.db.DeleteOldNotificationMessages(ctx)
1039+
}
1040+
10131041
func (q *querier) DeleteOldProvisionerDaemons(ctx context.Context) error {
10141042
if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceSystem); err != nil {
10151043
return err
@@ -1114,13 +1142,27 @@ func (q *querier) DeleteWorkspaceAgentPortSharesByTemplate(ctx context.Context,
11141142
return q.db.DeleteWorkspaceAgentPortSharesByTemplate(ctx, templateID)
11151143
}
11161144

1145+
func (q *querier) EnqueueNotificationMessage(ctx context.Context, arg database.EnqueueNotificationMessageParams) (database.NotificationMessage, error) {
1146+
if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
1147+
return database.NotificationMessage{}, err
1148+
}
1149+
return q.db.EnqueueNotificationMessage(ctx, arg)
1150+
}
1151+
11171152
func (q *querier) FavoriteWorkspace(ctx context.Context, id uuid.UUID) error {
11181153
fetch := func(ctx context.Context, id uuid.UUID) (database.Workspace, error) {
11191154
return q.db.GetWorkspaceByID(ctx, id)
11201155
}
11211156
return update(q.log, q.auth, fetch, q.db.FavoriteWorkspace)(ctx, id)
11221157
}
11231158

1159+
func (q *querier) FetchNewMessageMetadata(ctx context.Context, arg database.FetchNewMessageMetadataParams) (database.FetchNewMessageMetadataRow, error) {
1160+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {
1161+
return database.FetchNewMessageMetadataRow{}, err
1162+
}
1163+
return q.db.FetchNewMessageMetadata(ctx, arg)
1164+
}
1165+
11241166
func (q *querier) GetAPIKeyByID(ctx context.Context, id string) (database.APIKey, error) {
11251167
return fetch(q.log, q.auth, q.db.GetAPIKeyByID)(ctx, id)
11261168
}

coderd/database/dbauthz/dbauthz_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -2467,6 +2467,32 @@ func (s *MethodTestSuite) TestSystemFunctions() {
24672467
AgentID: uuid.New(),
24682468
}).Asserts(tpl, policy.ActionCreate)
24692469
}))
2470+
s.Run("AcquireNotificationMessages", s.Subtest(func(db database.Store, check *expects) {
2471+
// TODO: update this test once we have a specific role for notifications
2472+
check.Args(database.AcquireNotificationMessagesParams{}).Asserts(rbac.ResourceSystem, policy.ActionUpdate)
2473+
}))
2474+
s.Run("BulkMarkNotificationMessagesFailed", s.Subtest(func(db database.Store, check *expects) {
2475+
// TODO: update this test once we have a specific role for notifications
2476+
check.Args(database.BulkMarkNotificationMessagesFailedParams{}).Asserts(rbac.ResourceSystem, policy.ActionUpdate)
2477+
}))
2478+
s.Run("BulkMarkNotificationMessagesSent", s.Subtest(func(db database.Store, check *expects) {
2479+
// TODO: update this test once we have a specific role for notifications
2480+
check.Args(database.BulkMarkNotificationMessagesSentParams{}).Asserts(rbac.ResourceSystem, policy.ActionUpdate)
2481+
}))
2482+
s.Run("DeleteOldNotificationMessages", s.Subtest(func(db database.Store, check *expects) {
2483+
// TODO: update this test once we have a specific role for notifications
2484+
check.Args().Asserts(rbac.ResourceSystem, policy.ActionDelete)
2485+
}))
2486+
s.Run("EnqueueNotificationMessage", s.Subtest(func(db database.Store, check *expects) {
2487+
// TODO: update this test once we have a specific role for notifications
2488+
check.Args(database.EnqueueNotificationMessageParams{
2489+
Method: database.NotificationMethodWebhook,
2490+
}).Asserts(rbac.ResourceSystem, policy.ActionCreate)
2491+
}))
2492+
s.Run("FetchNewMessageMetadata", s.Subtest(func(db database.Store, check *expects) {
2493+
// TODO: update this test once we have a specific role for notifications
2494+
check.Args(database.FetchNewMessageMetadataParams{}).Asserts(rbac.ResourceSystem, policy.ActionRead)
2495+
}))
24702496
}
24712497

24722498
func (s *MethodTestSuite) TestOAuth2ProviderApps() {

coderd/database/dbmem/dbmem.go

+45
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,15 @@ func (*FakeQuerier) AcquireLock(_ context.Context, _ int64) error {
907907
return xerrors.New("AcquireLock must only be called within a transaction")
908908
}
909909

910+
func (*FakeQuerier) AcquireNotificationMessages(_ context.Context, arg database.AcquireNotificationMessagesParams) ([]database.AcquireNotificationMessagesRow, error) {
911+
err := validateDatabaseType(arg)
912+
if err != nil {
913+
return nil, err
914+
}
915+
// nolint:nilnil // Irrelevant.
916+
return nil, nil
917+
}
918+
910919
func (q *FakeQuerier) AcquireProvisionerJob(_ context.Context, arg database.AcquireProvisionerJobParams) (database.ProvisionerJob, error) {
911920
if err := validateDatabaseType(arg); err != nil {
912921
return database.ProvisionerJob{}, err
@@ -1169,6 +1178,22 @@ func (q *FakeQuerier) BatchUpdateWorkspaceLastUsedAt(_ context.Context, arg data
11691178
return nil
11701179
}
11711180

1181+
func (*FakeQuerier) BulkMarkNotificationMessagesFailed(_ context.Context, arg database.BulkMarkNotificationMessagesFailedParams) (int64, error) {
1182+
err := validateDatabaseType(arg)
1183+
if err != nil {
1184+
return 0, err
1185+
}
1186+
return -1, nil
1187+
}
1188+
1189+
func (*FakeQuerier) BulkMarkNotificationMessagesSent(_ context.Context, arg database.BulkMarkNotificationMessagesSentParams) (int64, error) {
1190+
err := validateDatabaseType(arg)
1191+
if err != nil {
1192+
return 0, err
1193+
}
1194+
return -1, nil
1195+
}
1196+
11721197
func (*FakeQuerier) CleanTailnetCoordinators(_ context.Context) error {
11731198
return ErrUnimplemented
11741199
}
@@ -1504,6 +1529,10 @@ func (q *FakeQuerier) DeleteOAuth2ProviderAppTokensByAppAndUserID(_ context.Cont
15041529
return nil
15051530
}
15061531

1532+
func (*FakeQuerier) DeleteOldNotificationMessages(_ context.Context) error {
1533+
return nil
1534+
}
1535+
15071536
func (q *FakeQuerier) DeleteOldProvisionerDaemons(_ context.Context) error {
15081537
q.mutex.Lock()
15091538
defer q.mutex.Unlock()
@@ -1737,6 +1766,14 @@ func (q *FakeQuerier) DeleteWorkspaceAgentPortSharesByTemplate(_ context.Context
17371766
return nil
17381767
}
17391768

1769+
func (*FakeQuerier) EnqueueNotificationMessage(_ context.Context, arg database.EnqueueNotificationMessageParams) (database.NotificationMessage, error) {
1770+
err := validateDatabaseType(arg)
1771+
if err != nil {
1772+
return database.NotificationMessage{}, err
1773+
}
1774+
return database.NotificationMessage{}, nil
1775+
}
1776+
17401777
func (q *FakeQuerier) FavoriteWorkspace(_ context.Context, arg uuid.UUID) error {
17411778
err := validateDatabaseType(arg)
17421779
if err != nil {
@@ -1756,6 +1793,14 @@ func (q *FakeQuerier) FavoriteWorkspace(_ context.Context, arg uuid.UUID) error
17561793
return nil
17571794
}
17581795

1796+
func (*FakeQuerier) FetchNewMessageMetadata(_ context.Context, arg database.FetchNewMessageMetadataParams) (database.FetchNewMessageMetadataRow, error) {
1797+
err := validateDatabaseType(arg)
1798+
if err != nil {
1799+
return database.FetchNewMessageMetadataRow{}, err
1800+
}
1801+
return database.FetchNewMessageMetadataRow{}, nil
1802+
}
1803+
17591804
func (q *FakeQuerier) GetAPIKeyByID(_ context.Context, id string) (database.APIKey, error) {
17601805
q.mutex.RLock()
17611806
defer q.mutex.RUnlock()

coderd/database/dbmetrics/dbmetrics.go

+42
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmock/dbmock.go

+89
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)