Skip to content

Commit 743d308

Browse files
authored
feat: support multiple terminal fonts (coder#17257)
Fixes: coder#15024
1 parent 30f41cd commit 743d308

29 files changed

+813
-228
lines changed

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/database/dbauthz/dbauthz.go

+44-22
Original file line numberDiff line numberDiff line change
@@ -2721,17 +2721,6 @@ func (q *querier) GetUserActivityInsights(ctx context.Context, arg database.GetU
27212721
return q.db.GetUserActivityInsights(ctx, arg)
27222722
}
27232723

2724-
func (q *querier) GetUserAppearanceSettings(ctx context.Context, userID uuid.UUID) (string, error) {
2725-
u, err := q.db.GetUserByID(ctx, userID)
2726-
if err != nil {
2727-
return "", err
2728-
}
2729-
if err := q.authorizeContext(ctx, policy.ActionReadPersonal, u); err != nil {
2730-
return "", err
2731-
}
2732-
return q.db.GetUserAppearanceSettings(ctx, userID)
2733-
}
2734-
27352724
func (q *querier) GetUserByEmailOrUsername(ctx context.Context, arg database.GetUserByEmailOrUsernameParams) (database.User, error) {
27362725
return fetch(q.log, q.auth, q.db.GetUserByEmailOrUsername)(ctx, arg)
27372726
}
@@ -2804,6 +2793,28 @@ func (q *querier) GetUserStatusCounts(ctx context.Context, arg database.GetUserS
28042793
return q.db.GetUserStatusCounts(ctx, arg)
28052794
}
28062795

2796+
func (q *querier) GetUserTerminalFont(ctx context.Context, userID uuid.UUID) (string, error) {
2797+
u, err := q.db.GetUserByID(ctx, userID)
2798+
if err != nil {
2799+
return "", err
2800+
}
2801+
if err := q.authorizeContext(ctx, policy.ActionReadPersonal, u); err != nil {
2802+
return "", err
2803+
}
2804+
return q.db.GetUserTerminalFont(ctx, userID)
2805+
}
2806+
2807+
func (q *querier) GetUserThemePreference(ctx context.Context, userID uuid.UUID) (string, error) {
2808+
u, err := q.db.GetUserByID(ctx, userID)
2809+
if err != nil {
2810+
return "", err
2811+
}
2812+
if err := q.authorizeContext(ctx, policy.ActionReadPersonal, u); err != nil {
2813+
return "", err
2814+
}
2815+
return q.db.GetUserThemePreference(ctx, userID)
2816+
}
2817+
28072818
func (q *querier) GetUserWorkspaceBuildParameters(ctx context.Context, params database.GetUserWorkspaceBuildParametersParams) ([]database.GetUserWorkspaceBuildParametersRow, error) {
28082819
u, err := q.db.GetUserByID(ctx, params.OwnerID)
28092820
if err != nil {
@@ -4321,17 +4332,6 @@ func (q *querier) UpdateTemplateWorkspacesLastUsedAt(ctx context.Context, arg da
43214332
return fetchAndExec(q.log, q.auth, policy.ActionUpdate, fetch, q.db.UpdateTemplateWorkspacesLastUsedAt)(ctx, arg)
43224333
}
43234334

4324-
func (q *querier) UpdateUserAppearanceSettings(ctx context.Context, arg database.UpdateUserAppearanceSettingsParams) (database.UserConfig, error) {
4325-
u, err := q.db.GetUserByID(ctx, arg.UserID)
4326-
if err != nil {
4327-
return database.UserConfig{}, err
4328-
}
4329-
if err := q.authorizeContext(ctx, policy.ActionUpdatePersonal, u); err != nil {
4330-
return database.UserConfig{}, err
4331-
}
4332-
return q.db.UpdateUserAppearanceSettings(ctx, arg)
4333-
}
4334-
43354335
func (q *querier) UpdateUserDeletedByID(ctx context.Context, id uuid.UUID) error {
43364336
return deleteQ(q.log, q.auth, q.db.GetUserByID, q.db.UpdateUserDeletedByID)(ctx, id)
43374337
}
@@ -4469,6 +4469,28 @@ func (q *querier) UpdateUserStatus(ctx context.Context, arg database.UpdateUserS
44694469
return updateWithReturn(q.log, q.auth, fetch, q.db.UpdateUserStatus)(ctx, arg)
44704470
}
44714471

4472+
func (q *querier) UpdateUserTerminalFont(ctx context.Context, arg database.UpdateUserTerminalFontParams) (database.UserConfig, error) {
4473+
u, err := q.db.GetUserByID(ctx, arg.UserID)
4474+
if err != nil {
4475+
return database.UserConfig{}, err
4476+
}
4477+
if err := q.authorizeContext(ctx, policy.ActionUpdatePersonal, u); err != nil {
4478+
return database.UserConfig{}, err
4479+
}
4480+
return q.db.UpdateUserTerminalFont(ctx, arg)
4481+
}
4482+
4483+
func (q *querier) UpdateUserThemePreference(ctx context.Context, arg database.UpdateUserThemePreferenceParams) (database.UserConfig, error) {
4484+
u, err := q.db.GetUserByID(ctx, arg.UserID)
4485+
if err != nil {
4486+
return database.UserConfig{}, err
4487+
}
4488+
if err := q.authorizeContext(ctx, policy.ActionUpdatePersonal, u); err != nil {
4489+
return database.UserConfig{}, err
4490+
}
4491+
return q.db.UpdateUserThemePreference(ctx, arg)
4492+
}
4493+
44724494
func (q *querier) UpdateVolumeResourceMonitor(ctx context.Context, arg database.UpdateVolumeResourceMonitorParams) error {
44734495
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceWorkspaceAgentResourceMonitor); err != nil {
44744496
return err

coderd/database/dbauthz/dbauthz_test.go

+25-4
Original file line numberDiff line numberDiff line change
@@ -1628,27 +1628,48 @@ func (s *MethodTestSuite) TestUser() {
16281628
[]database.GetUserWorkspaceBuildParametersRow{},
16291629
)
16301630
}))
1631-
s.Run("GetUserAppearanceSettings", s.Subtest(func(db database.Store, check *expects) {
1631+
s.Run("GetUserThemePreference", s.Subtest(func(db database.Store, check *expects) {
16321632
ctx := context.Background()
16331633
u := dbgen.User(s.T(), db, database.User{})
1634-
db.UpdateUserAppearanceSettings(ctx, database.UpdateUserAppearanceSettingsParams{
1634+
db.UpdateUserThemePreference(ctx, database.UpdateUserThemePreferenceParams{
16351635
UserID: u.ID,
16361636
ThemePreference: "light",
16371637
})
16381638
check.Args(u.ID).Asserts(u, policy.ActionReadPersonal).Returns("light")
16391639
}))
1640-
s.Run("UpdateUserAppearanceSettings", s.Subtest(func(db database.Store, check *expects) {
1640+
s.Run("UpdateUserThemePreference", s.Subtest(func(db database.Store, check *expects) {
16411641
u := dbgen.User(s.T(), db, database.User{})
16421642
uc := database.UserConfig{
16431643
UserID: u.ID,
16441644
Key: "theme_preference",
16451645
Value: "dark",
16461646
}
1647-
check.Args(database.UpdateUserAppearanceSettingsParams{
1647+
check.Args(database.UpdateUserThemePreferenceParams{
16481648
UserID: u.ID,
16491649
ThemePreference: uc.Value,
16501650
}).Asserts(u, policy.ActionUpdatePersonal).Returns(uc)
16511651
}))
1652+
s.Run("GetUserTerminalFont", s.Subtest(func(db database.Store, check *expects) {
1653+
ctx := context.Background()
1654+
u := dbgen.User(s.T(), db, database.User{})
1655+
db.UpdateUserTerminalFont(ctx, database.UpdateUserTerminalFontParams{
1656+
UserID: u.ID,
1657+
TerminalFont: "ibm-plex-mono",
1658+
})
1659+
check.Args(u.ID).Asserts(u, policy.ActionReadPersonal).Returns("ibm-plex-mono")
1660+
}))
1661+
s.Run("UpdateUserTerminalFont", s.Subtest(func(db database.Store, check *expects) {
1662+
u := dbgen.User(s.T(), db, database.User{})
1663+
uc := database.UserConfig{
1664+
UserID: u.ID,
1665+
Key: "terminal_font",
1666+
Value: "ibm-plex-mono",
1667+
}
1668+
check.Args(database.UpdateUserTerminalFontParams{
1669+
UserID: u.ID,
1670+
TerminalFont: uc.Value,
1671+
}).Asserts(u, policy.ActionUpdatePersonal).Returns(uc)
1672+
}))
16521673
s.Run("UpdateUserStatus", s.Subtest(func(db database.Store, check *expects) {
16531674
u := dbgen.User(s.T(), db, database.User{})
16541675
check.Args(database.UpdateUserStatusParams{

coderd/database/dbmem/dbmem.go

+82-41
Original file line numberDiff line numberDiff line change
@@ -6448,20 +6448,6 @@ func (q *FakeQuerier) GetUserActivityInsights(_ context.Context, arg database.Ge
64486448
return rows, nil
64496449
}
64506450

6451-
func (q *FakeQuerier) GetUserAppearanceSettings(_ context.Context, userID uuid.UUID) (string, error) {
6452-
q.mutex.RLock()
6453-
defer q.mutex.RUnlock()
6454-
6455-
for _, uc := range q.userConfigs {
6456-
if uc.UserID != userID || uc.Key != "theme_preference" {
6457-
continue
6458-
}
6459-
return uc.Value, nil
6460-
}
6461-
6462-
return "", sql.ErrNoRows
6463-
}
6464-
64656451
func (q *FakeQuerier) GetUserByEmailOrUsername(_ context.Context, arg database.GetUserByEmailOrUsernameParams) (database.User, error) {
64666452
if err := validateDatabaseType(arg); err != nil {
64676453
return database.User{}, err
@@ -6674,6 +6660,34 @@ func (q *FakeQuerier) GetUserStatusCounts(_ context.Context, arg database.GetUse
66746660
return result, nil
66756661
}
66766662

6663+
func (q *FakeQuerier) GetUserTerminalFont(ctx context.Context, userID uuid.UUID) (string, error) {
6664+
q.mutex.RLock()
6665+
defer q.mutex.RUnlock()
6666+
6667+
for _, uc := range q.userConfigs {
6668+
if uc.UserID != userID || uc.Key != "terminal_font" {
6669+
continue
6670+
}
6671+
return uc.Value, nil
6672+
}
6673+
6674+
return "", sql.ErrNoRows
6675+
}
6676+
6677+
func (q *FakeQuerier) GetUserThemePreference(_ context.Context, userID uuid.UUID) (string, error) {
6678+
q.mutex.RLock()
6679+
defer q.mutex.RUnlock()
6680+
6681+
for _, uc := range q.userConfigs {
6682+
if uc.UserID != userID || uc.Key != "theme_preference" {
6683+
continue
6684+
}
6685+
return uc.Value, nil
6686+
}
6687+
6688+
return "", sql.ErrNoRows
6689+
}
6690+
66776691
func (q *FakeQuerier) GetUserWorkspaceBuildParameters(_ context.Context, params database.GetUserWorkspaceBuildParametersParams) ([]database.GetUserWorkspaceBuildParametersRow, error) {
66786692
q.mutex.RLock()
66796693
defer q.mutex.RUnlock()
@@ -11015,33 +11029,6 @@ func (q *FakeQuerier) UpdateTemplateWorkspacesLastUsedAt(_ context.Context, arg
1101511029
return nil
1101611030
}
1101711031

11018-
func (q *FakeQuerier) UpdateUserAppearanceSettings(_ context.Context, arg database.UpdateUserAppearanceSettingsParams) (database.UserConfig, error) {
11019-
err := validateDatabaseType(arg)
11020-
if err != nil {
11021-
return database.UserConfig{}, err
11022-
}
11023-
11024-
q.mutex.Lock()
11025-
defer q.mutex.Unlock()
11026-
11027-
for i, uc := range q.userConfigs {
11028-
if uc.UserID != arg.UserID || uc.Key != "theme_preference" {
11029-
continue
11030-
}
11031-
uc.Value = arg.ThemePreference
11032-
q.userConfigs[i] = uc
11033-
return uc, nil
11034-
}
11035-
11036-
uc := database.UserConfig{
11037-
UserID: arg.UserID,
11038-
Key: "theme_preference",
11039-
Value: arg.ThemePreference,
11040-
}
11041-
q.userConfigs = append(q.userConfigs, uc)
11042-
return uc, nil
11043-
}
11044-
1104511032
func (q *FakeQuerier) UpdateUserDeletedByID(_ context.Context, id uuid.UUID) error {
1104611033
q.mutex.Lock()
1104711034
defer q.mutex.Unlock()
@@ -11367,6 +11354,60 @@ func (q *FakeQuerier) UpdateUserStatus(_ context.Context, arg database.UpdateUse
1136711354
return database.User{}, sql.ErrNoRows
1136811355
}
1136911356

11357+
func (q *FakeQuerier) UpdateUserTerminalFont(ctx context.Context, arg database.UpdateUserTerminalFontParams) (database.UserConfig, error) {
11358+
err := validateDatabaseType(arg)
11359+
if err != nil {
11360+
return database.UserConfig{}, err
11361+
}
11362+
11363+
q.mutex.Lock()
11364+
defer q.mutex.Unlock()
11365+
11366+
for i, uc := range q.userConfigs {
11367+
if uc.UserID != arg.UserID || uc.Key != "terminal_font" {
11368+
continue
11369+
}
11370+
uc.Value = arg.TerminalFont
11371+
q.userConfigs[i] = uc
11372+
return uc, nil
11373+
}
11374+
11375+
uc := database.UserConfig{
11376+
UserID: arg.UserID,
11377+
Key: "terminal_font",
11378+
Value: arg.TerminalFont,
11379+
}
11380+
q.userConfigs = append(q.userConfigs, uc)
11381+
return uc, nil
11382+
}
11383+
11384+
func (q *FakeQuerier) UpdateUserThemePreference(_ context.Context, arg database.UpdateUserThemePreferenceParams) (database.UserConfig, error) {
11385+
err := validateDatabaseType(arg)
11386+
if err != nil {
11387+
return database.UserConfig{}, err
11388+
}
11389+
11390+
q.mutex.Lock()
11391+
defer q.mutex.Unlock()
11392+
11393+
for i, uc := range q.userConfigs {
11394+
if uc.UserID != arg.UserID || uc.Key != "theme_preference" {
11395+
continue
11396+
}
11397+
uc.Value = arg.ThemePreference
11398+
q.userConfigs[i] = uc
11399+
return uc, nil
11400+
}
11401+
11402+
uc := database.UserConfig{
11403+
UserID: arg.UserID,
11404+
Key: "theme_preference",
11405+
Value: arg.ThemePreference,
11406+
}
11407+
q.userConfigs = append(q.userConfigs, uc)
11408+
return uc, nil
11409+
}
11410+
1137011411
func (q *FakeQuerier) UpdateVolumeResourceMonitor(_ context.Context, arg database.UpdateVolumeResourceMonitorParams) error {
1137111412
err := validateDatabaseType(arg)
1137211413
if err != nil {

0 commit comments

Comments
 (0)