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"` InputRef string `json:"inputRef,omitempty"` Inputs map[string]string `json:"inputs,omitempty"` } 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"` CompletedAt time.Time `json:"completedAt,omitempty"` } type SourceRCONCommandRequestBody struct { Kind domain.SourceRCONCommandKind `json:"kind"` ChatType int `json:"chatType,omitempty"` Message string `json:"message,omitempty"` TargetSteamID string `json:"targetSteamId,omitempty"` Command string `json:"command,omitempty"` IdempotencyKey string `json:"idempotencyKey"` } type SourceRCONCommandResponse struct { JobID string `json:"jobId"` ServerInstanceID string `json:"serverInstanceId"` Status string `json:"status"` Message string `json:"message"` } 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, InputRef: request.InputRef, Inputs: domain.CopyStringMap(request.Inputs)} } 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, CompletedAt: result.CompletedAt} } func (request SourceRCONCommandRequestBody) ToDomain(serverInstanceID string) domain.SourceRCONCommandRequest { return domain.SourceRCONCommandRequest{ServerInstanceID: serverInstanceID, Kind: request.Kind, ChatType: request.ChatType, Message: request.Message, TargetSteamID: request.TargetSteamID, Command: request.Command, IdempotencyKey: request.IdempotencyKey} } func SourceRCONCommandFromDomain(dispatch domain.SourceRCONCommandDispatch) SourceRCONCommandResponse { return SourceRCONCommandResponse{JobID: dispatch.JobID, ServerInstanceID: dispatch.ServerInstanceID, Status: dispatch.Status, Message: dispatch.Message} } 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} }