94 lines
2.5 KiB
Rust
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())
|
|
}
|