lightspeed_cms/repository/pg/
mod.rs1use 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}