221 lines
7.8 KiB
Go
221 lines
7.8 KiB
Go
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("Пустой проект")
|
||
}
|
||
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 {
|
||
log.Fatal("Неверно указано имя источника данных в REST. Формат: <db/interface>.<Название>")
|
||
}
|
||
if len(dataArr) == 2 {
|
||
// Есть интерфейс
|
||
switch strings.ToLower(dataArr[0]) {
|
||
case "db":
|
||
project.Backend.Rest[i].Data.ID = findSourceDataInDBByName(project, dataArr[1])
|
||
// Обработаем поля для 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 = 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 = findFieldIdInDBByName(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Filter[j].Name)
|
||
}
|
||
}
|
||
}
|
||
case "interface":
|
||
project.Backend.Rest[i].Data.ID = findSourceDataInInterfaceByName(project, dataArr[1])
|
||
// Обработаем поля для 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].ID = 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 {
|
||
project.Backend.Rest[i].Filter[j].ID = findFieldIdInInterfaceByName(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Filter[j].Name)
|
||
}
|
||
}
|
||
}
|
||
default:
|
||
log.Fatal("Неизвестный формат источника")
|
||
}
|
||
continue
|
||
}
|
||
if len(dataArr) == 1 {
|
||
// Нет интерфейса, по этому ищем где первым попадется
|
||
project.Backend.Rest[i].Data.ID = findSourceDataInDBByName(project, dataArr[1])
|
||
if project.Backend.Rest[i].Data.ID != uuid.Nil {
|
||
continue
|
||
}
|
||
project.Backend.Rest[i].Data.ID = 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. Найдем
|
||
|
||
project.Backend.Rest[i].Data.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 = 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 = findFieldNameInDBById(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Filter[j].ID)
|
||
}
|
||
continue
|
||
}
|
||
|
||
project.Backend.Rest[i].Data.Name = 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 = findFieldNameInInterfaceById(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 = findFieldNameInInterfaceById(project, project.Backend.Rest[i].Data.ID, project.Backend.Rest[i].Filter[j].ID)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return project
|
||
}
|
||
|
||
// Найти ID таблицы по имени
|
||
func findSourceDataInDBByName(project *structs.Project, name string) uuid.UUID {
|
||
if len(project.DB.Tables) == 0 {
|
||
return uuid.Nil
|
||
}
|
||
for i := range project.DB.Tables {
|
||
if project.DB.Tables[i].Name == name {
|
||
return project.DB.Tables[i].ID
|
||
}
|
||
}
|
||
return uuid.Nil
|
||
}
|
||
|
||
// Найти ID поля по имени
|
||
func findFieldIdInDBByName(project *structs.Project, tblID uuid.UUID, fldName string) uuid.UUID {
|
||
if len(project.DB.Tables) == 0 {
|
||
return uuid.Nil
|
||
}
|
||
for i := range project.DB.Tables {
|
||
if project.DB.Tables[i].ID == tblID {
|
||
for j := range project.DB.Tables[i].Fields {
|
||
if project.DB.Tables[i].Fields[j].Name == strings.ToLower(fldName) {
|
||
return project.DB.Tables[i].Fields[j].ID
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return uuid.Nil
|
||
}
|
||
|
||
// Найти имя таблицы по ID
|
||
func findSourceDataInDBByID(project *structs.Project, id uuid.UUID) string {
|
||
if len(project.DB.Tables) == 0 {
|
||
return ""
|
||
}
|
||
for i := range project.DB.Tables {
|
||
if project.DB.Tables[i].ID == id {
|
||
return project.DB.Tables[i].Name
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
// Найти имя поля в таблице по ID
|
||
func findFieldNameInDBById(project *structs.Project, tblID uuid.UUID, fldId uuid.UUID) string {
|
||
if len(project.DB.Tables) == 0 {
|
||
return ""
|
||
}
|
||
for i := range project.DB.Tables {
|
||
if project.DB.Tables[i].ID == tblID {
|
||
for j := range project.DB.Tables[i].Fields {
|
||
if project.DB.Tables[i].Fields[j].ID == fldId {
|
||
return project.DB.Tables[i].Fields[j].Name
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
func findSourceDataInInterfaceByName(project *structs.Project, name string) uuid.UUID {
|
||
// TODO
|
||
log.Fatal("Функция в разработки")
|
||
return uuid.Nil
|
||
}
|
||
|
||
func findSourceDataInInterfaceByID(project *structs.Project, id uuid.UUID) string {
|
||
// TODO
|
||
log.Fatal("Функция в разработки")
|
||
return ""
|
||
}
|
||
|
||
// Найти ID поля по имени
|
||
func findFieldIdInInterfaceByName(project *structs.Project, tblID uuid.UUID, fldName string) uuid.UUID {
|
||
// TODO
|
||
log.Fatal("Функция в разработки")
|
||
return uuid.Nil
|
||
}
|
||
|
||
// Найти имя поля в интерфейсе по ID
|
||
func findFieldNameInInterfaceById(project *structs.Project, tblID uuid.UUID, fldId uuid.UUID) string {
|
||
if len(project.DB.Tables) == 0 {
|
||
return ""
|
||
}
|
||
for i := range project.DB.Tables {
|
||
if project.DB.Tables[i].ID == tblID {
|
||
for j := range project.DB.Tables[i].Fields {
|
||
if project.DB.Tables[i].Fields[j].ID == fldId {
|
||
return project.DB.Tables[i].Fields[j].Name
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return ""
|
||
}
|