feat: support multiple terminal fonts (#17257)

Fixes: https://github.com/coder/coder/issues/15024
This commit is contained in:
Marcin Tojek
2025-04-07 14:30:10 +02:00
committed by GitHub
parent 30f41cdd42
commit 743d308eb3
29 changed files with 815 additions and 230 deletions

View File

@ -2721,17 +2721,6 @@ func (q *querier) GetUserActivityInsights(ctx context.Context, arg database.GetU
return q.db.GetUserActivityInsights(ctx, arg)
}
func (q *querier) GetUserAppearanceSettings(ctx context.Context, userID uuid.UUID) (string, error) {
u, err := q.db.GetUserByID(ctx, userID)
if err != nil {
return "", err
}
if err := q.authorizeContext(ctx, policy.ActionReadPersonal, u); err != nil {
return "", err
}
return q.db.GetUserAppearanceSettings(ctx, userID)
}
func (q *querier) GetUserByEmailOrUsername(ctx context.Context, arg database.GetUserByEmailOrUsernameParams) (database.User, error) {
return fetch(q.log, q.auth, q.db.GetUserByEmailOrUsername)(ctx, arg)
}
@ -2804,6 +2793,28 @@ func (q *querier) GetUserStatusCounts(ctx context.Context, arg database.GetUserS
return q.db.GetUserStatusCounts(ctx, arg)
}
func (q *querier) GetUserTerminalFont(ctx context.Context, userID uuid.UUID) (string, error) {
u, err := q.db.GetUserByID(ctx, userID)
if err != nil {
return "", err
}
if err := q.authorizeContext(ctx, policy.ActionReadPersonal, u); err != nil {
return "", err
}
return q.db.GetUserTerminalFont(ctx, userID)
}
func (q *querier) GetUserThemePreference(ctx context.Context, userID uuid.UUID) (string, error) {
u, err := q.db.GetUserByID(ctx, userID)
if err != nil {
return "", err
}
if err := q.authorizeContext(ctx, policy.ActionReadPersonal, u); err != nil {
return "", err
}
return q.db.GetUserThemePreference(ctx, userID)
}
func (q *querier) GetUserWorkspaceBuildParameters(ctx context.Context, params database.GetUserWorkspaceBuildParametersParams) ([]database.GetUserWorkspaceBuildParametersRow, error) {
u, err := q.db.GetUserByID(ctx, params.OwnerID)
if err != nil {
@ -4321,17 +4332,6 @@ func (q *querier) UpdateTemplateWorkspacesLastUsedAt(ctx context.Context, arg da
return fetchAndExec(q.log, q.auth, policy.ActionUpdate, fetch, q.db.UpdateTemplateWorkspacesLastUsedAt)(ctx, arg)
}
func (q *querier) UpdateUserAppearanceSettings(ctx context.Context, arg database.UpdateUserAppearanceSettingsParams) (database.UserConfig, error) {
u, err := q.db.GetUserByID(ctx, arg.UserID)
if err != nil {
return database.UserConfig{}, err
}
if err := q.authorizeContext(ctx, policy.ActionUpdatePersonal, u); err != nil {
return database.UserConfig{}, err
}
return q.db.UpdateUserAppearanceSettings(ctx, arg)
}
func (q *querier) UpdateUserDeletedByID(ctx context.Context, id uuid.UUID) error {
return deleteQ(q.log, q.auth, q.db.GetUserByID, q.db.UpdateUserDeletedByID)(ctx, id)
}
@ -4469,6 +4469,28 @@ func (q *querier) UpdateUserStatus(ctx context.Context, arg database.UpdateUserS
return updateWithReturn(q.log, q.auth, fetch, q.db.UpdateUserStatus)(ctx, arg)
}
func (q *querier) UpdateUserTerminalFont(ctx context.Context, arg database.UpdateUserTerminalFontParams) (database.UserConfig, error) {
u, err := q.db.GetUserByID(ctx, arg.UserID)
if err != nil {
return database.UserConfig{}, err
}
if err := q.authorizeContext(ctx, policy.ActionUpdatePersonal, u); err != nil {
return database.UserConfig{}, err
}
return q.db.UpdateUserTerminalFont(ctx, arg)
}
func (q *querier) UpdateUserThemePreference(ctx context.Context, arg database.UpdateUserThemePreferenceParams) (database.UserConfig, error) {
u, err := q.db.GetUserByID(ctx, arg.UserID)
if err != nil {
return database.UserConfig{}, err
}
if err := q.authorizeContext(ctx, policy.ActionUpdatePersonal, u); err != nil {
return database.UserConfig{}, err
}
return q.db.UpdateUserThemePreference(ctx, arg)
}
func (q *querier) UpdateVolumeResourceMonitor(ctx context.Context, arg database.UpdateVolumeResourceMonitorParams) error {
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceWorkspaceAgentResourceMonitor); err != nil {
return err

View File

@ -1628,27 +1628,48 @@ func (s *MethodTestSuite) TestUser() {
[]database.GetUserWorkspaceBuildParametersRow{},
)
}))
s.Run("GetUserAppearanceSettings", s.Subtest(func(db database.Store, check *expects) {
s.Run("GetUserThemePreference", s.Subtest(func(db database.Store, check *expects) {
ctx := context.Background()
u := dbgen.User(s.T(), db, database.User{})
db.UpdateUserAppearanceSettings(ctx, database.UpdateUserAppearanceSettingsParams{
db.UpdateUserThemePreference(ctx, database.UpdateUserThemePreferenceParams{
UserID: u.ID,
ThemePreference: "light",
})
check.Args(u.ID).Asserts(u, policy.ActionReadPersonal).Returns("light")
}))
s.Run("UpdateUserAppearanceSettings", s.Subtest(func(db database.Store, check *expects) {
s.Run("UpdateUserThemePreference", s.Subtest(func(db database.Store, check *expects) {
u := dbgen.User(s.T(), db, database.User{})
uc := database.UserConfig{
UserID: u.ID,
Key: "theme_preference",
Value: "dark",
}
check.Args(database.UpdateUserAppearanceSettingsParams{
check.Args(database.UpdateUserThemePreferenceParams{
UserID: u.ID,
ThemePreference: uc.Value,
}).Asserts(u, policy.ActionUpdatePersonal).Returns(uc)
}))
s.Run("GetUserTerminalFont", s.Subtest(func(db database.Store, check *expects) {
ctx := context.Background()
u := dbgen.User(s.T(), db, database.User{})
db.UpdateUserTerminalFont(ctx, database.UpdateUserTerminalFontParams{
UserID: u.ID,
TerminalFont: "ibm-plex-mono",
})
check.Args(u.ID).Asserts(u, policy.ActionReadPersonal).Returns("ibm-plex-mono")
}))
s.Run("UpdateUserTerminalFont", s.Subtest(func(db database.Store, check *expects) {
u := dbgen.User(s.T(), db, database.User{})
uc := database.UserConfig{
UserID: u.ID,
Key: "terminal_font",
Value: "ibm-plex-mono",
}
check.Args(database.UpdateUserTerminalFontParams{
UserID: u.ID,
TerminalFont: uc.Value,
}).Asserts(u, policy.ActionUpdatePersonal).Returns(uc)
}))
s.Run("UpdateUserStatus", s.Subtest(func(db database.Store, check *expects) {
u := dbgen.User(s.T(), db, database.User{})
check.Args(database.UpdateUserStatusParams{