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

95 lines
3.4 KiB
Go

package lib
import (
"fmt"
"log"
"strings"
"git.ymnuktech.ru/ymnuk/yt-gen-app/structs"
uuid "github.com/satori/go.uuid"
)
func PrepareMetadata(project *structs.Project) {
if project == nil {
log.Fatal("Metadata is empty")
}
if project.Name == "" {
log.Fatal("Should be set project name")
}
// Подготовка БД
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 = 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].Type = "uuid"
case "int":
project.DB.Tables[i].FkFields[len(project.DB.Tables[i].FkFields)-1].Type = "bigint"
case "bigintint":
project.DB.Tables[i].FkFields[len(project.DB.Tables[i].FkFields)-1].Type = "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
/*project.DB.Tables[i].FkFields = append(project.DB.Tables[i].FkFields, structs.Field{
Name: fmt.Sprintf("%s", project.DB.Tables[k].Name),
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
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())
}
project.DB.Tables[i].FkFields = append(project.DB.Tables[i].FkFields, structs.Field{
Name: fmt.Sprintf("%s", strings.ToLower(project.DB.Tables[i].FKs[j].TableName)),
Type: project.DB.Tables[i].Pk,
Description: fmt.Sprintf("Foreign key for \\\"%s\\\" table", project.DB.Tables[i].FKs[j].TableName),
})
}
}
}
}
}