mirror of
https://github.com/johrpan/musicus.git
synced 2025-10-26 19:57:25 +01:00
database: Add methods to query mediums
This commit is contained in:
parent
93c55d8892
commit
2ded5a659a
2 changed files with 67 additions and 1 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
use super::generate_id;
|
use super::generate_id;
|
||||||
use super::schema::{mediums, recordings, track_sets, tracks};
|
use super::schema::{ensembles, mediums, performances, persons, recordings, track_sets, tracks};
|
||||||
use super::{Database, Error, Recording, Result};
|
use super::{Database, Error, Recording, Result};
|
||||||
use diesel::prelude::*;
|
use diesel::prelude::*;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
@ -167,6 +167,50 @@ impl Database {
|
||||||
Ok(medium)
|
Ok(medium)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get mediums on which this person is performing.
|
||||||
|
pub fn get_mediums_for_person(&self, person_id: &str) -> Result<Vec<Medium>> {
|
||||||
|
let mut mediums: Vec<Medium> = Vec::new();
|
||||||
|
|
||||||
|
let rows = mediums::table
|
||||||
|
.inner_join(track_sets::table.on(track_sets::medium.eq(mediums::id)))
|
||||||
|
.inner_join(recordings::table.on(recordings::id.eq(track_sets::recording)))
|
||||||
|
.inner_join(performances::table.on(performances::recording.eq(recordings::id)))
|
||||||
|
.inner_join(persons::table.on(persons::id.nullable().eq(performances::person)))
|
||||||
|
.filter(persons::id.eq(person_id))
|
||||||
|
.select(mediums::table::all_columns())
|
||||||
|
.distinct()
|
||||||
|
.load::<MediumRow>(&self.connection)?;
|
||||||
|
|
||||||
|
for row in rows {
|
||||||
|
let medium = self.get_medium_data(row)?;
|
||||||
|
mediums.push(medium);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(mediums)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get mediums on which this ensemble is performing.
|
||||||
|
pub fn get_mediums_for_ensemble(&self, ensemble_id: &str) -> Result<Vec<Medium>> {
|
||||||
|
let mut mediums: Vec<Medium> = Vec::new();
|
||||||
|
|
||||||
|
let rows = mediums::table
|
||||||
|
.inner_join(track_sets::table.on(track_sets::medium.eq(mediums::id)))
|
||||||
|
.inner_join(recordings::table.on(recordings::id.eq(track_sets::recording)))
|
||||||
|
.inner_join(performances::table.on(performances::recording.eq(recordings::id)))
|
||||||
|
.inner_join(ensembles::table.on(ensembles::id.nullable().eq(performances::ensemble)))
|
||||||
|
.filter(ensembles::id.eq(ensemble_id))
|
||||||
|
.select(mediums::table::all_columns())
|
||||||
|
.distinct()
|
||||||
|
.load::<MediumRow>(&self.connection)?;
|
||||||
|
|
||||||
|
for row in rows {
|
||||||
|
let medium = self.get_medium_data(row)?;
|
||||||
|
mediums.push(medium);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(mediums)
|
||||||
|
}
|
||||||
|
|
||||||
/// Delete a medium and all of its tracks. This will fail, if the music
|
/// Delete a medium and all of its tracks. This will fail, if the music
|
||||||
/// library contains audio files referencing any of those tracks.
|
/// library contains audio files referencing any of those tracks.
|
||||||
pub fn delete_medium(&self, id: &str) -> Result<()> {
|
pub fn delete_medium(&self, id: &str) -> Result<()> {
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@ pub enum Action {
|
||||||
RecordingExists(String, Sender<Result<bool>>),
|
RecordingExists(String, Sender<Result<bool>>),
|
||||||
UpdateMedium(Medium, Sender<Result<()>>),
|
UpdateMedium(Medium, Sender<Result<()>>),
|
||||||
GetMedium(String, Sender<Result<Option<Medium>>>),
|
GetMedium(String, Sender<Result<Option<Medium>>>),
|
||||||
|
GetMediumsForPerson(String, Sender<Result<Vec<Medium>>>),
|
||||||
|
GetMediumsForEnsemble(String, Sender<Result<Vec<Medium>>>),
|
||||||
DeleteMedium(String, Sender<Result<()>>),
|
DeleteMedium(String, Sender<Result<()>>),
|
||||||
GetTrackSets(String, Sender<Result<Vec<TrackSet>>>),
|
GetTrackSets(String, Sender<Result<Vec<TrackSet>>>),
|
||||||
Stop(Sender<()>),
|
Stop(Sender<()>),
|
||||||
|
|
@ -130,6 +132,12 @@ impl DbThread {
|
||||||
GetMedium(id, sender) => {
|
GetMedium(id, sender) => {
|
||||||
sender.send(db.get_medium(&id)).unwrap();
|
sender.send(db.get_medium(&id)).unwrap();
|
||||||
}
|
}
|
||||||
|
GetMediumsForPerson(id, sender) => {
|
||||||
|
sender.send(db.get_mediums_for_person(&id)).unwrap();
|
||||||
|
}
|
||||||
|
GetMediumsForEnsemble(id, sender) => {
|
||||||
|
sender.send(db.get_mediums_for_ensemble(&id)).unwrap();
|
||||||
|
}
|
||||||
DeleteMedium(id, sender) => {
|
DeleteMedium(id, sender) => {
|
||||||
sender.send(db.delete_medium(&id)).unwrap();
|
sender.send(db.delete_medium(&id)).unwrap();
|
||||||
}
|
}
|
||||||
|
|
@ -338,6 +346,20 @@ impl DbThread {
|
||||||
receiver.await?
|
receiver.await?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get all mediums on which a person performs.
|
||||||
|
pub async fn get_mediums_for_person(&self, id: &str) -> Result<Vec<Medium>> {
|
||||||
|
let (sender, receiver) = oneshot::channel();
|
||||||
|
self.action_sender.send(GetMediumsForPerson(id.to_owned(), sender))?;
|
||||||
|
receiver.await?
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get all mediums on which an ensemble performs.
|
||||||
|
pub async fn get_mediums_for_ensemble(&self, id: &str) -> Result<Vec<Medium>> {
|
||||||
|
let (sender, receiver) = oneshot::channel();
|
||||||
|
self.action_sender.send(GetMediumsForEnsemble(id.to_owned(), sender))?;
|
||||||
|
receiver.await?
|
||||||
|
}
|
||||||
|
|
||||||
/// Get all track sets for a recording.
|
/// Get all track sets for a recording.
|
||||||
pub async fn get_track_sets(&self, recording_id: &str) -> Result<Vec<TrackSet>> {
|
pub async fn get_track_sets(&self, recording_id: &str) -> Result<Vec<TrackSet>> {
|
||||||
let (sender, receiver) = oneshot::channel();
|
let (sender, receiver) = oneshot::channel();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue