feat: Implement user management with a new add_user binary and refactor state handling into a dedicated store module.
This commit is contained in:
+5
-54
@@ -1,63 +1,14 @@
|
||||
use rocket::fs::FileServer;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fs::File;
|
||||
use std::io::BufReader;
|
||||
use std::sync::Mutex;
|
||||
|
||||
use crate::items::Game;
|
||||
use backend::auth;
|
||||
use backend::items::{self, Game};
|
||||
use backend::proto_utils;
|
||||
use backend::store::{self, User, save_state};
|
||||
|
||||
#[macro_use]
|
||||
extern crate rocket;
|
||||
|
||||
pub mod items {
|
||||
include!(concat!(env!("OUT_DIR"), "/items.rs"));
|
||||
}
|
||||
|
||||
mod auth;
|
||||
mod proto_utils;
|
||||
|
||||
#[derive(Clone, Serialize, Deserialize)]
|
||||
pub struct User {
|
||||
pub person: items::Person,
|
||||
pub password_hash: String,
|
||||
}
|
||||
|
||||
impl std::ops::Deref for User {
|
||||
type Target = items::Person;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
&self.person
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
struct PersistentState {
|
||||
games: Vec<Game>,
|
||||
users: Vec<User>,
|
||||
}
|
||||
|
||||
const STATE_FILE: &str = "state.json";
|
||||
|
||||
fn save_state(games: &[Game], users: &[User]) {
|
||||
let state = PersistentState {
|
||||
games: games.to_vec(),
|
||||
users: users.to_vec(),
|
||||
};
|
||||
if let Ok(file) = File::create(STATE_FILE) {
|
||||
let _ = serde_json::to_writer_pretty(file, &state);
|
||||
}
|
||||
}
|
||||
|
||||
fn load_state() -> Option<(Vec<Game>, Vec<User>)> {
|
||||
if let Ok(file) = File::open(STATE_FILE) {
|
||||
let reader = BufReader::new(file);
|
||||
if let Ok(state) = serde_json::from_reader::<_, PersistentState>(reader) {
|
||||
return Some((state.games, state.users));
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
#[get("/<name>")]
|
||||
fn get_user(
|
||||
_token: auth::Token,
|
||||
@@ -178,7 +129,7 @@ async fn index_fallback() -> Option<rocket::fs::NamedFile> {
|
||||
|
||||
#[rocket::main]
|
||||
async fn main() -> Result<(), std::io::Error> {
|
||||
let (game_list, user_list) = load_state().unwrap_or_else(|| {
|
||||
let (game_list, user_list) = store::load_state().unwrap_or_else(|| {
|
||||
let mut game_list: Vec<Game> = Vec::new();
|
||||
let mut user_list: Vec<User> = Vec::new();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user