This commit is contained in:
Philipp Hofer 2025-04-11 15:15:51 +02:00
parent 2f5129c325
commit 0228cec056
2 changed files with 16 additions and 28 deletions

View File

@ -45,16 +45,14 @@ impl Station {
}
pub async fn login(db: &SqlitePool, id: i64, code: &str) -> Option<Self> {
let Some(station) = sqlx::query_as!(
let station = sqlx::query_as!(
Self,
"SELECT id, name, notes, amount_people, last_login, pw, lat, lng FROM station WHERE id = ? AND pw = ?",
id, code
)
.fetch_one(db)
.await
.ok() else {
return None;
};
.ok()?;
sqlx::query!(
"UPDATE station SET last_login = CURRENT_TIMESTAMP WHERE id = ?",
@ -80,13 +78,13 @@ impl Station {
db: &SqlitePool,
team: &Team,
) -> Result<(), String> {
let teams = TeamsAtStationLocation::for_station(db, &self).await;
let teams = TeamsAtStationLocation::for_station(db, self).await;
if !teams.not_yet_here.contains(team) {
return Err(format!("Kann Team nicht der Warteschlange hinzufügen, weil das Team {} nicht zu deiner Station kommen soll.", team.name));
}
Rating::create(db, &self, team).await?;
Rating::create(db, self, team).await?;
Ok(())
}
@ -96,7 +94,7 @@ impl Station {
db: &SqlitePool,
team: &Team,
) -> Result<(), String> {
let teams = TeamsAtStationLocation::for_station(db, &self).await;
let teams = TeamsAtStationLocation::for_station(db, self).await;
let waiting_teams: Vec<&Team> = teams.waiting.iter().map(|(team, _)| team).collect();
@ -104,13 +102,13 @@ impl Station {
return Err(format!("Kann Team nicht von der Warteschlange gelöscht werden, weil das Team {} nicht in der Warteschlange ist.", team.name));
}
Rating::delete(db, &self, team).await?;
Rating::delete(db, self, team).await?;
Ok(())
}
pub(crate) async fn team_starting(&self, db: &SqlitePool, team: &Team) -> Result<(), String> {
let teams = TeamsAtStationLocation::for_station(db, &self).await;
let teams = TeamsAtStationLocation::for_station(db, self).await;
let waiting_teams: Vec<&Team> = teams.waiting.iter().map(|(team, _)| team).collect();
@ -138,7 +136,7 @@ impl Station {
db: &SqlitePool,
team: &Team,
) -> Result<(), String> {
let teams = TeamsAtStationLocation::for_station(db, &self).await;
let teams = TeamsAtStationLocation::for_station(db, self).await;
let doing_teams: Vec<&Team> = teams.doing.iter().map(|(team, _)| team).collect();
@ -162,7 +160,7 @@ impl Station {
}
pub(crate) async fn team_finished(&self, db: &SqlitePool, team: &Team) -> Result<(), String> {
let teams = TeamsAtStationLocation::for_station(db, &self).await;
let teams = TeamsAtStationLocation::for_station(db, self).await;
let doing_teams: Vec<&Team> = teams.doing.iter().map(|(team, _)| team).collect();
@ -190,7 +188,7 @@ impl Station {
db: &SqlitePool,
team: &Team,
) -> Result<(), String> {
let teams = TeamsAtStationLocation::for_station(db, &self).await;
let teams = TeamsAtStationLocation::for_station(db, self).await;
let left_teams: Vec<&Team> = teams.left.iter().map(|(team, _)| team).collect();
@ -307,7 +305,7 @@ impl Station {
let Some(last_login) = &self.last_login else {
return None;
};
let datetime_utc = DateTime::<Utc>::from_naive_utc_and_offset(last_login.clone(), Utc);
let datetime_utc = DateTime::<Utc>::from_naive_utc_and_offset(*last_login, Utc);
Some(datetime_utc.with_timezone(&Local))
}

View File

@ -45,16 +45,6 @@ impl Rating {
.map_err(|e| e.to_string())?;
Ok(())
}
pub(crate) async fn all_with_station(db: &SqlitePool, station: &Station) -> Vec<Self> {
sqlx::query_as::<_, Self>(
"SELECT team_id, station_id, points, notes, arrived_at, started_at, left_at FROM rating WHERE station_id = ?;",
)
.bind(station.id)
.fetch_all(db)
.await
.unwrap()
}
pub async fn find_by_team_and_station(
db: &SqlitePool,
team: &Team,
@ -67,7 +57,7 @@ impl Rating {
}
pub(crate) fn local_time_arrived_at(&self) -> String {
let datetime_utc = DateTime::<Utc>::from_naive_utc_and_offset(self.arrived_at.clone(), Utc);
let datetime_utc = DateTime::<Utc>::from_naive_utc_and_offset(self.arrived_at, Utc);
let datetime_local = datetime_utc.with_timezone(&Local);
datetime_local.format("%H:%M").to_string()
@ -76,7 +66,7 @@ impl Rating {
let Some(started_at) = self.started_at else {
return String::from("noch nicht gestartet");
};
let datetime_utc = DateTime::<Utc>::from_naive_utc_and_offset(started_at.clone(), Utc);
let datetime_utc = DateTime::<Utc>::from_naive_utc_and_offset(started_at, Utc);
let datetime_local = datetime_utc.with_timezone(&Local);
datetime_local.format("%H:%M").to_string()
@ -86,7 +76,7 @@ impl Rating {
let Some(left_at) = self.left_at else {
return String::from("noch nicht fertig");
};
let datetime_utc = DateTime::<Utc>::from_naive_utc_and_offset(left_at.clone(), Utc);
let datetime_utc = DateTime::<Utc>::from_naive_utc_and_offset(left_at, Utc);
let datetime_local = datetime_utc.with_timezone(&Local);
datetime_local.format("%H:%M").to_string()
@ -103,7 +93,7 @@ pub(crate) struct TeamsAtStationLocation {
impl TeamsAtStationLocation {
pub(crate) async fn for_station(db: &SqlitePool, station: &Station) -> TeamsAtStationLocation {
let teams = station.teams(&db).await;
let teams = station.teams(db).await;
let total_teams = teams.len() as i64;
let mut not_yet_here = Vec::new();
@ -112,7 +102,7 @@ impl TeamsAtStationLocation {
let mut left = Vec::new();
for team in teams {
match Rating::find_by_team_and_station(db, &team, &station).await {
match Rating::find_by_team_and_station(db, &team, station).await {
Some(rating) => {
if rating.left_at.is_some() {
left.push((team, rating));