yt-gen-app/lib/prepare/prepare-db.go

137 lines
5.0 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].FKs[j].Type, //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].Description != "" {
fkTmp.Description = project.DB.Tables[i].FKs[j].Description
}
if strings.ToLower(project.DB.Tables[i].FKs[j].TableName) == "user" {
fkTmp.TypeParentTable = "uuid"
}
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
}