diff --git a/.changeset/curvy-pumas-clean.md b/.changeset/curvy-pumas-clean.md new file mode 100644 index 000000000..4e89b4a07 --- /dev/null +++ b/.changeset/curvy-pumas-clean.md @@ -0,0 +1,6 @@ +--- +'@lagon/dashboard': patch +'@lagon/cli': patch +--- + +Deploy to the specified organization instead of the current selected one diff --git a/crates/cli/src/commands/deploy.rs b/crates/cli/src/commands/deploy.rs index ac5279386..b23ee3bd6 100644 --- a/crates/cli/src/commands/deploy.rs +++ b/crates/cli/src/commands/deploy.rs @@ -73,7 +73,9 @@ pub async fn deploy( ); println!(); - let trpc_client = TrpcClient::new(config.clone()); + let mut trpc_client = TrpcClient::new(config.clone()); + trpc_client.set_organization_id(function_config.organization_id.clone()); + let response = trpc_client .query::<(), OrganizationsResponse>("organizationsList", None) .await?; diff --git a/crates/cli/src/commands/link.rs b/crates/cli/src/commands/link.rs index 53e64d610..cb0f62879 100644 --- a/crates/cli/src/commands/link.rs +++ b/crates/cli/src/commands/link.rs @@ -21,7 +21,9 @@ pub async fn link(directory: Option) -> Result<()> { match !function_config.function_id.is_empty() { true => Err(anyhow!("This directory is already linked to a Function")), false => { - let trpc_client = TrpcClient::new(config); + let mut trpc_client = TrpcClient::new(config); + trpc_client.set_organization_id(function_config.organization_id.clone()); + let response = trpc_client .query::<(), OrganizationsResponse>("organizationsList", None) .await?; diff --git a/crates/cli/src/commands/ls.rs b/crates/cli/src/commands/ls.rs index 90e38ba2d..1b86a1f45 100644 --- a/crates/cli/src/commands/ls.rs +++ b/crates/cli/src/commands/ls.rs @@ -39,6 +39,7 @@ pub async fn ls(directory: Option) -> Result<()> { let end_progress = print_progress("Fetching Deployments"); let function = TrpcClient::new(config) + .set_organization_id(function_config.organization_id.clone()) .query::( "functionGet", Some(FunctionRequest { diff --git a/crates/cli/src/commands/promote.rs b/crates/cli/src/commands/promote.rs index 4604e070e..472bc86b7 100644 --- a/crates/cli/src/commands/promote.rs +++ b/crates/cli/src/commands/promote.rs @@ -38,6 +38,7 @@ pub async fn promote(deployment_id: String, directory: Option) -> Resul println!(); let end_progress = print_progress("Promoting Deployment"); TrpcClient::new(config) + .set_organization_id(function_config.organization_id.clone()) .mutation::( "deploymentPromote", PromoteDeploymentRequest { diff --git a/crates/cli/src/commands/rm.rs b/crates/cli/src/commands/rm.rs index 17402d70e..d7b540854 100644 --- a/crates/cli/src/commands/rm.rs +++ b/crates/cli/src/commands/rm.rs @@ -38,6 +38,7 @@ pub async fn rm(directory: Option) -> Result<()> { true => { let end_progress = print_progress("Deleting Function"); TrpcClient::new(config) + .set_organization_id(function_config.organization_id.clone()) .mutation::( "functionDelete", DeleteFunctionRequest { diff --git a/crates/cli/src/commands/undeploy.rs b/crates/cli/src/commands/undeploy.rs index 0d813d293..60db18291 100644 --- a/crates/cli/src/commands/undeploy.rs +++ b/crates/cli/src/commands/undeploy.rs @@ -37,6 +37,7 @@ pub async fn undeploy(deployment_id: String, directory: Option) -> Resu true => { let end_progress = print_progress("Deleting Deployment"); TrpcClient::new(config) + .set_organization_id(function_config.organization_id.clone()) .mutation::( "deploymentUndeploy", UndeployDeploymentRequest { diff --git a/crates/cli/src/utils/deployments.rs b/crates/cli/src/utils/deployments.rs index 7b2befb32..e3914f00a 100644 --- a/crates/cli/src/utils/deployments.rs +++ b/crates/cli/src/utils/deployments.rs @@ -399,7 +399,11 @@ pub async fn create_deployment( let end_progress = print_progress("Creating Deployment"); - let trpc_client = Arc::new(TrpcClient::new(config)); + let mut trpc_client = TrpcClient::new(config); + trpc_client.set_organization_id(function_config.organization_id.clone()); + + let trpc_client = Arc::new(trpc_client); + let response = trpc_client .mutation::( "deploymentCreate", @@ -440,7 +444,7 @@ pub async fn create_deployment( .get(&asset) .unwrap_or_else(|| panic!("Couldn't find asset {asset}")); - join_set.spawn(upload_asset(trpc_client.clone(), asset.clone(), url)); + join_set.spawn(upload_asset(Arc::clone(&trpc_client), asset.clone(), url)); } while let Some(res) = join_set.join_next().await { diff --git a/crates/cli/src/utils/trpc.rs b/crates/cli/src/utils/trpc.rs index ba9f7f500..d35991120 100644 --- a/crates/cli/src/utils/trpc.rs +++ b/crates/cli/src/utils/trpc.rs @@ -27,13 +27,23 @@ pub struct TrpcErrorResult { pub struct TrpcClient { pub client: Client, config: Config, + organization_id: Option, } impl TrpcClient { pub fn new(config: Config) -> Self { let client = ClientBuilder::new().use_rustls_tls().build().unwrap(); - Self { client, config } + Self { + client, + config, + organization_id: None, + } + } + + pub fn set_organization_id(&mut self, organization_id: String) -> &mut Self { + self.organization_id = Some(organization_id); + self } pub async fn query(&self, key: &str, body: Option) -> Result> @@ -46,17 +56,20 @@ impl TrpcClient { None => String::new(), }; - let response = self + let mut builder = self .client .request( "GET".parse()?, format!("{}/api/trpc/{}{}", self.config.site_url.clone(), key, input,), ) .header("content-type", "application/json") - .header("x-lagon-token", self.config.token.as_ref().unwrap()) - .send() - .await?; + .header("x-lagon-token", self.config.token.as_ref().unwrap()); + if let Some(organization_id) = &self.organization_id { + builder = builder.header("x-lagon-organization-id", organization_id); + } + + let response = builder.send().await?; let body = response.text().await?; match serde_json::from_str::>(&body) { @@ -75,18 +88,20 @@ impl TrpcClient { { let body = serde_json::to_string(&body)?; - let response = self + let mut builder = self .client .request( "POST".parse()?, format!("{}/api/trpc/{}", self.config.site_url.clone(), key), ) .header("content-type", "application/json") - .header("x-lagon-token", self.config.token.as_ref().unwrap()) - .body(body) - .send() - .await?; + .header("x-lagon-token", self.config.token.as_ref().unwrap()); + + if let Some(organization_id) = &self.organization_id { + builder = builder.header("x-lagon-organization-id", organization_id); + } + let response = builder.body(body).send().await?; let body = response.text().await?; match serde_json::from_str::>(&body) { diff --git a/packages/dashboard/pages/api/trpc/[trpc].ts b/packages/dashboard/pages/api/trpc/[trpc].ts index 3130a551f..fc3729395 100644 --- a/packages/dashboard/pages/api/trpc/[trpc].ts +++ b/packages/dashboard/pages/api/trpc/[trpc].ts @@ -22,6 +22,7 @@ const createContext = async ({ session: Session; }> => { const tokenValue = req.headers['x-lagon-token'] as string; + const organizationId = req.headers['x-lagon-organization-id'] as string | undefined; // tokensAuthenticate needs to skip authentication if (req.query.trpc === 'tokensAuthenticate') { @@ -58,7 +59,7 @@ const createContext = async ({ const organization = await prisma.organization.findFirst({ where: { - id: token.user.currentOrganizationId ?? '', + id: organizationId ?? token.user.currentOrganizationId ?? '', }, select: { id: true,