From da7164317681aeca442ccef6ed0a74ad1952f0bf Mon Sep 17 00:00:00 2001 From: Ilion Beyst Date: Sun, 27 Feb 2022 21:47:17 +0100 Subject: [PATCH] seed simplebot on server startup --- .../migrations/2021-12-18-130837_bots/up.sql | 4 +-- planetwars-server/src/lib.rs | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/planetwars-server/migrations/2021-12-18-130837_bots/up.sql b/planetwars-server/migrations/2021-12-18-130837_bots/up.sql index a23fbf7..b158940 100644 --- a/planetwars-server/migrations/2021-12-18-130837_bots/up.sql +++ b/planetwars-server/migrations/2021-12-18-130837_bots/up.sql @@ -1,11 +1,9 @@ CREATE TABLE bots ( id serial PRIMARY KEY, owner_id integer REFERENCES users(id), - name text NOT NULL + name text UNIQUE NOT NULL ); -CREATE UNIQUE INDEX bots_index ON bots(owner_id, name); - CREATE TABLE code_bundles ( id serial PRIMARY KEY, bot_id integer REFERENCES bots(id), diff --git a/planetwars-server/src/lib.rs b/planetwars-server/src/lib.rs index 89b3d7a..ec12997 100644 --- a/planetwars-server/src/lib.rs +++ b/planetwars-server/src/lib.rs @@ -28,12 +28,38 @@ use axum::{ const BOTS_DIR: &str = "./data/bots"; const MATCHES_DIR: &str = "./data/matches"; const MAPS_DIR: &str = "./data/maps"; +const SIMPLEBOT_PATH: &str = "../simplebot/simplebot.py"; type ConnectionPool = bb8::Pool>; +pub async fn seed_simplebot(pool: &ConnectionPool) { + let conn = pool.get().await.expect("could not get database connection"); + // This transaction is expected to fail when simplebot already exists. + let _res = conn.transaction::<(), diesel::result::Error, _>(|| { + use db::bots::NewBot; + + let new_bot = NewBot { + name: "simplebot", + owner_id: None, + }; + + let simplebot = db::bots::create_bot(&new_bot, &conn)?; + + let simplebot_code = + std::fs::read_to_string(SIMPLEBOT_PATH).expect("could not read simplebot code"); + + modules::bots::save_code_bundle(&simplebot_code, Some(simplebot.id), &conn)?; + + println!("initialized simplebot"); + + Ok(()) + }); +} + pub async fn prepare_db(database_url: &str) -> Pool> { let manager = DieselConnectionManager::::new(database_url); let pool = bb8::Pool::builder().build(manager).await.unwrap(); + seed_simplebot(&pool).await; return pool; }