yt-gen-app/lib/documentation.go

183 lines
4.9 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 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
}