yt-gen-app/lib/backend.go

279 lines
8.5 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 (
"log"
"path/filepath"
"strings"
"git.ymnuktech.ru/ymnuk/yt-gen-app/lib/templ"
"git.ymnuktech.ru/ymnuk/yt-gen-app/structs"
)
func Backend() {
// Создаем необходимые директории
dirs := []string{
filepath.Join(AppConfig.OutdirBackend, "db", "model"),
filepath.Join(AppConfig.OutdirBackend, "lib", "salt"),
filepath.Join(AppConfig.OutdirBackend, "structs"),
filepath.Join(AppConfig.OutdirBackend, "route", "static"),
filepath.Join(AppConfig.OutdirBackend, "route", "api", "auth"),
filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "role"),
filepath.Join(AppConfig.OutdirBackend, "middleware"),
}
if len(dirs) > 0 {
for _, dir := range dirs {
if err := templ.MkdirIsNotExists(dir); err != nil {
log.Fatal(err)
}
}
}
backendGenerateStructs()
generateDB()
generateBackendTmpl()
execCommands()
backendFixApi()
}
// Генерирование структуры БД
func generateDB() {
generateModelBase()
}
func generateBackendTmpl() {
staticTmpls := []structs.TmplInOut{
// root
{
FileIn: "tmpl/backend/gitignore.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, ".gitignore"),
},
// lib
{
FileIn: "tmpl/backend/lib/connect-to-ldap.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "lib", "connect-to-ldap.go"),
},
// lib/salt
{
FileIn: "tmpl/backend/lib/salt/generate-salt.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "lib", "salt", "generate-salt.go"),
},
// structs
{
FileIn: "tmpl/backend/structs/filter-request.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "structs", "filter-request.go"),
},
{
FileIn: "tmpl/backend/structs/jwt-custom-claim.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "structs", "jwt-custom-claim.go"),
},
{
FileIn: "tmpl/backend/structs/result.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "structs", "result.go"),
},
// db
{
FileIn: "tmpl/backend/db/transaction.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "db", "transaction.go"),
},
// db/model
{
FileIn: "tmpl/backend/db/model/base.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "db", "model", "base.go"),
},
{
FileIn: "tmpl/backend/db/model/base-int.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "db", "model", "base-int.go"),
},
{
FileIn: "tmpl/backend/db/model/role.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "db", "model", "role.go"),
},
{
FileIn: "tmpl/backend/db/model/user-role.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "db", "model", "user-role.go"),
},
{
FileIn: "tmpl/backend/db/model/log.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "db", "model", "log.go"),
},
// routes
{
FileIn: "tmpl/backend/route/static/gitkeep.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "static", ".gitkeep"),
},
{
FileIn: "tmpl/backend/route/static/static.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "static", "static.html"),
},
{
FileIn: "tmpl/backend/middleware/middleware.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "middleware", "middleware.go"),
},
}
if len(staticTmpls) > 0 {
for _, staticTmpl := range staticTmpls {
if err := templ.WriteTmplFile(staticTmpl.FileIn, staticTmpl.FileOut); err != nil {
log.Fatal(err)
}
}
}
// middlewares
if err := templ.PrepareTmplFile("tmpl/backend/middleware/middleware.tmpl", Project, filepath.Join(AppConfig.OutdirBackend, "middleware", "middleware.go")); err != nil {
panic(err)
}
generateBackendRest()
}
func generateModelBase() {
// main
if err := templ.PrepareTmplFile("tmpl/backend/main.tmpl", Project, filepath.Join(AppConfig.OutdirBackend, "main.go")); err != nil {
log.Fatal(err)
}
if err := templ.PrepareTmplFile("tmpl/backend/lib/config.tmpl", Project, filepath.Join(AppConfig.OutdirBackend, "lib", "config.go")); err != nil {
log.Fatal(err)
}
// db
if err := templ.PrepareTmplIsNotExists("tmpl/backend/db/model/user.tmpl", Project, filepath.Join(AppConfig.OutdirBackend, "db", "model", "user.go")); err != nil {
log.Fatal(err)
}
if err := templ.PrepareTmplFile("tmpl/backend/db/db.tmpl", Project, filepath.Join(AppConfig.OutdirBackend, "db", "db.go")); err != nil {
log.Fatal(err)
}
if len(Project.DB.Tables) > 0 {
for _, table := range Project.DB.Tables {
if err := templ.PrepareTmplFile("tmpl/backend/db/model/model.tmpl", table, filepath.Join(AppConfig.OutdirBackend, "db", "model", strings.ToLower(table.Name)+".go")); err != nil {
log.Fatal(err)
}
}
}
if len(Project.DB.Tables) > 0 {
for _, table := range Project.DB.Tables {
if len(table.Values) > 0 {
if err := templ.PrepareTmplFile("tmpl/backend/db/migrate-model.tmpl", structs.RestStruct{
Project: Project,
Table: &table,
}, filepath.Join(AppConfig.OutdirBackend, "db", "migrate"+templ.FieldNamePrepare(table.Name)+".go")); err != nil {
log.Fatal(err)
}
}
}
}
// Создаем файл с функциями кэширования пользователей из JWT для их работы
if err := templ.PrepareTmplFile("tmpl/backend/db/user-cache.tmpl", Project, filepath.Join(AppConfig.OutdirBackend, "db", "user-cache.go")); err != nil {
log.Fatal(err)
}
if err := templ.PrepareTmplFile("tmpl/backend/log/log.tmpl", Project, filepath.Join(AppConfig.OutdirBackend, "log", "log.go")); err != nil {
log.Fatal(err)
}
// middleware
if err := templ.PrepareTmplFile("tmpl/backend/middleware/middleware.tmpl", Project, filepath.Join(AppConfig.OutdirBackend, "middleware", "middleware.go")); err != nil {
log.Fatal(err)
}
if err := templ.PrepareTmplFile("tmpl/backend/middleware/in-role.tmpl", Project, filepath.Join(AppConfig.OutdirBackend, "middleware", "in-role.go")); err != nil {
log.Fatal(err)
}
staticTmpls := []structs.TmplInOut{
// route
{
FileIn: "tmpl/backend/route/route.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "route.go"),
},
// route/api
{
FileIn: "tmpl/backend/route/api/index.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "index.go"),
},
// route/api/auth
{
FileIn: "tmpl/backend/route/api/auth/index.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "auth", "index.go"),
},
// route/api/user
{
FileIn: "tmpl/backend/route/api/user/index.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "index.go"),
},
{
FileIn: "tmpl/backend/route/api/user/ldap-search.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "ldap-search.go"),
},
{
FileIn: "tmpl/backend/route/api/user/list-users.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "list-users.go"),
},
{
FileIn: "tmpl/backend/route/api/user/lock.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "lock.go"),
},
{
FileIn: "tmpl/backend/route/api/user/unlock.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "unlock.go"),
},
{
FileIn: "tmpl/backend/route/api/user/delete.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "delete.go"),
},
}
for _, item := range staticTmpls {
if err := templ.PrepareTmplFile(item.FileIn, Project, item.FileOut); err != nil {
log.Fatal(err)
}
}
staticTmpls = []structs.TmplInOut{
{
FileIn: "tmpl/backend/route/api/user/get.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "get.go"),
},
{
FileIn: "tmpl/backend/route/api/user/post.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "post.go"),
},
{
FileIn: "tmpl/backend/route/api/user/put.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "put.go"),
},
{
FileIn: "tmpl/backend/route/api/safed/index.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "safed", "index.go"),
},
{
FileIn: "tmpl/backend/route/api/unsafed/index.tmpl",
FileOut: filepath.Join(AppConfig.OutdirBackend, "route", "api", "unsafed", "index.go"),
},
}
for _, item := range staticTmpls {
if err := templ.PrepareTmplIsNotExists(item.FileIn, Project, item.FileOut); err != nil {
log.Fatal(err)
}
}
// route/api/user/role
if err := templ.PrepareTmplFile("tmpl/backend/route/api/user/role/index.tmpl", Project, filepath.Join(AppConfig.OutdirBackend, "route", "api", "user", "role", "index.go")); err != nil {
log.Fatal(err)
}
}