entertainarr_adapter_sqlite/
tvshow_episode_file.rs

1use 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}