|
|
@@ -1,15 +1,17 @@
|
|
|
-// package mod_http -- http-модуль для архитектуры
|
|
|
-package mod_http
|
|
|
+// package mod_http -- http-движок для архитектуры
|
|
|
+package engine_http
|
|
|
|
|
|
import (
|
|
|
"bytes"
|
|
|
_ "embed"
|
|
|
- "encoding/json"
|
|
|
"fmt"
|
|
|
"time"
|
|
|
|
|
|
svg "github.com/ajstarks/svgo"
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
+ "gitp78su.ipnodns.ru/svi/kern/v3"
|
|
|
+ "gitp78su.ipnodns.ru/svi/kern/v3/kc/log_buf"
|
|
|
+ "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
|
|
|
"gopkg.in/yaml.v3"
|
|
|
|
|
|
"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
|
|
|
@@ -17,14 +19,7 @@ import (
|
|
|
"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
|
|
|
"gitp78su.ipnodns.ru/svi/goarch/lev1/coord"
|
|
|
"gitp78su.ipnodns.ru/svi/goarch/lev1/size"
|
|
|
- "gitp78su.ipnodns.ru/svi/goarch/lev1/view_use_case"
|
|
|
"gitp78su.ipnodns.ru/svi/goarch/pkg/elems/canvas"
|
|
|
- "gitp78su.ipnodns.ru/svi/goarch/pkg/views/view_actor"
|
|
|
- "gitp78su.ipnodns.ru/svi/goarch/pkg/views/view_link"
|
|
|
- "gitp78su.ipnodns.ru/svi/goarch/pkg/views/view_use_group"
|
|
|
- "gitp78su.ipnodns.ru/svi/kern/v3"
|
|
|
- "gitp78su.ipnodns.ru/svi/kern/v3/kc/log_buf"
|
|
|
- "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
|
|
|
)
|
|
|
|
|
|
//go:embed index.html
|
|
|
@@ -40,24 +35,25 @@ func (sf *CanvasSize) String() string {
|
|
|
return fmt.Sprintf("w:%v; h:%v", sf.SizeX_, sf.SizeY_)
|
|
|
}
|
|
|
|
|
|
-// ModHttp -- http-модуль для архитектуры
|
|
|
-type ModHttp struct {
|
|
|
+// EngineHttp -- http-движок для архитектуры
|
|
|
+type EngineHttp struct {
|
|
|
// fibApp *fiber.App
|
|
|
kCtx ktypes.IKernelCtx
|
|
|
log ktypes.ILogBuf
|
|
|
- diaMode string // Режим диаграммы
|
|
|
- oldBinArch []byte // Кеш старой архитектуры
|
|
|
- canvSize CanvasSize // Размер холста
|
|
|
- size types.ISize // Размер холста в его координатах
|
|
|
- pos types.ICoord // Координаты холста
|
|
|
+ diaMode string // Режим диаграммы
|
|
|
+ oldBinArch []byte // Кеш старой архитектуры
|
|
|
+ canvSize CanvasSize // Размер холста
|
|
|
+ size types.IViewSize // Размер холста в его координатах
|
|
|
+ pos types.IViewCoord // Координаты холста
|
|
|
+ mapDrawer types.IMapDrawer // Словарь отрисовщиков
|
|
|
}
|
|
|
|
|
|
-// NewModHttp -- возвращает новый сервис
|
|
|
-func NewModHttp() *ModHttp {
|
|
|
+// NewEngineHttp -- возвращает новый движок HTTP
|
|
|
+func NewEngineHttp() *EngineHttp {
|
|
|
optTerm := log_buf.OptIsTerm(true)
|
|
|
- optPref := log_buf.OptPrefix("ModHttp")
|
|
|
+ optPref := log_buf.OptPrefix("EngineHttp")
|
|
|
log := log_buf.NewLogBuf(optTerm, optPref)
|
|
|
- sf := &ModHttp{
|
|
|
+ sf := &EngineHttp{
|
|
|
kCtx: kern.GetKernelCtx(),
|
|
|
log: log,
|
|
|
diaMode: cons.ModeUseCase,
|
|
|
@@ -84,7 +80,7 @@ type FormArch struct {
|
|
|
}
|
|
|
|
|
|
// Устанавливает размер холста
|
|
|
-func (sf *ModHttp) postSetCanvasSize(ctx *fiber.Ctx) error {
|
|
|
+func (sf *EngineHttp) postSetCanvasSize(ctx *fiber.Ctx) error {
|
|
|
err := ctx.BodyParser(&sf.canvSize)
|
|
|
if err != nil {
|
|
|
sf.log.Err("postSetCanvasSize(): on body parser, err=\n\t%v", err)
|
|
|
@@ -104,7 +100,7 @@ func (sf *ModHttp) postSetCanvasSize(ctx *fiber.Ctx) error {
|
|
|
}
|
|
|
|
|
|
// Возвращает новый холст
|
|
|
-func (sf *ModHttp) canvas(wr *bytes.Buffer, lstElem []map[string]interface{}) (*svg.SVG, error) {
|
|
|
+func (sf *EngineHttp) canvas(wr *bytes.Buffer, lstElem []map[string]interface{}) (*svg.SVG, error) {
|
|
|
var (
|
|
|
elem map[string]interface{}
|
|
|
isFind, isOk bool
|
|
|
@@ -136,7 +132,7 @@ func (sf *ModHttp) canvas(wr *bytes.Buffer, lstElem []map[string]interface{}) (*
|
|
|
}
|
|
|
|
|
|
// По запросу парсит, что получилось -- обновляет архитектуру
|
|
|
-func (sf *ModHttp) postArch(ctx *fiber.Ctx) error {
|
|
|
+func (sf *EngineHttp) postArch(ctx *fiber.Ctx) error {
|
|
|
form := &FormArch{}
|
|
|
if err := ctx.BodyParser(form); err != nil {
|
|
|
return ctx.SendString(fmt.Sprintf("ServHttp.archPost(): in BodyParser, err=<br>%v", err))
|
|
|
@@ -157,7 +153,7 @@ func (sf *ModHttp) postArch(ctx *fiber.Ctx) error {
|
|
|
}
|
|
|
switch sf.diaMode {
|
|
|
case cons.ModeUseCase: // режим вариантов использования
|
|
|
- if err := sf.useCase(canvas, mapElem); err != nil {
|
|
|
+ if err := sf.useCase(canvas); err != nil {
|
|
|
return ctx.SendString(fmt.Sprintf("ServHttp.archPost(): in useCase, err=<br>%v", err))
|
|
|
}
|
|
|
default: // неизвестный режим
|
|
|
@@ -170,69 +166,21 @@ func (sf *ModHttp) postArch(ctx *fiber.Ctx) error {
|
|
|
}
|
|
|
|
|
|
// Формирует варианты использования
|
|
|
-func (sf *ModHttp) useCase(canvas *svg.SVG, lstElem []map[string]interface{}) error {
|
|
|
- mapDraw := make(map[alias.Id]types.IDrawer)
|
|
|
- for _, elem := range lstElem {
|
|
|
- _id, isOk := elem["id"]
|
|
|
- if !isOk {
|
|
|
- return fmt.Errorf("ServHttp.useCase(): field 'id' not found<br>%#+v", elem)
|
|
|
- }
|
|
|
- id0, isOk := _id.(string)
|
|
|
- if !isOk {
|
|
|
- return fmt.Errorf("ServHttp.useCase(): field 'id'(%T, %+v) not alias.Id", _id, _id)
|
|
|
- }
|
|
|
- id := alias.Id(id0)
|
|
|
- if id == "" {
|
|
|
- return fmt.Errorf("ServHttp.useCase(): id=%q, elem is empty<br>%#+v", id, elem)
|
|
|
- }
|
|
|
- _, isOk = mapDraw[id]
|
|
|
- if isOk {
|
|
|
- return fmt.Errorf("ServHttp.useCase(): id=%q already exists", id)
|
|
|
- }
|
|
|
- binElem, _ := json.MarshalIndent(elem, "", " ")
|
|
|
- _type, isOk := elem["type"]
|
|
|
- if !isOk {
|
|
|
- return fmt.Errorf("ServHttp.useCase(): id=%q, field 'type' not found<br>%+v", id, string(binElem))
|
|
|
- }
|
|
|
- strType, isOk := _type.(string)
|
|
|
- if !isOk {
|
|
|
- return fmt.Errorf("ServHttp.useCase(): id=%q, field 'type'(%+v) not string<br>%+v", id, _type, string(binElem))
|
|
|
- }
|
|
|
- var (
|
|
|
- drawer types.IDrawer
|
|
|
- )
|
|
|
- switch strType {
|
|
|
- case cons.TypeUseActor: // Нарисовать актора
|
|
|
- view_actor.NewViewActor(actor, elem)
|
|
|
- case cons.TypeUseCase: // Нарисовать вариант использования
|
|
|
- drawer = view_use_case.NewViewUseCase(useCase, elem)
|
|
|
- case cons.TypeUseLink: // Нарисовать связь
|
|
|
- drawer = view_link.NewViewLink(useLink)
|
|
|
- case cons.TypeUseGroup: // Нарисовать группу вариантов использования
|
|
|
- drawer = view_use_group.NewViewUseGroup(useGroup, elem)
|
|
|
- }
|
|
|
- if drawer != nil {
|
|
|
- mapDraw[id] = drawer
|
|
|
- sf.log.Debug("useCase(): id=%q, elem=\n%v\n", id, elem)
|
|
|
- }
|
|
|
- }
|
|
|
- for _, drawer := range mapDraw {
|
|
|
- switch drawer.(type) {
|
|
|
- case types.IElemLink:
|
|
|
- }
|
|
|
- drawer.Draw(canvas, mapDraw)
|
|
|
+func (sf *EngineHttp) useCase(canvas *svg.SVG) error {
|
|
|
+ for _, elem := range sf.mapDrawer.LstDrawers() {
|
|
|
+ elem.Draw(canvas)
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
// Возвращает картинку архитектуры
|
|
|
-func (sf *ModHttp) postSetModeUseCase(ctx *fiber.Ctx) error {
|
|
|
+func (sf *EngineHttp) postSetModeUseCase(ctx *fiber.Ctx) error {
|
|
|
sf.diaMode = cons.ModeUseCase
|
|
|
return ctx.SendString("[mode='" + sf.diaMode + "']")
|
|
|
}
|
|
|
|
|
|
// Возвращает главную страницу сервиса
|
|
|
-func (sf *ModHttp) getIndex(ctx *fiber.Ctx) error {
|
|
|
+func (sf *EngineHttp) getIndex(ctx *fiber.Ctx) error {
|
|
|
ctx.Response().Header.Set("Content-Type", "text/html")
|
|
|
return ctx.Send(indexHtml)
|
|
|
}
|