yt-gen-app/lib/prepare-metadata.go
2023-07-19 16:02:07 +03:00

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: "Администратор безопасности",
})
}
}