Генерация схемы ролей

This commit is contained in:
ymnuk 2023-11-12 14:33:05 +03:00
parent a776880f9f
commit 451d4c48ad
8 changed files with 157 additions and 40 deletions

55
lib/doc-roles.go Normal file
View File

@ -0,0 +1,55 @@
package lib
import (
"strings"
"text/template"
"git.ymnuktech.ru/ymnuk/yt-gen-app/lib/templ"
"github.com/yuzutech/kroki-go"
)
func docRoles() {
var err error
var tmpl *template.Template
var out []byte
// Сгенерируем граф с ролями
if tmpl, err = templ.ReadTmplFile("tmpl/docs/backend/roles-graph.tmpl"); err != nil {
panic(err)
}
if out, err = templ.ExecuteTmplFile(tmpl, Project); err != nil {
panic(err)
}
client := NewKrokiClient()
if result, err := client.FromString(string(out), kroki.GraphViz, kroki.SVG); err != nil {
panic(err)
} else {
templ.WriteFile(AppConfig.OutdirDoc+"/roles.svg", []byte(result))
}
//templ.WriteFile(AppConfig.OutdirDoc+"/roles.txt", out)
if !AppConfig.IsSingleDoc {
if tmpl, err = templ.ReadTmplFile("tmpl/docs/backend/roles.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+"/roles.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+"/roles.html", out); err != nil {
panic(err)
}
}
}
}

35
lib/doc-singlepage.go Normal file
View File

@ -0,0 +1,35 @@
package lib
import (
"text/template"
"git.ymnuktech.ru/ymnuk/yt-gen-app/lib/templ"
)
func docSinglePage() {
var err error
var tmpl *template.Template
var out []byte
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)
}
}
}

View File

@ -17,37 +17,18 @@ func Documentation() {
AppConfig.IsMarkdown = true
}
// Генерация общей схемы БД
fullDocDBGen()
/*fullDocDBGen()
// Генерация схем для каждой таблицы
for _, table := range Project.DB.Tables {
docDBGen(&table)
}
}*/
// Генерация информации о ролях
docRoles()
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)
}
}
docSinglePage()
} else {
if tmpl, err = templ.ReadTmplFile("tmpl/docs/index.tmpl"); err != nil {
panic(err)
@ -102,23 +83,8 @@ func Documentation() {
}
}
}
// Генерация каждой таблицы по отдельности с прилегающими ближайшими таблицами
/*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

View File

@ -75,6 +75,13 @@ var funcMap = template.FuncMap{
"parseRestPathForName": ParseRestPathForName,
"parseRestPathParams": ParseRestPathParams,
"fieldInTableByName": FieldInTableByName,
"escapeChars": EscapeChars,
}
func EscapeChars(value string) string {
value = strings.ReplaceAll(value, "/", "\\/")
return value
}
func IncludeTemplPart(templName string, data interface{}) string {

View File

@ -0,0 +1,44 @@
digraph G {
rankdir=LR;
subgraph cluster_roles {
rankdir=TD;
label = "Роли";
{{ range $index, $role := .Roles }}
{{ $role.Name }}[label="{{ $role.Display }}"];
{{ end }}
}
subgraph cluster_rest {
rankdir=RL;
label = "REST";
{{ range $index, $rest := .Backend.Rest }}
{{ $rest.Name }}[label="{{ $index }}"];
{{ if eq $rest.Methods nil }}
{{ $rest.Name }}_LIST[label="LIST"];
{{ $rest.Name }} -> {{ $rest.Name }}_LIST
{{ $rest.Name }}_GET[label="GET"];
{{ $rest.Name }} -> {{ $rest.Name }}_GET;
{{ $rest.Name }}_POST[label="POST"];
{{ $rest.Name }} -> {{ $rest.Name }}_POST;
{{ $rest.Name }}_PUT[label="PUT"];
{{ $rest.Name }} -> {{ $rest.Name }}_PUT;
{{ $rest.Name }}_DELETE[label="DELETE"];
{{ $rest.Name }} -> {{ $rest.Name }}_DELETE;
{{ else }}
{{ range $indexMethod, $method := $rest.Methods }}
{{ $rest.Name }}_{{ $method }}[label="{{ $method }}"];
{{ $rest.Name }} -> {{ $rest.Name }}_{{ $method }};
{{ end }}
{{ end }}
{{ end }}
}
{{ range $restName, $rest := .Backend.Rest }}
{{ range $method, $roles := $rest.Roles}}
{{ $eq := eq $roles nil }}
{{ if not $eq}}
{{ range $indexRole, $role := $roles }}
{{ $rest.Name }}_{{ $method }} -> {{ $role }};
{{ end }}
{{ end }}
{{ end }}
{{ end }}
}

View File

@ -0,0 +1,4 @@
|Название|Описание|
|:-------|:-------|
{{ range $index, $role := .Roles }}|{{ $role.Name }}|{{ $role.Display }}|
{{ end }}

View File

@ -0,0 +1,5 @@
# Роли
{{ includeTemplPart "tmpl/docs/backend/roles-table.tmpl" $ }}
![Роли](roles.svg "Роли")

View File

@ -1,4 +1,3 @@
# База данных
{{ includeTemplPart "tmpl/docs/db/table-list-single.tmpl" .DB }}
@ -11,3 +10,5 @@
{{ includeTemplPart "tmpl/docs/db/entity-table-no-href.tmpl" $table }}
{{ end }}
{{ includeTemplPart "tmpl/docs/backend/roles.tmpl" . }}