131 lines
4.7 KiB
Go
131 lines
4.7 KiB
Go
package prepare
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"math/rand"
|
|
"strings"
|
|
|
|
"git.ymnuktech.ru/ymnuk/yt-gen-app/lib/templ"
|
|
"git.ymnuktech.ru/ymnuk/yt-gen-app/structs"
|
|
uuid "github.com/satori/go.uuid"
|
|
)
|
|
|
|
// Подготовка БД
|
|
func prepareDB(project *structs.Project) *structs.Project {
|
|
if len(project.DB.Tables) > 0 {
|
|
for i := range project.DB.Tables {
|
|
if project.DB.Tables[i].ID == uuid.Nil {
|
|
project.DB.Tables[i].ID = uuid.NewV4()
|
|
}
|
|
if len(project.DB.Tables[i].Fields) > 0 {
|
|
for j := range project.DB.Tables[i].Fields {
|
|
project.DB.Tables[i].Fields[j].Name = templ.FieldDBName(&project.DB.Tables[i].Fields[j])
|
|
if project.DB.Tables[i].Fields[j].ID == uuid.Nil {
|
|
project.DB.Tables[i].Fields[j].ID = uuid.NewV4()
|
|
}
|
|
project.DB.Tables[i].Fields[j].Type = strings.Trim(project.DB.Tables[i].Fields[j].Type, " ")
|
|
project.DB.Tables[i].Fields[j].Type = strings.ToLower(project.DB.Tables[i].Fields[j].Type)
|
|
if project.DB.Tables[i].Fields[j].Type == "" {
|
|
project.DB.Tables[i].Fields[j].Type = "text"
|
|
}
|
|
|
|
}
|
|
}
|
|
if project.DB.Tables[i].Recursive {
|
|
project.DB.Tables[i].FkFields = append(project.DB.Tables[i].FkFields, structs.Field{
|
|
Name: "parent",
|
|
Description: "Recursive foreign key for self table",
|
|
})
|
|
/*switch project.DB.Tables[i].Pk {
|
|
case "uuid":
|
|
project.DB.Tables[i].FkFields[len(project.DB.Tables[i].FkFields)-1].TypeParentTable = "uuid"
|
|
case "int":
|
|
project.DB.Tables[i].FkFields[len(project.DB.Tables[i].FkFields)-1].TypeParentTable = "bigint"
|
|
case "bigint":
|
|
project.DB.Tables[i].FkFields[len(project.DB.Tables[i].FkFields)-1].TypeParentTable = "bigint"
|
|
default:
|
|
log.Fatalf("Error primary key type '%s' in table '%s'", project.DB.Tables[i].Pk, project.DB.Tables[i].Name)
|
|
}*/
|
|
}
|
|
if len(project.DB.Tables[i].FKs) > 0 {
|
|
for j := range project.DB.Tables[i].FKs {
|
|
if project.DB.Tables[i].FKs[j].ID == uuid.Nil {
|
|
project.DB.Tables[i].FKs[j].ID = uuid.NewV4()
|
|
}
|
|
if project.DB.Tables[i].FKs[j].TableID == uuid.Nil && project.DB.Tables[i].FKs[j].TableName != "" {
|
|
for k := range project.DB.Tables {
|
|
if project.DB.Tables[k].Name == project.DB.Tables[i].FKs[j].TableName {
|
|
project.DB.Tables[i].FKs[j].TableID = project.DB.Tables[k].ID
|
|
//project.DB.Tables[i].FKs[j].Type = project.DB.Tables[k].Pk
|
|
}
|
|
}
|
|
}
|
|
if project.DB.Tables[i].FKs[j].TableID != uuid.Nil {
|
|
for k := range project.DB.Tables {
|
|
if project.DB.Tables[k].ID == project.DB.Tables[i].FKs[j].TableID {
|
|
project.DB.Tables[i].FKs[j].TableName = project.DB.Tables[k].Name
|
|
if project.DB.Tables[i].FKs[j].Name == "" {
|
|
project.DB.Tables[i].FKs[j].Name = project.DB.Tables[i].FKs[j].TableName
|
|
}
|
|
//project.DB.Tables[i].FKs[j].Type = project.DB.Tables[i].FKs[j].TableName
|
|
project.DB.Tables[i].FKs[j].Type = project.DB.Tables[k].Pk
|
|
//project.DB.Tables[k].Children = append(project.DB.Tables[k].Children, project.DB.Tables[i].Name)
|
|
|
|
}
|
|
}
|
|
}
|
|
if project.DB.Tables[i].FKs[j].TableName == "" {
|
|
log.Fatalf("Error foreign key for '%s' table", project.DB.Tables[i].FKs[j].TableID.String())
|
|
}
|
|
|
|
fkTmp := structs.Field{
|
|
Type: project.DB.Tables[i].Pk,
|
|
TypeParentTable: project.DB.Tables[i].Pk,
|
|
Description: fmt.Sprintf("Foreign key for \\\"%s\\\" table", project.DB.Tables[i].FKs[j].TableName),
|
|
}
|
|
if project.DB.Tables[i].FKs[j].Name != "" {
|
|
fkTmp.Name = strings.ToLower(project.DB.Tables[i].FKs[j].Name)
|
|
} else {
|
|
fkTmp.Name = strings.ToLower(project.DB.Tables[i].FKs[j].TableName)
|
|
}
|
|
fkTmp.Type = project.DB.Tables[i].FKs[j].TableName
|
|
|
|
project.DB.Tables[i].FkFields = append(project.DB.Tables[i].FkFields, fkTmp)
|
|
}
|
|
}
|
|
|
|
// Подготовка значений для справочников
|
|
if len(project.DB.Tables[i].Values) > 0 {
|
|
r := rand.New(rand.NewSource(999999999))
|
|
for j := range project.DB.Tables[i].Values {
|
|
if v, ok := project.DB.Tables[i].Values[j]["id"]; !ok || v == nil {
|
|
switch project.DB.Tables[i].Pk {
|
|
case "uuid":
|
|
project.DB.Tables[i].Values[j]["id"] = uuid.NewV4()
|
|
case "int":
|
|
project.DB.Tables[i].Values[j]["id"] = r.Int31()
|
|
case "bigint":
|
|
project.DB.Tables[i].Values[j]["id"] = r.Int63()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for i := range project.DB.Tables {
|
|
for j := range project.DB.Tables[i].FKs {
|
|
for k := range project.DB.Tables {
|
|
if project.DB.Tables[i].FKs[j].TableID == project.DB.Tables[k].ID {
|
|
project.DB.Tables[k].Children = append(project.DB.Tables[k].Children, structs.Field{
|
|
Name: project.DB.Tables[i].FKs[j].Name,
|
|
Type: project.DB.Tables[i].Name,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return project
|
|
}
|