entertainarr_adapter_sqlite/
tvshow_episode_file.rs1use crate::Wrapper;
2use crate::prelude::HasAnyOf;
3
4use anyhow::Context;
5use entertainarr_domain::media::entity::MediaFile;
6use entertainarr_domain::tvshow::entity::ListEpisodeFileParams;
7use entertainarr_domain::tvshow::entity::TvShowEpisodeFile;
8
9const LIST_QUERY: &str = r#"select tef.tvshow_episode_id, mf.id, mf.disk, mf.filepath, mf.filename, mf.content_type, mf.file_size, mf.created_at, mf.updated_at
10from media_files as mf
11join tvshow_episode_files tef on tef.media_file_id = mf.id
12where true"#;
13
14impl entertainarr_domain::tvshow::prelude::TvShowEpisodeFileRepository for crate::Pool {
15 #[tracing::instrument(
16 skip_all,
17 fields(
18 otel.kind = "client",
19 db.system = "sqlite",
20 db.name = "tvshow",
21 db.operation = "select",
22 db.sql.table = "tvshow_episode_files",
23 db.query.text = tracing::field::Empty,
24 db.response.returned_rows = tracing::field::Empty,
25 error.type = tracing::field::Empty,
26 error.message = tracing::field::Empty,
27 error.stacktrace = tracing::field::Empty,
28 ),
29 err(Debug),
30 )]
31 async fn list<'a>(
32 &self,
33 params: ListEpisodeFileParams<'a>,
34 ) -> anyhow::Result<Vec<TvShowEpisodeFile>> {
35 let mut qb: sqlx::QueryBuilder<sqlx::Sqlite> = sqlx::QueryBuilder::new(LIST_QUERY);
36 if !params.episode_ids.is_empty() {
37 qb.push(" AND ")
38 .push_any("tef.tvshow_episode_id", params.episode_ids);
39 }
40 tracing::Span::current().record("db.query.text", qb.sql());
41 qb.build_query_as()
42 .fetch_all(self.as_ref())
43 .await
44 .inspect(crate::record_all)
45 .inspect_err(crate::record_error)
46 .map(Wrapper::list)
47 .context("unable to fetch episode files")
48 }
49}
50
51impl<'r> sqlx::FromRow<'r, sqlx::sqlite::SqliteRow> for crate::Wrapper<TvShowEpisodeFile> {
52 fn from_row(row: &'r sqlx::sqlite::SqliteRow) -> Result<Self, sqlx::Error> {
53 use sqlx::Row;
54
55 let mut idx = crate::IndexIter::default();
56
57 let tvshow_episode_id: u64 = row.try_get(idx.next())?;
58 let media_file = Wrapper::<MediaFile>::from_index_row(row, &mut idx)?;
59
60 Ok(Wrapper(TvShowEpisodeFile {
61 tvshow_episode_id,
62 media_file: media_file.inner(),
63 }))
64 }
65}