Loading repl/command.go +4 −0 Original line number Diff line number Diff line Loading @@ -366,6 +366,10 @@ that message.`, "/DESCRIBE": { Description: ` Valid when used with /FOLDERS. Specifies to include description of folder.`, }, "/FLAGS": { Description: ` Valid when used with /FOLDERS. Shows your personal alert setting (BRIEF, READNEW, SHOWNEW) for each folder.`, }, "/EXPIRATION": { Description: ` Shows the message's expiration date rather than the creation date.`, Loading repl/messages.go +16 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,17 @@ func ActionDirectory(cmd *dclish.Command) error { return nil } showDesc := cmd.Flags["/DESCRIBE"].Value == "true" showFlags := cmd.Flags["/FLAGS"].Value == "true" alertMap := map[string]int64{} if showFlags { ctx := storage.Context() alertRows, err := this.Q.ListUserFolderAlerts(ctx, this.User.Login) if err == nil { for _, r := range alertRows { alertMap[r.Folder] = r.Alert } } } buf := strings.Builder{} buf.WriteString(fmt.Sprintf("%-25s %5s\n", "Folder", "Msgs")) for _, f := range folderList { Loading @@ -43,6 +54,11 @@ func ActionDirectory(cmd *dclish.Command) error { if showDesc && f.Description != "" { buf.WriteString(fmt.Sprintf(" %s", f.Description)) } if showFlags { if alert := alertMap[f.Name]; alert != 0 { buf.WriteString(fmt.Sprintf(" %s", strings.ToUpper(storage.AlertString(alert)))) } } buf.WriteString("\n") } pager.Pager(buf.String()) Loading repl/show.go +18 −5 Original line number Diff line number Diff line Loading @@ -23,13 +23,20 @@ func ActionShow(cmd *dclish.Command) error { // ActionShowFlags handles the `SHOW FLAGS` command. func ActionShowFlags(_ *dclish.Command) error { flagset := false ctx := storage.Context() fmt.Printf("For the selected folder %s:\n", this.Folder.Name) flagset := false if this.Folder.Alert != 0 { fmt.Printf(" %s is set.\n", fmt.Printf(" System flag: %s\n", strings.ToUpper(storage.AlertString(this.Folder.Alert))) flagset = true } userAlert, err := this.Q.GetUserFolderAlert(ctx, this.User.Login, this.Folder.Name) if err == nil && userAlert != 0 { fmt.Printf(" Your setting: %s\n", strings.ToUpper(storage.AlertString(userAlert))) flagset = true } if !flagset { fmt.Println(" No flags are set.") } Loading Loading @@ -85,9 +92,15 @@ func ActionShowFolder(cmd *dclish.Command) error { if folder.Always != 0 { fmt.Println(" ALWAYS has been set.") } if this.Folder.Alert != 0 { fmt.Printf(" %s is set.\n", strings.ToUpper(storage.AlertString(this.Folder.Alert))) if folder.Alert != 0 { fmt.Printf(" System flag: %s\n", strings.ToUpper(storage.AlertString(folder.Alert))) } ctx := storage.Context() userAlert, err := this.Q.GetUserFolderAlert(ctx, this.User.Login, folder.Name) if err == nil && userAlert != 0 { fmt.Printf(" Your setting: %s\n", strings.ToUpper(storage.AlertString(userAlert))) } return nil Loading storage/queries/users.sql +12 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,18 @@ INSERT INTO folder_configs (login, folder, alert) ON CONFLICT(login, folder) DO UPDATE SET login = ?1, folder = ?2, alert = ?3; -- GetUserFolderAlert gets the user's personal alert setting for a folder. -- Returns 0 if no setting has been saved. -- name: GetUserFolderAlert :one SELECT CAST(COALESCE((SELECT alert FROM folder_configs WHERE login = ?1 AND folder = ?2), 0) AS INT); -- ListUserFolderAlerts lists all non-default alert settings for a user. -- name: ListUserFolderAlerts :many SELECT folder, CAST(alert AS INT) as alert FROM folder_configs WHERE login = ? AND alert != 0 ORDER BY folder; -- UpdateUserName update user's name for a given login (excluding the -- SYSTEM user). -- name: UpdateUserName :exec Loading storage/users.sql.go +56 −0 Original line number Diff line number Diff line Loading @@ -319,6 +319,21 @@ func (q *Queries) GetUser(ctx context.Context, login string) (User, error) { return i, err } const getUserFolderAlert = `-- name: GetUserFolderAlert :one SELECT CAST(COALESCE((SELECT alert FROM folder_configs WHERE login = ?1 AND folder = ?2), 0) AS INT) ` // GetUserFolderAlert gets the user's personal alert setting for a folder. // Returns 0 if no setting has been saved. // // SELECT CAST(COALESCE((SELECT alert FROM folder_configs WHERE login = ?1 AND folder = ?2), 0) AS INT) func (q *Queries) GetUserFolderAlert(ctx context.Context, login string, folder string) (int64, error) { row := q.db.QueryRowContext(ctx, getUserFolderAlert, login, folder) var column_1 int64 err := row.Scan(&column_1) return column_1, err } const isUserAdmin = `-- name: IsUserAdmin :one SELECT admin FROM users WHERE login = ? ` Loading @@ -333,6 +348,47 @@ func (q *Queries) IsUserAdmin(ctx context.Context, login string) (int64, error) return admin, err } const listUserFolderAlerts = `-- name: ListUserFolderAlerts :many SELECT folder, CAST(alert AS INT) as alert FROM folder_configs WHERE login = ? AND alert != 0 ORDER BY folder ` type ListUserFolderAlertsRow struct { Folder string Alert int64 } // ListUserFolderAlerts lists all non-default alert settings for a user. // // SELECT folder, CAST(alert AS INT) as alert // FROM folder_configs // WHERE login = ? AND alert != 0 // ORDER BY folder func (q *Queries) ListUserFolderAlerts(ctx context.Context, login string) ([]ListUserFolderAlertsRow, error) { rows, err := q.db.QueryContext(ctx, listUserFolderAlerts, login) if err != nil { return nil, err } defer rows.Close() var items []ListUserFolderAlertsRow for rows.Next() { var i ListUserFolderAlertsRow if err := rows.Scan(&i.Folder, &i.Alert); err != nil { return nil, err } items = append(items, i) } if err := rows.Close(); err != nil { return nil, err } if err := rows.Err(); err != nil { return nil, err } return items, nil } const updateUserAdmin = `-- name: UpdateUserAdmin :exec UPDATE users SET admin = ? WHERE login = ? AND login != 'SYSTEM' ` Loading Loading
repl/command.go +4 −0 Original line number Diff line number Diff line Loading @@ -366,6 +366,10 @@ that message.`, "/DESCRIBE": { Description: ` Valid when used with /FOLDERS. Specifies to include description of folder.`, }, "/FLAGS": { Description: ` Valid when used with /FOLDERS. Shows your personal alert setting (BRIEF, READNEW, SHOWNEW) for each folder.`, }, "/EXPIRATION": { Description: ` Shows the message's expiration date rather than the creation date.`, Loading
repl/messages.go +16 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,17 @@ func ActionDirectory(cmd *dclish.Command) error { return nil } showDesc := cmd.Flags["/DESCRIBE"].Value == "true" showFlags := cmd.Flags["/FLAGS"].Value == "true" alertMap := map[string]int64{} if showFlags { ctx := storage.Context() alertRows, err := this.Q.ListUserFolderAlerts(ctx, this.User.Login) if err == nil { for _, r := range alertRows { alertMap[r.Folder] = r.Alert } } } buf := strings.Builder{} buf.WriteString(fmt.Sprintf("%-25s %5s\n", "Folder", "Msgs")) for _, f := range folderList { Loading @@ -43,6 +54,11 @@ func ActionDirectory(cmd *dclish.Command) error { if showDesc && f.Description != "" { buf.WriteString(fmt.Sprintf(" %s", f.Description)) } if showFlags { if alert := alertMap[f.Name]; alert != 0 { buf.WriteString(fmt.Sprintf(" %s", strings.ToUpper(storage.AlertString(alert)))) } } buf.WriteString("\n") } pager.Pager(buf.String()) Loading
repl/show.go +18 −5 Original line number Diff line number Diff line Loading @@ -23,13 +23,20 @@ func ActionShow(cmd *dclish.Command) error { // ActionShowFlags handles the `SHOW FLAGS` command. func ActionShowFlags(_ *dclish.Command) error { flagset := false ctx := storage.Context() fmt.Printf("For the selected folder %s:\n", this.Folder.Name) flagset := false if this.Folder.Alert != 0 { fmt.Printf(" %s is set.\n", fmt.Printf(" System flag: %s\n", strings.ToUpper(storage.AlertString(this.Folder.Alert))) flagset = true } userAlert, err := this.Q.GetUserFolderAlert(ctx, this.User.Login, this.Folder.Name) if err == nil && userAlert != 0 { fmt.Printf(" Your setting: %s\n", strings.ToUpper(storage.AlertString(userAlert))) flagset = true } if !flagset { fmt.Println(" No flags are set.") } Loading Loading @@ -85,9 +92,15 @@ func ActionShowFolder(cmd *dclish.Command) error { if folder.Always != 0 { fmt.Println(" ALWAYS has been set.") } if this.Folder.Alert != 0 { fmt.Printf(" %s is set.\n", strings.ToUpper(storage.AlertString(this.Folder.Alert))) if folder.Alert != 0 { fmt.Printf(" System flag: %s\n", strings.ToUpper(storage.AlertString(folder.Alert))) } ctx := storage.Context() userAlert, err := this.Q.GetUserFolderAlert(ctx, this.User.Login, folder.Name) if err == nil && userAlert != 0 { fmt.Printf(" Your setting: %s\n", strings.ToUpper(storage.AlertString(userAlert))) } return nil Loading
storage/queries/users.sql +12 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,18 @@ INSERT INTO folder_configs (login, folder, alert) ON CONFLICT(login, folder) DO UPDATE SET login = ?1, folder = ?2, alert = ?3; -- GetUserFolderAlert gets the user's personal alert setting for a folder. -- Returns 0 if no setting has been saved. -- name: GetUserFolderAlert :one SELECT CAST(COALESCE((SELECT alert FROM folder_configs WHERE login = ?1 AND folder = ?2), 0) AS INT); -- ListUserFolderAlerts lists all non-default alert settings for a user. -- name: ListUserFolderAlerts :many SELECT folder, CAST(alert AS INT) as alert FROM folder_configs WHERE login = ? AND alert != 0 ORDER BY folder; -- UpdateUserName update user's name for a given login (excluding the -- SYSTEM user). -- name: UpdateUserName :exec Loading
storage/users.sql.go +56 −0 Original line number Diff line number Diff line Loading @@ -319,6 +319,21 @@ func (q *Queries) GetUser(ctx context.Context, login string) (User, error) { return i, err } const getUserFolderAlert = `-- name: GetUserFolderAlert :one SELECT CAST(COALESCE((SELECT alert FROM folder_configs WHERE login = ?1 AND folder = ?2), 0) AS INT) ` // GetUserFolderAlert gets the user's personal alert setting for a folder. // Returns 0 if no setting has been saved. // // SELECT CAST(COALESCE((SELECT alert FROM folder_configs WHERE login = ?1 AND folder = ?2), 0) AS INT) func (q *Queries) GetUserFolderAlert(ctx context.Context, login string, folder string) (int64, error) { row := q.db.QueryRowContext(ctx, getUserFolderAlert, login, folder) var column_1 int64 err := row.Scan(&column_1) return column_1, err } const isUserAdmin = `-- name: IsUserAdmin :one SELECT admin FROM users WHERE login = ? ` Loading @@ -333,6 +348,47 @@ func (q *Queries) IsUserAdmin(ctx context.Context, login string) (int64, error) return admin, err } const listUserFolderAlerts = `-- name: ListUserFolderAlerts :many SELECT folder, CAST(alert AS INT) as alert FROM folder_configs WHERE login = ? AND alert != 0 ORDER BY folder ` type ListUserFolderAlertsRow struct { Folder string Alert int64 } // ListUserFolderAlerts lists all non-default alert settings for a user. // // SELECT folder, CAST(alert AS INT) as alert // FROM folder_configs // WHERE login = ? AND alert != 0 // ORDER BY folder func (q *Queries) ListUserFolderAlerts(ctx context.Context, login string) ([]ListUserFolderAlertsRow, error) { rows, err := q.db.QueryContext(ctx, listUserFolderAlerts, login) if err != nil { return nil, err } defer rows.Close() var items []ListUserFolderAlertsRow for rows.Next() { var i ListUserFolderAlertsRow if err := rows.Scan(&i.Folder, &i.Alert); err != nil { return nil, err } items = append(items, i) } if err := rows.Close(); err != nil { return nil, err } if err := rows.Err(); err != nil { return nil, err } return items, nil } const updateUserAdmin = `-- name: UpdateUserAdmin :exec UPDATE users SET admin = ? WHERE login = ? AND login != 'SYSTEM' ` Loading