115 lines
2.7 KiB
Go
115 lines
2.7 KiB
Go
// Package module defines the small contracts shared by application modules.
|
|
// A module contributes its own schema, seed data, admin surface and runtime
|
|
// hooks without depending on the built-in system implementation.
|
|
package module
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"kra/pkg/database/migration"
|
|
"kra/pkg/mq"
|
|
"kra/pkg/task"
|
|
)
|
|
|
|
type Menu struct {
|
|
Name, Path, ParentName, Component, Title, Icon string
|
|
Sort int
|
|
}
|
|
|
|
type API struct {
|
|
Path, Method, Group, Description string
|
|
}
|
|
|
|
type Surface struct {
|
|
Menus []Menu
|
|
APIs []API
|
|
}
|
|
|
|
type TimedTask struct {
|
|
Name, Description, Spec, MethodName string
|
|
WithSeconds, Enabled bool
|
|
}
|
|
|
|
type Definition struct {
|
|
Name string
|
|
Migrations []migration.Step
|
|
Surface Surface
|
|
TimedTasks []TimedTask
|
|
Tasks []task.Method
|
|
SubscriptionContributors []mq.SubscriptionContributor
|
|
}
|
|
|
|
type Catalog struct {
|
|
Definitions []Definition
|
|
}
|
|
|
|
func (c Catalog) MigrationSteps() []migration.Step {
|
|
var steps []migration.Step
|
|
for _, item := range c.Definitions {
|
|
steps = append(steps, item.Migrations...)
|
|
}
|
|
return steps
|
|
}
|
|
|
|
func (c Catalog) Surface() Surface {
|
|
var surface Surface
|
|
for _, item := range c.Definitions {
|
|
surface.Menus = append(surface.Menus, item.Surface.Menus...)
|
|
surface.APIs = append(surface.APIs, item.Surface.APIs...)
|
|
}
|
|
return surface
|
|
}
|
|
|
|
func (c Catalog) DefaultTimedTasks() []TimedTask {
|
|
var tasks []TimedTask
|
|
for _, item := range c.Definitions {
|
|
tasks = append(tasks, item.TimedTasks...)
|
|
}
|
|
return tasks
|
|
}
|
|
|
|
func (c Catalog) TaskMethods() []task.Method {
|
|
var methods []task.Method
|
|
for _, item := range c.Definitions {
|
|
methods = append(methods, item.Tasks...)
|
|
}
|
|
return methods
|
|
}
|
|
|
|
// SubscriptionContributors returns the module declarations that are applied
|
|
// to the process-wide MQ runtime during application startup.
|
|
func (c Catalog) SubscriptionContributors() []mq.SubscriptionContributor {
|
|
var contributors []mq.SubscriptionContributor
|
|
for _, item := range c.Definitions {
|
|
contributors = append(contributors, item.SubscriptionContributors...)
|
|
}
|
|
return contributors
|
|
}
|
|
|
|
type RouteRegistrar interface {
|
|
RegisterRoutes(public, private *gin.RouterGroup, engine *gin.Engine)
|
|
}
|
|
|
|
type Runtime struct {
|
|
routes []RouteRegistrar
|
|
}
|
|
|
|
func NewRuntime(routes ...RouteRegistrar) *Runtime {
|
|
return &Runtime{routes: append([]RouteRegistrar(nil), routes...)}
|
|
}
|
|
|
|
func (r *Runtime) Add(routes ...RouteRegistrar) {
|
|
if r == nil {
|
|
return
|
|
}
|
|
r.routes = append(r.routes, routes...)
|
|
}
|
|
|
|
func (r *Runtime) RegisterRoutes(public, private *gin.RouterGroup, engine *gin.Engine) {
|
|
if r == nil {
|
|
return
|
|
}
|
|
for _, registrar := range r.routes {
|
|
registrar.RegisterRoutes(public, private, engine)
|
|
}
|
|
}
|