package lib import ( "fmt" "log" "strings" "text/template" "git.ymnuktech.ru/ymnuk/yt-gen-app/lib/templ" "git.ymnuktech.ru/ymnuk/yt-gen-app/structs" uuid "github.com/satori/go.uuid" "github.com/yuzutech/kroki-go" ) func Documentation() { if !AppConfig.IsHtml { AppConfig.IsMarkdown = true } // Генерация общей схемы БД fullDocDBGen() // Генерация схем для каждой таблицы for _, table := range Project.DB.Tables { docDBGen(&table) } // Генерация информации о ролях docRoles() var err error var tmpl *template.Template var out []byte if AppConfig.IsSingleDoc { docSinglePage() } else { if tmpl, err = templ.ReadTmplFile("tmpl/docs/index.tmpl"); err != nil { panic(err) } if out, err = templ.ExecuteTmplFile(tmpl, Project); err != nil { panic(err) } if AppConfig.IsMarkdown { if err = templ.WriteFile(AppConfig.OutdirDoc+"/index.md", out); err != nil { panic(err) } } if AppConfig.IsHtml { var buff []byte if buff, err = templ.Content.ReadFile("tmpl/docs/styles.tmpl"); err != nil { panic(err) } //{{ includeTemplPart "tmpl/docs/styles.tmpl" nil }} out = append(buff, out...) out = []byte(strings.ReplaceAll(string(out), ".md", ".html")) out = mdToHTML(out) if err = templ.WriteFile(AppConfig.OutdirDoc+"/index.html", out); err != nil { panic(err) } } // Генерация каждого отдельного файла для каждой таблицы if tmpl, err = templ.ReadTmplFile("tmpl/docs/db/entity-table-href.tmpl"); err != nil { panic(err) } for _, table := range Project.DB.Tables { // TODO if out, err = templ.ExecuteTmplFile(tmpl, table); err != nil { panic(err) } if AppConfig.IsMarkdown { if err = templ.WriteFile(AppConfig.OutdirDoc+"/"+templ.FieldNameLowerPrepare(table.Name)+".md", out); err != nil { panic(err) } } if AppConfig.IsHtml { var buff1 []byte if buff1, err = templ.Content.ReadFile("tmpl/docs/styles.tmpl"); err != nil { panic(err) } //{{ includeTemplPart "tmpl/docs/styles.tmpl" nil }} out = append(buff1, out...) out = []byte(strings.ReplaceAll(string(out), ".md", ".html")) out = mdToHTML(out) if err = templ.WriteFile(AppConfig.OutdirDoc+"/"+templ.FieldNameLowerPrepare(table.Name)+".html", out); err != nil { panic(err) } } } } } // Генерация общей схемы БД func fullDocDBGen() { // TODO if tmpl, err := templ.ReadTmplFile("tmpl/docs/db/full-schema.tmpl"); err != nil { panic(err) } else { if buff, err := templ.ExecuteTmplFile(tmpl, Project.DB); err != nil { panic(err) } else { //fmt.Println(string(buff)) //templ.WriteFile(AppConfig.OutdirDoc+"/test.txt", buff) client := NewKrokiClient() if result, err := client.FromString(string(buff), "dbml", kroki.SVG); err != nil { panic(err) } else { //fmt.Println(result) templ.WriteFile(AppConfig.OutdirDoc+"/full-schemadb.svg", []byte(result)) } } } } // Генерация отдельной таблицы с прилегающими ближайшими таблицами func docDBGen(table *structs.Table) { restStruct := structs.RestStruct{ Table: table, Children: GetChildrenTables(table), Parents: GetParentsTables(table), } if tmpl, err := templ.ReadTmplFile("tmpl/docs/db/adjacents-tables.tmpl"); err != nil { panic(err) } else { if buff, err := templ.ExecuteTmplFile(tmpl, restStruct); err != nil { fmt.Println(string(buff)) panic(err) } else { //fmt.Println(string(buff)) //templ.WriteFile(AppConfig.OutdirDoc+"/test.txt", buff) client := NewKrokiClient() if result, err := client.FromString(string(buff), "dbml", kroki.SVG); err != nil { fmt.Println(string(buff)) panic(err) } else { //fmt.Println(result) templ.WriteFile(AppConfig.OutdirDoc+"/"+templ.FieldNameLowerPrepare(restStruct.Table.Name)+".svg", []byte(result)) } } } // TODO } func GetParentsTables(table *structs.Table) (tables []structs.Table) { for _, fk := range table.FKs { for _, tbl := range Project.DB.Tables { if fk.TableID == uuid.Nil { // Это одна из трех таблиц: user, role, user_role switch templ.FieldNameLowerPrepare(fk.TableName) { case "user": tables = append(tables, structs.Table{ ID: uuid.Nil, Name: "user", Pk: "uuid", }) case "role": tables = append(tables, structs.Table{ ID: uuid.Nil, Name: "role", Pk: "uuid", }) default: log.Fatalf("Not found standart table %s", templ.FieldNameLowerPrepare(fk.TableName)) } break } if fk.TableID == tbl.ID { tables = append(tables, tbl) break } } } return } func GetChildrenTables(table *structs.Table) (tables []structs.Table) { for _, tbl := range Project.DB.Tables { for _, fk := range tbl.FKs { if fk.TableID == table.ID { tables = append(tables, tbl) } } } return }