Move SCUM lifecycle ownership to plugin
This commit is contained in:
@@ -224,6 +224,7 @@ type DistributionBuildInputResponse struct {
|
||||
SecretRef string `json:"secretRef"`
|
||||
KeyGeneration int `json:"keyGeneration"`
|
||||
AuthKey string `json:"authKey"`
|
||||
WorkspaceSeed string `json:"workspaceSeed,omitempty"`
|
||||
}
|
||||
|
||||
type DependencyExecutionInputRequest struct {
|
||||
@@ -568,6 +569,7 @@ func DistributionBuildInputFromDomain(input domain.DistributionBuildInput) Distr
|
||||
SecretRef: input.SecretRef,
|
||||
KeyGeneration: input.KeyGeneration,
|
||||
AuthKey: input.AuthKey,
|
||||
WorkspaceSeed: input.WorkspaceSeed,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -371,6 +371,7 @@ type GamePluginManifestBody struct {
|
||||
Capabilities []string `json:"capabilities"`
|
||||
Permissions []string `json:"permissions"`
|
||||
Actions PluginLifecycleActionsBody `json:"actions"`
|
||||
AssetFiles []PluginAssetFileBody `json:"assetFiles,omitempty"`
|
||||
Pages []GamePluginPageBody `json:"pages,omitempty"`
|
||||
FileWorkspace PluginFileWorkspaceBody `json:"fileWorkspace,omitempty"`
|
||||
AI GamePluginManifestAIBody `json:"ai,omitempty"`
|
||||
@@ -384,6 +385,13 @@ type GamePluginManifestBody struct {
|
||||
type GamePluginManifestRegistrationRequest struct {
|
||||
ManifestRef string `json:"manifestRef"`
|
||||
Manifest GamePluginManifestBody `json:"manifest"`
|
||||
AssetFiles []PluginAssetFileBody `json:"assetFiles,omitempty"`
|
||||
}
|
||||
|
||||
type PluginAssetFileBody struct {
|
||||
Path string `json:"path"`
|
||||
Content string `json:"content,omitempty"`
|
||||
Mode int `json:"mode,omitempty"`
|
||||
}
|
||||
|
||||
type GamePluginCreateRequest struct {
|
||||
@@ -996,6 +1004,7 @@ func (request AIProviderUpdateRequest) ToDomain(id string, status domain.AIProvi
|
||||
func (request GamePluginManifestRegistrationRequest) ToDomain() domain.GamePluginManifestRegistration {
|
||||
return domain.GamePluginManifestRegistration{
|
||||
ManifestRef: request.ManifestRef,
|
||||
AssetFiles: pluginAssetFilesToDomain(request.AssetFiles),
|
||||
Manifest: domain.GamePluginManifest{
|
||||
ID: request.Manifest.ID,
|
||||
Name: request.Manifest.Name,
|
||||
@@ -1008,6 +1017,7 @@ func (request GamePluginManifestRegistrationRequest) ToDomain() domain.GamePlugi
|
||||
Capabilities: domain.CopyStringSlice(request.Manifest.Capabilities),
|
||||
Permissions: domain.CopyStringSlice(request.Manifest.Permissions),
|
||||
Actions: request.Manifest.Actions.ToDomain(),
|
||||
AssetFiles: pluginAssetFilesToDomain(request.Manifest.AssetFiles),
|
||||
Pages: pagesToDomain(request.Manifest.Pages),
|
||||
FileWorkspace: fileWorkspaceToDomain(request.Manifest.FileWorkspace),
|
||||
AI: request.Manifest.AI.ToDomain(),
|
||||
@@ -1020,6 +1030,17 @@ func (request GamePluginManifestRegistrationRequest) ToDomain() domain.GamePlugi
|
||||
}
|
||||
}
|
||||
|
||||
func pluginAssetFilesToDomain(files []PluginAssetFileBody) []domain.PluginAssetFile {
|
||||
if files == nil {
|
||||
return nil
|
||||
}
|
||||
out := make([]domain.PluginAssetFile, len(files))
|
||||
for i, file := range files {
|
||||
out[i] = domain.PluginAssetFile{Path: file.Path, Content: file.Content, Mode: file.Mode}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func mapTrajectoryDeclarationToDomain(value *GameMapTrajectoryDeclarationBody) *domain.GameMapTrajectoryDeclaration {
|
||||
if value == nil {
|
||||
return nil
|
||||
|
||||
@@ -77,20 +77,28 @@ func TestGamePluginManifestRegistrationToDomainCopiesSlices(t *testing.T) {
|
||||
CreateFormSchema: "schemas/create-form.schema.json",
|
||||
},
|
||||
Actions: PluginLifecycleActionsBody{Install: "actions/install.json", Start: "actions/start.json", Stop: "actions/stop.json"},
|
||||
AssetFiles: []PluginAssetFileBody{
|
||||
{Path: "actions/install.json", Mode: 0o600},
|
||||
},
|
||||
Pages: []GamePluginPageBody{
|
||||
{Key: "logs", Title: "Logs", Path: "/logs", Permissions: []string{"server.logs.read"}},
|
||||
},
|
||||
AI: GamePluginManifestAIBody{Purposes: []string{"logs.diagnose"}},
|
||||
},
|
||||
AssetFiles: []PluginAssetFileBody{
|
||||
{Path: "actions/install.json", Content: "{}", Mode: 0o600},
|
||||
},
|
||||
}
|
||||
|
||||
domainRegistration := request.ToDomain()
|
||||
domainRegistration.Manifest.Tags[0] = "mutated"
|
||||
domainRegistration.Manifest.Server.SupportedOS[0] = "darwin"
|
||||
domainRegistration.Manifest.AssetFiles[0].Path = "actions/mutated.json"
|
||||
domainRegistration.AssetFiles[0].Content = "mutated"
|
||||
domainRegistration.Manifest.Pages[0].Permissions[0] = "ai.invoke"
|
||||
domainRegistration.Manifest.AI.Purposes[0] = "config.suggest"
|
||||
|
||||
if request.Manifest.Tags[0] != "example" || request.Manifest.Server.SupportedOS[0] != "linux" || request.Manifest.Pages[0].Permissions[0] != "server.logs.read" || request.Manifest.AI.Purposes[0] != "logs.diagnose" {
|
||||
if request.Manifest.Tags[0] != "example" || request.Manifest.Server.SupportedOS[0] != "linux" || request.Manifest.AssetFiles[0].Path != "actions/install.json" || request.AssetFiles[0].Content != "{}" || request.Manifest.Pages[0].Permissions[0] != "server.logs.read" || request.Manifest.AI.Purposes[0] != "logs.diagnose" {
|
||||
t.Fatalf("expected manifest request slices to be copied, got %+v", request)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user