🗑️ Clean up command related stuff
🚚 Move http package to web
This commit is contained in:
@ -1,130 +0,0 @@
|
||||
package cruda
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"git.solsynth.dev/hypernet/nexus/pkg/nex"
|
||||
"github.com/go-playground/validator/v10"
|
||||
"gorm.io/gorm"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type CrudAction func(v *CrudConn) nex.CommandHandler
|
||||
|
||||
func AddModel[T any](v *CrudConn, model T, id, prefix string, tags []string) error {
|
||||
funcList := []CrudAction{cmdList[T], cmdGet[T], cmdCreate[T], cmdUpdate[T], cmdDelete[T]}
|
||||
funcCmds := []string{".list", "", "", "", ""}
|
||||
funcMethods := []string{"get", "get", "put", "patch", "delete"}
|
||||
for idx, fn := range funcList {
|
||||
if err := v.n.AddCommand(prefix+id+funcCmds[idx], funcMethods[idx], tags, fn(v)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var validate = validator.New(validator.WithRequiredStructEnabled())
|
||||
|
||||
func cmdList[T any](c *CrudConn) nex.CommandHandler {
|
||||
return func(ctx *nex.CommandCtx) error {
|
||||
take := int(nex.CtxValueShouldBe[int64](ctx, "query.take", 10))
|
||||
skip := int(nex.CtxValueShouldBe[int64](ctx, "query.skip", 0))
|
||||
|
||||
var str T
|
||||
var count int64
|
||||
if err := c.Db.Model(str).Count(&count).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var out []T
|
||||
if err := c.Db.Offset(skip).Limit(take).Find(&out).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(map[string]any{
|
||||
"count": count,
|
||||
"data": out,
|
||||
}, http.StatusOK)
|
||||
}
|
||||
}
|
||||
|
||||
func cmdGet[T any](c *CrudConn) nex.CommandHandler {
|
||||
return func(ctx *nex.CommandCtx) error {
|
||||
id, err := nex.CtxValueMustBe[int64](ctx, "query.id")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var out T
|
||||
if err := c.Db.First(&out, "id = ?", id).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return ctx.Write([]byte(err.Error()), "text/plain", http.StatusNotFound)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(out, http.StatusOK)
|
||||
}
|
||||
}
|
||||
|
||||
func cmdCreate[T any](c *CrudConn) nex.CommandHandler {
|
||||
return func(ctx *nex.CommandCtx) error {
|
||||
var payload T
|
||||
if err := ctx.ReadJSON(&payload); err != nil {
|
||||
return err
|
||||
} else if err := validate.Struct(payload); err != nil {
|
||||
return ctx.Write([]byte(err.Error()), "text/plain+error", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if err := c.Db.Create(&payload).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(payload, http.StatusOK)
|
||||
}
|
||||
}
|
||||
|
||||
func cmdUpdate[T any](c *CrudConn) nex.CommandHandler {
|
||||
return func(ctx *nex.CommandCtx) error {
|
||||
id, err := nex.CtxValueMustBe[int64](ctx, "query.id")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var payload T
|
||||
if err := ctx.ReadJSON(&payload); err != nil {
|
||||
return err
|
||||
} else if err := validate.Struct(payload); err != nil {
|
||||
return ctx.Write([]byte(err.Error()), "text/plain+error", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
var out T
|
||||
if err := c.Db.Model(out).Where("id = ?", id).Updates(&payload).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := c.Db.First(&out, "id = ?", id).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(out, http.StatusOK)
|
||||
}
|
||||
}
|
||||
|
||||
func cmdDelete[T any](c *CrudConn) nex.CommandHandler {
|
||||
return func(ctx *nex.CommandCtx) error {
|
||||
id, err := nex.CtxValueMustBe[int64](ctx, "query.id")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var out T
|
||||
if err := c.Db.Delete(&out, "id = ?", id).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return ctx.Write([]byte(err.Error()), "text/plain", http.StatusNotFound)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.Write(nil, "text/plain", http.StatusOK)
|
||||
}
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
package cruda_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.solsynth.dev/hypernet/nexus/pkg/nex"
|
||||
"git.solsynth.dev/hypernet/nexus/pkg/nex/cruda"
|
||||
"git.solsynth.dev/hypernet/nexus/pkg/proto"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Test struct {
|
||||
cruda.BaseModel
|
||||
Content string `json:"content" validate:"required"`
|
||||
}
|
||||
|
||||
func TestCrudaCommand(t *testing.T) {
|
||||
conn, err := nex.NewNexusConn("127.0.0.1:7001", &proto.ServiceInfo{
|
||||
Id: "cruda01",
|
||||
Type: "cruda",
|
||||
Label: "CRUD Accelerator",
|
||||
GrpcAddr: "127.0.0.1:6001",
|
||||
HttpAddr: nil,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(fmt.Errorf("unable to connect nexus: %v", err))
|
||||
}
|
||||
|
||||
if err := conn.RegisterService(); err != nil {
|
||||
t.Fatal(fmt.Errorf("unable to register service: %v", err))
|
||||
}
|
||||
|
||||
cc := cruda.NewCrudaConn(conn)
|
||||
dsn, err := cc.AllocDatabase("test")
|
||||
if err != nil {
|
||||
t.Fatal(fmt.Errorf("unable to allocate database: %v", err))
|
||||
}
|
||||
t.Log(fmt.Sprintf("Allocated database: %s", dsn))
|
||||
|
||||
if err := cruda.MigrateModel(cc, Test{}); err != nil {
|
||||
t.Fatal(fmt.Errorf("unable to migrate database: %v", err))
|
||||
}
|
||||
|
||||
if err := cruda.AddModel(cc, Test{}, "tm", "test.", nil); err != nil {
|
||||
t.Fatal(fmt.Errorf("unable to add commands: %v", err))
|
||||
}
|
||||
|
||||
go func() {
|
||||
err := conn.RunCommands("0.0.0.0:6001")
|
||||
if err != nil {
|
||||
t.Error(fmt.Errorf("unable to run commands: %v", err))
|
||||
return
|
||||
}
|
||||
}()
|
||||
|
||||
t.Log("Waiting 180 seconds for calling command...")
|
||||
time.Sleep(time.Second * 180)
|
||||
}
|
Reference in New Issue
Block a user