feat: 完整游戏运维功能
This commit is contained in:
+124
-18
@@ -13,15 +13,29 @@ import (
|
||||
)
|
||||
|
||||
type StoreSnapshot struct {
|
||||
Users []domain.User `json:"users"`
|
||||
AIProviders []domain.AIProvider `json:"aiProviders"`
|
||||
GamePlugins []domain.GamePlugin `json:"gamePlugins"`
|
||||
ServerInstances []domain.ServerInstance `json:"serverInstances"`
|
||||
RunEndpoints []domain.RunEndpoint `json:"runEndpoints"`
|
||||
Jobs []domain.Job `json:"jobs"`
|
||||
Artifacts []domain.Artifact `json:"artifacts"`
|
||||
LogStreams []domain.LogStream `json:"logStreams"`
|
||||
AuditEvents []domain.AuditEvent `json:"auditEvents"`
|
||||
Users []domain.User `json:"users"`
|
||||
AuthSessions []domain.AuthSessionRecord `json:"authSessions"`
|
||||
RunControlSessions []domain.RunControlSession `json:"runControlSessions"`
|
||||
AIProviders []domain.AIProvider `json:"aiProviders"`
|
||||
GamePlugins []domain.GamePlugin `json:"gamePlugins"`
|
||||
ServerInstances []domain.ServerInstance `json:"serverInstances"`
|
||||
RunEndpoints []domain.RunEndpoint `json:"runEndpoints"`
|
||||
Jobs []domain.Job `json:"jobs"`
|
||||
Artifacts []domain.Artifact `json:"artifacts"`
|
||||
RuntimeBindings []domain.RuntimeBinding `json:"runtimeBindings"`
|
||||
EncryptedComponentKeys []domain.EncryptedComponentKey `json:"encryptedComponentKeys"`
|
||||
RunDistributions []domain.RunDistribution `json:"runDistributions"`
|
||||
ClientManagerDistributions []domain.ClientManagerDistribution `json:"clientManagerDistributions"`
|
||||
ClientManagerInstallations []domain.ClientManagerInstallation `json:"clientManagerInstallations"`
|
||||
ClientManagerSessions []domain.ClientManagerSession `json:"clientManagerSessions"`
|
||||
ClientManagerNonces []domain.ClientManagerRegistrationNonce `json:"clientManagerNonces"`
|
||||
DependencyStatuses []domain.DependencyStatus `json:"dependencyStatuses"`
|
||||
ClientManagerBuildJobs []domain.ClientManagerBuildJob `json:"clientManagerBuildJobs"`
|
||||
RunUpdateJobs []domain.RunUpdateJob `json:"runUpdateJobs"`
|
||||
LogStreams []domain.LogStream `json:"logStreams"`
|
||||
AuditEvents []domain.AuditEvent `json:"auditEvents"`
|
||||
MetricSamples []domain.MetricSample `json:"metricSamples"`
|
||||
Backups []domain.BackupRecord `json:"backups"`
|
||||
}
|
||||
|
||||
type FileStore struct {
|
||||
@@ -53,6 +67,14 @@ func (store *FileStore) Users() UserRepository {
|
||||
return &persistentRepository[domain.User, domain.UserFilter]{repository: store.MemoryStore.users, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) AuthSessions() AuthSessionRepository {
|
||||
return &persistentRepository[domain.AuthSessionRecord, domain.AuthSessionFilter]{repository: store.MemoryStore.authSessions, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) RunControlSessions() RunControlSessionRepository {
|
||||
return &persistentRepository[domain.RunControlSession, struct{}]{repository: store.MemoryStore.runSessions, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) AIProviders() AIProviderRepository {
|
||||
return &persistentRepository[domain.AIProvider, domain.AIProviderFilter]{repository: store.MemoryStore.aiProviders, persist: store.persist}
|
||||
}
|
||||
@@ -80,6 +102,46 @@ func (store *FileStore) Artifacts() ArtifactRepository {
|
||||
return &persistentRepository[domain.Artifact, domain.ArtifactFilter]{repository: store.MemoryStore.artifacts, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) RuntimeBindings() RuntimeBindingRepository {
|
||||
return &persistentRepository[domain.RuntimeBinding, domain.RuntimeBindingFilter]{repository: store.MemoryStore.runtimeBindings, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) EncryptedComponentKeys() EncryptedComponentKeyRepository {
|
||||
return &persistentRepository[domain.EncryptedComponentKey, domain.EncryptedComponentKeyFilter]{repository: store.MemoryStore.componentKeys, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) RunDistributions() RunDistributionRepository {
|
||||
return &persistentRepository[domain.RunDistribution, domain.RunDistributionFilter]{repository: store.MemoryStore.runDists, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) ClientManagerDistributions() ClientManagerDistributionRepository {
|
||||
return &persistentRepository[domain.ClientManagerDistribution, domain.ClientManagerDistributionFilter]{repository: store.MemoryStore.clientDists, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) ClientManagerInstallations() ClientManagerInstallationRepository {
|
||||
return &persistentRepository[domain.ClientManagerInstallation, domain.ClientManagerInstallationFilter]{repository: store.MemoryStore.clientInstalls, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) ClientManagerSessions() ClientManagerSessionRepository {
|
||||
return &persistentRepository[domain.ClientManagerSession, domain.ClientManagerSessionFilter]{repository: store.MemoryStore.clientSessions, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) ClientManagerNonces() ClientManagerNonceRepository {
|
||||
return &persistentRepository[domain.ClientManagerRegistrationNonce, domain.ClientManagerNonceFilter]{repository: store.MemoryStore.clientNonces, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) DependencyStatuses() DependencyStatusRepository {
|
||||
return &persistentRepository[domain.DependencyStatus, domain.DependencyStatusFilter]{repository: store.MemoryStore.dependencies, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) ClientManagerBuildJobs() ClientManagerBuildJobRepository {
|
||||
return &persistentRepository[domain.ClientManagerBuildJob, domain.ClientManagerBuildJobFilter]{repository: store.MemoryStore.buildJobs, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) RunUpdateJobs() RunUpdateJobRepository {
|
||||
return &persistentRepository[domain.RunUpdateJob, domain.RunUpdateJobFilter]{repository: store.MemoryStore.updateJobs, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) LogStreams() LogStreamRepository {
|
||||
return &persistentRepository[domain.LogStream, domain.LogStreamFilter]{repository: store.MemoryStore.logStreams, persist: store.persist}
|
||||
}
|
||||
@@ -88,6 +150,14 @@ func (store *FileStore) AuditEvents() AuditEventRepository {
|
||||
return &persistentRepository[domain.AuditEvent, domain.AuditEventFilter]{repository: store.MemoryStore.auditEvents, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) MetricSamples() MetricSampleRepository {
|
||||
return &persistentRepository[domain.MetricSample, domain.MetricSampleFilter]{repository: store.MemoryStore.metricSamples, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) Backups() BackupRepository {
|
||||
return &persistentRepository[domain.BackupRecord, domain.BackupFilter]{repository: store.MemoryStore.backups, persist: store.persist}
|
||||
}
|
||||
|
||||
func (store *FileStore) load() error {
|
||||
data, err := os.ReadFile(store.path)
|
||||
if err != nil {
|
||||
@@ -131,28 +201,56 @@ func (store *FileStore) persist() error {
|
||||
|
||||
func (store *FileStore) snapshot() StoreSnapshot {
|
||||
return StoreSnapshot{
|
||||
Users: snapshotRepository(store.MemoryStore.users),
|
||||
AIProviders: snapshotRepository(store.MemoryStore.aiProviders),
|
||||
GamePlugins: snapshotRepository(store.MemoryStore.gamePlugins),
|
||||
ServerInstances: snapshotRepository(store.MemoryStore.serverInstances),
|
||||
RunEndpoints: snapshotRepository(store.MemoryStore.runEndpoints),
|
||||
Jobs: snapshotRepository(store.MemoryStore.jobs.memoryRepository),
|
||||
Artifacts: snapshotRepository(store.MemoryStore.artifacts),
|
||||
LogStreams: snapshotRepository(store.MemoryStore.logStreams),
|
||||
AuditEvents: snapshotRepository(store.MemoryStore.auditEvents),
|
||||
Users: snapshotRepository(store.MemoryStore.users),
|
||||
AuthSessions: snapshotRepository(store.MemoryStore.authSessions),
|
||||
RunControlSessions: snapshotRepository(store.MemoryStore.runSessions),
|
||||
AIProviders: snapshotRepository(store.MemoryStore.aiProviders),
|
||||
GamePlugins: snapshotRepository(store.MemoryStore.gamePlugins),
|
||||
ServerInstances: snapshotRepository(store.MemoryStore.serverInstances),
|
||||
RunEndpoints: snapshotRepository(store.MemoryStore.runEndpoints),
|
||||
Jobs: snapshotRepository(store.MemoryStore.jobs.memoryRepository),
|
||||
Artifacts: snapshotRepository(store.MemoryStore.artifacts),
|
||||
RuntimeBindings: snapshotRepository(store.MemoryStore.runtimeBindings),
|
||||
EncryptedComponentKeys: snapshotRepository(store.MemoryStore.componentKeys),
|
||||
RunDistributions: snapshotRepository(store.MemoryStore.runDists),
|
||||
ClientManagerDistributions: snapshotRepository(store.MemoryStore.clientDists),
|
||||
ClientManagerInstallations: snapshotRepository(store.MemoryStore.clientInstalls),
|
||||
ClientManagerSessions: snapshotRepository(store.MemoryStore.clientSessions),
|
||||
ClientManagerNonces: snapshotRepository(store.MemoryStore.clientNonces),
|
||||
DependencyStatuses: snapshotRepository(store.MemoryStore.dependencies),
|
||||
ClientManagerBuildJobs: snapshotRepository(store.MemoryStore.buildJobs),
|
||||
RunUpdateJobs: snapshotRepository(store.MemoryStore.updateJobs),
|
||||
LogStreams: snapshotRepository(store.MemoryStore.logStreams),
|
||||
AuditEvents: snapshotRepository(store.MemoryStore.auditEvents),
|
||||
MetricSamples: snapshotRepository(store.MemoryStore.metricSamples),
|
||||
Backups: snapshotRepository(store.MemoryStore.backups),
|
||||
}
|
||||
}
|
||||
|
||||
func (store *FileStore) loadSnapshot(snapshot StoreSnapshot) {
|
||||
loadRepository(store.MemoryStore.users, snapshot.Users)
|
||||
loadRepository(store.MemoryStore.authSessions, snapshot.AuthSessions)
|
||||
loadRepository(store.MemoryStore.runSessions, snapshot.RunControlSessions)
|
||||
loadRepository(store.MemoryStore.aiProviders, snapshot.AIProviders)
|
||||
loadRepository(store.MemoryStore.gamePlugins, snapshot.GamePlugins)
|
||||
loadRepository(store.MemoryStore.serverInstances, snapshot.ServerInstances)
|
||||
loadRepository(store.MemoryStore.runEndpoints, snapshot.RunEndpoints)
|
||||
loadRepository(store.MemoryStore.jobs.memoryRepository, snapshot.Jobs)
|
||||
loadRepository(store.MemoryStore.artifacts, snapshot.Artifacts)
|
||||
loadRepository(store.MemoryStore.runtimeBindings, snapshot.RuntimeBindings)
|
||||
loadRepository(store.MemoryStore.componentKeys, snapshot.EncryptedComponentKeys)
|
||||
loadRepository(store.MemoryStore.runDists, snapshot.RunDistributions)
|
||||
loadRepository(store.MemoryStore.clientDists, snapshot.ClientManagerDistributions)
|
||||
loadRepository(store.MemoryStore.clientInstalls, snapshot.ClientManagerInstallations)
|
||||
loadRepository(store.MemoryStore.clientSessions, snapshot.ClientManagerSessions)
|
||||
loadRepository(store.MemoryStore.clientNonces, snapshot.ClientManagerNonces)
|
||||
loadRepository(store.MemoryStore.dependencies, snapshot.DependencyStatuses)
|
||||
loadRepository(store.MemoryStore.buildJobs, snapshot.ClientManagerBuildJobs)
|
||||
loadRepository(store.MemoryStore.updateJobs, snapshot.RunUpdateJobs)
|
||||
loadRepository(store.MemoryStore.logStreams, snapshot.LogStreams)
|
||||
loadRepository(store.MemoryStore.auditEvents, snapshot.AuditEvents)
|
||||
loadRepository(store.MemoryStore.metricSamples, snapshot.MetricSamples)
|
||||
loadRepository(store.MemoryStore.backups, snapshot.Backups)
|
||||
}
|
||||
|
||||
type mutableRepository[T any, F any] interface {
|
||||
@@ -160,6 +258,7 @@ type mutableRepository[T any, F any] interface {
|
||||
Get(string) (T, error)
|
||||
List(F) ([]T, error)
|
||||
Update(T) error
|
||||
Delete(string) error
|
||||
}
|
||||
|
||||
type persistentRepository[T any, F any] struct {
|
||||
@@ -189,6 +288,13 @@ func (repository *persistentRepository[T, F]) Update(value T) error {
|
||||
return repository.persist()
|
||||
}
|
||||
|
||||
func (repository *persistentRepository[T, F]) Delete(id string) error {
|
||||
if err := repository.repository.Delete(id); err != nil {
|
||||
return err
|
||||
}
|
||||
return repository.persist()
|
||||
}
|
||||
|
||||
type persistentJobRepository struct {
|
||||
*persistentRepository[domain.Job, domain.JobFilter]
|
||||
repository JobRepository
|
||||
|
||||
Reference in New Issue
Block a user