use rusqlite::params;
use uuid::Uuid;
use super::{
EnvId, ProjectId, Vault,
error::{DbError, map_rusqlite_error, not_found_or},
};
#[derive(Debug, Clone)]
pub struct Environment {
pub id: EnvId,
pub project_id: ProjectId,
pub name: String,
pub created_at: i64,
pub updated_at: i64,
}
impl Vault {
pub fn create_environment(&self, project_id: &ProjectId, name: &str) -> Result<EnvId, DbError> {
let id = Uuid::new_v4().to_string();
self.conn
.execute(
"INSERT INTO environments (id, project_id, name) VALUES (?1, ?2, ?3)",
params![id, project_id.as_str(), name],
)
.map_err(map_rusqlite_error)?;
Ok(EnvId(id))
}
pub fn get_environment(&self, id: &EnvId) -> Result<Environment, DbError> {
self.conn
.query_row(
"SELECT id, project_id, name, created_at, updated_at
FROM environments
WHERE id = ?1",
params![id.as_str()],
row_to_environment,
)
.map_err(not_found_or)
}
pub fn get_environment_by_name(
&self,
project_id: &ProjectId,
name: &str,
) -> Result<Environment, DbError> {
self.conn
.query_row(
"SELECT id, project_id, name, created_at, updated_at
FROM environments
WHERE project_id = ?1 AND name = ?2",
params![project_id.as_str(), name],
row_to_environment,
)
.map_err(not_found_or)
}
pub fn list_environments(&self, project_id: &ProjectId) -> Result<Vec<Environment>, DbError> {
let mut stmt = self
.conn
.prepare(
"SELECT id, project_id, name, created_at, updated_at
FROM environments
WHERE project_id = ?1
ORDER BY name ASC",
)
.map_err(map_rusqlite_error)?;
let rows = stmt
.query_map(params![project_id.as_str()], row_to_environment)
.map_err(map_rusqlite_error)?;
rows.map(|r| r.map_err(map_rusqlite_error))
.collect::<Result<Vec<Environment>, DbError>>()
}
pub fn delete_environment(&self, id: &EnvId) -> Result<(), DbError> {
let changed = self
.conn
.execute(
"DELETE FROM environments WHERE id = ?1",
params![id.as_str()],
)
.map_err(map_rusqlite_error)?;
if changed == 0 {
return Err(DbError::NotFound);
}
Ok(())
}
}
fn row_to_environment(row: &rusqlite::Row<'_>) -> rusqlite::Result<Environment> {
Ok(Environment {
id: EnvId(row.get(0)?),
project_id: ProjectId(row.get(1)?),
name: row.get(2)?,
created_at: row.get(3)?,
updated_at: row.get(4)?,
})
}