99 lines
2.2 KiB
Go
99 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"time"
|
|
)
|
|
|
|
type TrashDTO struct {
|
|
TrashPath string `json:"trashPath"`
|
|
Nodes []TrashNodeDTO `json:"nodes"`
|
|
Entries []TrashEntryDTO `json:"entries"`
|
|
}
|
|
|
|
type TrashNodeDTO struct {
|
|
ID string `json:"id"`
|
|
Title string `json:"title"`
|
|
Type string `json:"type"`
|
|
FsPath string `json:"fsPath"`
|
|
DeletedAt string `json:"deletedAt"`
|
|
}
|
|
|
|
type TrashEntryDTO struct {
|
|
Name string `json:"name"`
|
|
Path string `json:"path"`
|
|
IsDir bool `json:"isDir"`
|
|
Size int64 `json:"size"`
|
|
ModifiedAt string `json:"modifiedAt"`
|
|
}
|
|
|
|
func (a *App) ListTrash() (*TrashDTO, error) {
|
|
if err := a.requireVault(); err != nil {
|
|
return nil, err
|
|
}
|
|
trashPath := filepath.Join(a.vault, ".verstak", "trash")
|
|
|
|
deleted, err := a.nodes.ListDeleted()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
nodes := make([]TrashNodeDTO, 0, len(deleted))
|
|
for _, n := range deleted {
|
|
deletedAt := ""
|
|
if n.DeletedAt != nil {
|
|
deletedAt = n.DeletedAt.Format(time.RFC3339)
|
|
}
|
|
nodes = append(nodes, TrashNodeDTO{
|
|
ID: n.ID,
|
|
Title: n.Title,
|
|
Type: n.Type,
|
|
FsPath: n.FsPath,
|
|
DeletedAt: deletedAt,
|
|
})
|
|
}
|
|
|
|
entries, err := listTrashEntries(trashPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &TrashDTO{TrashPath: trashPath, Nodes: nodes, Entries: entries}, nil
|
|
}
|
|
|
|
func listTrashEntries(trashPath string) ([]TrashEntryDTO, error) {
|
|
if err := os.MkdirAll(trashPath, 0o750); err != nil {
|
|
return nil, err
|
|
}
|
|
dirEntries, err := os.ReadDir(trashPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
out := make([]TrashEntryDTO, 0, len(dirEntries))
|
|
for _, entry := range dirEntries {
|
|
info, err := entry.Info()
|
|
if err != nil {
|
|
continue
|
|
}
|
|
out = append(out, TrashEntryDTO{
|
|
Name: entry.Name(),
|
|
Path: filepath.Join(trashPath, entry.Name()),
|
|
IsDir: entry.IsDir(),
|
|
Size: info.Size(),
|
|
ModifiedAt: info.ModTime().UTC().Format(time.RFC3339),
|
|
})
|
|
}
|
|
return out, nil
|
|
}
|
|
|
|
func (a *App) OpenTrashFolder() error {
|
|
if err := a.requireVault(); err != nil {
|
|
return err
|
|
}
|
|
trashPath := filepath.Join(a.vault, ".verstak", "trash")
|
|
if err := os.MkdirAll(trashPath, 0o750); err != nil {
|
|
return err
|
|
}
|
|
return exec.Command("xdg-open", trashPath).Run()
|
|
}
|