Skip to content

Commit 0a221e8

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

File tree

17 files changed

+999
-0
lines changed

17 files changed

+999
-0
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 42 additions & 0 deletions
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

Lines changed: 26 additions & 0 deletions
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

Lines changed: 45 additions & 0 deletions
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

Lines changed: 42 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: 89 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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy