yt-gen-app/lib/prepare/prepare-rest.go
Ymnuk d02f4c7040
All checks were successful
continuous-integration/drone/tag Build is passing
Fix prepare Rest
2023-08-10 11:55:03 +03:00

221 lines
7.8 KiB
Go
Raw 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("Пустой проект")
}
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 ""
}