brass/web/src/models/assignement.rs

170 lines
4.9 KiB
Rust

use chrono::{Local, NaiveDateTime, NaiveTime};
use sqlx::{query, PgPool};
use super::{assignment_changeset::AssignmentChangeset, Function, Result};
pub struct Assignment {
pub event_id: i32,
pub availabillity_id: i32,
pub function: Function,
pub start_time: NaiveTime,
pub end_time: NaiveTime,
}
impl Assignment {
pub async fn create(
pool: &PgPool,
event_id: i32,
availabillity_id: i32,
changeset: AssignmentChangeset,
) -> Result<()> {
// TODO: refactor
let date1 = Local::now();
let date2 = Local::now();
query!(
r##"
INSERT INTO assignment (eventId, availabillityId, function, startTimestamp, endTimestamp)
VALUES ($1, $2, $3, $4, $5);
"##,
event_id,
availabillity_id,
changeset.function as Function,
date1,
date2
)
.execute(pool)
.await?;
Ok(())
}
pub async fn read_all_by_availabillity(
pool: &PgPool,
availabillity_id: i32,
) -> Result<Vec<Assignment>> {
let records = query!(
r##"
SELECT
assignment.eventId,
assignment.availabillityId,
assignment.function AS "function: Function",
assignment.startTimestamp,
assignment.endTimestamp
FROM assignment
WHERE assignment.AvailabillityId = $1;
"##,
availabillity_id
)
.fetch_all(pool)
.await?;
let assignemnets = records
.iter()
.map(|r| Assignment {
event_id: r.eventid,
availabillity_id: r.availabillityid,
function: r.function,
// TODO: refactor
start_time: r.starttimestamp.time(),
end_time: r.endtimestamp.time(),
})
.collect();
Ok(assignemnets)
}
pub async fn read_all_by_event(pool: &PgPool, event_id: i32) -> Result<Vec<Assignment>> {
let records = query!(
r##"
SELECT
assignment.eventId,
assignment.availabillityId,
assignment.function AS "function: Function",
assignment.startTimestamp,
assignment.endTimestamp
FROM assignment
WHERE assignment.eventId = $1;
"##,
event_id,
)
.fetch_all(pool)
.await?;
let assignemnets = records
.iter()
.map(|r| Assignment {
event_id: r.eventid,
availabillity_id: r.availabillityid,
function: r.function,
// TODO: refactor
start_time: r.starttimestamp.time(),
end_time: r.endtimestamp.time(),
})
.collect();
Ok(assignemnets)
}
pub async fn read(
pool: &PgPool,
event_id: i32,
availabillity_id: i32,
) -> Result<Option<Assignment>> {
let record = query!(
r##"
SELECT
assignment.eventId,
assignment.availabillityId,
assignment.function AS "function: Function",
assignment.startTimestamp,
assignment.endTimestamp
FROM assignment
WHERE
assignment.eventId = $1 AND
assignment.availabillityId = $2;
"##,
event_id,
availabillity_id
)
.fetch_optional(pool)
.await?;
let assignemnet = record.map(|r| Assignment {
event_id: r.eventid,
availabillity_id: r.availabillityid,
function: r.function,
// TODO: refactor
start_time: r.starttimestamp.time(),
end_time: r.endtimestamp.time(),
});
Ok(assignemnet)
}
pub async fn update(
pool: &PgPool,
event_id: i32,
availabillity_id: i32,
changeset: AssignmentChangeset,
) -> Result<()> {
// TODO: refactor
let date1 = Local::now();
let date2 = Local::now();
query!("UPDATE assignment SET function = $1, startTimestamp = $2, endTimestamp = $3 WHERE eventId = $4 AND availabillityId = $5;", changeset.function as Function, date1, date2, event_id, availabillity_id).execute(pool).await?;
Ok(())
}
pub async fn delete(pool: &PgPool, event_id: i32, availabillity_id: i32) -> Result<()> {
query!("DELETE FROM assignment WHERE assignment.eventId = $1 AND assignment.availabillityId = $2;",
event_id,
availabillity_id
)
.execute(pool)
.await?;
Ok(())
}
}