feat: 完整游戏运维功能

This commit is contained in:
npc0-hue
2026-07-18 09:04:01 +08:00
parent f3b14b7945
commit 48b8ad8d6c
187 changed files with 16607 additions and 1140 deletions
+165
View File
@@ -0,0 +1,165 @@
package dto
import (
"time"
"browser.local/platform/domain"
)
type MetricSampleBody struct {
ID string `json:"id,omitempty"`
ServerInstanceID string `json:"serverInstanceId"`
Online bool `json:"online"`
PlayerCount *int `json:"playerCount,omitempty"`
MaxPlayers *int `json:"maxPlayers,omitempty"`
TPS *float64 `json:"tps,omitempty"`
LatencyMS *float64 `json:"latencyMs,omitempty"`
CPUPercent *float64 `json:"cpuPercent,omitempty"`
MemoryPercent *float64 `json:"memoryPercent,omitempty"`
DiskPercent *float64 `json:"diskPercent,omitempty"`
Source string `json:"source"`
CollectedAt time.Time `json:"collectedAt"`
}
type MetricBatchIngestRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
Samples []MetricSampleBody `json:"samples"`
}
type MetricBatchIngestResponse struct {
Accepted bool `json:"accepted"`
AcceptedCount int `json:"acceptedCount"`
LatestAt time.Time `json:"latestAt"`
ServerTime time.Time `json:"serverTime"`
}
type MetricSampleListResponse struct {
Items []MetricSampleBody `json:"items"`
Count int `json:"count"`
}
type BackupCreateRequest struct {
ID string `json:"id,omitempty"`
ServerInstanceID string `json:"serverInstanceId"`
ArtifactID string `json:"artifactId"`
Checksum string `json:"checksum,omitempty"`
SizeBytes int64 `json:"sizeBytes,omitempty"`
State domain.BackupState `json:"state,omitempty"`
RetentionUntil time.Time `json:"retentionUntil,omitempty"`
}
type BackupResponse struct {
ID string `json:"id"`
ServerInstanceID string `json:"serverInstanceId"`
ArtifactID string `json:"artifactId"`
Checksum string `json:"checksum"`
SizeBytes int64 `json:"sizeBytes"`
State domain.BackupState `json:"state"`
RecoveryStatus string `json:"recoveryStatus,omitempty"`
RetentionUntil time.Time `json:"retentionUntil,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type BackupListResponse struct {
Items []BackupResponse `json:"items"`
Count int `json:"count"`
}
type RemoteAdapterDeclarationResponse struct {
Key string `json:"key"`
Kind domain.RemoteAdapterKind `json:"kind"`
TargetKeys []string `json:"targetKeys"`
Capabilities []string `json:"capabilities"`
TimeoutSeconds int `json:"timeoutSeconds"`
MaxAttempts int `json:"maxAttempts"`
}
type RemoteAdapterDeclarationListResponse struct {
Items []RemoteAdapterDeclarationResponse `json:"items"`
Count int `json:"count"`
}
type RemoteAdapterRequestBody struct {
DeclarationKey string `json:"declarationKey"`
TargetKey string `json:"targetKey"`
Capability string `json:"capability"`
TimeoutSeconds int `json:"timeoutSeconds,omitempty"`
MaxAttempts int `json:"maxAttempts,omitempty"`
IdempotencyKey string `json:"idempotencyKey"`
}
type RemoteAdapterResponse struct {
RequestID string `json:"requestId"`
ServerInstanceID string `json:"serverInstanceId"`
DeclarationKey string `json:"declarationKey"`
TargetKey string `json:"targetKey"`
Kind domain.RemoteAdapterKind `json:"kind"`
Status string `json:"status"`
Retryable bool `json:"retryable"`
Message string `json:"message"`
ResultRef string `json:"resultRef,omitempty"`
AuditEventID string `json:"auditEventId,omitempty"`
CompletedAt time.Time `json:"completedAt,omitempty"`
}
func (request MetricBatchIngestRequest) ToDomain() domain.MetricBatchIngest {
samples := make([]domain.MetricSample, len(request.Samples))
for i, sample := range request.Samples {
samples[i] = metricSampleToDomain(sample)
}
return domain.MetricBatchIngest{RunEndpointID: request.RunEndpointID, SessionToken: request.SessionToken, Samples: samples}
}
func MetricBatchIngestFromDomain(result domain.MetricBatchIngestResult) MetricBatchIngestResponse {
return MetricBatchIngestResponse{Accepted: result.Accepted, AcceptedCount: result.AcceptedCount, LatestAt: result.LatestAt, ServerTime: result.ServerTime}
}
func MetricSampleListFromDomain(samples []domain.MetricSample) MetricSampleListResponse {
items := make([]MetricSampleBody, len(samples))
for i, sample := range samples {
items[i] = metricSampleFromDomain(sample)
}
return MetricSampleListResponse{Items: items, Count: len(items)}
}
func (request BackupCreateRequest) ToDomain() domain.BackupRecord {
return domain.BackupRecord{ID: request.ID, ServerInstanceID: request.ServerInstanceID, ArtifactID: request.ArtifactID, Checksum: request.Checksum, SizeBytes: request.SizeBytes, State: request.State, RetentionUntil: request.RetentionUntil}
}
func BackupFromDomain(record domain.BackupRecord) BackupResponse {
return BackupResponse{ID: record.ID, ServerInstanceID: record.ServerInstanceID, ArtifactID: record.ArtifactID, Checksum: record.Checksum, SizeBytes: record.SizeBytes, State: record.State, RecoveryStatus: record.RecoveryStatus, RetentionUntil: record.RetentionUntil, CreatedAt: record.CreatedAt, UpdatedAt: record.UpdatedAt}
}
func BackupListFromDomain(records []domain.BackupRecord) BackupListResponse {
items := make([]BackupResponse, len(records))
for i, record := range records {
items[i] = BackupFromDomain(record)
}
return BackupListResponse{Items: items, Count: len(items)}
}
func RemoteAdapterDeclarationsFromDomain(declarations []domain.RemoteAdapterDeclaration) RemoteAdapterDeclarationListResponse {
items := make([]RemoteAdapterDeclarationResponse, len(declarations))
for i, declaration := range declarations {
items[i] = RemoteAdapterDeclarationResponse{Key: declaration.Key, Kind: declaration.Kind, TargetKeys: domain.CopyStringSlice(declaration.TargetKeys), Capabilities: domain.CopyStringSlice(declaration.Capabilities), TimeoutSeconds: declaration.TimeoutSeconds, MaxAttempts: declaration.MaxAttempts}
}
return RemoteAdapterDeclarationListResponse{Items: items, Count: len(items)}
}
func (request RemoteAdapterRequestBody) ToDomain(serverInstanceID string) domain.RemoteAdapterRequest {
return domain.RemoteAdapterRequest{ServerInstanceID: serverInstanceID, DeclarationKey: request.DeclarationKey, TargetKey: request.TargetKey, Capability: request.Capability, TimeoutSeconds: request.TimeoutSeconds, MaxAttempts: request.MaxAttempts, IdempotencyKey: request.IdempotencyKey}
}
func RemoteAdapterFromDomain(result domain.RemoteAdapterResult) RemoteAdapterResponse {
return RemoteAdapterResponse{RequestID: result.RequestID, ServerInstanceID: result.ServerInstanceID, DeclarationKey: result.DeclarationKey, TargetKey: result.TargetKey, Kind: result.Kind, Status: result.Status, Retryable: result.Retryable, Message: result.Message, ResultRef: result.ResultRef, AuditEventID: result.AuditEventID, CompletedAt: result.CompletedAt}
}
func metricSampleToDomain(sample MetricSampleBody) domain.MetricSample {
return domain.MetricSample{ID: sample.ID, ServerInstanceID: sample.ServerInstanceID, Online: sample.Online, PlayerCount: sample.PlayerCount, MaxPlayers: sample.MaxPlayers, TPS: sample.TPS, LatencyMS: sample.LatencyMS, CPUPercent: sample.CPUPercent, MemoryPercent: sample.MemoryPercent, DiskPercent: sample.DiskPercent, Source: sample.Source, CollectedAt: sample.CollectedAt}
}
func metricSampleFromDomain(sample domain.MetricSample) MetricSampleBody {
return MetricSampleBody{ID: sample.ID, ServerInstanceID: sample.ServerInstanceID, Online: sample.Online, PlayerCount: sample.PlayerCount, MaxPlayers: sample.MaxPlayers, TPS: sample.TPS, LatencyMS: sample.LatencyMS, CPUPercent: sample.CPUPercent, MemoryPercent: sample.MemoryPercent, DiskPercent: sample.DiskPercent, Source: sample.Source, CollectedAt: sample.CollectedAt}
}