Select Git revision
-
Kevin Lyda authored
The `this.Folder` var is now a `storage.Folder`. Implemented the `DELETE` command.
Kevin Lyda authoredThe `this.Folder` var is now a `storage.Folder`. Implemented the `DELETE` command.
folders.go 3.08 KiB
// Package folders are all the routines and sql for managing folders.
package folders
import (
"errors"
"strings"
"git.lyda.ie/kevin/bulletin/storage"
"git.lyda.ie/kevin/bulletin/this"
)
// ValidFolder validates the folder name for this user.
func ValidFolder(folder string) (storage.Folder, error) {
if strings.Contains(folder, "%") {
return storage.Folder{}, errors.New("Folder name cannot contain a %")
}
correct := FindFolder(folder)
if correct.Name == "" {
return storage.Folder{}, errors.New("Unable to select the folder")
}
if !IsFolderAccess(correct.Name, this.User.Login) {
// TODO: Should be:
// WRITE(6,'('' You are not allowed to access folder.'')')
// WRITE(6,'('' See '',A,'' if you wish to access folder.'')')
return storage.Folder{}, errors.New("Unable to select the folder")
}
return correct, nil
}
// Values for FolderVisibility.
const (
FolderPublic int64 = 0
FolderSemiPrivate = 1
FolderPrivate = 2
)
// CreateFolder creates a new folder.
func CreateFolder(owner string, options storage.CreateFolderParams) error {
if !IsAlphaNum(options.Name) {
return errors.New("Folder can only have letters and numbers")
}
options.Name = strings.ToUpper(options.Name)
ctx := storage.Context()
tx, err := this.Store.Begin()
if err != nil {
return err
}
defer tx.Rollback()
qtx := this.Q.WithTx(tx)
err = qtx.CreateFolder(ctx, options)
if err != nil {
return err
}
err = qtx.AddFolderOwner(ctx, storage.AddFolderOwnerParams{
Folder: options.Name,
Login: owner,
})
if err != nil {
return err
}
// TODO: process this error a bit more to give a better error message.
return tx.Commit()
}
// ListFolder provides a list of folders that this.User has access to.
func ListFolder() ([]storage.ListFolderRow, error) {
// TODO: need to check access.
ctx := storage.Context()
rows, err := this.Q.ListFolder(ctx)
if err != nil {
// TODO: process this error a bit more to give a better error message.
return []storage.ListFolderRow{}, err
}
return rows, nil
}
// FindFolder finds a folder based on the prefix.
func FindFolder(name string) storage.Folder {
ctx := storage.Context()
folder, _ := this.Q.FindFolderExact(ctx, name)
if folder.Name != "" {
return folder
}
folder, _ = this.Q.FindFolderPrefix(ctx, name)
return folder
}
// IsFolderAccess checks if a user can access a folder.
func IsFolderAccess(name, login string) bool {
ctx := storage.Context()
found, _ := this.Q.IsFolderAccess(ctx, storage.IsFolderAccessParams{
Name: name,
Login: login,
})
return found == 1
}
// IsFolderOwner checks if a user is a folder owner.
func IsFolderOwner(folder, login string) bool {
ctx := storage.Context()
found, _ := this.Q.IsFolderOwner(ctx, storage.IsFolderOwnerParams{
Folder: folder,
Login: login,
})
return found == 1
}
// DeleteFolder deletes a folder.
func DeleteFolder(name string) error {
// TODO: make sure user can delete this table.
ctx := storage.Context()
err := this.Q.DeleteFolder(ctx, name)
// TODO: process this error a bit more to give a better error message.
if err != nil {
return err
}
return nil
}