veza/dev-environment/templates/rust-service.template.rs
2025-12-03 22:56:50 +01:00

91 lines
2 KiB
Rust

use anyhow::{Result, Context};
use sqlx::PgPool;
use uuid::Uuid;
/// {{SERVICE_NAME}}Service provides business logic for {{DOMAIN}}
pub struct {{SERVICE_NAME}}Service {
pool: PgPool,
}
impl {{SERVICE_NAME}}Service {
/// Creates a new {{SERVICE_NAME}}Service instance
pub fn new(pool: PgPool) -> Self {
Self { pool }
}
/// Creates a new {{ENTITY}}
pub async fn create_{{ENTITY_LOWER}}(
&self,
request: Create{{ENTITY}}Request,
) -> Result<{{ENTITY}}> {
// Validation
request.validate()?;
// Business logic
let {{ENTITY_LOWER}} = sqlx::query_as!(
{{ENTITY}},
r#"
INSERT INTO {{TABLE_NAME}} (id, /* TODO: add fields */)
VALUES ($1, /* TODO: add values */)
RETURNING id, /* TODO: add fields */
"#,
Uuid::new_v4(),
// TODO: add request fields
)
.fetch_one(&self.pool)
.await
.context("Failed to create {{ENTITY_LOWER}}")?;
Ok({{ENTITY_LOWER}})
}
/// Gets a {{ENTITY}} by ID
pub async fn get_{{ENTITY_LOWER}}_by_id(
&self,
id: Uuid,
) -> Result<{{ENTITY}}> {
let {{ENTITY_LOWER}} = sqlx::query_as!(
{{ENTITY}},
r#"
SELECT id, /* TODO: add fields */
FROM {{TABLE_NAME}}
WHERE id = $1
"#,
id
)
.fetch_optional(&self.pool)
.await
.context("Failed to fetch {{ENTITY_LOWER}}")?
.ok_or_else(|| anyhow::anyhow!("{{ENTITY}} not found"))?;
Ok({{ENTITY_LOWER}})
}
}
/// Request to create a {{ENTITY}}
#[derive(Debug)]
pub struct Create{{ENTITY}}Request {
// TODO: Add request fields
}
impl Create{{ENTITY}}Request {
/// Validates the request
pub fn validate(&self) -> Result<()> {
// TODO: Add validation logic
Ok(())
}
}
/// {{ENTITY}} model
#[derive(Debug)]
pub struct {{ENTITY}} {
pub id: Uuid,
// TODO: Add entity fields
}