lightspeed_cms/repository/pg/
mod.rs

1use crate::repository::pg::pg_content::PgContentRepository;
2use crate::repository::pg::pg_project::PgProjectRepository;
3use crate::repository::pg::pg_schema::PgSchemaRepository;
4use crate::repository::CmsRepositoryManager;
5use c3p0::postgres::*;
6use c3p0::*;
7use lightspeed_core::error::LightSpeedError;
8
9pub mod pg_content;
10pub mod pg_project;
11pub mod pg_schema;
12
13const MIGRATIONS: include_dir::Dir = include_dir::include_dir!("$CARGO_MANIFEST_DIR/src_resources/db/pg/migrations");
14
15#[derive(Clone)]
16pub struct PgCmsRepositoryManager {
17    c3p0: PgC3p0Pool,
18}
19
20impl PgCmsRepositoryManager {
21    pub fn new(c3p0: PgC3p0Pool) -> Self {
22        Self { c3p0 }
23    }
24}
25
26#[async_trait::async_trait]
27impl CmsRepositoryManager for PgCmsRepositoryManager {
28    type Conn = PgConnection;
29    type C3P0 = PgC3p0Pool;
30    type ContentRepo = PgContentRepository;
31    type ProjectRepo = PgProjectRepository;
32    type SchemaRepo = PgSchemaRepository;
33
34    fn c3p0(&self) -> &PgC3p0Pool {
35        &self.c3p0
36    }
37
38    async fn start(&self) -> Result<(), LightSpeedError> {
39        let migrate_table_name = format!("LS_CMS_{C3P0_MIGRATE_TABLE_DEFAULT}");
40
41        let migrate = C3p0MigrateBuilder::new(self.c3p0().clone())
42            .with_table_name(migrate_table_name)
43            .with_migrations(from_embed(&MIGRATIONS).map_err(|err| LightSpeedError::ModuleStartError {
44                message: format!("PgCmsRepositoryManager - failed to read db migrations: {err:?}"),
45            })?)
46            .build();
47
48        migrate.migrate().await.map_err(|err| LightSpeedError::ModuleStartError {
49            message: format!("PgCmsRepositoryManager - db migration failed: {err:?}"),
50        })
51    }
52
53    fn content_repo(&self, table_name: &str) -> Self::ContentRepo {
54        PgContentRepository::new(table_name)
55    }
56
57    fn project_repo(&self) -> Self::ProjectRepo {
58        PgProjectRepository::default()
59    }
60
61    fn schema_repo(&self) -> Self::SchemaRepo {
62        PgSchemaRepository::default()
63    }
64}