1
0
Fork 0
pique/src/handler/projects.rs

94 lines
2.5 KiB
Rust

use axum::{http::StatusCode, response::Redirect, Form};
use axum_login::AuthSession;
use crate::{
handler::internal_server_error,
models::{
project_memberships::{self, ProjectRole},
projects::{self, NewProject},
users::User,
},
permissions,
prelude::*,
};
use super::internal_error;
pub async fn projects_page(
State(provider): State<Provider>,
auth_session: AuthSession<Provider>,
) -> Response {
if let Some(user) = auth_session.user {
render_projects_page(provider, user).await
} else {
Redirect::to("/login").into_response()
}
}
async fn render_projects_page(provider: Provider, user: User) -> Response {
let mut db = match provider.db_pool.get() {
Ok(db) => db,
Err(err) => {
error!(?err, "failed to get db connection");
return internal_server_error();
}
};
let projects = permissions::query::accessible_projects(&mut db, &user.id).unwrap_or_default();
let values = context! {
user => user,
projects => projects,
};
provider.render_resp("projects/list_projects.html", values)
}
pub async fn create_project_page(
State(provider): State<Provider>,
auth_session: AuthSession<Provider>,
) -> Response {
let user = match auth_session.user {
Some(user) => user,
None => return Redirect::to("/login").into_response(),
};
let values = context! {
user => user,
};
provider.render_resp("projects/create_project.html", values)
}
#[derive(Debug, Deserialize)]
pub struct CreateProjectSubmission {
pub name: String,
pub description: String,
pub key: String,
}
pub async fn create_project_submit(
State(provider): State<Provider>,
auth_session: AuthSession<Provider>,
form: Form<CreateProjectSubmission>,
) -> Result<Response, (StatusCode, String)> {
let mut db = provider.db_pool.get().map_err(internal_error)?;
let user = match auth_session.user {
Some(user) => user,
None => return Ok(Redirect::to("/login").into_response()),
};
let new_project = NewProject::new(
user.id.clone(),
form.name.clone(),
form.description.clone(),
form.key.clone(),
);
// TODO: validation
let project = projects::query::create(&mut db, new_project).map_err(internal_error)?;
let _ = project_memberships::query::create(&mut db, &user.id, &project.id, ProjectRole::Admin)
.map_err(internal_error)?;
Ok(Redirect::to("/projects").into_response())
}