musicus/src/backend/database/persons.rs

66 lines
1.8 KiB
Rust
Raw Normal View History

2020-11-17 15:52:47 +01:00
use super::schema::persons;
use super::{Database, DatabaseResult};
2020-11-17 15:52:47 +01:00
use diesel::prelude::*;
use serde::{Deserialize, Serialize};
/// A person that is a composer, an interpret or both.
2020-11-28 21:45:22 +01:00
#[derive(Serialize, Deserialize, Insertable, Queryable, Debug, Clone)]
2020-11-17 15:52:47 +01:00
#[serde(rename_all = "camelCase")]
pub struct Person {
2020-11-28 21:45:22 +01:00
pub id: String,
2020-11-17 15:52:47 +01:00
pub first_name: String,
pub last_name: String,
}
impl Person {
/// Get the full name in the form "First Last".
pub fn name_fl(&self) -> String {
format!("{} {}", self.first_name, self.last_name)
}
/// Get the full name in the form "Last, First".
pub fn name_lf(&self) -> String {
format!("{}, {}", self.last_name, self.first_name)
}
}
impl Database {
/// Update an existing person or insert a new one.
pub fn update_person(&self, person: Person) -> DatabaseResult<()> {
2020-11-17 15:52:47 +01:00
self.defer_foreign_keys()?;
self.connection.transaction(|| {
diesel::replace_into(persons::table)
2020-11-28 21:45:22 +01:00
.values(person)
2020-11-17 15:52:47 +01:00
.execute(&self.connection)
})?;
Ok(())
}
/// Get an existing person.
pub fn get_person(&self, id: &str) -> DatabaseResult<Option<Person>> {
2020-11-28 21:45:22 +01:00
let person = persons::table
.filter(persons::id.eq(id))
.load::<Person>(&self.connection)?
.into_iter()
.next();
2020-11-17 15:52:47 +01:00
Ok(person)
}
/// Delete an existing person.
pub fn delete_person(&self, id: &str) -> DatabaseResult<()> {
2020-11-28 21:45:22 +01:00
diesel::delete(persons::table.filter(persons::id.eq(id))).execute(&self.connection)?;
2020-11-17 15:52:47 +01:00
Ok(())
}
/// Get all existing persons.
pub fn get_persons(&self) -> DatabaseResult<Vec<Person>> {
2020-11-28 21:45:22 +01:00
let persons = persons::table.load::<Person>(&self.connection)?;
2020-11-17 15:52:47 +01:00
Ok(persons)
}
}