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 }