After_Chido_Api/services/shelter_service.py

72 lines
2.8 KiB
Python

from sqlalchemy import insert, select, update, delete
from fastapi import HTTPException
from models.db import shelters_table
from models.schemas import Shelter
from sqlalchemy.ext.asyncio import AsyncSession
class ShelterService:
@staticmethod
async def create_shelter(shelter: Shelter, db: AsyncSession):
query = insert(shelters_table).values(
label=shelter.label,
description=shelter.description,
status=shelter.status,
contact_person=shelter.contact_person,
gps_coordinates=shelter.gps_coordinates,
added_by=shelter.added_by,
)
try:
result = await db.execute(query)
await db.commit()
shelter_id = result.inserted_primary_key[0]
return {"id": shelter_id, **shelter.dict()}
except Exception as e:
await db.rollback()
raise HTTPException(status_code=500, detail=f"Could not create shelter: {str(e)}")
@staticmethod
async def get_shelter(shelter_id: int, db: AsyncSession):
query = select(shelters_table).where(shelters_table.c.id == shelter_id)
result = await db.execute(query)
shelter = result.fetchone()
if not shelter:
raise HTTPException(status_code=404, detail="Shelter not found")
return dict(shelter)
@staticmethod
async def get_all_shelters(db: AsyncSession):
query = select(shelters_table)
result = await db.execute(query)
return [dict(row) for row in result.fetchall()]
@staticmethod
async def update_shelter(shelter_id: int, data: dict, db: AsyncSession):
query = (
update(shelters_table)
.where(shelters_table.c.id == shelter_id)
.values(**data)
)
try:
result = await db.execute(query)
if result.rowcount == 0:
raise HTTPException(status_code=404, detail="Shelter not found")
await db.commit()
return {"message": "Shelter updated successfully"}
except Exception as e:
await db.rollback()
raise HTTPException(status_code=500, detail=f"Could not update shelter: {str(e)}")
@staticmethod
async def delete_shelter(shelter_id: int, db: AsyncSession):
query = delete(shelters_table).where(shelters_table.c.id == shelter_id)
try:
result = await db.execute(query)
if result.rowcount == 0:
raise HTTPException(status_code=404, detail="Shelter not found")
await db.commit()
return {"message": "Shelter deleted successfully"}
except Exception as e:
await db.rollback()
raise HTTPException(status_code=500, detail=f"Could not delete shelter: {str(e)}")