feat: middle save

This commit is contained in:
Project_IO 2025-03-22 15:58:09 +09:00
parent 36a0a2c78a
commit 69a0e226b7
6 changed files with 238 additions and 174 deletions

12
app.go
View file

@ -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
} }

View file

@ -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)
}

View file

@ -0,0 +1 @@
package routes

83
internal/routes/worker.go Normal file
View 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)
}

View file

@ -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
View 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
}