From a1619d91b1af1b7c4f0b4f11e859f973a6f93e97 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Sun, 21 Jul 2024 18:39:22 -0700 Subject: [PATCH] chore: return backend project on bootstrap --- rivet-toolchain/src/backend/mod.rs | 43 ++++++++++++++++--- .../src/tasks/get_bootstrap_data.rs | 19 +++++++- scripts/copy_sdks.sh | 3 +- sdks/rust/docs/EeBackendEnvironment.md | 1 + .../EeCloudBackendProjectsCreateRequest.md | 1 + .../EeCloudBackendProjectsCreateResponse.md | 1 + .../rust/src/models/ee_backend_environment.rs | 5 ++- ...e_cloud_backend_projects_create_request.rs | 3 ++ ..._cloud_backend_projects_create_response.rs | 5 ++- 9 files changed, 71 insertions(+), 10 deletions(-) diff --git a/rivet-toolchain/src/backend/mod.rs b/rivet-toolchain/src/backend/mod.rs index 2c488f21..e8d092bd 100644 --- a/rivet-toolchain/src/backend/mod.rs +++ b/rivet-toolchain/src/backend/mod.rs @@ -95,17 +95,48 @@ pub async fn spawn_opengb_command(opts: OpenGbCommandOpts) -> GlobalResult /// Gets or auto-creates a backend project for the game. pub async fn get_or_create_project(ctx: &Ctx) -> GlobalResult> { + // Get the project let project_res = apis::ee_cloud_games_projects_api::ee_cloud_games_projects_get( &ctx.openapi_config_cloud, &ctx.game_id, ) .await?; - // TODO: Add get or create project - let project = unwrap!( - project_res.project, - "No OpenGB project linked to the current game. Create one on the hub: https://hub.rivet.gg/" - ); + if let Some(project) = project_res.project { + Ok(project) + } else { + // Get game in order to determine team & project name + let models::CloudGamesGetGameByIdResponse { game, .. } = + apis::cloud_games_api::cloud_games_get_game_by_id( + &ctx.openapi_config_cloud, + &ctx.game_id, + None, + ) + .await?; - Ok(project) + // Create project + let display_name = format!("{:.15}-backend", game.display_name); + let models::EeCloudBackendProjectsCreateResponse { project, .. } = + apis::ee_cloud_backend_projects_api::ee_cloud_backend_projects_create( + &ctx.openapi_config_cloud, + models::EeCloudBackendProjectsCreateRequest { + developer_group_id: game.developer_group_id, + display_name, + game_id: Some(game.game_id), + }, + ) + .await?; + + // Link to game + apis::ee_cloud_games_projects_api::ee_cloud_games_projects_link( + &ctx.openapi_config_cloud, + &ctx.game_id, + models::EeCloudGamesProjectsLinkRequest { + project_id: project.project_id, + }, + ) + .await?; + + Ok(project) + } } diff --git a/rivet-toolchain/src/tasks/get_bootstrap_data.rs b/rivet-toolchain/src/tasks/get_bootstrap_data.rs index 4def8bc9..2e2e2b96 100644 --- a/rivet-toolchain/src/tasks/get_bootstrap_data.rs +++ b/rivet-toolchain/src/tasks/get_bootstrap_data.rs @@ -1,7 +1,8 @@ use global_error::prelude::*; +use rivet_api::{apis, models}; use serde::{Deserialize, Serialize}; -use crate::util::task::TaskCtx; +use crate::{backend, util::task::TaskCtx}; #[derive(Deserialize)] pub struct Input {} @@ -11,6 +12,8 @@ pub struct Output { pub token: String, pub api_endpoint: String, pub game_id: String, + pub backend_project: models::EeBackendProject, + pub backend_environments: Vec, } pub struct Task; @@ -25,10 +28,24 @@ impl super::Task for Task { async fn run(_task: TaskCtx, _input: Self::Input) -> GlobalResult { let ctx = crate::ctx::load().await?; + + // Get or create backend project + let backend_project = backend::get_or_create_project(&ctx).await?; + let backend_environments = + apis::ee_cloud_backend_projects_envs_api::ee_cloud_backend_projects_envs_list( + &ctx.openapi_config_cloud, + &backend_project.project_id.to_string(), + None, + ) + .await? + .environments; + Ok(Output { token: ctx.access_token.clone(), api_endpoint: ctx.api_endpoint.clone(), game_id: ctx.game_id.clone(), + backend_project: *backend_project, + backend_environments, }) } } diff --git a/scripts/copy_sdks.sh b/scripts/copy_sdks.sh index fbe8c269..9dc80b3d 100755 --- a/scripts/copy_sdks.sh +++ b/scripts/copy_sdks.sh @@ -1,5 +1,6 @@ #!/bin/sh +set -euf mkdir -p ./sdks/rust rm -rf ./sdks/rust -cp -r ../rivet-ee/sdks/full/rust ./sdks +cp -r $EE_REPO_PATH/sdks/full/rust ./sdks diff --git a/sdks/rust/docs/EeBackendEnvironment.md b/sdks/rust/docs/EeBackendEnvironment.md index 7e53b72b..ffd5386b 100644 --- a/sdks/rust/docs/EeBackendEnvironment.md +++ b/sdks/rust/docs/EeBackendEnvironment.md @@ -6,6 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **create_ts** | **String** | RFC3339 timestamp | **display_name** | **String** | Represent a resource's readable display name. | +**endpoint** | **String** | | **environment_id** | [**uuid::Uuid**](uuid::Uuid.md) | | **name_id** | **String** | A human readable short identifier used to references resources. Different than a `uuid` because this is intended to be human readable. Different than `DisplayName` because this should not include special characters and be short. | **tier** | [**crate::models::EeBackendTier**](EeBackendTier.md) | | diff --git a/sdks/rust/docs/EeCloudBackendProjectsCreateRequest.md b/sdks/rust/docs/EeCloudBackendProjectsCreateRequest.md index fe68cbdf..df8b75f0 100644 --- a/sdks/rust/docs/EeCloudBackendProjectsCreateRequest.md +++ b/sdks/rust/docs/EeCloudBackendProjectsCreateRequest.md @@ -6,6 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **developer_group_id** | [**uuid::Uuid**](uuid::Uuid.md) | | **display_name** | **String** | Represent a resource's readable display name. | +**game_id** | Option<[**uuid::Uuid**](uuid::Uuid.md)> | | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdks/rust/docs/EeCloudBackendProjectsCreateResponse.md b/sdks/rust/docs/EeCloudBackendProjectsCreateResponse.md index cb508ac5..af654d26 100644 --- a/sdks/rust/docs/EeCloudBackendProjectsCreateResponse.md +++ b/sdks/rust/docs/EeCloudBackendProjectsCreateResponse.md @@ -4,6 +4,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- +**project** | [**crate::models::EeBackendProject**](EeBackendProject.md) | | **project_id** | [**uuid::Uuid**](uuid::Uuid.md) | | [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdks/rust/src/models/ee_backend_environment.rs b/sdks/rust/src/models/ee_backend_environment.rs index 1b55839c..d5df0d45 100644 --- a/sdks/rust/src/models/ee_backend_environment.rs +++ b/sdks/rust/src/models/ee_backend_environment.rs @@ -19,6 +19,8 @@ pub struct EeBackendEnvironment { /// Represent a resource's readable display name. #[serde(rename = "display_name")] pub display_name: String, + #[serde(rename = "endpoint")] + pub endpoint: String, #[serde(rename = "environment_id")] pub environment_id: uuid::Uuid, /// A human readable short identifier used to references resources. Different than a `uuid` because this is intended to be human readable. Different than `DisplayName` because this should not include special characters and be short. @@ -29,10 +31,11 @@ pub struct EeBackendEnvironment { } impl EeBackendEnvironment { - pub fn new(create_ts: String, display_name: String, environment_id: uuid::Uuid, name_id: String, tier: crate::models::EeBackendTier) -> EeBackendEnvironment { + pub fn new(create_ts: String, display_name: String, endpoint: String, environment_id: uuid::Uuid, name_id: String, tier: crate::models::EeBackendTier) -> EeBackendEnvironment { EeBackendEnvironment { create_ts, display_name, + endpoint, environment_id, name_id, tier, diff --git a/sdks/rust/src/models/ee_cloud_backend_projects_create_request.rs b/sdks/rust/src/models/ee_cloud_backend_projects_create_request.rs index 5614253e..1d31e0c5 100644 --- a/sdks/rust/src/models/ee_cloud_backend_projects_create_request.rs +++ b/sdks/rust/src/models/ee_cloud_backend_projects_create_request.rs @@ -18,6 +18,8 @@ pub struct EeCloudBackendProjectsCreateRequest { /// Represent a resource's readable display name. #[serde(rename = "display_name")] pub display_name: String, + #[serde(rename = "game_id", skip_serializing_if = "Option::is_none")] + pub game_id: Option, } impl EeCloudBackendProjectsCreateRequest { @@ -25,6 +27,7 @@ impl EeCloudBackendProjectsCreateRequest { EeCloudBackendProjectsCreateRequest { developer_group_id, display_name, + game_id: None, } } } diff --git a/sdks/rust/src/models/ee_cloud_backend_projects_create_response.rs b/sdks/rust/src/models/ee_cloud_backend_projects_create_response.rs index 37a3abdc..a279a429 100644 --- a/sdks/rust/src/models/ee_cloud_backend_projects_create_response.rs +++ b/sdks/rust/src/models/ee_cloud_backend_projects_create_response.rs @@ -13,13 +13,16 @@ #[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] pub struct EeCloudBackendProjectsCreateResponse { + #[serde(rename = "project")] + pub project: Box, #[serde(rename = "project_id")] pub project_id: uuid::Uuid, } impl EeCloudBackendProjectsCreateResponse { - pub fn new(project_id: uuid::Uuid) -> EeCloudBackendProjectsCreateResponse { + pub fn new(project: crate::models::EeBackendProject, project_id: uuid::Uuid) -> EeCloudBackendProjectsCreateResponse { EeCloudBackendProjectsCreateResponse { + project: Box::new(project), project_id, } }