Commit 1bcdf9e5 authored by Kevin Lyda's avatar Kevin Lyda
Browse files

Surface user folder flags

parent 8f7c7875
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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.`,
+16 −0
Original line number Diff line number Diff line
@@ -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 {
@@ -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())
+18 −5
Original line number Diff line number Diff line
@@ -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.")
	}
@@ -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
+12 −0
Original line number Diff line number Diff line
@@ -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
+56 −0
Original line number Diff line number Diff line
@@ -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 = ?
`
@@ -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'
`