mirror of
https://github.com/go-admin-team/go-admin.git
synced 2026-09-20 17:57:54 +00:00
sys_app is one row per installed application. It is physically deleted on uninstall rather than following the millisecond soft-delete marker the other sys_ tables use: an installed-app registry has no "deleted by accident, needs recovering" case, and a physical delete is what lets the same code be installed again afterwards. status is installing/installed/failed rather than a boolean, because an install spanning several migration files is not atomic on MySQL - DDL commits implicitly, so a run can stop in the middle. failed_version and last_error are diagnostic snapshots for a person to read; nothing may decide anything from them, and the field comments say so. Where to resume is answered by sys_migration, which cannot drift from what was actually applied. sys_app_casbin_grant records which casbin_rule rows an install created, keyed by casbin_rule's own natural key. That table is not extended instead: gorm-adapter's SavePolicy truncates and reloads it from an in-memory model, which would drop any column added here without a word. Built against SQLite, MySQL 8.0 and PostgreSQL 15.
44 lines
2.7 KiB
Go
44 lines
2.7 KiB
Go
package models
|
|
|
|
import "time"
|
|
|
|
// SysAppCasbinGrant is a ledger of casbin_rule rows an app install created,
|
|
// keyed by the exact natural key casbin_rule itself is unique on. It exists
|
|
// because casbin_rule is not a table this project owns (see design doc
|
|
// docs-prd/008-应用清单与安装器/数据库变更.md §2.2): we cannot add an
|
|
// app_code column to it without that column being silently zeroed the first
|
|
// time anything calls the gorm-adapter's SavePolicy/SavePolicyCtx. Recording
|
|
// the natural key here, instead of a foreign key into casbin_rule, is also
|
|
// what survives SysRole.Update's RemoveFilteredPolicy+re-add cycle for a
|
|
// role's policies (app/admin/service/sys_role.go): that cycle replaces the
|
|
// underlying row (a new auto-increment ID) but reproduces the same
|
|
// (ptype,v0,v1,v2) tuple from the same sys_menu/sys_api data, so a
|
|
// natural-key match here still finds it. What it does not survive is the
|
|
// role being renamed, or the tuple being rebuilt from a completely different
|
|
// source (a future SavePolicy call from outside this seeder) - in both cases
|
|
// the match legitimately fails, and business rule 3 says the uninstaller
|
|
// should report and skip, not delete something else that happens to look
|
|
// the same.
|
|
type SysAppCasbinGrant struct {
|
|
Id int `json:"id" gorm:"primaryKey;autoIncrement"`
|
|
|
|
AppCode string `json:"appCode" gorm:"type:varchar(64);not null;index:idx_sys_app_casbin_grant_app_code;comment:app code that created this grant"`
|
|
|
|
// Column widths mirror gorm-adapter's own CasbinRule struct exactly, so
|
|
// a value that fits into casbin_rule always fits here, and the unique
|
|
// index below matches the one createTable() puts on casbin_rule itself.
|
|
Ptype string `json:"ptype" gorm:"size:100;not null;uniqueIndex:uk_sys_app_casbin_grant_rule;comment:casbin ptype, 'p' today"`
|
|
V0 string `json:"v0" gorm:"size:100;not null;default:'';uniqueIndex:uk_sys_app_casbin_grant_rule;comment:role_key at grant time"`
|
|
V1 string `json:"v1" gorm:"size:100;not null;default:'';uniqueIndex:uk_sys_app_casbin_grant_rule;comment:api path"`
|
|
V2 string `json:"v2" gorm:"size:100;not null;default:'';uniqueIndex:uk_sys_app_casbin_grant_rule;comment:http method"`
|
|
V3 string `json:"v3" gorm:"size:100;not null;default:'';uniqueIndex:uk_sys_app_casbin_grant_rule;comment:unused today"`
|
|
V4 string `json:"v4" gorm:"size:100;not null;default:'';uniqueIndex:uk_sys_app_casbin_grant_rule;comment:unused today"`
|
|
V5 string `json:"v5" gorm:"size:100;not null;default:'';uniqueIndex:uk_sys_app_casbin_grant_rule;comment:unused today"`
|
|
|
|
CreatedAt time.Time `json:"createdAt" gorm:"comment:when this grant was recorded"`
|
|
}
|
|
|
|
func (*SysAppCasbinGrant) TableName() string {
|
|
return "sys_app_casbin_grant"
|
|
}
|