project controller

This commit is contained in:
w-mj 2023-04-03 22:39:43 +08:00
parent a36de499c3
commit e4ddd0b445
No known key found for this signature in database
GPG Key ID: 3A2CB5BE2F835897
9 changed files with 174 additions and 25 deletions

View File

@ -81,6 +81,7 @@ func main() {
r.GET("/images", controller.GetImages) r.GET("/images", controller.GetImages)
controller.AddDataController(r) controller.AddDataController(r)
controller.AddProjectController(r)
err := r.Run(":8000") err := r.Run(":8000")
if err != nil { if err != nil {

View File

@ -2,15 +2,17 @@ package controller
import ( import (
"errors" "errors"
"fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
"k8s-manager/src/model" "k8s-manager/src/model"
"k8s-manager/src/utils" "k8s-manager/src/utils"
"math/rand"
) )
func AddData(username string, data *model.DataModel) (utils.OKType, error) { func AddData(username string, data *model.DataModel) (utils.OKType, error) {
data.UserName = username data.UserName = username
data.Save() data.AccessInfo = fmt.Sprintf("/data/%s-%s-%d", data.UserName, data.Name, rand.Int())
data.Create()
return utils.OK, nil return utils.OK, nil
} }
@ -26,13 +28,13 @@ func DeleteData(username string, ID uint) (utils.OKType, error) {
} }
func UpdateData(username string, data *model.DataModel) (utils.OKType, error) { func UpdateData(username string, data *model.DataModel) (utils.OKType, error) {
oldData := model.DataModel{} oldData := &model.DataModel{}
oldData.SetID(data.ID) oldData.SetID(data.ID)
oldData.Fill() oldData.Fill()
if username != oldData.GetUserName() { if username != oldData.GetUserName() {
return nil, errors.New("wrong username") return nil, errors.New("wrong username")
} }
data.Save() data.Save(oldData)
return utils.OK, nil return utils.OK, nil
} }
@ -40,7 +42,6 @@ func GetData(UserName string, IsPublish bool) (gin.H, error) {
data := model.DataModel{} data := model.DataModel{}
data.UserName = UserName data.UserName = UserName
data.IsPublished = IsPublish data.IsPublished = IsPublish
log.Info(UserName, IsPublish)
if UserName == "" && !IsPublish { if UserName == "" && !IsPublish {
return gin.H{"data": []string{}}, nil return gin.H{"data": []string{}}, nil
} }

View File

@ -0,0 +1,54 @@
package controller
import (
"errors"
"github.com/gin-gonic/gin"
"k8s-manager/src/model"
"k8s-manager/src/utils"
)
func AddProject(username string, proj *model.ProjectModel) (utils.OKType, error) {
proj.UserName = username
proj.Create()
return utils.OK, nil
}
func DeleteProject(username string, ID uint) (utils.OKType, error) {
old := model.ProjectModel{}
old.ID = ID
old.Fill()
if username != old.UserName {
return nil, errors.New("wrong username")
}
old.Delete()
return utils.OK, nil
}
func UpdateProject(username string, proj *model.ProjectModel) (utils.OKType, error) {
old := &model.ProjectModel{}
old.ID = proj.ID
old.Fill()
if username != old.GetUserName() {
return nil, errors.New("wrong username")
}
proj.Save(old)
return utils.OK, nil
}
func GetProjects(UserName string, IsPublished bool) (gin.H, error) {
proj := &model.ProjectModel{}
proj.UserName = UserName
proj.IsPublished = IsPublished
if UserName == "" && !IsPublished {
return gin.H{"data": []string{}}, nil
}
ans := proj.Gets()
return gin.H{"data": ans}, nil
}
func AddProjectController(r *gin.Engine) {
utils.RouteWrapper(r, "POST", "/project", AddProject, []string{"username", "1"})
utils.RouteWrapper(r, "DELETE", "/project", DeleteProject, []string{"username", "ID"})
utils.RouteWrapper(r, "PUT", "/project", UpdateProject, []string{"username", "1"})
utils.RouteWrapper(r, "GET", "/projects", GetProjects, []string{"UserName", "IsPublished"})
}

View File

@ -41,7 +41,7 @@ func (b *BaseModel[T]) Create() {
db.Create(p) db.Create(p)
} }
func (b *BaseModel[T]) Save() { func (b *BaseModel[T]) Save(old *T) {
db := k8s_manager.DB() db := k8s_manager.DB()
p := (*T)(unsafe.Pointer(b)) p := (*T)(unsafe.Pointer(b))
db.Save(p) db.Save(p)

View File

@ -1,23 +1,24 @@
package model package model
import ( import (
"gorm.io/gorm" k8s_manager "k8s-manager/src"
"k8s-manager/src/utils"
"time" "time"
) )
type ProjectModel struct { type ProjectModel struct {
gorm.Model BaseModel[ProjectModel]
ProjectName string ProjectName string
UserName string UserName string
GroupName string GroupName string
Type string Type string
Comment string Comment string
Doc string Doc string
IsPublic bool IsPublished bool
ImageID int ImageID int
Image ImageModel Image ImageModel
TrainData []*DataModel `gorm:"many2many:projects_data"` TrainData []*ProjectTrainDataModel `gorm:"foreignKey:ProjectID"`
UserPath string UserPath string
CodePath string CodePath string
@ -30,6 +31,71 @@ func (*ProjectModel) TableName() string {
return "projects" return "projects"
} }
type ProjectTrainDataModel struct {
BaseModel[ProjectTrainDataModel]
ProjectID uint
DataID uint
Data *DataModel
MountPath string
}
func (*ProjectTrainDataModel) TableName() string {
return "project_train_data"
}
func (p *ProjectModel) Fill() {
db := k8s_manager.DB()
db.Preload("ProjectTrainDataModel").First(p, p.ID)
}
func (p *ProjectModel) Create() {
db := k8s_manager.DB()
db.Create(p)
for _, d := range p.TrainData {
d.ProjectID = p.ID
db.Create(d)
}
}
func (p *ProjectModel) Delete() {
db := k8s_manager.DB()
for _, d := range p.TrainData {
db.Delete(d)
}
db.Delete(p)
}
func (p *ProjectModel) Save(oldProject *ProjectModel) {
db := k8s_manager.DB()
//oldProject := &ProjectModel{}
//oldProject.ID = p.ID
//oldProject.Fill()
toAdd := utils.Difference(p.TrainData, oldProject.TrainData, func(a, b *ProjectTrainDataModel) bool { return a.ID == b.ID })
for t := range toAdd {
db.Create(t)
}
toDel := utils.Difference(oldProject.TrainData, p.TrainData, func(a, b *ProjectTrainDataModel) bool { return a.ID == b.ID })
for t := range toDel {
db.Delete(t)
}
toSave := utils.Intersect(oldProject.TrainData, p.TrainData, func(a, b *ProjectTrainDataModel) bool { return a.ID == b.ID })
for t := range toSave {
db.Save(t)
}
db.Save(p)
}
func (p *ProjectModel) Gets() []ProjectModel {
db := k8s_manager.DB()
var ans []ProjectModel
db.Model(&ProjectModel{}).Preload("ProjectTrainDataModel").Where(p).Find(&ans)
return ans
}
type RunningProject struct { type RunningProject struct {
Project *ProjectModel Project *ProjectModel
StartTime *time.Time StartTime *time.Time

View File

@ -0,0 +1,31 @@
package utils
func Difference[T any](a, b []T, com func(T, T) bool) []T {
var ans []T
for _, x := range a {
unique := true
for _, y := range b {
if com(x, y) {
unique = false
break
}
}
if unique {
ans = append(ans, x)
}
}
return ans
}
func Intersect[T any](a, b []T, com func(T, T) bool) []T {
var ans []T
for _, x := range a {
for _, y := range b {
if com(x, y) {
ans = append(ans, x)
break
}
}
}
return ans
}

View File

@ -1,10 +1,5 @@
package main package main
import (
"k8s-manager/src/controller"
"k8s-manager/src/model"
)
func main() { func main() {
controller.BaseController[model.DataModel, *model.DataModel]{}.Add(nil) //controller.BaseController[model.DataModel, *model.DataModel]{}.Add(nil)
} }

View File

@ -1,7 +1,6 @@
package main package main
import ( import (
"encoding/json"
"fmt" "fmt"
k8s_manager "k8s-manager/src" k8s_manager "k8s-manager/src"
"k8s-manager/src/model" "k8s-manager/src/model"
@ -10,9 +9,10 @@ import (
func CreateTables() { func CreateTables() {
db := k8s_manager.DB() db := k8s_manager.DB()
err := db.Migrator().AutoMigrate( err := db.Migrator().AutoMigrate(
&model.ProjectModel{}, //&model.ProjectModel{},
&model.ImageModel{}, //&model.ImageModel{},
&model.DataModel{}, //&model.DataModel{},
&model.ProjectTrainDataModel{},
) )
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
@ -22,9 +22,10 @@ func CreateTables() {
func main() { func main() {
k8s_manager.InitConfig() k8s_manager.InitConfig()
db := k8s_manager.DB() CreateTables()
p := model.ProjectModel{} // db := k8s_manager.DB()
db.Preload("TrainData").Where("user_name = ?", "wmj").Find(&p) // p := model.ProjectModel{}
j, _ := json.Marshal(&p) // db.Preload("TrainData").Where("user_name = ?", "wmj").Find(&p)
fmt.Println(string(j)) // j, _ := json.Marshal(&p)
// fmt.Println(string(j))
} }