- make:admin-controller edits the singular of its name (--model overrides):
ModelName, modelClass and the YAML under models/<model>/
- NewRecord returns &models.<Model>{} when the model exists; otherwise the
nil body stays and the command says to run make:model
- config_list.yaml offers create and delete with showCheckboxes
- registry.gen.go embeds controllers/*/*.yaml and models/*/*.yaml once they
exist and exposes generatedAdminFS(); scaffolded plugins implement
pact.AdminAssets through it, and a plugin without AdminFS gets a note
- blog example moves its YAML to models/post; docs and help text follow
171 lines
4.4 KiB
Cheetah
171 lines
4.4 KiB
Cheetah
{{define "model.go"}}//summer:make model
|
|
|
|
package models
|
|
|
|
import "time"
|
|
|
|
// {{.Ident}} is a generated GORM model for {{.PluginID}}.
|
|
type {{.Ident}} struct {
|
|
ID uint `gorm:"primaryKey"`
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
}
|
|
|
|
func ({{.Ident}}) TableName() string { return {{printf "%q" .Table}} }
|
|
{{end}}
|
|
|
|
{{define "migration.go"}}//summer:make migration
|
|
|
|
package updates
|
|
|
|
import (
|
|
"github.com/go-gormigrate/gormigrate/v2"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// {{.Func}} returns the {{.MigrationID}} gormigrate entry.
|
|
func {{.Func}}() *gormigrate.Migration {
|
|
return &gormigrate.Migration{
|
|
ID: {{printf "%q" .MigrationID}},
|
|
Migrate: func(tx *gorm.DB) error {
|
|
return tx.Exec({{printf "%q" .UpSQL}}).Error
|
|
},
|
|
Rollback: func(tx *gorm.DB) error {
|
|
return tx.Exec({{printf "%q" .DownSQL}}).Error
|
|
},
|
|
}
|
|
}
|
|
{{end}}
|
|
|
|
{{define "command.go"}}//summer:make command
|
|
|
|
package console
|
|
|
|
import (
|
|
"context"
|
|
|
|
"git.golem15.com/golem15/summercms/modules/backpack"
|
|
"git.golem15.com/golem15/summercms/modules/bonfire"
|
|
)
|
|
|
|
// {{.Func}} returns the {{.CommandName}} console command. app is the
|
|
// application the plugin kept from Boot: it gives the command the config and
|
|
// the services plugins publish (app.Lookup).
|
|
func {{.Func}}(app *backpack.App) bonfire.Command {
|
|
return bonfire.Command{
|
|
Name: {{printf "%q" .CommandName}},
|
|
Description: {{printf "%q" .Description}},
|
|
Run: func(ctx context.Context, in bonfire.Input, out bonfire.Output) error {
|
|
out.Printf({{printf "%q" .CommandName}} + "\n")
|
|
return nil
|
|
},
|
|
}
|
|
}
|
|
{{end}}
|
|
|
|
{{define "job.go"}}//summer:make job
|
|
|
|
package jobs
|
|
|
|
import (
|
|
"context"
|
|
|
|
"git.golem15.com/golem15/summercms/modules/conga"
|
|
"git.golem15.com/golem15/summercms/modules/pact"
|
|
)
|
|
|
|
// {{.Ident}}Args is the typed payload for {{.Kind}}.
|
|
type {{.Ident}}Args struct{}
|
|
|
|
func ({{.Ident}}Args) Kind() string { return {{printf "%q" .Kind}} }
|
|
|
|
// {{.Func}} returns the {{.Kind}} job.
|
|
func {{.Func}}() pact.Job {
|
|
return conga.Job(func(ctx context.Context, args {{.Ident}}Args) error {
|
|
return nil
|
|
})
|
|
}
|
|
{{end}}
|
|
|
|
{{define "admin_controller.go"}}//summer:make admin-controller
|
|
|
|
package controllers
|
|
{{if .ModelImport}}
|
|
import (
|
|
{{printf "%q" .ModelImport}}
|
|
"git.golem15.com/golem15/summercms/modules/pact"
|
|
)
|
|
{{else}}
|
|
import "git.golem15.com/golem15/summercms/modules/pact"
|
|
{{end}}
|
|
var (
|
|
_ pact.AdminController = {{.Worker}}{}
|
|
_ pact.AdminRecordSource = {{.Worker}}{}
|
|
_ pact.AdminPermissioned = {{.Worker}}{}
|
|
)
|
|
|
|
type {{.Worker}} struct{}
|
|
|
|
func ({{.Worker}}) ID() string { return {{printf "%q" .Kind}} }
|
|
func ({{.Worker}}) ModelName() string { return {{printf "%q" .ModelIdent}} }
|
|
func ({{.Worker}}) ConfigDir() string { return {{printf "%q" .ConfigDir}} }
|
|
|
|
// NewRecord returns the model the generic admin handlers query and fill.
|
|
{{- if .ModelImport}}
|
|
func ({{.Worker}}) NewRecord() any { return &models.{{.ModelIdent}}{} }
|
|
{{- else}}
|
|
// TODO: run summer make:model for {{.ModelIdent}}, then return &models.{{.ModelIdent}}{}.
|
|
// Until then the list and every write answer 500, so nothing is exposed.
|
|
func ({{.Worker}}) NewRecord() any { return nil }
|
|
{{- end}}
|
|
|
|
// RequiredPermissions is checked before any schema or record is served. Keep
|
|
// it: a controller without one is open to every administrator. Declare the
|
|
// code in the plugin's Permissions() (pact.HasPermissions), or the admin API
|
|
// refuses to start with an unknown-permission error that names this controller.
|
|
func ({{.Worker}}) RequiredPermissions() []string {
|
|
return []string{ {{printf "%q" .Permission}} }
|
|
}
|
|
|
|
// {{.Func}} returns the {{.Kind}} admin controller.
|
|
func {{.Func}}() pact.AdminController { return {{.Worker}}{} }
|
|
{{end}}
|
|
|
|
{{define "config_form.yaml"}}name: {{.ModelIdent}}
|
|
form: ~/plugins/{{.PluginPath}}/models/{{.ModelSnake}}/fields.yaml
|
|
modelClass: {{.ModelIdent}}
|
|
defaultRedirect: {{.PluginPath}}/{{.Snake}}
|
|
|
|
create:
|
|
redirect: {{.PluginPath}}/{{.Snake}}/update/:id
|
|
redirectClose: {{.PluginPath}}/{{.Snake}}
|
|
|
|
update:
|
|
redirect: {{.PluginPath}}/{{.Snake}}
|
|
redirectClose: {{.PluginPath}}/{{.Snake}}
|
|
{{end}}
|
|
|
|
{{define "config_list.yaml"}}list: ~/plugins/{{.PluginPath}}/models/{{.ModelSnake}}/columns.yaml
|
|
modelClass: {{.ModelIdent}}
|
|
title: {{.Ident}}
|
|
recordsPerPage: 20
|
|
showCheckboxes: true
|
|
toolbar:
|
|
buttons: [create, delete]
|
|
search:
|
|
prompt: backend::lang.list.search_prompt
|
|
{{end}}
|
|
|
|
{{define "fields.yaml"}}fields:
|
|
id:
|
|
label: ID
|
|
span: auto
|
|
type: number
|
|
{{end}}
|
|
|
|
{{define "columns.yaml"}}columns:
|
|
id:
|
|
label: ID
|
|
searchable: true
|
|
{{end}}
|