From 0c04baa60929c22829f0a3cc5e991f0c279b3e79 Mon Sep 17 00:00:00 2001 From: Kevin Lyda <kevin@lyda.ie> Date: Wed, 7 May 2025 23:14:18 +0100 Subject: [PATCH] Implement select --- NOTES.md | 7 +++++-- folders/folders.go | 15 ++++++++++++++- repl/folders.go | 4 +++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/NOTES.md b/NOTES.md index 317f95e..f3dccc8 100644 --- a/NOTES.md +++ b/NOTES.md @@ -24,8 +24,11 @@ sqlite trigger tracing: `.trace stdout --row --profile --stmt --expanded --plain ## Things to do * Implement each command. - * Next: folder commands - ~~CREATE~~, ~~REMOVE~~, MODIFY, INDEX, SELECT - * Messages: ADD, CURRENT, DIRECTORY + * Next: folder commands - ~~CREATE~~, ~~REMOVE~~, MODIFY, ~~INDEX~~, SELECT + * Messages: ADD, CURRENT, DIRECTORY, BACK, CHANGE, FIRST, REMOVE, NEXT, READ + * Messages edit: CHANGE, REPLY, FORWARD + * Moving messages: COPY, MOVE + * Mail: MAIL, FORWARD, * Editor - need an embedded editor * An EDT inspired [editor](https://sourceforge.net/projects/edt-text-editor/) * [gkilo](https://github.com/vcnovaes/gkilo) diff --git a/folders/folders.go b/folders/folders.go index bfafdd2..04b69a1 100644 --- a/folders/folders.go +++ b/folders/folders.go @@ -102,19 +102,32 @@ func (s *Store) ListFolder(user string, _ FolderListOptions) ([]FolderListRow, e return flr, nil } +// IsFolderAccess checks if a user can access a folder. +func (s *Store) IsFolderAccess(name, user string) bool { + found := 0 + s.db.Get(&found, + `SELECT 1 FROM folders AS f LEFT JOIN co_owners AS c ON f.name = c.folder + WHERE f.name = $1 AND + (f.visibility = "public" + OR (f.owner = $2 OR c.OWNER = $2))`, + name, user) + return found == 1 +} + // IsFolderOwner checks if a user is a folder owner. func (s *Store) IsFolderOwner(name, user string) bool { found := 0 s.db.Get(&found, `SELECT 1 FROM folders AS f LEFT JOIN co_owners AS c ON f.name = c.folder - WHERE f.name = $1 (f.owner = '$2' OR c.OWNER = '$2')`, + WHERE f.name = $1 AND (f.owner = '$2' OR c.OWNER = '$2')`, name, user) return found == 1 } // DeleteFolder creates a new folder. func (s *Store) DeleteFolder(name string) error { + // TODO: make sure user can delete this table. results, err := s.db.Exec("DELETE FROM folders WHERE name=$1", name) // TODO: process this error a bit more to give a better error message. if err != nil { diff --git a/repl/folders.go b/repl/folders.go index bfa3bdf..2d9351f 100644 --- a/repl/folders.go +++ b/repl/folders.go @@ -82,7 +82,9 @@ func ActionCreate(cmd *dclish.Command) error { // ActionSelect handles the `SELECT` command. This selects a folder. func ActionSelect(cmd *dclish.Command) error { - fmt.Printf("TODO: implement SELECT:\n%s\n\n", cmd.Description) + if accounts.User.Folders.IsFolderAccess(cmd.Args[0], accounts.User.Login) { + accounts.User.CurrentFolder = cmd.Args[0] + } return nil } -- GitLab