package prepare import ( "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 prepareRest(project *structs.Project) *structs.Project { if project == nil { log.Fatal("Пустой проект") } project.Backend.RestGroups = append(project.Backend.RestGroups, "users") if len(project.Backend.Rest) > 0 { // Обрабатываем REST для подготовки данных for i := range project.Backend.Rest { if data, ok := project.Backend.Rest[i]; !ok || data == nil { log.Fatalf("Нет пути в REST: %s", i) } if project.Backend.Rest[i].Data.Name == "" && project.Backend.Rest[i].Data.ID == uuid.Nil { log.Fatal("Не указан источник данных") } if project.Backend.Rest[i].Data.Name != "" && project.Backend.Rest[i].Data.ID == uuid.Nil { // Есть имя, но нет ID. Найдем dataArr := strings.Split(project.Backend.Rest[i].Data.Name, ".") if len(dataArr) > 2 || len(dataArr) < 1 { log.Fatal("Неверно указано имя источника данных в REST. Формат: .<Название>") } if len(dataArr) == 1 { if dataArr[0] == "binary" { project.Backend.Rest[i].Data.ID = uuid.Nil } else { log.Fatal("Неверно указано имя источника данных в REST. Формат: .<Название>") } } if len(dataArr) == 2 { // Есть интерфейс switch strings.ToLower(dataArr[0]) { case "db": tmpSrc := templ.FindSourceDataInDBByName(project, dataArr[1]) if tmpSrc == nil { log.Fatalf("Not found data \"%s\"", project.Backend.Rest[i].Data.Name) } project.Backend.Rest[i].Data.ID = tmpSrc.ID // Обработаем поля для Edit if len(project.Backend.Rest[i].Edit) > 0 { for j := range project.Backend.Rest[i].Edit { if project.Backend.Rest[i].Edit[j].ID == uuid.Nil { project.Backend.Rest[i].Edit[j].Name = templ.FieldDBName(&structs.Field{ Name: project.Backend.Rest[i].Edit[j].Name, }) project.Backend.Rest[i].Edit[j].ID = templ.FindFieldIdInDBByName(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Edit[j].Name) } } } // Обработаем поля для Filter if len(project.Backend.Rest[i].Filter) > 0 { for j := range project.Backend.Rest[i].Filter { if project.Backend.Rest[i].Filter[j].ID == uuid.Nil { project.Backend.Rest[i].Filter[j].Name = templ.FieldDBName(&structs.Field{ Name: project.Backend.Rest[i].Filter[j].Name, }) project.Backend.Rest[i].Filter[j].ID = templ.FindFieldIdInDBByName(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Filter[j].Name) } } } case "interface": tmpInterface := templ.FindSourceDataInInterfaceByName(project, dataArr[1]) project.Backend.Rest[i].Data.ID = tmpInterface.ID // Обработаем поля для Edit if len(project.Backend.Rest[i].Edit) > 0 { for j := range project.Backend.Rest[i].Edit { if project.Backend.Rest[i].Edit[j].ID == uuid.Nil { tmp := templ.FindFieldIdInInterfaceByName(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Edit[j].Name) project.Backend.Rest[i].Edit[j].ID = tmp //templ.FindFieldIdInInterfaceByName(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Edit[j].Name) } } } // Обработаем поля для Filter if len(project.Backend.Rest[i].Filter) > 0 { for j := range project.Backend.Rest[i].Filter { if project.Backend.Rest[i].Filter[j].ID == uuid.Nil { tmp := templ.FindFieldIdInInterfaceByName(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Filter[j].Name) project.Backend.Rest[i].Filter[j].ID = tmp //templ.FindFieldIdInInterfaceByName(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Filter[j].Name) } } } default: log.Fatal("Неизвестный формат источника") } continue } if len(dataArr) == 1 { // Нет интерфейса, по этому ищем где первым попадется //tmpSrc := templ.FindSourceDataInDBByName(project, dataArr[1]) /*project.Backend.Rest[i].Data.ID = tmpSrc.ID if project.Backend.Rest[i].Data.ID != uuid.Nil { continue }*/ /*tmpSrc1 := templ.FindSourceDataInInterfaceByName(project, dataArr[1]) project.Backend.Rest[i].Data.ID = tmpSrc1.ID //templ.FindSourceDataInInterfaceByName(project, dataArr[1]) if project.Backend.Rest[i].Data.ID == uuid.Nil { log.Fatal("Не найдена структура данных для REST") }*/ continue } } if project.Backend.Rest[i].Data.Name == "" && project.Backend.Rest[i].Data.ID != uuid.Nil { // Есть имя, но нет ID. Найдем tmpSrc := templ.FindSourceDataInDBByID(project, project.Backend.Rest[i].Data.ID) project.Backend.Rest[i].Data.Name = tmpSrc.Name // findSourceDataInDBByID(project, project.Backend.Rest[i].Data.ID) if project.Backend.Rest[i].Data.ID != uuid.Nil { for j := range project.Backend.Rest[i].Edit { project.Backend.Rest[i].Data.Name = templ.FindFieldNameInDBById(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Edit[j].ID) } for j := range project.Backend.Rest[i].Filter { project.Backend.Rest[i].Data.Name = templ.FindFieldNameInDBById(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Filter[j].ID) } continue } tmpSrc1 := templ.FindSourceDataInInterfaceByID(project, project.Backend.Rest[i].Data.ID) project.Backend.Rest[i].Data.Name = tmpSrc1.Name //templ.FindSourceDataInInterfaceByID(project, project.Backend.Rest[i].Data.ID) if project.Backend.Rest[i].Data.ID == uuid.Nil { log.Fatal("Не найдена структура данных для REST") } for j := range project.Backend.Rest[i].Edit { project.Backend.Rest[i].Edit[j].Name = templ.FindFieldNameInTableById(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Edit[j].ID) } for j := range project.Backend.Rest[i].Filter { project.Backend.Rest[i].Edit[j].Name = templ.FindFieldNameInInterfaceById(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Filter[j].ID) } } // Собираем группы, чтобы они были уникальными project.Backend.Rest[i].GroupName = templ.FieldNamePrepare(project.Backend.Rest[i].GroupName) runes := []rune(project.Backend.Rest[i].GroupName) runes[0] = []rune(strings.ToLower(string(runes[0])))[0] project.Backend.Rest[i].GroupName = string(runes) search := false for _, grp := range project.Backend.RestGroups { if grp == project.Backend.Rest[i].GroupName { search = true break } } if !search { project.Backend.RestGroups = append(project.Backend.RestGroups, project.Backend.Rest[i].GroupName) } } } return project }