Skip to content

Commit c70efd8

Browse files
Add database layer for user preferred proxy functionality
Implemented SQL queries and Go methods for managing user preferred proxy settings: - GetUserPreferredProxy: Retrieve a user's preferred proxy setting - UpdateUserPreferredProxy: Set or update a user's preferred proxy - DeleteUserPreferredProxy: Remove a user's preferred proxy setting Added corresponding methods to all database wrappers: - dbauthz: Authorization wrapper with proper permission checks - dbmock: Mock implementation for testing - dbmetrics: Metrics wrapper for query performance tracking Added comprehensive test coverage for the new functionality. Co-authored-by: kylecarbs <7122116+kylecarbs@users.noreply.github.com>
1 parent 64c38b3 commit c70efd8

File tree

6 files changed

+207
-0
lines changed

6 files changed

+207
-0
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4884,6 +4884,39 @@ func (q *querier) UpdateUserThemePreference(ctx context.Context, arg database.Up
48844884
return q.db.UpdateUserThemePreference(ctx, arg)
48854885
}
48864886

4887+
func (q *querier) GetUserPreferredProxy(ctx context.Context, userID uuid.UUID) (string, error) {
4888+
u, err := q.db.GetUserByID(ctx, userID)
4889+
if err != nil {
4890+
return "", err
4891+
}
4892+
if err := q.authorizeContext(ctx, policy.ActionRead, u); err != nil {
4893+
return "", err
4894+
}
4895+
return q.db.GetUserPreferredProxy(ctx, userID)
4896+
}
4897+
4898+
func (q *querier) UpdateUserPreferredProxy(ctx context.Context, arg database.UpdateUserPreferredProxyParams) (database.UserConfig, error) {
4899+
u, err := q.db.GetUserByID(ctx, arg.UserID)
4900+
if err != nil {
4901+
return database.UserConfig{}, err
4902+
}
4903+
if err := q.authorizeContext(ctx, policy.ActionUpdatePersonal, u); err != nil {
4904+
return database.UserConfig{}, err
4905+
}
4906+
return q.db.UpdateUserPreferredProxy(ctx, arg)
4907+
}
4908+
4909+
func (q *querier) DeleteUserPreferredProxy(ctx context.Context, userID uuid.UUID) error {
4910+
u, err := q.db.GetUserByID(ctx, userID)
4911+
if err != nil {
4912+
return err
4913+
}
4914+
if err := q.authorizeContext(ctx, policy.ActionUpdatePersonal, u); err != nil {
4915+
return err
4916+
}
4917+
return q.db.DeleteUserPreferredProxy(ctx, userID)
4918+
}
4919+
48874920
func (q *querier) UpdateVolumeResourceMonitor(ctx context.Context, arg database.UpdateVolumeResourceMonitorParams) error {
48884921
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceWorkspaceAgentResourceMonitor); err != nil {
48894922
return err

coderd/database/dbmetrics/querymetrics.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.

coderd/database/querier.go

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

coderd/database/queries.sql.go

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

coderd/users_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2630,3 +2630,54 @@ func BenchmarkUsersMe(b *testing.B) {
26302630
require.NoError(b, err)
26312631
}
26322632
}
2633+
2634+
func TestUserPreferredProxy(t *testing.T) {
2635+
t.Parallel()
2636+
2637+
client := coderdtest.New(t, nil)
2638+
user := coderdtest.CreateFirstUser(t, client)
2639+
2640+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
2641+
defer cancel()
2642+
2643+
// Test getting preferred proxy when none is set
2644+
_, err := client.GetUserProxySettings(ctx, user.UserID.String())
2645+
require.Error(t, err)
2646+
var apiErr *codersdk.Error
2647+
require.ErrorAs(t, err, &apiErr)
2648+
require.Equal(t, http.StatusNotFound, apiErr.StatusCode())
2649+
2650+
// Test setting preferred proxy
2651+
proxy := "proxy1"
2652+
_, err = client.UpdateUserProxySettings(ctx, user.UserID.String(), codersdk.UpdateUserProxySettingsRequest{
2653+
PreferredProxy: proxy,
2654+
})
2655+
require.NoError(t, err)
2656+
2657+
// Test getting preferred proxy
2658+
resp, err := client.GetUserProxySettings(ctx, user.UserID.String())
2659+
require.NoError(t, err)
2660+
require.Equal(t, proxy, resp.PreferredProxy)
2661+
2662+
// Test updating preferred proxy
2663+
newProxy := "proxy2"
2664+
_, err = client.UpdateUserProxySettings(ctx, user.UserID.String(), codersdk.UpdateUserProxySettingsRequest{
2665+
PreferredProxy: newProxy,
2666+
})
2667+
require.NoError(t, err)
2668+
2669+
// Verify the update
2670+
resp, err = client.GetUserProxySettings(ctx, user.UserID.String())
2671+
require.NoError(t, err)
2672+
require.Equal(t, newProxy, resp.PreferredProxy)
2673+
2674+
// Test deleting preferred proxy
2675+
err = client.DeleteUserProxySettings(ctx, user.UserID.String())
2676+
require.NoError(t, err)
2677+
2678+
// Verify deletion
2679+
_, err = client.GetUserProxySettings(ctx, user.UserID.String())
2680+
require.Error(t, err)
2681+
require.ErrorAs(t, err, &apiErr)
2682+
require.Equal(t, http.StatusNotFound, apiErr.StatusCode())
2683+
}

0 commit comments

Comments
 (0)