wip: list

This commit is contained in:
loveuer
2024-09-29 22:15:28 +08:00
parent b2c13508f4
commit 5e0885f22d
13 changed files with 241 additions and 19 deletions

View File

@ -27,6 +27,7 @@ func Init(ctx context.Context) error {
register("/api/connection/test", handler.ConnectionTest)
register("/api/connection/create", handler.ConnectionCreate)
register("/api/connection/list", handler.ConnectionList)
register("/api/connection/connect", handler.ConnectionConnect)
return nil
}

View File

@ -4,6 +4,7 @@ import (
"context"
"github.com/loveuer/nf-disk/internal/api"
"github.com/loveuer/nf-disk/internal/db"
"github.com/loveuer/nf-disk/internal/manager"
"github.com/loveuer/nf-disk/internal/model"
"github.com/loveuer/nf-disk/internal/tool"
"github.com/loveuer/nf-disk/ndh"
@ -21,12 +22,17 @@ func NewApp() *App {
}
}
func (a *App) Startup(ctx context.Context) {
log.Info("app startup!!!")
func (a *App) Init(ctx context.Context) {
log.Info("app init!!!")
a.ctx = ctx
tool.Must(db.Init(ctx, "sqlite::memory", db.OptSqliteByMem(nil)))
tool.Must(model.Init(db.Default.Session()))
tool.Must(manager.Init(ctx))
tool.Must(api.Init(ctx))
}
func (a *App) Startup(ctx context.Context) {
log.Info("app startup!!!")
}

View File

@ -1,11 +1,14 @@
package handler
import (
"errors"
"github.com/loveuer/nf-disk/internal/db"
"github.com/loveuer/nf-disk/internal/manager"
"github.com/loveuer/nf-disk/internal/model"
"github.com/loveuer/nf-disk/internal/s3"
"github.com/loveuer/nf-disk/ndh"
"github.com/samber/lo"
"gorm.io/gorm"
)
func ConnectionTest(c *ndh.Ctx) error {
@ -78,7 +81,7 @@ func ConnectionCreate(c *ndh.Ctx) error {
return c.Send500(err.Error(), "创建连接失败(1)")
}
if err = manager.Register(connection, client); err != nil {
if err = manager.Manager.Register(connection, client); err != nil {
return c.Send500(err.Error(), "创建连接失败(2)")
}
@ -97,5 +100,52 @@ func ConnectionList(c *ndh.Ctx) error {
return err
}
listMap := lo.SliceToMap(list, func(item *model.Connection) (uint64, *model.Connection) {
return item.Id, item
})
manager.Manager.Map(func(c *model.Connection, s *s3.Client) error {
if item, ok := listMap[c.Id]; ok {
item.Active = true
}
return nil
})
return c.Send200(map[string]any{"list": list})
}
func ConnectionConnect(c *ndh.Ctx) error {
type Req struct {
Id uint64 `json:"id"`
}
var (
err error
req = new(Req)
conn = new(model.Connection)
client *s3.Client
)
if err = c.ReqParse(req); err != nil {
return c.Send400(req)
}
if err = db.Default.Session().Take(conn, req.Id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return c.Send400(err.Error(), "连接不存在")
}
return c.Send500(err.Error())
}
if client, err = s3.New(c.Context(), conn.Endpoint, conn.Access, conn.Key); err != nil {
return c.Send500(err.Error(), "连接失败")
}
if err = manager.Manager.Register(conn, client); err != nil {
return c.Send500(err.Error(), "连接失败")
}
return c.Send200(conn, "连接成功")
}

View File

@ -0,0 +1,7 @@
package manager
import "errors"
var (
ErrNotFound = errors.New("not found")
)

View File

@ -5,14 +5,71 @@ import (
"github.com/loveuer/nf-disk/internal/model"
"github.com/loveuer/nf-disk/internal/s3"
"github.com/loveuer/nf/nft/log"
"sync"
)
type client struct {
conn *model.Connection
client *s3.Client
}
type manager struct {
sync.Mutex
clients map[uint64]*client
}
var (
Manager *manager
)
func Init(ctx context.Context) error {
return nil
}
func Register(m *model.Connection, c *s3.Client) error {
log.Debug("manager: register connection-client: id = %d, name = %s", m.Id, m.Name)
Manager = &manager{
clients: make(map[uint64]*client),
}
return nil
}
func (m *manager) Register(c *model.Connection, s *s3.Client) error {
log.Debug("manager: register connection-client: id = %d, name = %s", c.Id, c.Name)
Manager.Lock()
defer Manager.Unlock()
Manager.clients[c.Id] = &client{conn: c, client: s}
return nil
}
func (m *manager) UnRegister(id uint64) error {
Manager.Lock()
defer Manager.Unlock()
c, ok := m.clients[id]
if !ok {
return ErrNotFound
}
log.Debug("manager: register connection-client: id = %d, name = %s", c.conn, c.conn.Name)
delete(m.clients, id)
return nil
}
func (m *manager) Map(fn func(*model.Connection, *s3.Client) error) error {
for _, item := range m.clients {
if err := fn(item.conn, item.client); err != nil {
return err
}
}
return nil
}
func (m *manager) Use(id uint64) (*model.Connection, *s3.Client, error) {
c, ok := m.clients[id]
if !ok {
return nil, nil, ErrNotFound
}
return c.conn, c.client, nil
}

View File

@ -1,9 +1,35 @@
package model
import "gorm.io/gorm"
import (
"github.com/loveuer/nf-disk/internal/opt"
"gorm.io/gorm"
)
func Init(tx *gorm.DB) error {
return tx.AutoMigrate(
func Init(tx *gorm.DB) (err error) {
if err = tx.AutoMigrate(
&Connection{},
)
); err != nil {
return err
}
if opt.Debug {
if err = tx.Create([]*Connection{
{
Name: "dev-minio",
Endpoint: "http://10.220.10.15:9000",
Access: "8ALV3DUZI31YG4BDRJ0Z",
Key: "CRqwS1MsiUj27TbRK+3T2n+LpKWd07VvaDKuzU0H",
},
{
Name: "test",
Endpoint: "http://10.220.10.14:19000",
Access: "",
Key: "",
},
}).Error; err != nil {
return err
}
}
return
}

View File

@ -11,6 +11,8 @@ type Connection struct {
Endpoint string `json:"endpoint" gorm:"column:endpoint"`
Access string `json:"access" gorm:"column:access"`
Key string `json:"key" gorm:"column:key"`
Active bool `json:"active" gorm:"-"`
}
func (c *Connection) Create(tx *gorm.DB) error {