package prepare import ( "fmt" "log" "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].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 } } } 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), }) } } } } return project }