Skip to content

Commit 854444f

Browse files
authored
feat: add new endpoint for environment variables in the designer module (#791)
1 parent c30111f commit 854444f

File tree

4 files changed

+167
-1
lines changed

4 files changed

+167
-1
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//
2+
// Copyright © 2025 Agora
3+
// This file is part of TEN Framework, an open source project.
4+
// Licensed under the Apache License, Version 2.0, with certain conditions.
5+
// Refer to the "LICENSE" file in the root directory for more information.
6+
//
7+
use std::env;
8+
use std::sync::Arc;
9+
10+
use actix_web::{web, HttpResponse, Responder};
11+
use serde::{Deserialize, Serialize};
12+
13+
use crate::designer::DesignerState;
14+
15+
#[derive(Debug, Deserialize, Serialize)]
16+
pub struct GetEnvVarRequestPayload {
17+
pub name: String,
18+
}
19+
20+
#[derive(Debug, Deserialize, Serialize)]
21+
pub struct GetEnvVarResponseData {
22+
pub value: Option<String>,
23+
}
24+
25+
/// This function handles requests for getting environment variables.
26+
/// It accepts a JSON payload with a "name" property and returns the
27+
/// corresponding environment variable value, or None if not defined.
28+
pub async fn get_env_var_endpoint(
29+
request_payload: web::Json<GetEnvVarRequestPayload>,
30+
_state: web::Data<Arc<DesignerState>>,
31+
) -> Result<impl Responder, actix_web::Error> {
32+
let name = &request_payload.name;
33+
34+
// Cross-platform way to get environment variables.
35+
let value = env::var(name).ok();
36+
37+
let response_data = GetEnvVarResponseData { value };
38+
39+
Ok(HttpResponse::Ok().json(response_data))
40+
}

core/src/ten_manager/src/designer/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ pub mod common;
1010
pub mod dir_list;
1111
pub mod doc_link;
1212
pub mod env;
13+
pub mod env_var;
1314
pub mod exec;
1415
pub mod extensions;
1516
pub mod file_content;
@@ -123,6 +124,7 @@ pub fn configure_routes(
123124
// Registry endpoints.
124125
.service(web::resource("/registry/packages").route(web::get().to(registry::packages::get_packages_endpoint)))
125126
// Environment endpoints.
126-
.service(web::resource("/env").route(web::get().to(env::get_env_endpoint))),
127+
.service(web::resource("/env").route(web::get().to(env::get_env_endpoint)))
128+
.service(web::resource("/env-var").route(web::post().to(env_var::get_env_var_endpoint))),
127129
);
128130
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
//
2+
// Copyright © 2025 Agora
3+
// This file is part of TEN Framework, an open source project.
4+
// Licensed under the Apache License, Version 2.0, with certain conditions.
5+
// Refer to the "LICENSE" file in the root directory for more information.
6+
//
7+
#[cfg(test)]
8+
mod tests {
9+
use std::env;
10+
11+
use actix_web::{test, web, App};
12+
use ten_manager::designer::env_var::{
13+
get_env_var_endpoint, GetEnvVarRequestPayload, GetEnvVarResponseData,
14+
};
15+
16+
use crate::test_case::common::designer_state::create_designer_state;
17+
18+
#[actix_web::test]
19+
async fn test_get_existing_env_var() {
20+
// Setup
21+
const TEST_VAR_NAME: &str = "TEST_ENV_VAR_EXISTING";
22+
const TEST_VAR_VALUE: &str = "test_value";
23+
24+
// Set the environment variable
25+
env::set_var(TEST_VAR_NAME, TEST_VAR_VALUE);
26+
27+
// Create test app with the endpoint
28+
let state = web::Data::new(create_designer_state());
29+
let app = test::init_service(
30+
App::new()
31+
.app_data(state.clone())
32+
.route("/env-var", web::post().to(get_env_var_endpoint)),
33+
)
34+
.await;
35+
36+
// Create test request
37+
let req = test::TestRequest::post()
38+
.uri("/env-var")
39+
.set_json(&GetEnvVarRequestPayload {
40+
name: TEST_VAR_NAME.to_string(),
41+
})
42+
.to_request();
43+
44+
// Send request and get response.
45+
let resp: GetEnvVarResponseData =
46+
test::call_and_read_body_json(&app, req).await;
47+
48+
// Clean up.
49+
env::remove_var(TEST_VAR_NAME);
50+
51+
// Verify response.
52+
assert_eq!(resp.value, Some(TEST_VAR_VALUE.to_string()));
53+
}
54+
55+
#[actix_web::test]
56+
async fn test_get_nonexistent_env_var() {
57+
// Setup - using a variable name that is unlikely to exist.
58+
const TEST_VAR_NAME: &str = "TEST_ENV_VAR_NONEXISTENT_12345";
59+
60+
// Make sure the variable doesn't exist.
61+
env::remove_var(TEST_VAR_NAME);
62+
63+
// Create test app with the endpoint
64+
let state = web::Data::new(create_designer_state());
65+
let app = test::init_service(
66+
App::new()
67+
.app_data(state.clone())
68+
.route("/env-var", web::post().to(get_env_var_endpoint)),
69+
)
70+
.await;
71+
72+
// Create test request.
73+
let req = test::TestRequest::post()
74+
.uri("/env-var")
75+
.set_json(&GetEnvVarRequestPayload {
76+
name: TEST_VAR_NAME.to_string(),
77+
})
78+
.to_request();
79+
80+
// Send request and get response.
81+
let resp: GetEnvVarResponseData =
82+
test::call_and_read_body_json(&app, req).await;
83+
84+
// Verify response.
85+
assert_eq!(resp.value, None);
86+
}
87+
88+
#[actix_web::test]
89+
async fn test_get_empty_env_var() {
90+
// Setup.
91+
const TEST_VAR_NAME: &str = "TEST_ENV_VAR_EMPTY";
92+
93+
// Set the environment variable to an empty string.
94+
env::set_var(TEST_VAR_NAME, "");
95+
96+
// Create test app with the endpoint.
97+
let state = web::Data::new(create_designer_state());
98+
let app = test::init_service(
99+
App::new()
100+
.app_data(state.clone())
101+
.route("/env-var", web::post().to(get_env_var_endpoint)),
102+
)
103+
.await;
104+
105+
// Create test request.
106+
let req = test::TestRequest::post()
107+
.uri("/env-var")
108+
.set_json(&GetEnvVarRequestPayload {
109+
name: TEST_VAR_NAME.to_string(),
110+
})
111+
.to_request();
112+
113+
// Send request and get response.
114+
let resp: GetEnvVarResponseData =
115+
test::call_and_read_body_json(&app, req).await;
116+
117+
// Clean up.
118+
env::remove_var(TEST_VAR_NAME);
119+
120+
// Verify response - an empty string is still a value, not None.
121+
assert_eq!(resp.value, Some("".to_string()));
122+
}
123+
}

core/src/ten_manager/tests/test_case/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
mod cmd;
88
mod common;
99
mod designer;
10+
mod env_var;
1011
mod fs;
1112
mod graph;
1213
mod log;

0 commit comments

Comments
 (0)