yt-gen-app/lib/documentation.go

160 lines
4.2 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 lib
import (
"log"
"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)
}
var err error
var tmpl *template.Template
var out []byte
if AppConfig.IsSingleDoc {
if tmpl, err = templ.ReadTmplFile("tmpl/docs/single-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...)
if err = templ.WriteFile(AppConfig.OutdirDoc+"/index.html", mdToHTML(out)); err != nil {
panic(err)
}
}
}
// Генерация каждой таблицы по отдельности с прилегающими ближайшими таблицами
/*for i := range Project.DB.Tables {
docDBGen(Project.DB.Tables[i])
}*/
// TODO
}
// Генерирования списка таблиц
/*func listTablesDocGen() string {
// TODO
}
// Генерирование полей таблицы
func tableDocGen(table structs.Table) string {
// TODO
}*/
// Генерация общей схемы БД
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 {
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+"/"+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
}