feat: middle save
This commit is contained in:
parent
36a0a2c78a
commit
69a0e226b7
6 changed files with 238 additions and 174 deletions
12
app.go
12
app.go
|
@ -26,6 +26,12 @@ func main() {
|
||||||
command := commando.NewCommando(os.Args[1:])
|
command := commando.NewCommando(os.Args[1:])
|
||||||
cnf := config.Get()
|
cnf := config.Get()
|
||||||
|
|
||||||
|
// init auth module
|
||||||
|
auth := service.NewAuthService()
|
||||||
|
|
||||||
|
// init priv module
|
||||||
|
_ = service.NewPrivDirService(nil)
|
||||||
|
|
||||||
ver := service.NewVersion(version, branch, hash)
|
ver := service.NewVersion(version, branch, hash)
|
||||||
command.Root("daemon", "run file server", func(n *commando.Node) error {
|
command.Root("daemon", "run file server", func(n *commando.Node) error {
|
||||||
fmt.Printf("Kuma Archive %s\n", version)
|
fmt.Printf("Kuma Archive %s\n", version)
|
||||||
|
@ -43,13 +49,10 @@ func main() {
|
||||||
gin.SetMode(gin.ReleaseMode)
|
gin.SetMode(gin.ReleaseMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// init auth module
|
|
||||||
service.NewAuthService()
|
|
||||||
|
|
||||||
app := gin.Default()
|
app := gin.Default()
|
||||||
routes.New(app, ver, apiOnly)
|
routes.New(app, ver, apiOnly)
|
||||||
|
|
||||||
fmt.Fprintf(os.Stdout, "binding server at: http://0.0.0.0:%d\n", cnf.Port)
|
_, _ = fmt.Fprintf(os.Stdout, "binding server at: http://0.0.0.0:%d\n", cnf.Port)
|
||||||
if err = app.Run(fmt.Sprintf(":%d", cnf.Port)); err != nil {
|
if err = app.Run(fmt.Sprintf(":%d", cnf.Port)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -100,7 +103,6 @@ func main() {
|
||||||
return errors.New("password check is not correct")
|
return errors.New("password check is not correct")
|
||||||
}
|
}
|
||||||
|
|
||||||
auth := service.NewAuthService()
|
|
||||||
if err = auth.Create(&service.Account{Username: username, Password: password}); err != nil {
|
if err = auth.Create(&service.Account{Username: username, Password: password}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
package routes
|
package routes
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"git.wh64.net/devproje/kuma-archive/internal/middleware"
|
"git.wh64.net/devproje/kuma-archive/internal/middleware"
|
||||||
"git.wh64.net/devproje/kuma-archive/internal/service"
|
"git.wh64.net/devproje/kuma-archive/internal/service"
|
||||||
"github.com/gin-contrib/static"
|
"github.com/gin-contrib/static"
|
||||||
|
@ -42,78 +38,3 @@ func New(app *gin.Engine, version *service.Version, apiOnly bool) {
|
||||||
ctx.File("/web/assets/favicon.ico")
|
ctx.File("/web/assets/favicon.ico")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func readPath(ctx *gin.Context) {
|
|
||||||
worker := service.NewWorkerService()
|
|
||||||
path := ctx.Param("path")
|
|
||||||
// TODO: prefix detect
|
|
||||||
// if strings.HasPrefix(path, "")
|
|
||||||
|
|
||||||
data, err := worker.Read(path)
|
|
||||||
if err != nil {
|
|
||||||
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
|
||||||
ctx.Status(404)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if !data.IsDir {
|
|
||||||
ctx.JSON(200, gin.H{
|
|
||||||
"ok": 1,
|
|
||||||
"path": path,
|
|
||||||
"total": data.FileSize,
|
|
||||||
"is_dir": false,
|
|
||||||
"entries": nil,
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
raw, err := os.ReadDir(data.Path)
|
|
||||||
if err != nil {
|
|
||||||
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
|
||||||
ctx.Status(500)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
entries := make([]service.DirEntry, 0)
|
|
||||||
for _, entry := range raw {
|
|
||||||
finfo, err := entry.Info()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintf(os.Stderr, "%v\n", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
entries = append(entries, service.DirEntry{
|
|
||||||
Name: entry.Name(),
|
|
||||||
Path: filepath.Join(path, entry.Name()),
|
|
||||||
Date: finfo.ModTime().Unix(),
|
|
||||||
FileSize: uint64(finfo.Size()),
|
|
||||||
IsDir: finfo.IsDir(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.JSON(200, gin.H{
|
|
||||||
"ok": 1,
|
|
||||||
"path": path,
|
|
||||||
"total": data.FileSize,
|
|
||||||
"is_dir": true,
|
|
||||||
"entries": entries,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func downloadPath(ctx *gin.Context) {
|
|
||||||
worker := service.NewWorkerService()
|
|
||||||
path := ctx.Param("path")
|
|
||||||
data, err := worker.Read(path)
|
|
||||||
if err != nil {
|
|
||||||
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
|
||||||
ctx.Status(404)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if data.IsDir {
|
|
||||||
ctx.String(400, "current path is not file")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.FileAttachment(data.Path, data.Name)
|
|
||||||
}
|
|
||||||
|
|
1
internal/routes/privdir.go
Normal file
1
internal/routes/privdir.go
Normal file
|
@ -0,0 +1 @@
|
||||||
|
package routes
|
83
internal/routes/worker.go
Normal file
83
internal/routes/worker.go
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
package routes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"git.wh64.net/devproje/kuma-archive/internal/service"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
func readPath(ctx *gin.Context) {
|
||||||
|
worker := service.NewWorkerService()
|
||||||
|
path := ctx.Param("path")
|
||||||
|
|
||||||
|
data, err := worker.Read(path)
|
||||||
|
if err != nil {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||||
|
ctx.Status(404)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !data.IsDir {
|
||||||
|
ctx.JSON(200, gin.H{
|
||||||
|
"ok": 1,
|
||||||
|
"path": path,
|
||||||
|
"total": data.FileSize,
|
||||||
|
"is_dir": false,
|
||||||
|
"entries": nil,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
raw, err := os.ReadDir(data.Path)
|
||||||
|
if err != nil {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||||
|
ctx.Status(500)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
entries := make([]service.DirEntry, 0)
|
||||||
|
for _, entry := range raw {
|
||||||
|
var finfo os.FileInfo
|
||||||
|
finfo, err = entry.Info()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
entries = append(entries, service.DirEntry{
|
||||||
|
Name: entry.Name(),
|
||||||
|
Path: filepath.Join(path, entry.Name()),
|
||||||
|
Date: finfo.ModTime().Unix(),
|
||||||
|
FileSize: uint64(finfo.Size()),
|
||||||
|
IsDir: finfo.IsDir(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.JSON(200, gin.H{
|
||||||
|
"ok": 1,
|
||||||
|
"path": path,
|
||||||
|
"total": data.FileSize,
|
||||||
|
"is_dir": true,
|
||||||
|
"entries": entries,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func downloadPath(ctx *gin.Context) {
|
||||||
|
worker := service.NewWorkerService()
|
||||||
|
path := ctx.Param("path")
|
||||||
|
data, err := worker.Read(path)
|
||||||
|
if err != nil {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||||
|
ctx.Status(404)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.IsDir {
|
||||||
|
ctx.String(400, "current path is not file")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.FileAttachment(data.Path, data.Name)
|
||||||
|
}
|
|
@ -1,90 +0,0 @@
|
||||||
package service
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type PrivDirService struct{}
|
|
||||||
|
|
||||||
type PrivDir struct {
|
|
||||||
Id string `json:"id"`
|
|
||||||
DirName string `json:"dirname"`
|
|
||||||
Owner string `json:"owner"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
db, err := Open()
|
|
||||||
if err != nil {
|
|
||||||
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer db.Close()
|
|
||||||
|
|
||||||
stmt, err := db.Prepare(strings.TrimSpace(`
|
|
||||||
create table PrivDir(
|
|
||||||
id varchar(36),
|
|
||||||
dirname varchar(250) unique,
|
|
||||||
owner varchar(25),
|
|
||||||
constraint PK_PrivDir_ID primary key(id),
|
|
||||||
constraint FK_Owner_ID foreign key(owner)
|
|
||||||
references(Account.username) on update cascade on delete cascade
|
|
||||||
);
|
|
||||||
`))
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stmt.Close()
|
|
||||||
|
|
||||||
if _, err = stmt.Exec(); err != nil {
|
|
||||||
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewPrivDirService() *PrivDirService {
|
|
||||||
return &PrivDirService{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sv *PrivDirService) CreatePriv(dirname string, acc *Account) error {
|
|
||||||
db, err := Open()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer db.Close()
|
|
||||||
|
|
||||||
id := uuid.NewString()
|
|
||||||
stmt, err := db.Prepare("insert into PrivDir(id, name, owner) values (?, ?, ?);")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer stmt.Close()
|
|
||||||
|
|
||||||
_, err = stmt.Exec(id, dirname, acc.Username)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sv *PrivDirService) ReadPriv(name string) (*PrivDir, error) {
|
|
||||||
db, err := Open()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer db.Close()
|
|
||||||
|
|
||||||
stmt, err := db.Prepare("select * from PrivDir where name = ?;")
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer stmt.Close()
|
|
||||||
|
|
||||||
row := stmt.QueryRow(name)
|
|
||||||
var data PrivDir
|
|
||||||
|
|
||||||
if err = row.Scan(&data.Id, &data.DirName, &data.Owner); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &data, nil
|
|
||||||
}
|
|
147
internal/service/privdir.go
Normal file
147
internal/service/privdir.go
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PrivDirService struct {
|
||||||
|
acc *Account
|
||||||
|
}
|
||||||
|
|
||||||
|
type PrivDir struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
DirName string `json:"dirname"`
|
||||||
|
Owner string `json:"owner"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
db, err := Open()
|
||||||
|
if err != nil {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
stmt, err := db.Prepare(strings.TrimSpace(`
|
||||||
|
create table PrivDir(
|
||||||
|
id varchar(36),
|
||||||
|
dirname varchar(250) unique,
|
||||||
|
owner varchar(25),
|
||||||
|
constraint PK_PrivDir_ID primary key(id),
|
||||||
|
constraint FK_Owner_ID foreign key(owner)
|
||||||
|
references(Account.username) on update cascade on delete cascade
|
||||||
|
);
|
||||||
|
`))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
|
||||||
|
if _, err = stmt.Exec(); err != nil {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPrivDirService(acc *Account) *PrivDirService {
|
||||||
|
return &PrivDirService{
|
||||||
|
acc: acc,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sv *PrivDirService) CreatePriv(dirname string) error {
|
||||||
|
db, err := Open()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
id := uuid.NewString()
|
||||||
|
stmt, err := db.Prepare("insert into PrivDir(id, dirname, owner) values (?, ?, ?);")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
|
||||||
|
_, err = stmt.Exec(id, dirname, sv.acc.Username)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sv *PrivDirService) ReadPriv(name string) (*PrivDir, error) {
|
||||||
|
db, err := Open()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
stmt, err := db.Prepare("select * from PrivDir where dirname = ? and owner = ?;")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
|
||||||
|
row := stmt.QueryRow(name, sv.acc.Username)
|
||||||
|
var data PrivDir
|
||||||
|
|
||||||
|
if err = row.Scan(&data.Id, &data.DirName, &data.Owner); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sv *PrivDirService) DeletePriv(name string) error {
|
||||||
|
db, err := Open()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
stmt, err := db.Prepare("delete from PrivDir where dirname = ? and owner = ?;")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
|
||||||
|
_, err = stmt.Exec(name, sv.acc.Username)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sv *PrivDirService) QueryPriv() ([]*PrivDir, error) {
|
||||||
|
db, err := Open()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
stmt, err := db.Prepare("select * from PrivDir;")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
|
||||||
|
rows, err := stmt.Query()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
var dirs []*PrivDir
|
||||||
|
for rows.Next() {
|
||||||
|
var data PrivDir
|
||||||
|
if err = rows.Scan(&data.Id, &data.DirName, &data.Owner); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dirs = append(dirs, &data)
|
||||||
|
}
|
||||||
|
|
||||||
|
return dirs, nil
|
||||||
|
}
|
Loading…
Reference in a new issue