1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
use crate::model::project::ProjectData; use crate::repository::ProjectRepository; use c3p0::postgres::*; use c3p0::*; use lightspeed_core::error::LightSpeedError; use std::ops::Deref; #[derive(Clone)] pub struct PgProjectRepository { repo: PgC3p0Json<ProjectData, DefaultJsonCodec>, } impl Deref for PgProjectRepository { type Target = PgC3p0Json<ProjectData, DefaultJsonCodec>; fn deref(&self) -> &Self::Target { &self.repo } } impl Default for PgProjectRepository { fn default() -> Self { PgProjectRepository { repo: C3p0JsonBuilder::new("LS_CMS_PROJECT").build() } } } #[async_trait::async_trait] impl ProjectRepository for PgProjectRepository { type Conn = PgConnection; async fn fetch_by_id(&self, conn: &mut Self::Conn, id: i64) -> Result<Model<ProjectData>, LightSpeedError> { Ok(self.repo.fetch_one_by_id(conn, &id).await?) } async fn exists_by_name(&self, conn: &mut Self::Conn, name: &str) -> Result<bool, LightSpeedError> { let sql = r#" select count(*) from LS_CMS_PROJECT where LS_CMS_PROJECT.DATA ->> 'name' = $1 "#; Ok(conn .fetch_one(sql, &[&name], |row| { let count: i64 = row.get(0); Ok(count > 0) }) .await?) } async fn save( &self, conn: &mut Self::Conn, model: NewModel<ProjectData>, ) -> Result<Model<ProjectData>, LightSpeedError> { Ok(self.repo.save(conn, model).await?) } async fn update( &self, conn: &mut Self::Conn, model: Model<ProjectData>, ) -> Result<Model<ProjectData>, LightSpeedError> { Ok(self.repo.update(conn, model).await?) } async fn delete( &self, conn: &mut Self::Conn, model: Model<ProjectData>, ) -> Result<Model<ProjectData>, LightSpeedError> { Ok(self.repo.delete(conn, model).await?) } }