From cd45d2baadeccf39955f1881afffff62faaa787d Mon Sep 17 00:00:00 2001 From: MickaelK Date: Fri, 29 Aug 2025 22:49:42 +1000 Subject: [PATCH] fix (psql): psql storage issues --- public/assets/components/fab.css | 3 +++ server/plugin/plg_backend_psql/index.go | 7 +----- server/plugin/plg_backend_psql/index_cat.go | 2 +- server/plugin/plg_backend_psql/index_ls.go | 22 +++++++++++++++--- server/plugin/plg_backend_psql/index_rm.go | 25 +++++++++++++++++++++ server/plugin/plg_backend_psql/utils.go | 8 +++---- 6 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 server/plugin/plg_backend_psql/index_rm.go diff --git a/public/assets/components/fab.css b/public/assets/components/fab.css index 07dbf093..f1d5a2d5 100644 --- a/public/assets/components/fab.css +++ b/public/assets/components/fab.css @@ -5,6 +5,9 @@ z-index: 2; background: transparent; } +.component_fab .content:empty { + display: none; +} .component_fab .content { height: 25px; width: 25px; diff --git a/server/plugin/plg_backend_psql/index.go b/server/plugin/plg_backend_psql/index.go index 6d5a0fc7..5bdc386d 100644 --- a/server/plugin/plg_backend_psql/index.go +++ b/server/plugin/plg_backend_psql/index.go @@ -103,16 +103,11 @@ func (this PSQL) LoginForm() Form { func (this PSQL) Touch(path string) error { defer this.Close() if !strings.HasSuffix(path, ".form") { - return ErrNotValid + return NewError("Create a form file instead. eg: xxxx.form", 403) } return nil } -func (this PSQL) Rm(path string) error { - defer this.Close() - return ErrNotAuthorized -} - func (this PSQL) Mkdir(path string) error { defer this.Close() return ErrNotValid diff --git a/server/plugin/plg_backend_psql/index_cat.go b/server/plugin/plg_backend_psql/index_cat.go index 1e2f63a6..51f982e2 100644 --- a/server/plugin/plg_backend_psql/index_cat.go +++ b/server/plugin/plg_backend_psql/index_cat.go @@ -53,7 +53,7 @@ func (this PSQL) Cat(path string) (io.ReadCloser, error) { forms := make([]FormElement, len(c)) for i, _ := range columns { forms[i] = createFormElement(col[i], columns[i]) - if slices.Contains(columns[i].Constraint, "PRIMARY KEY") { + if slices.Contains(columns[i].Constraint, "PRIMARY KEY") && forms[i].Value != nil { forms[i].ReadOnly = true } else if slices.Contains(columns[i].Constraint, "FOREIGN KEY") { if link, err := _findRelation(this.ctx, this.db, columns[i]); err == nil { diff --git a/server/plugin/plg_backend_psql/index_ls.go b/server/plugin/plg_backend_psql/index_ls.go index da16c779..3ee97375 100644 --- a/server/plugin/plg_backend_psql/index_ls.go +++ b/server/plugin/plg_backend_psql/index_ls.go @@ -2,6 +2,7 @@ package plg_backend_psql import ( "os" + "time" . "github.com/mickael-kerjean/filestash/server/common" ) @@ -38,11 +39,18 @@ func (this PSQL) Ls(path string) ([]os.FileInfo, error) { } return out, nil } else if l.row == "" { - _, key, err := processTable(this.ctx, this.db, l.table) + columns, key, err := processTable(this.ctx, this.db, l.table) if err != nil { return nil, err } - rows, err := this.db.QueryContext(this.ctx, `SELECT "`+key+`" FROM "`+l.table+`" LIMIT 500000`) + query := `SELECT "` + key + `", NULL FROM "` + l.table + `" LIMIT 500000` + for _, c := range columns { + if c.Type == "timestamptz" { + query = `SELECT "` + key + `", "` + c.Name + `" FROM "` + l.table + `" LIMIT 500000` + break + } + } + rows, err := this.db.QueryContext(this.ctx, query) if err != nil { return nil, err } @@ -50,12 +58,20 @@ func (this PSQL) Ls(path string) ([]os.FileInfo, error) { out := []os.FileInfo{} for rows.Next() { var name string - if err := rows.Scan(&name); err != nil { + var t *time.Time + if err = rows.Scan(&name, &t); err != nil { return nil, err } out = append(out, File{ FName: name + ".form", FType: "file", + FTime: func() int64 { + if t == nil { + return 0 + } + return t.Unix() + }(), + FSize: -1, }) } return out, nil diff --git a/server/plugin/plg_backend_psql/index_rm.go b/server/plugin/plg_backend_psql/index_rm.go new file mode 100644 index 00000000..9b646e70 --- /dev/null +++ b/server/plugin/plg_backend_psql/index_rm.go @@ -0,0 +1,25 @@ +package plg_backend_psql + +import ( + . "github.com/mickael-kerjean/filestash/server/common" +) + +func (this PSQL) Rm(path string) error { + defer this.Close() + l, err := getPath(path) + if err != nil { + return err + } else if l.table == "" { + return ErrNotFound + } + _, key, err := processTable(this.ctx, this.db, l.table) + if err != nil { + return err + } + _, err = this.db.ExecContext( + this.ctx, + `DELETE FROM "`+l.table+`" WHERE "`+key+`" = $1`, + l.row, + ) + return err +} diff --git a/server/plugin/plg_backend_psql/utils.go b/server/plugin/plg_backend_psql/utils.go index f542932b..313208b0 100644 --- a/server/plugin/plg_backend_psql/utils.go +++ b/server/plugin/plg_backend_psql/utils.go @@ -115,11 +115,11 @@ func createFormElement(val any, column Column) FormElement { f := FormElement{ Type: "text", } - switch val.(type) { - case bool: - f.Type = "boolean" - case time.Time: + switch column.Type { + case "timestamptz": f.Type = "datetime" + case "bool": + f.Type = "boolean" } f.Value = convertFromDB(val)