peer-group-grading/crates/backend/src/db/project.rs
Mika Bomm 4828b7e907
Some checks failed
ci/woodpecker/push/check_fmt Pipeline failed
feat: implement user login functionality with session management
2025-04-03 13:58:18 +02:00

84 lines
2.2 KiB
Rust

use super::Database;
use crate::error::ApiError;
use log::debug;
use crate::entity::project;
use sea_orm::ActiveValue::{NotSet, Set, Unchanged};
use sea_orm::{ActiveModelTrait, DeleteResult, EntityTrait};
use serde::Deserialize;
use uuid::Uuid;
use validator::Validate;
#[derive(Deserialize, Validate)]
pub struct CreateProject {
#[validate(length(min = 3))]
name: String,
}
impl Database {
pub async fn get_projects(&self) -> Result<Vec<project::Model>, ApiError> {
debug!("Fetching all projects");
let projects = project::Entity::find().all(&self.conn).await?;
Ok(projects)
}
pub async fn get_project(&self, id: &Uuid) -> Result<Option<project::Model>, ApiError> {
debug!("Fetching project with id: {}", id);
let project = project::Entity::find_by_id(id.to_owned())
.one(&self.conn)
.await?;
if project.is_none() {
return Err(ApiError::NotFound);
}
Ok(project)
}
pub async fn create_project(
&self,
create_project: CreateProject,
) -> Result<project::Model, ApiError> {
debug!("Creating project with name: {}", create_project.name);
let project = project::ActiveModel {
id: NotSet,
name: Set(create_project.name),
};
let project = project.insert(&self.conn).await?;
Ok(project)
}
pub async fn update_project(
&self,
id: &Uuid,
project: CreateProject,
) -> Result<project::Model, ApiError> {
debug!("Updating project with id: {}", &id);
let active_model = project::ActiveModel {
id: Unchanged(*id),
name: Set(project.name),
};
let project = active_model.update(&self.conn).await?;
Ok(project)
}
pub async fn delete_project(&self, id: &Uuid) -> Result<DeleteResult, ApiError> {
debug!("Deleting project with id: {}", id);
let project = project::Entity::delete_by_id(id.to_owned())
.exec(&self.conn)
.await?;
if project.rows_affected == 0 {
return Err(ApiError::NotFound);
}
Ok(project)
}
}