|
|
||
|---|---|---|
| .. | ||
| gormkit | ||
| migration | ||
| pagination | ||
| payment | ||
| system | ||
| README.md | ||
| config_helpers.go | ||
| config_store.go | ||
| config_watch.go | ||
| data.go | ||
| data_scope.go | ||
| data_scope_audit.go | ||
| data_scope_audit_test.go | ||
| data_scope_record.go | ||
| data_scope_test.go | ||
| database.go | ||
| gorm_logger_test.go | ||
| initialization_backend.go | ||
| initialization_backend_test.go | ||
| integration_config.go | ||
| integration_config_test.go | ||
| migrations.go | ||
| migrations_test.go | ||
| mongo.go | ||
| runtime_clients.go | ||
README.md
Data Layer
internal/data is the persistence composition root. It owns the shared
database/runtime container (Data), database clients, configuration storage,
and the Wire ProviderSet. Business repositories live in submodules so a new
feature can be found by its domain instead of by scanning one large package.
Modules
internal/data/systemcontains the built-in administration domain: users, authorities, APIs, permissions, menus, organization, dictionaries, parameters, tokens, security, audit/logging, media, announcements, tasks, versions, exports, bootstrap seeding, and system migrations.internal/data/paymentcontains payment configuration and payment-order persistence. Provider SDK implementations are separate ininternal/integration/payment.internal/data/migrationcontains the version-table runner used by the root migration coordinator. It stays under data because it executes and records database schema steps.internal/adminsurfacecontains the small menu/API metadata contract used when a business module contributes pages to the administration UI. It lives outsidedatabecause the contract itself is not persistence code.
The root package intentionally keeps only cross-cutting infrastructure:
database lifecycle/reloads, runtime configuration persistence, data-scope
auditing, integration configuration storage, and migration orchestration.
Repositories depend on narrow module seams (system.Provider and
payment.Provider) rather than importing the root implementation details.
First-install and configuration-management orchestration lives in
internal/initialize. It implements biz.InitializationRepo through a narrow
backend interface that *data.Data satisfies. This keeps administrator/menu/API
seeding out of the database lifecycle package while retaining one migration
entry point.
Non-database adapters remain under internal/integration (storage, email,
payment SDKs, and cache). Their constructors are provided by
internal/integration.ProviderSet, separate from the data provider set.
GORM and pagination helpers live beside the data layer; stateless payment
parsing lives in internal/utils/paymentutil; admin JWT handling lives in
internal/security/adminauth.
Migration and bootstrap
There is one migration execution entry point: migrateAll in the root data
package. The root owns the shared integration-configuration table and appends
the steps returned by system.Migrations() and payment.Migrations().
Migrations create schemas and module-required fixed records only. Initial
business data is separate: initialize.Repo invokes system.SeedSystem only
from the explicit first-install flow to create the administrator, roles,
menus, APIs, departments, policies, and module-provided administration
surfaces.