From 5b10d5e98e806ce867d27c4cc7b7f5651656744f Mon Sep 17 00:00:00 2001 From: Ilion Beyst Date: Mon, 3 Jan 2022 23:33:00 +0100 Subject: [PATCH] add match_state to matches --- planetwars-server/Cargo.toml | 3 +- planetwars-server/diesel.toml | 1 + .../2022-01-02-105610_matches/down.sql | 3 +- .../2022-01-02-105610_matches/up.sql | 5 +++- planetwars-server/src/db/matches.rs | 3 ++ planetwars-server/src/db_types.rs | 9 ++++++ planetwars-server/src/lib.rs | 1 + planetwars-server/src/routes/matches.rs | 9 ++++-- planetwars-server/src/schema.rs | 28 ++++++++++++++++++- 9 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 planetwars-server/src/db_types.rs diff --git a/planetwars-server/Cargo.toml b/planetwars-server/Cargo.toml index 198d38f..77e8fe9 100644 --- a/planetwars-server/Cargo.toml +++ b/planetwars-server/Cargo.toml @@ -10,6 +10,7 @@ tokio = { version = "1.15", features = ["full"] } hyper = "0.14" axum = { version = "0.4", features = ["json", "headers", "multipart"] } diesel = { version = "1.4.4", features = ["postgres", "chrono"] } +diesel-derive-enum = { version = "1.1", features = ["postgres"] } bb8 = "0.7" bb8-diesel = "0.2" dotenv = "0.15.0" @@ -28,4 +29,4 @@ planetwars-matchrunner = { path = "../planetwars-matchrunner" } shlex = "1.1" [dev-dependencies] -parking_lot = "0.11" \ No newline at end of file +parking_lot = "0.11" diff --git a/planetwars-server/diesel.toml b/planetwars-server/diesel.toml index 92267c8..d95631b 100644 --- a/planetwars-server/diesel.toml +++ b/planetwars-server/diesel.toml @@ -3,3 +3,4 @@ [print_schema] file = "src/schema.rs" +import_types = ["diesel::sql_types::*", "crate::db_types::*"] diff --git a/planetwars-server/migrations/2022-01-02-105610_matches/down.sql b/planetwars-server/migrations/2022-01-02-105610_matches/down.sql index eadd0fa..430bb1b 100644 --- a/planetwars-server/migrations/2022-01-02-105610_matches/down.sql +++ b/planetwars-server/migrations/2022-01-02-105610_matches/down.sql @@ -1,3 +1,4 @@ DROP TABLE match_players; DROP INDEX match_created_at; -DROP TABLE matches; \ No newline at end of file +DROP TABLE matches; +DROP TYPE match_state; \ No newline at end of file diff --git a/planetwars-server/migrations/2022-01-02-105610_matches/up.sql b/planetwars-server/migrations/2022-01-02-105610_matches/up.sql index 88c8c9e..ace13fd 100644 --- a/planetwars-server/migrations/2022-01-02-105610_matches/up.sql +++ b/planetwars-server/migrations/2022-01-02-105610_matches/up.sql @@ -1,5 +1,8 @@ +CREATE TYPE match_state AS ENUM ('playing', 'ended'); + CREATE TABLE matches ( - id SERIAL PRIMARY KEY, + id SERIAL PRIMARY KEY NOT NULL, + state match_state NOT NULL, log_path text NOT NULL, created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ); diff --git a/planetwars-server/src/db/matches.rs b/planetwars-server/src/db/matches.rs index 9bf00db..36c2200 100644 --- a/planetwars-server/src/db/matches.rs +++ b/planetwars-server/src/db/matches.rs @@ -1,3 +1,4 @@ +pub use crate::db_types::MatchState; use chrono::NaiveDateTime; use diesel::{BelongingToDsl, QueryDsl, RunQueryDsl}; use diesel::{Connection, GroupedBy, PgConnection, QueryResult}; @@ -7,6 +8,7 @@ use crate::schema::{match_players, matches}; #[derive(Insertable)] #[table_name = "matches"] pub struct NewMatch<'a> { + pub state: MatchState, pub log_path: &'a str, } @@ -25,6 +27,7 @@ pub struct NewMatchPlayer { #[table_name = "matches"] pub struct MatchBase { pub id: i32, + pub state: MatchState, pub log_path: String, pub created_at: NaiveDateTime, } diff --git a/planetwars-server/src/db_types.rs b/planetwars-server/src/db_types.rs new file mode 100644 index 0000000..d1225d7 --- /dev/null +++ b/planetwars-server/src/db_types.rs @@ -0,0 +1,9 @@ +use diesel_derive_enum::DbEnum; + +#[derive(DbEnum, Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[DieselType = "Match_state"] + +pub enum MatchState { + Playing, + Finished, +} diff --git a/planetwars-server/src/lib.rs b/planetwars-server/src/lib.rs index 754d062..b5a204e 100644 --- a/planetwars-server/src/lib.rs +++ b/planetwars-server/src/lib.rs @@ -4,6 +4,7 @@ extern crate diesel; pub mod db; +pub mod db_types; pub mod routes; pub mod schema; diff --git a/planetwars-server/src/routes/matches.rs b/planetwars-server/src/routes/matches.rs index 4dfd44e..fed0f7b 100644 --- a/planetwars-server/src/routes/matches.rs +++ b/planetwars-server/src/routes/matches.rs @@ -1,4 +1,4 @@ -use std::{io::Read, path::PathBuf}; +use std::path::PathBuf; use axum::{ extract::{Extension, Path}, @@ -10,7 +10,11 @@ use rand::{distributions::Alphanumeric, Rng}; use serde::{Deserialize, Serialize}; use crate::{ - db::{bots, matches, users::User}, + db::{ + bots, + matches::{self, MatchState}, + users::User, + }, ConnectionPool, DatabaseConnection, BOTS_DIR, MAPS_DIR, MATCHES_DIR, }; @@ -81,6 +85,7 @@ async fn run_match_task( pool: ConnectionPool, ) { let match_data = matches::NewMatch { + state: MatchState::Finished, log_path: &log_file_name, }; diff --git a/planetwars-server/src/schema.rs b/planetwars-server/src/schema.rs index 413c4d1..7f60d64 100644 --- a/planetwars-server/src/schema.rs +++ b/planetwars-server/src/schema.rs @@ -1,4 +1,7 @@ table! { + use diesel::sql_types::*; + use crate::db_types::*; + bots (id) { id -> Int4, owner_id -> Int4, @@ -7,6 +10,9 @@ table! { } table! { + use diesel::sql_types::*; + use crate::db_types::*; + code_bundles (id) { id -> Int4, bot_id -> Int4, @@ -16,6 +22,9 @@ table! { } table! { + use diesel::sql_types::*; + use crate::db_types::*; + match_players (match_id, player_id) { match_id -> Int4, bot_id -> Int4, @@ -24,14 +33,21 @@ table! { } table! { + use diesel::sql_types::*; + use crate::db_types::*; + matches (id) { id -> Int4, + state -> Match_state, log_path -> Text, created_at -> Timestamp, } } table! { + use diesel::sql_types::*; + use crate::db_types::*; + sessions (id) { id -> Int4, user_id -> Int4, @@ -40,6 +56,9 @@ table! { } table! { + use diesel::sql_types::*; + use crate::db_types::*; + users (id) { id -> Int4, username -> Varchar, @@ -54,4 +73,11 @@ joinable!(match_players -> bots (bot_id)); joinable!(match_players -> matches (match_id)); joinable!(sessions -> users (user_id)); -allow_tables_to_appear_in_same_query!(bots, code_bundles, match_players, matches, sessions, users,); +allow_tables_to_appear_in_same_query!( + bots, + code_bundles, + match_players, + matches, + sessions, + users, +);