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

160 lines
7.1 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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. Формат: <db/interface>.<Название>")
}
if len(dataArr) == 1 {
if dataArr[0] == "binary" {
project.Backend.Rest[i].Data.ID = uuid.Nil
} else {
log.Fatal("Неверно указано имя источника данных в REST. Формат: <db/interface>.<Название>")
}
}
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
}