nxtgauge-backend-rust/crates/db/src/models/catering_service.rs

66 lines
2.4 KiB
Rust

use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::{FromRow, PgPool};
use uuid::Uuid;
// catering_service_profiles uses "business_name" instead of "display_name"
#[derive(Debug, Serialize, Deserialize, FromRow)]
pub struct CateringServiceProfile {
pub id: Uuid,
pub user_id: Uuid,
pub business_name: Option<String>,
pub bio: Option<String>,
pub location: Option<String>,
pub custom_data: Option<serde_json::Value>,
pub status: String,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UpsertCateringServiceProfilePayload {
pub business_name: Option<String>,
pub bio: Option<String>,
pub location: Option<String>,
pub custom_data: Option<serde_json::Value>,
}
pub struct CateringServiceRepository;
impl CateringServiceRepository {
pub async fn get_by_user_id(pool: &PgPool, user_id: Uuid) -> Result<Option<CateringServiceProfile>, sqlx::Error> {
sqlx::query_as::<_, CateringServiceProfile>(
r#"SELECT id, user_id, business_name, bio, location,
custom_data,
status, created_at, updated_at
FROM catering_service_profiles WHERE user_id = $1"#,
)
.bind(user_id)
.fetch_optional(pool)
.await
}
pub async fn upsert(pool: &PgPool, user_id: Uuid, p: UpsertCateringServiceProfilePayload) -> Result<CateringServiceProfile, sqlx::Error> {
sqlx::query_as::<_, CateringServiceProfile>(
r#"INSERT INTO catering_service_profiles (user_id, business_name, bio, location, custom_data)
VALUES ($1, $2, $3, $4, $5)
ON CONFLICT (user_id) DO UPDATE SET
business_name = COALESCE(EXCLUDED.business_name, catering_service_profiles.business_name),
bio = EXCLUDED.bio,
location = EXCLUDED.location,
custom_data = EXCLUDED.custom_data,
updated_at = NOW()
RETURNING id, user_id, business_name, bio, location,
custom_data,
status, created_at, updated_at"#,
)
.bind(user_id)
.bind(p.business_name)
.bind(p.bio)
.bind(p.location)
.bind(p.custom_data)
.fetch_one(pool)
.await
}
}