136 lines
4.5 KiB
Go
136 lines
4.5 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),
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Подготовка ролей
|
|
hasAppAdmin := false
|
|
hasSecAdmin := false
|
|
if len(project.Roles) > 0 {
|
|
|
|
for i := range project.Roles {
|
|
project.Roles[i].Name = strings.Trim(project.Roles[i].Name, " ")
|
|
if project.Roles[i].Name == "" {
|
|
log.Fatal("Should be set role name")
|
|
}
|
|
project.Roles[i].Name = strings.ReplaceAll(project.Roles[i].Name, " ", "_")
|
|
if project.Roles[i].ID == uuid.Nil {
|
|
project.Roles[i].ID = uuid.NewV4()
|
|
}
|
|
if project.Roles[i].Display == "" {
|
|
project.Roles[i].Display = project.Roles[i].Name
|
|
}
|
|
if project.Roles[i].Name == "APP_ADMIN" {
|
|
hasAppAdmin = true
|
|
}
|
|
if project.Roles[i].Name == "SEC_ADMIN" {
|
|
hasSecAdmin = true
|
|
}
|
|
}
|
|
|
|
}
|
|
if !hasAppAdmin {
|
|
project.Roles = append(project.Roles, structs.Role{
|
|
ID: uuid.NewV4(),
|
|
Name: "APP_ADMIN",
|
|
Display: "Администратор приложения",
|
|
})
|
|
}
|
|
if !hasSecAdmin {
|
|
project.Roles = append(project.Roles, structs.Role{
|
|
ID: uuid.NewV4(),
|
|
Name: "SEC_ADMIN",
|
|
Display: "Администратор безопасности",
|
|
})
|
|
}
|
|
}
|