Skip to main content

smbcloud_model/
deploy_config.rs

1use {
2    crate::{project::DeploymentMethod, runner::Runner},
3    serde::{Deserialize, Serialize},
4};
5
6/// Server-side deploy configuration returned by the API.
7///
8/// The CLI fetches this from `GET /v1/frontend_apps/{id}/deploy_config`
9/// and merges the populated fields into the local `.smb/config.toml`.
10#[derive(Debug, Serialize, Deserialize, Clone)]
11pub struct DeployConfig {
12    pub id: String,
13    pub name: String,
14    pub runner: Runner,
15    pub deployment_method: DeploymentMethod,
16    #[serde(default)]
17    pub source_path: Option<String>,
18    #[serde(default)]
19    pub kind: Option<String>,
20    #[serde(default)]
21    pub remote_path: Option<String>,
22    #[serde(default)]
23    pub output_path: Option<String>,
24    #[serde(default)]
25    pub build_command: Option<String>,
26    #[serde(default)]
27    pub install_command: Option<String>,
28    #[serde(default)]
29    pub binary_name: Option<String>,
30    #[serde(default)]
31    pub build_target: Option<String>,
32    #[serde(default)]
33    pub package_manager: Option<String>,
34    #[serde(default)]
35    pub pm2_app: Option<String>,
36    #[serde(default)]
37    pub pm2_env: Option<std::collections::HashMap<String, serde_json::Value>>,
38    /// Runtime supervisor. `nextjs-ssr`: `"pm2"` (default) or `"systemd"`;
39    /// `systemd` restarts via a git-owned
40    /// `systemctl --user restart <pm2_app>.service` instead of `pm2`.
41    /// `rust`: `"nohup"` (default) or `"systemd"`, restarting
42    /// `<binary_name>.service` the same way.
43    #[serde(default)]
44    pub process_manager: Option<String>,
45    #[serde(default)]
46    pub port: Option<u16>,
47    #[serde(default)]
48    pub shared_lib_path: Option<String>,
49    #[serde(default)]
50    pub project_id: Option<i32>,
51    #[serde(default)]
52    pub deploy_repo_id: Option<i64>,
53    #[serde(default)]
54    pub repository: Option<String>,
55    /// `legacy_ssh` (default) or `artifact`: how the server publishes this app.
56    #[serde(default)]
57    pub publish_target: Option<String>,
58    /// Where the published site is served, when the server knows.
59    #[serde(default)]
60    pub site_url: Option<String>,
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    #[test]
68    fn deserializes_full_deploy_config() {
69        let json = r#"{
70            "id": "80b309e8-c39a-45b6-9121-e616fde3cd42",
71            "name": "onde-cloud",
72            "runner": 0,
73            "deployment_method": 1,
74            "source_path": ".",
75            "kind": "rust",
76            "remote_path": "apps/rest-api/onde-cloud",
77            "output_path": null,
78            "build_command": null,
79            "install_command": null,
80            "binary_name": "onde-cloud",
81            "build_target": "x86_64-unknown-linux-gnu",
82            "package_manager": null,
83            "pm2_app": null,
84            "port": 8090,
85            "shared_lib_path": null,
86            "project_id": 50,
87            "deploy_repo_id": 18,
88            "repository": "test"
89        }"#;
90
91        let config: DeployConfig = serde_json::from_str(json).expect("should deserialize");
92        assert_eq!(config.id, "80b309e8-c39a-45b6-9121-e616fde3cd42");
93        assert_eq!(config.kind.as_deref(), Some("rust"));
94        assert_eq!(
95            config.remote_path.as_deref(),
96            Some("apps/rest-api/onde-cloud")
97        );
98        assert_eq!(config.binary_name.as_deref(), Some("onde-cloud"));
99        assert_eq!(
100            config.build_target.as_deref(),
101            Some("x86_64-unknown-linux-gnu")
102        );
103        assert_eq!(config.port, Some(8090));
104        assert_eq!(config.runner, Runner::NodeJs);
105    }
106
107    #[test]
108    fn deserializes_minimal_deploy_config() {
109        let json = r#"{
110            "id": "abc-123",
111            "name": "my-app",
112            "runner": 4,
113            "deployment_method": 0
114        }"#;
115
116        let config: DeployConfig = serde_json::from_str(json).expect("should deserialize");
117        assert_eq!(config.id, "abc-123");
118        assert_eq!(config.runner, Runner::Rust);
119        assert!(config.kind.is_none());
120        assert!(config.remote_path.is_none());
121        assert!(config.port.is_none());
122    }
123}