54 lines
1.5 KiB
Rust
54 lines
1.5 KiB
Rust
use crate::db::{Dao, TenebrousDbConn};
|
|
use crate::errors::Error;
|
|
use crate::models::characters::{Character, CharacterDataType, DynCharacterData, Visibility};
|
|
use crate::models::users::User;
|
|
use rocket_contrib::templates::Template;
|
|
use serde::Serialize;
|
|
use strum::IntoEnumIterator;
|
|
|
|
#[derive(Serialize)]
|
|
struct EditCharacterContext<'a> {
|
|
pub name: &'a str,
|
|
pub username: &'a str,
|
|
pub data_type: &'a CharacterDataType,
|
|
pub sheet: Box<DynCharacterData>,
|
|
pub state: FormStateContext<'a>,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
struct FormStateContext<'a> {
|
|
pub selected_system: &'a CharacterDataType,
|
|
}
|
|
|
|
#[get("/<owner>/<character_id>/edit")]
|
|
pub(super) async fn edit_character_page(
|
|
character_id: i32,
|
|
owner: String,
|
|
logged_in_user: Option<&User>,
|
|
conn: TenebrousDbConn<'_>,
|
|
) -> Result<Template, Error> {
|
|
let owner = conn.load_user(&owner).await?.ok_or(Error::NotFound)?;
|
|
|
|
let logged_in_user = logged_in_user.ok_or(Error::NotLoggedIn)?;
|
|
let character = conn
|
|
.load_character(character_id)
|
|
.await?
|
|
.ok_or(Error::NotFound)?;
|
|
|
|
if logged_in_user != &owner {
|
|
return Err(Error::NoPermission);
|
|
}
|
|
|
|
let context = EditCharacterContext {
|
|
name: &character.character_name,
|
|
username: &owner.username,
|
|
data_type: &character.data_type,
|
|
sheet: character.dyn_deserialize()?,
|
|
state: FormStateContext {
|
|
selected_system: &character.data_type,
|
|
},
|
|
};
|
|
|
|
Ok(Template::render("characters/edit_character", context))
|
|
}
|