Full Crud

This commit is contained in:
2024-10-20 20:20:01 +08:00
parent eaa1b04b75
commit a563c8f5bc
4 changed files with 118 additions and 16 deletions

View File

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

View File

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