✨ Full Crud
This commit is contained in:
@ -9,6 +9,7 @@ import (
|
||||
"google.golang.org/grpc/reflection"
|
||||
"net"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
@ -70,7 +71,36 @@ func (v localCommandRpcServer) SendCommand(ctx context.Context, argument *proto.
|
||||
}
|
||||
if md, ok := metadata.FromIncomingContext(ctx); ok {
|
||||
for k, v := range md {
|
||||
cc.values.Store(k, v)
|
||||
var val any = nil
|
||||
if len(v) == 1 {
|
||||
if len(v[0]) != 0 {
|
||||
if i, err := strconv.ParseInt(v[0], 10, 64); err == nil {
|
||||
val = i
|
||||
} else if b, err := strconv.ParseBool(v[0]); err == nil {
|
||||
val = b
|
||||
} else if f, err := strconv.ParseFloat(v[0], 64); err == nil {
|
||||
val = f
|
||||
}
|
||||
layouts := []string{
|
||||
time.RFC3339,
|
||||
"2006-01-02 15:04:05", // Example: 2024-10-20 14:55:05
|
||||
"2006-01-02", // Example: 2024-10-20
|
||||
}
|
||||
for _, layout := range layouts {
|
||||
if t, err := time.Parse(layout, v[0]); err == nil {
|
||||
val = t
|
||||
}
|
||||
}
|
||||
if val == nil {
|
||||
val = v[0]
|
||||
}
|
||||
} else {
|
||||
val = v[0]
|
||||
}
|
||||
} else if len(v) > 1 {
|
||||
val = v
|
||||
}
|
||||
cc.values.Store(k, val)
|
||||
}
|
||||
}
|
||||
if err := handler(cc); err != nil {
|
||||
|
@ -3,16 +3,16 @@ package cruda
|
||||
import (
|
||||
"git.solsynth.dev/hypernet/nexus/pkg/nex"
|
||||
"net/http"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
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]}
|
||||
funcList := []CrudAction{cmdList[T], cmdGet[T], cmdCreate[T], cmdUpdate[T], cmdDelete[T]}
|
||||
funcCmds := []string{".list", ".get", ".create", ".update", ".delete"}
|
||||
funcMethods := []string{"get", "get", "put", "patch", "delete"}
|
||||
for idx, fn := range funcList {
|
||||
if err := v.Conn.AddCommand(prefix+id+funcCmds[idx], "get", tags, fn(v)); err != nil {
|
||||
if err := v.Conn.AddCommand(prefix+id+funcCmds[idx], funcMethods[idx], tags, fn(v)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -21,15 +21,13 @@ func AddModel[T any](v *CrudConn, model T, id, prefix string, tags []string) err
|
||||
|
||||
func cmdList[T any](c *CrudConn) nex.CommandHandler {
|
||||
return func(ctx *nex.CommandCtx) error {
|
||||
rawTake := ctx.ValueOrElse("query.take", "10").(string)
|
||||
rawSkip := ctx.ValueOrElse("query.skip", "0").(string)
|
||||
take, err := strconv.Atoi(rawTake)
|
||||
if err != nil {
|
||||
take = 10
|
||||
}
|
||||
skip, err := strconv.Atoi(rawSkip)
|
||||
if err != nil {
|
||||
skip = 0
|
||||
take := int(ctx.ValueOrElse("query.take", 10).(int64))
|
||||
skip := int(ctx.ValueOrElse("query.skip", 0).(int64))
|
||||
|
||||
var str T
|
||||
var count int64
|
||||
if err := c.db.Model(str).Count(&count).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var out []T
|
||||
@ -37,6 +35,74 @@ func cmdList[T any](c *CrudConn) nex.CommandHandler {
|
||||
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 := ctx.ValueOrElse("query.id", 0).(int64)
|
||||
|
||||
var out T
|
||||
if err := c.db.First(&out, "id = ?", id).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(out, http.StatusOK)
|
||||
}
|
||||
}
|
||||
|
||||
func cmdCreate[T any](c *CrudConn) nex.CommandHandler {
|
||||
return func(ctx *nex.CommandCtx) error {
|
||||
var out T
|
||||
if err := ctx.ReadJSON(&out); err != nil {
|
||||
return err
|
||||
}
|
||||
// TODO validation
|
||||
|
||||
if err := c.db.Create(&out).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(out, http.StatusOK)
|
||||
}
|
||||
}
|
||||
|
||||
func cmdUpdate[T any](c *CrudConn) nex.CommandHandler {
|
||||
return func(ctx *nex.CommandCtx) error {
|
||||
id := ctx.ValueOrElse("query.id", 0).(int64)
|
||||
|
||||
var payload T
|
||||
if err := ctx.ReadJSON(&payload); err != nil {
|
||||
return err
|
||||
}
|
||||
// TODO validation
|
||||
|
||||
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 := ctx.ValueOrElse("query.id", 0).(int64)
|
||||
|
||||
var out T
|
||||
if err := c.db.Delete(&out, "id = ?", id).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(out, http.StatusOK)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user