diff --git a/Cargo.lock b/Cargo.lock
index cd416ce..80a40aa 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -855,6 +855,7 @@ dependencies = [
"http-body-util",
"hyper 1.0.0-rc.3",
"lazy_static",
+ "mgmt-api",
"nom",
"nonempty",
"prometheus",
@@ -942,6 +943,13 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+[[package]]
+name = "mgmt-api"
+version = "0.0.1-dev"
+dependencies = [
+ "serde",
+]
+
[[package]]
name = "mime"
version = "0.3.17"
diff --git a/Cargo.toml b/Cargo.toml
index f2d6e9e..f8f0d55 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,7 +1,8 @@
[workspace]
members = [
".",
- "crates/proto-irc"
+ "crates/proto-irc",
+ "crates/mgmt-api",
]
[workspace.package]
@@ -15,6 +16,7 @@ futures-util = "0.3.25"
anyhow = "1.0.68" # error utils
nonempty = "0.8.1"
clap = { version = "4.4.4", features = ["derive"] }
+serde = { version = "1.0.152", features = ["rc", "serde_derive"] }
[package]
name = "lavina"
@@ -27,7 +29,7 @@ anyhow.workspace = true
figment = { version = "0.10.8", features = ["env", "toml"] } # configuration files
hyper = { version = "1.0.0-rc.3,<1.0.0-rc.4", features = ["server", "http1"] } # http server
http-body-util = "0.1.0-rc.3"
-serde = { version = "1.0.152", features = ["rc", "serde_derive"] }
+serde.workspace = true
serde_json = "1.0.93"
tokio.workspace = true
tracing = "0.1.37" # logging & tracing api
@@ -45,6 +47,7 @@ derive_more = "0.99.17"
uuid = { version = "1.3.0", features = ["v4"] }
sqlx = { version = "0.7.0-alpha.2", features = ["sqlite", "migrate"] }
proto-irc = { path = "crates/proto-irc" }
+mgmt-api = { path = "crates/mgmt-api" }
clap.workspace = true
[dev-dependencies]
diff --git a/crates/mgmt-api/Cargo.toml b/crates/mgmt-api/Cargo.toml
new file mode 100644
index 0000000..030f3cf
--- /dev/null
+++ b/crates/mgmt-api/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "mgmt-api"
+edition = "2021"
+version.workspace = true
+publish = false
+
+[dependencies]
+serde.workspace = true
diff --git a/crates/mgmt-api/src/lib.rs b/crates/mgmt-api/src/lib.rs
new file mode 100644
index 0000000..cfe5b69
--- /dev/null
+++ b/crates/mgmt-api/src/lib.rs
@@ -0,0 +1,29 @@
+use serde::{Deserialize, Serialize};
+
+#[derive(Serialize, Deserialize)]
+pub struct ErrorResponse<'a> {
+ pub code: &'a str,
+ pub message: &'a str,
+}
+
+#[derive(Serialize, Deserialize)]
+pub struct CreatePlayerRequest<'a> {
+ pub name: &'a str,
+}
+
+#[derive(Serialize, Deserialize)]
+pub struct ChangePasswordRequest<'a> {
+ pub player_name: &'a str,
+ pub password: &'a str,
+}
+
+pub mod paths {
+ pub const CREATE_PLAYER: &'static str = "/mgmt/create_player";
+ pub const SET_PASSWORD: &'static str = "/mgmt/set_password";
+}
+
+pub mod errors {
+ pub const INVALID_PATH: &'static str = "invalid_path";
+ pub const MALFORMED_REQUEST: &'static str = "malformed_request";
+ pub const PLAYER_NOT_FOUND: &'static str = "player_not_found";
+}
diff --git a/rustfmt.toml b/rustfmt.toml
new file mode 100644
index 0000000..866c756
--- /dev/null
+++ b/rustfmt.toml
@@ -0,0 +1 @@
+max_width = 120
\ No newline at end of file
diff --git a/src/core/repo/mod.rs b/src/core/repo/mod.rs
index 10b601a..57371ed 100644
--- a/src/core/repo/mod.rs
+++ b/src/core/repo/mod.rs
@@ -5,7 +5,7 @@ use std::sync::Arc;
use serde::Deserialize;
use sqlx::sqlite::SqliteConnectOptions;
-use sqlx::{ConnectOptions, Connection, FromRow, SqliteConnection};
+use sqlx::{ConnectOptions, Connection, FromRow, Sqlite, SqliteConnection, Transaction};
use tokio::sync::Mutex;
use crate::prelude::*;
@@ -102,6 +102,50 @@ impl Storage {
res.close().await?;
Ok(())
}
+
+ pub async fn create_user(&mut self, name: &str) -> Result<()> {
+ let query = sqlx::query(
+ "insert into users(name)
+ values (?);",
+ )
+ .bind(name);
+ let mut executor = self.conn.lock().await;
+ query.execute(&mut *executor).await?;
+
+ Ok(())
+ }
+
+ pub async fn set_password<'a>(&'a mut self, name: &'a str, pwd: &'a str) -> Result