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, auth_session: AuthSession, ) -> 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, auth_session: AuthSession, ) -> 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, auth_session: AuthSession, form: Form, ) -> Result { 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()) }