yt-gen-app/lib/prepare/prepare-rest.go

160 lines
7.1 KiB
Go
Raw Normal View History

2023-07-26 16:19:28 +03:00
package prepare
import (
"log"
"strings"
"git.ymnuktech.ru/ymnuk/yt-gen-app/lib/templ"
2023-07-26 16:19:28 +03:00
"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("Пустой проект")
}
2023-08-15 19:38:14 +03:00
project.Backend.RestGroups = append(project.Backend.RestGroups, "users")
2023-07-26 16:19:28 +03:00
if len(project.Backend.Rest) > 0 {
// Обрабатываем REST для подготовки данных
for i := range project.Backend.Rest {
2023-08-10 11:55:03 +03:00
if data, ok := project.Backend.Rest[i]; !ok || data == nil {
log.Fatalf("Нет пути в REST: %s", i)
2023-07-26 16:19:28 +03:00
}
2023-08-10 11:55:03 +03:00
2023-07-26 16:19:28 +03:00
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 {
2023-07-26 16:19:28 +03:00
log.Fatal("Неверно указано имя источника данных в REST. Формат: <db/interface>.<Название>")
}
if len(dataArr) == 1 {
if dataArr[0] == "binary" {
project.Backend.Rest[i].Data.ID = uuid.Nil
} else {
log.Fatal("Неверно указано имя источника данных в REST. Формат: <db/interface>.<Название>")
}
}
2023-07-26 16:19:28 +03:00
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)
}
}
}
2023-07-26 16:19:28 +03:00
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)
}
}
}
2023-07-26 16:19:28 +03:00
default:
log.Fatal("Неизвестный формат источника")
}
continue
}
if len(dataArr) == 1 {
// Нет интерфейса, по этому ищем где первым попадется
//tmpSrc := templ.FindSourceDataInDBByName(project, dataArr[1])
/*project.Backend.Rest[i].Data.ID = tmpSrc.ID
2023-07-26 16:19:28 +03:00
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])
2023-07-26 16:19:28 +03:00
if project.Backend.Rest[i].Data.ID == uuid.Nil {
log.Fatal("Не найдена структура данных для REST")
}*/
2023-07-26 16:19:28 +03:00
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)
2023-07-26 16:19:28 +03:00
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)
}
2023-07-26 16:19:28 +03:00
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)
2023-07-26 16:19:28 +03:00
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)
}
2023-07-26 16:19:28 +03:00
}
2023-08-15 19:38:14 +03:00
// Собираем группы, чтобы они были уникальными
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
2023-08-15 19:38:14 +03:00
for _, grp := range project.Backend.RestGroups {
if grp == project.Backend.Rest[i].GroupName {
search = true
break
2023-08-15 19:38:14 +03:00
}
}
if !search {
project.Backend.RestGroups = append(project.Backend.RestGroups, project.Backend.Rest[i].GroupName)
}
2023-07-26 16:19:28 +03:00
}
}
return project
}