87 lines
3.4 KiB
Python
87 lines
3.4 KiB
Python
from sqlalchemy import insert, select, update, delete
|
|
from fastapi import HTTPException
|
|
from models.db import shelters_table
|
|
from models.schemas import Shelter, UpdateShelter
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from services.auth_service import AuthService
|
|
|
|
|
|
class ShelterService:
|
|
|
|
permissions = ["admin", "moderator"]
|
|
|
|
@staticmethod
|
|
async def create_shelter(shelter: Shelter, db, token):
|
|
user = await AuthService.get_current_user(token, db)
|
|
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=user["id"],
|
|
)
|
|
try:
|
|
result = await db.execute(query)
|
|
await db.commit()
|
|
shelter_id = result.inserted_primary_key[0]
|
|
return {"id": shelter_id, **shelter.model_dump()}
|
|
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):
|
|
query = select(shelters_table).where(shelters_table.c.id == shelter_id)
|
|
result = await db.execute(query)
|
|
shelter = result.mappings().fetchone()
|
|
if not shelter:
|
|
raise HTTPException(status_code=404, detail="Shelter not found")
|
|
return dict(shelter)
|
|
|
|
@staticmethod
|
|
async def get_all_shelters(db):
|
|
query = select(shelters_table)
|
|
result = await db.execute(query)
|
|
shelters = result.mappings().fetchall()
|
|
return [dict(shelter) for shelter in shelters]
|
|
|
|
@staticmethod
|
|
async def update_shelter(shelter_id: int, shelter: UpdateShelter, db, token):
|
|
user = await AuthService.get_current_user(token, db)
|
|
update_values = shelter.model_dump(exclude_unset=True)
|
|
if not update_values:
|
|
raise HTTPException(status_code=400, detail="No fields provided for update")
|
|
|
|
query = (
|
|
update(shelters_table)
|
|
.where(shelters_table.c.id == shelter_id)
|
|
.values(**update_values,
|
|
added_by=user["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 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, token):
|
|
#await AuthService.check_permissions(token, db, ShelterService.permissions)
|
|
await AuthService.admin_required(token, db)
|
|
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)}")
|