diff --git a/main.go b/main.go index a82c387..b6c85c4 100644 --- a/main.go +++ b/main.go @@ -80,6 +80,8 @@ func main() { r.DELETE("/image", controller.DeleteImage) r.GET("/images", controller.GetImages) + //r.POST("/data", controller.Add[model.DataModel]) + err := r.Run(":8000") if err != nil { log.Fatal(err) diff --git a/src/controller/base_controller.go b/src/controller/base_controller.go new file mode 100644 index 0000000..dd70c9d --- /dev/null +++ b/src/controller/base_controller.go @@ -0,0 +1,82 @@ +package controller + +import ( + "fmt" + "github.com/gin-gonic/gin" + "k8s-manager/src/model" + "k8s-manager/src/utils" + "net/http" + "reflect" + "strconv" +) + +type BaseController[T model.DataModel, PT model.ModalInterface[T]] struct { +} + +func (BaseController[T, PT]) Add(c *gin.Context) { + data := PT(new(T)) + fmt.Println(reflect.TypeOf(data)) + if utils.GinErrorCheck(c, c.BindJSON(&data)) { + return + } + username := c.MustGet("username").(string) + data.SetUserName(username) + data.Create() + utils.GinOk(c, "ok") +} + +func (BaseController[T, PT]) Delete(c *gin.Context) { + id := c.Query("ID") + if id == "" { + utils.GinError(c, http.StatusBadRequest, "no id") + return + } + username := c.MustGet("username").(string) + idi, err := strconv.Atoi(id) + if utils.GinErrorCheck(c, err) { + return + } + data := PT(new(T)) + data.SetID(uint(idi)) + data.Fill() + if data.GetUserName() != username { + utils.GinError(c, http.StatusUnauthorized, "username error") + return + } + data.Delete() +} + +func (BaseController[T, PT]) Update(c *gin.Context) { + data := PT(new(T)) + if utils.GinErrorCheck(c, c.BindJSON(data)) { + return + } + username := c.MustGet("username").(string) + oldData := PT(new(T)) + oldData.SetID(data.GetID()) + oldData.Fill() + if oldData.GetUserName() != username { + utils.GinError(c, http.StatusUnauthorized, "username error") + return + } + data.Save() +} + +func (BaseController[T, PT]) Gets(c *gin.Context) { + username := c.MustGet("username").(string) + var ans []T + query := map[string]interface{}{} + if c.Query("UserName") != "" { + if username != c.Query("UserName") { + utils.GinError(c, http.StatusUnauthorized, "username error") + return + } + query["UserName"] = username + } else if c.Query("IsPublic") != "" { + query["IsPublic"] = true + } else { + utils.GinError(c, http.StatusBadRequest, "param error.") + return + } + c.JSON(http.StatusOK, gin.H{"data": ans}) +} diff --git a/src/controller/data_controller.go b/src/controller/data_controller.go new file mode 100644 index 0000000..a3eb7e9 --- /dev/null +++ b/src/controller/data_controller.go @@ -0,0 +1,7 @@ +package controller + +import "github.com/gin-gonic/gin" + +func AddData(c *gin.Context) { + +} diff --git a/src/model/base_model.go b/src/model/base_model.go new file mode 100644 index 0000000..4421b69 --- /dev/null +++ b/src/model/base_model.go @@ -0,0 +1,93 @@ +package model + +import ( + "gorm.io/gorm" + k8s_manager "k8s-manager/src" + "reflect" + "unsafe" +) + +type ModalType interface { + DataModel | ImageModel +} + +type ModalInterface[T ModalType] interface { + *T + Create() + Fill() + Delete() + Save() + Gets(map[string]interface{}) []T + //Gets() []T + + GetUserName() string + SetUserName(string) + SetID(uint) + GetID() uint +} + +type BaseModel[T any] struct { + gorm.Model +} + +func (b *BaseModel[T]) Fill() { + db := k8s_manager.DB() + p := (*T)(unsafe.Pointer(b)) + db.First(p, b.ID) +} + +func (b *BaseModel[T]) Create() { + db := k8s_manager.DB() + p := (*T)(unsafe.Pointer(b)) + db.Create(p) +} + +func (b *BaseModel[T]) Save() { + db := k8s_manager.DB() + p := (*T)(unsafe.Pointer(b)) + db.Save(p) +} + +func (b *BaseModel[T]) Delete() { + db := k8s_manager.DB() + p := (*T)(unsafe.Pointer(b)) + db.Delete(p) +} + +func (b *BaseModel[T]) Gets(query map[string]interface{}) []T { + db := k8s_manager.DB() + ans := make([]T, 0) + db.Where(query).Find(&ans) + return ans +} + +func (b *BaseModel[T]) Get(query map[string]interface{}) *T { + db := k8s_manager.DB() + p := (*T)(unsafe.Pointer(b)) + db.Where(query).First(p) + return p +} + +func (b *BaseModel[T]) SetUserName(name string) { + p := (*T)(unsafe.Pointer(b)) + a := reflect.ValueOf(p) + reflect.Indirect(a).FieldByName("UserName").SetString(name) +} + +func (b *BaseModel[T]) SetID(ID uint) { + p := (*T)(unsafe.Pointer(b)) + a := reflect.ValueOf(p) + reflect.Indirect(a).FieldByName("ID").SetUint(uint64(ID)) +} + +func (b *BaseModel[T]) GetUserName() string { + p := (*T)(unsafe.Pointer(b)) + a := reflect.ValueOf(p) + return reflect.Indirect(a).FieldByName("UserName").String() +} + +func (b *BaseModel[T]) GetID() uint { + p := (*T)(unsafe.Pointer(b)) + a := reflect.ValueOf(p) + return uint(reflect.Indirect(a).FieldByName("ID").Uint()) +} diff --git a/src/model/data_model.go b/src/model/data_model.go index 57276f9..caaf724 100644 --- a/src/model/data_model.go +++ b/src/model/data_model.go @@ -1,12 +1,7 @@ package model -import ( - "gorm.io/gorm" - k8s_manager "k8s-manager/src" -) - type DataModel struct { - gorm.Model + BaseModel[DataModel] Type string Name string Comment string @@ -20,8 +15,3 @@ type DataModel struct { func (*DataModel) TableName() string { return "data" } - -func (d *DataModel) Fill() { - db := k8s_manager.DB() - db.First(d, d.ID) -} diff --git a/test/test_generic.go b/test/test_generic.go new file mode 100644 index 0000000..53fa5f3 --- /dev/null +++ b/test/test_generic.go @@ -0,0 +1,10 @@ +package main + +import ( + "k8s-manager/src/controller" + "k8s-manager/src/model" +) + +func main() { + controller.BaseController[model.DataModel, *model.DataModel]{}.Add(nil) +}