Skip to content

Commit 608dd85

Browse files
committed
add blood inventory
1 parent af4fa9f commit 608dd85

2 files changed

Lines changed: 68 additions & 24 deletions

File tree

src/handlers/hospitals.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub struct CreateHospitalRequest {
4141
pub has_blood_bank: bool,
4242
pub accepting_donors: bool,
4343
pub donating_operating_hours: Option<String>,
44+
pub blood_inventory: Option<Vec<BloodInventoryUpdate>>,
4445
}
4546

4647
#[derive(Debug, Deserialize, ToSchema)]
@@ -145,7 +146,7 @@ pub async fn create_hospital(
145146
accepting_donors: hospital.accepting_donors,
146147
donating_operating_hours: hospital.donating_operating_hours,
147148
created_at: hospital.created_at,
148-
blood_inventory: vec![], // New hospital has no inventory yet
149+
blood_inventory: hospitals::service::get_hospital_inventory(&mut conn, hospital.id)?,
149150
};
150151

151152
Ok(ApiResponse::success_with_message(
@@ -447,19 +448,44 @@ pub async fn upload_accreditation_doc(
447448
get,
448449
path = "/api/hospitals",
449450
responses(
450-
(status = 200, body = ApiResponse<Vec<Hospital>>),
451+
(status = 200, body = ApiResponse<Vec<HospitalResponse>>),
451452
(status = 500)
452453
),
453454
tag = "hospitals"
454455
)]
455456
pub async fn get_hospitals(
456457
State(state): State<AppState>,
457-
) -> Result<ApiResponse<Vec<Hospital>>, AppError> {
458+
) -> Result<ApiResponse<Vec<HospitalResponse>>, AppError> {
458459
let mut conn = state.pool.get()?;
459460
let hospitals = hospitals::service::get_hospitals(&mut conn)?;
461+
462+
let mut response = Vec::new();
463+
for hospital in hospitals {
464+
let inventory = hospitals::service::get_hospital_inventory(&mut conn, hospital.id)?;
465+
response.push(HospitalResponse {
466+
id: hospital.id,
467+
name: hospital.name,
468+
hospital_type: hospital.hospital_type,
469+
address: hospital.address,
470+
city: hospital.city,
471+
country: hospital.country,
472+
primary_phone: hospital.primary_phone,
473+
emergency_phone: hospital.emergency_phone,
474+
email: hospital.email,
475+
license_number: hospital.license_number,
476+
accreditation_doc_url: hospital.accreditation_doc_url,
477+
license_status: hospital.license_status,
478+
has_blood_bank: hospital.has_blood_bank,
479+
accepting_donors: hospital.accepting_donors,
480+
donating_operating_hours: hospital.donating_operating_hours,
481+
created_at: hospital.created_at,
482+
blood_inventory: inventory,
483+
});
484+
}
485+
460486
Ok(ApiResponse::success_with_message(
461487
"Hospitals retrieved successfully",
462-
hospitals,
488+
response,
463489
))
464490
}
465491

src/hospitals/service.rs

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,26 +52,44 @@ pub fn create_hospital(
5252
validate_phone_length(emergency, 11, 15)?;
5353
}
5454

55-
let hospital: Hospital = diesel::insert_into(hospitals)
56-
.values((
57-
user_id.eq(user.id),
58-
name.eq(payload.name),
59-
hospital_type.eq(payload.hospital_type),
60-
address.eq(payload.address),
61-
city.eq(payload.city),
62-
country.eq(payload.country),
63-
primary_phone.eq(payload.primary_phone),
64-
emergency_phone.eq(payload.emergency_phone),
65-
email.eq(payload.email),
66-
license_number.eq(payload.license_number),
67-
accreditation_doc_url.eq(payload.accreditation_doc_url),
68-
has_blood_bank.eq(payload.has_blood_bank),
69-
accepting_donors.eq(payload.accepting_donors),
70-
donating_operating_hours.eq(payload.donating_operating_hours),
71-
))
72-
.returning(Hospital::as_select())
73-
.get_result(conn)
74-
.map_err(AppError::from)?;
55+
let hospital: Hospital = conn.transaction::<Hospital, AppError, _>(|conn| {
56+
let hospital: Hospital = diesel::insert_into(hospitals)
57+
.values((
58+
user_id.eq(user.id),
59+
name.eq(payload.name),
60+
hospital_type.eq(payload.hospital_type),
61+
address.eq(payload.address),
62+
city.eq(payload.city),
63+
country.eq(payload.country),
64+
primary_phone.eq(payload.primary_phone),
65+
emergency_phone.eq(payload.emergency_phone),
66+
email.eq(&payload.email),
67+
license_number.eq(payload.license_number),
68+
accreditation_doc_url.eq(payload.accreditation_doc_url),
69+
has_blood_bank.eq(payload.has_blood_bank),
70+
accepting_donors.eq(payload.accepting_donors),
71+
donating_operating_hours.eq(payload.donating_operating_hours),
72+
))
73+
.returning(Hospital::as_select())
74+
.get_result(conn)
75+
.map_err(AppError::from)?;
76+
77+
if let Some(inventory) = payload.blood_inventory {
78+
use crate::schema::hospital_blood_inventories::dsl::*;
79+
for item in inventory {
80+
diesel::insert_into(hospital_blood_inventories)
81+
.values((
82+
hospital_id.eq(hospital.id),
83+
blood_type.eq(item.blood_type),
84+
units_available.eq(item.units_available.unwrap_or(0)),
85+
bank_capacity.eq(item.bank_capacity.unwrap_or(0)),
86+
))
87+
.execute(conn)?;
88+
}
89+
}
90+
91+
Ok(hospital)
92+
})?;
7593

7694
if let Some(ref hospital_email) = hospital.email {
7795
let mail_service = mail_service.clone();

0 commit comments

Comments
 (0)