diff --git a/frontend/src/page/home/home.css b/frontend/src/page/home/home.css index cd05775..122532a 100644 --- a/frontend/src/page/home/home.css +++ b/frontend/src/page/home/home.css @@ -37,7 +37,8 @@ input.body-connections-search-input { outline: none; text-indent: 5px; } -div.body-connections-search-dismiss{ + +div.body-connections-search-dismiss { border: none; background: none; outline: none; @@ -48,3 +49,35 @@ div.body-connections-search-dismiss{ justify-content: center; align-items: center; } + +div.body-connections-list-item { + height: 36px; +} + +div.body-connections-list-item.active { + background: aquamarine; +} + +div.body-connections-list-item:first-child { + margin-top: 2px; +} + +button.body-connections-list-item-button { + background: none; + border: none; + height: 100%; + width: 100%; + padding: 0 6px; + display: flex; + justify-content: left; + align-items: center; + cursor: pointer; + font-size: 14px; +} + +button.body-connections-list-item-button:hover { + background-color: var(--colorBrandBackground); + color: rgba(245, 245, 245, 1); +} + + diff --git a/frontend/src/page/home/home.tsx b/frontend/src/page/home/home.tsx index 1692641..7a68fc1 100644 --- a/frontend/src/page/home/home.tsx +++ b/frontend/src/page/home/home.tsx @@ -26,6 +26,23 @@ function Home() { }) }, []); + async function handleConnect(item: Connection) { + console.log('[DEBUG] db click item =', item) + for (const c of connectionList) { + if(c.active) { + return + } + } + + let res = await Dial("/api/connection/connect", {id: item.id}) + if (res.status === 200) { + dispatchMessage("连接成功", "success") + for (const c of connectionList) { + c.active = c.id === item.id; + } + } + } + return (
@@ -47,7 +64,14 @@ function Home() {
-
+
+ {connectionList.map(item => { + return
+ +
+ })} +
diff --git a/frontend/wailsjs/go/controller/App.d.ts b/frontend/wailsjs/go/controller/App.d.ts index dfdb059..f04e377 100755 --- a/frontend/wailsjs/go/controller/App.d.ts +++ b/frontend/wailsjs/go/controller/App.d.ts @@ -1,4 +1,7 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +import {context} from '../models'; + +export function Init(arg1:context.Context):Promise; export function Invoke(arg1:string,arg2:string):Promise; diff --git a/frontend/wailsjs/go/controller/App.js b/frontend/wailsjs/go/controller/App.js index 3bb5d47..4358348 100755 --- a/frontend/wailsjs/go/controller/App.js +++ b/frontend/wailsjs/go/controller/App.js @@ -2,6 +2,10 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +export function Init(arg1) { + return window['go']['controller']['App']['Init'](arg1); +} + export function Invoke(arg1, arg2) { return window['go']['controller']['App']['Invoke'](arg1, arg2); } diff --git a/go.mod b/go.mod index 2502815..d1d6327 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/loveuer/nf v0.2.11 github.com/ncruces/go-sqlite3/gormlite v0.18.4 github.com/psanford/httpreadat v0.1.0 + github.com/samber/lo v1.38.1 github.com/wailsapp/wails/v2 v2.9.2 gorm.io/driver/mysql v1.5.7 gorm.io/driver/postgres v1.5.9 @@ -60,7 +61,6 @@ require ( github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/samber/lo v1.38.1 // indirect github.com/tetratelabs/wazero v1.8.0 // indirect github.com/tkrajina/go-reflector v0.5.6 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect diff --git a/internal/api/api.go b/internal/api/api.go index d519d4f..d2d6a78 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -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 } diff --git a/internal/controller/app.go b/internal/controller/app.go index e53ebc4..1b64325 100644 --- a/internal/controller/app.go +++ b/internal/controller/app.go @@ -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!!!") +} diff --git a/internal/handler/connection.go b/internal/handler/connection.go index 92ca3d9..1bf5878 100644 --- a/internal/handler/connection.go +++ b/internal/handler/connection.go @@ -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, "连接成功") +} diff --git a/internal/manager/error.go b/internal/manager/error.go new file mode 100644 index 0000000..3d4895a --- /dev/null +++ b/internal/manager/error.go @@ -0,0 +1,7 @@ +package manager + +import "errors" + +var ( + ErrNotFound = errors.New("not found") +) diff --git a/internal/manager/manager.go b/internal/manager/manager.go index ff17cd1..7bf9e0b 100644 --- a/internal/manager/manager.go +++ b/internal/manager/manager.go @@ -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 +} diff --git a/internal/model/init.go b/internal/model/init.go index 43cd790..ea73287 100644 --- a/internal/model/init.go +++ b/internal/model/init.go @@ -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 } diff --git a/internal/model/s3.go b/internal/model/s3.go index e6754a1..5463337 100644 --- a/internal/model/s3.go +++ b/internal/model/s3.go @@ -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 { diff --git a/main.go b/main.go index 5d25765..843d69c 100644 --- a/main.go +++ b/main.go @@ -1,10 +1,13 @@ package main import ( + "context" "embed" "flag" "github.com/loveuer/nf-disk/internal/controller" - "github.com/loveuer/nf/nft/nfctl/opt" + "github.com/loveuer/nf-disk/internal/opt" + "os/signal" + "syscall" "github.com/loveuer/nf/nft/log" "github.com/wailsapp/wails/v2" @@ -16,17 +19,23 @@ import ( var assets embed.FS func init() { - flag.BoolVar(&opt.Debug, "debug", false, "debug mode") +} + +func main() { + ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) + defer cancel() + + flag.BoolVar(&opt.Debug, "debug", true, "debug mode") flag.Parse() if opt.Debug { log.SetLogLevel(log.LogLevelDebug) } -} -func main() { app := controller.NewApp() + app.Init(ctx) + if err := wails.Run(&options.App{ Title: "nf-disk", Width: 1024,