rustploy 0.1.2

Rustploy PaaS daemon — lightweight self-hosted deployment platform
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
//! `dispatch`: o `match` que manda cada `Command` para o seu handler em
//! `handlers/`. Ver `docs/indice/comandos.md`.

use super::AppState;
use shared::{Command, Response as RpResponse};
use tracing::info;

pub async fn dispatch(state: AppState, cmd: Command) -> RpResponse {
    use super::handlers;

    let cmd_name = match &cmd {
        Command::Ping => "Ping",
        Command::DaemonStatus => "DaemonStatus",
        Command::DeployEngineStatus => "DeployEngineStatus",
        Command::ProjectCreate { .. } => "ProjectCreate",
        Command::ProjectList => "ProjectList",
        Command::ProjectDelete { .. } => "ProjectDelete",
        Command::ProjectUpdate { .. } => "ProjectUpdate",
        Command::ProjectEnvSet { .. } => "ProjectEnvSet",
        Command::ServiceCreate(_) => "ServiceCreate",
        Command::ServiceExportPlan { .. } => "ServiceExportPlan",
        Command::ServiceExport { .. } => "ServiceExport",
        Command::ServiceImport(_) => "ServiceImport",
        Command::ServiceList { .. } => "ServiceList",
        Command::ServiceGet { .. } => "ServiceGet",
        Command::ServiceUpdate { .. } => "ServiceUpdate",
        Command::ServiceDelete { .. } => "ServiceDelete",
        Command::DeployStart { .. } => "DeployStart",
        Command::DeployAbort { .. } => "DeployAbort",
        Command::DeployDelete { .. } => "DeployDelete",
        Command::DeployHistory { .. } => "DeployHistory",
        Command::DeployRollback { .. } => "DeployRollback",
        Command::ServiceStop { .. } => "ServiceStop",
        Command::ServiceReload { .. } => "ServiceReload",
        Command::LogsGet { .. } => "LogsGet",
        Command::RecentDeployments { .. } => "RecentDeployments",
        Command::GetBuildLogs { .. } => "GetBuildLogs",
        Command::ServiceConnectionInfo { .. } => "ServiceConnectionInfo",
        Command::SharedAccessList { .. } => "SharedAccessList",
        Command::SharedAccessGrant { .. } => "SharedAccessGrant",
        Command::SharedAccessRevoke { .. } => "SharedAccessRevoke",
        Command::ManagedDatabaseList { .. } => "ManagedDatabaseList",
        Command::ManagedDatabaseCreate(_) => "ManagedDatabaseCreate",
        Command::ManagedDatabaseDelete { .. } => "ManagedDatabaseDelete",
        Command::ManagedDatabaseListAll => "ManagedDatabaseListAll",
        Command::MigrationStart(_) => "MigrationStart",
        Command::MigrationGet { .. } => "MigrationGet",
        Command::MigrationList { .. } => "MigrationList",
        Command::MigrationRollback { .. } => "MigrationRollback",
        Command::MigrationDiscard { .. } => "MigrationDiscard",
        Command::GetWebhookUrl { .. } => "GetWebhookUrl",
        Command::RegenerateWebhookToken { .. } => "RegenerateWebhookToken",
        Command::GetDaemonSettings => "GetDaemonSettings",
        Command::SetDaemonSettings { .. } => "SetDaemonSettings",
        Command::SecretSet { .. } => "SecretSet",
        Command::SecretDelete { .. } => "SecretDelete",
        Command::SecretList { .. } => "SecretList",
        Command::ManifestApply { .. } => "ManifestApply",
        Command::ManifestExport { .. } => "ManifestExport",
        Command::ManifestExportAll => "ManifestExportAll",
        Command::ManifestImport { .. } => "ManifestImport",
        Command::JobCreate { .. } => "JobCreate",
        Command::JobUpdate { .. } => "JobUpdate",
        Command::JobDelete { .. } => "JobDelete",
        Command::JobList { .. } => "JobList",
        Command::JobListAll => "JobListAll",
        Command::JobRunNow { .. } => "JobRunNow",
        Command::JobRunCancel { .. } => "JobRunCancel",
        Command::JobRunHistory { .. } => "JobRunHistory",
        Command::GetJobLogs { .. } => "GetJobLogs",
        Command::JobWarm { .. } => "JobWarm",
        Command::JobWarmStatus { .. } => "JobWarmStatus",
        Command::PruneContainers => "PruneContainers",
        Command::PruneVolumes { .. } => "PruneVolumes",
        Command::PruneImages { .. } => "PruneImages",
        Command::PruneBuildCache => "PruneBuildCache",
        Command::PruneNetworks => "PruneNetworks",
        Command::DockerCleanupConfigGet => "DockerCleanupConfigGet",
        Command::DockerCleanupConfigSet { .. } => "DockerCleanupConfigSet",
        Command::DockerCleanupRunNow => "DockerCleanupRunNow",
        Command::DockerImages => "DockerImages",
        Command::DockerVolumes => "DockerVolumes",
        Command::DockerNetworks => "DockerNetworks",
        Command::DockerContainers => "DockerContainers",
        Command::RemoveContainer { .. } => "RemoveContainer",
        Command::RemoveImage { .. } => "RemoveImage",
        Command::RemoveVolume { .. } => "RemoveVolume",
        Command::RemoveNetwork { .. } => "RemoveNetwork",
        Command::StopAllManaged => "StopAllManaged",
        Command::IngressRoutes => "IngressRoutes",
        Command::IngressReconcile { .. } => "IngressReconcile",
        Command::EnvBackupList => "EnvBackupList",
        Command::EnvBackupRestore { .. } => "EnvBackupRestore",
        Command::GitProviderList => "GitProviderList",
        Command::GitProviderCreate { .. } => "GitProviderCreate",
        Command::GitProviderDelete { .. } => "GitProviderDelete",
        Command::GitOAuthStart { .. } => "GitOAuthStart",
        Command::GitRepoList { .. } => "GitRepoList",
        Command::GitBranchList { .. } => "GitBranchList",
        Command::WizardCatalog { .. } => "WizardCatalog",
        Command::WizardCreate(_) => "WizardCreate",
        Command::Snapshot => "Snapshot",
        Command::RegistryStatus => "RegistryStatus",
        Command::RegistryRepoList => "RegistryRepoList",
        Command::RegistryTagList { .. } => "RegistryTagList",
        Command::RegistryTagDelete { .. } => "RegistryTagDelete",
        Command::RegistryRepoDelete { .. } => "RegistryRepoDelete",
        Command::RegistryGc => "RegistryGc",
        Command::RegistryTokenCreate { .. } => "RegistryTokenCreate",
        Command::RegistryTokenList => "RegistryTokenList",
        Command::RegistryTokenRevoke { .. } => "RegistryTokenRevoke",
        _ => "Unknown",
    };
    info!(command = cmd_name, "→ Request");

    let resp = match cmd {
        Command::Ping => handlers::ping::handle(state).await,
        Command::DaemonStatus => handlers::daemon_status::handle(state).await,
        Command::DeployEngineStatus => handlers::deploy_engine_status::handle(state).await,
        Command::PruneContainers => handlers::docker_prune::prune_containers(state).await,
        Command::PruneVolumes { all } => handlers::docker_prune::prune_volumes(state, all).await,
        Command::PruneImages { all } => handlers::docker_prune::prune_images(state, all).await,
        Command::PruneBuildCache => handlers::docker_prune::prune_build_cache(state).await,
        Command::PruneNetworks => handlers::docker_prune::prune_networks(state).await,
        Command::DockerCleanupConfigGet => handlers::docker_cleanup::get_config(state).await,
        Command::DockerCleanupConfigSet { config } => {
            handlers::docker_cleanup::set_config(state, config).await
        }
        Command::DockerCleanupRunNow => handlers::docker_cleanup::run_now(state).await,
        Command::DockerImages => handlers::docker_inventory::list_images(state).await,
        Command::DockerVolumes => handlers::docker_inventory::list_volumes(state).await,
        Command::DockerNetworks => handlers::docker_inventory::list_networks(state).await,
        Command::DockerContainers => handlers::docker_inventory::list_containers(state).await,
        Command::RemoveContainer { id } => {
            handlers::docker_remove::remove_container(state, id).await
        }
        Command::RemoveImage { id } => handlers::docker_remove::remove_image(state, id).await,
        Command::RemoveVolume { name } => handlers::docker_remove::remove_volume(state, name).await,
        Command::RemoveNetwork { id } => handlers::docker_remove::remove_network(state, id).await,
        Command::StopAllManaged => handlers::docker_inventory::stop_all_managed(state).await,
        Command::IngressRoutes => handlers::ingress::routes(state).await,
        Command::IngressReconcile { service_id } => {
            handlers::ingress::reconcile(state, service_id).await
        }
        Command::EnvBackupList => handlers::env_backup::list(state).await,
        Command::EnvBackupRestore { snapshot } => {
            handlers::env_backup::restore(state, snapshot).await
        }
        Command::ProjectCreate { name, description } => {
            handlers::project_create::handle(state, name, description).await
        }
        Command::ProjectList => handlers::project_list::handle(state).await,
        Command::ProjectDelete { id } => handlers::project_delete::handle(state, id).await,
        Command::ProjectUpdate {
            id,
            name,
            description,
        } => handlers::project_update::handle(state, id, name, description).await,
        Command::ProjectEnvSet {
            project_id,
            env_vars,
            env_comments,
        } => handlers::project_env_set::handle(state, project_id, env_vars, env_comments).await,
        Command::ServiceCreate(spec) => handlers::service_create::handle(state, spec).await,
        Command::ServiceList { project_id } => {
            handlers::service_list::handle(state, project_id).await
        }
        Command::SharedAccessList { server_service_id } => {
            handlers::shared_access::list(state, server_service_id).await
        }
        Command::SharedAccessGrant {
            server_service_id,
            project_id,
        } => handlers::shared_access::grant(state, server_service_id, project_id).await,
        Command::SharedAccessRevoke {
            server_service_id,
            project_id,
        } => handlers::shared_access::revoke(state, server_service_id, project_id).await,
        Command::ManagedDatabaseList { server_service_id } => {
            handlers::managed_database::list(state, server_service_id).await
        }
        Command::ManagedDatabaseCreate(req) => handlers::managed_database::create(state, req).await,
        Command::ManagedDatabaseDelete { id } => {
            handlers::managed_database::delete(state, id).await
        }
        Command::ManagedDatabaseListAll => handlers::managed_database::list_all(state).await,
        Command::MigrationStart(req) => handlers::migration::start(state, req).await,
        Command::MigrationGet { id } => handlers::migration::get(state, id).await,
        Command::MigrationList { project_id } => handlers::migration::list(state, project_id).await,
        Command::MigrationRollback { id } => handlers::migration::rollback(state, id).await,
        Command::MigrationDiscard { id } => handlers::migration::discard(state, id).await,
        Command::ServiceConnectionInfo { service_id } => {
            handlers::service_connection_info::handle(state, service_id).await
        }
        Command::ServiceGet { id } => handlers::service_get::handle(state, id).await,
        Command::ServiceExportPlan { service_id } => {
            handlers::service_export::plan(state, service_id).await
        }
        Command::ServiceExport {
            service_id,
            include_values,
            project_env_keys,
        } => {
            handlers::service_export::export(state, service_id, include_values, project_env_keys)
                .await
        }
        Command::ServiceImport(req) => handlers::service_import::handle(state, req).await,
        Command::ServiceUpdate { id, spec } => {
            handlers::service_update::handle(state, id, spec).await
        }
        Command::ServiceDelete { id } => handlers::service_delete::handle(state, id).await,
        Command::DeployStart { service_id } => {
            handlers::deploy_start::handle(state, service_id).await
        }
        Command::DeployAbort { deployment_id } => {
            handlers::deploy_abort::handle(state, deployment_id).await
        }
        Command::DeployQueuePromote { deployment_id } => {
            handlers::deploy_queue_promote::handle(state, deployment_id).await
        }
        Command::DeployQueueReorder { order } => {
            handlers::deploy_queue_reorder::handle(state, order).await
        }
        Command::DeployQueuePause { paused } => {
            handlers::deploy_queue_pause::handle(state, paused).await
        }
        Command::DeployDelete { deployment_id } => {
            handlers::deploy_delete::handle(state, deployment_id).await
        }
        Command::DeployHistory { service_id, limit } => {
            handlers::deploy_history::handle(state, service_id, limit).await
        }
        Command::DeployRollback { service_id } => {
            handlers::deploy_rollback::handle(state, service_id).await
        }
        Command::ServiceStop { service_id } => {
            handlers::service_stop::handle(state, service_id).await
        }
        Command::ServiceReload { service_id } => {
            handlers::service_reload::handle(state, service_id).await
        }
        Command::LogsGet { service_id, tail } => {
            handlers::logs_get::handle(state, service_id, tail).await
        }
        Command::RecentDeployments { limit } => {
            handlers::recent_deployments::handle(state, limit).await
        }
        Command::GetBuildLogs { deployment_id } => {
            handlers::get_build_logs::handle(state, deployment_id).await
        }
        Command::GetWebhookUrl { service_id } => {
            handlers::get_webhook_url::handle(state, service_id).await
        }
        Command::RegenerateWebhookToken { service_id } => {
            handlers::regenerate_webhook_token::handle(state, service_id).await
        }
        Command::GetDaemonSettings => handlers::get_daemon_settings::handle(state).await,
        Command::SetDaemonSettings {
            acme_email,
            registry_domain,
        } => handlers::set_daemon_settings::handle(state, acme_email, registry_domain).await,
        Command::SecretSet {
            project_id,
            name,
            value,
        } => handlers::secret_set::handle(state, project_id, name, value).await,
        Command::SecretDelete { project_id, name } => {
            handlers::secret_delete::handle(state, project_id, name).await
        }
        Command::SecretList { project_id } => {
            handlers::secret_list::handle(state, project_id).await
        }
        Command::ManifestApply {
            manifests,
            prune,
            deploy,
        } => handlers::manifest_apply::handle(state, manifests, prune, deploy).await,
        Command::ManifestExport { project_id } => {
            handlers::manifest_export::handle(state, project_id).await
        }
        Command::ManifestExportAll => handlers::manifest_export_all::handle(state).await,
        Command::ManifestImport {
            yaml,
            dotenv,
            prune,
            deploy,
        } => handlers::manifest_import::handle(state, yaml, dotenv, prune, deploy).await,
        Command::JobCreate {
            project_id,
            trigger_service_id,
            name,
            compose,
            git_source,
            main_service,
            env_vars,
            env_comments,
            recurrence,
        } => {
            handlers::job_create::handle(
                state,
                project_id,
                trigger_service_id,
                name,
                compose,
                git_source,
                main_service,
                env_vars,
                env_comments,
                recurrence,
            )
            .await
        }
        Command::JobUpdate {
            id,
            name,
            compose,
            git_source,
            main_service,
            env_vars,
            env_comments,
            enabled,
            recurrence,
        } => {
            handlers::job_update::handle(
                state,
                id,
                name,
                compose,
                git_source,
                main_service,
                env_vars,
                env_comments,
                enabled,
                recurrence,
            )
            .await
        }
        Command::JobDelete { id } => handlers::job_delete::handle(state, id).await,
        Command::JobList { project_id } => handlers::job_list::handle(state, project_id).await,
        Command::JobListAll => handlers::job_list_all::handle(state).await,
        Command::JobRunNow { id } => handlers::job_run_now::handle(state, id).await,
        Command::JobRunCancel { job_run_id } => {
            handlers::job_run_cancel::handle(state, job_run_id).await
        }
        Command::JobRunHistory { job_id, limit } => {
            handlers::job_run_history::handle(state, job_id, limit).await
        }
        Command::GetJobLogs { job_run_id } => {
            handlers::get_job_logs::handle(state, job_run_id).await
        }
        Command::JobWarmStatus { job_id } => handlers::job_warm_status::handle(state, job_id).await,
        Command::JobWarm { job_id } => handlers::job_warm::handle(state, job_id).await,
        Command::GitProviderList => handlers::git_provider_list::handle(state).await,
        Command::GitProviderCreate {
            kind,
            name,
            base_url,
            auth_mode,
            oauth_client_id,
            oauth_client_secret,
            pat,
        } => {
            handlers::git_provider_create::handle(
                state,
                kind,
                name,
                base_url,
                auth_mode,
                oauth_client_id,
                oauth_client_secret,
                pat,
            )
            .await
        }
        Command::GitProviderDelete { id } => handlers::git_provider_delete::handle(state, id).await,
        Command::GitOAuthStart { provider_id } => {
            handlers::git_oauth_start::handle(state, provider_id).await
        }
        Command::GitRepoList { provider_id } => {
            handlers::git_repo_list::handle(state, provider_id).await
        }
        Command::GitBranchList {
            provider_id,
            repo_full_name,
        } => handlers::git_branch_list::handle(state, provider_id, repo_full_name).await,
        Command::WizardCatalog { search } => handlers::wizard::catalog(search).await,
        Command::WizardCreate(req) => handlers::wizard::create(state, req).await,
        // `snapshot` chama `dispatch` internamente (fan-out de DaemonStatus/
        // ProjectList/…), então boxamos o future para quebrar a recursão async.
        Command::Snapshot => {
            RpResponse::Snapshot(Box::pin(super::http_api::snapshot(&state)).await)
        }
        Command::RegistryStatus => handlers::registry::status(state).await,
        Command::RegistryRepoList => handlers::registry::repo_list(state).await,
        Command::RegistryTagList { repo } => handlers::registry::tag_list(state, repo).await,
        Command::RegistryTagDelete { repo, tag } => {
            handlers::registry::tag_delete(state, repo, tag).await
        }
        Command::RegistryRepoDelete { repo } => handlers::registry::repo_delete(state, repo).await,
        Command::RegistryGc => handlers::registry::gc(state).await,
        Command::RegistryTokenCreate { name, scope } => {
            handlers::registry::token_create(state, name, scope).await
        }
        Command::RegistryTokenList => handlers::registry::token_list(state).await,
        Command::RegistryTokenRevoke { name } => {
            handlers::registry::token_revoke(state, name).await
        }
        _ => RpResponse::err("NotImplemented", "command not yet implemented"),
    };

    let ok = !matches!(resp, RpResponse::Err { .. });
    info!(ok, command = cmd_name, "← Response");
    resp
}