75 lines
2.9 KiB
Python
75 lines
2.9 KiB
Python
"""
|
|
Event Service - Manages celestial events
|
|
"""
|
|
import logging
|
|
from typing import List, Optional
|
|
from datetime import datetime, timedelta
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy import select, delete, func, desc
|
|
from sqlalchemy.orm import selectinload
|
|
from app.models.db.celestial_event import CelestialEvent
|
|
from app.models.schemas.social import CelestialEventCreate, CelestialEventResponse
|
|
from app.models.db.celestial_body import CelestialBody
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class EventService:
|
|
async def create_event(self, event_data: CelestialEventCreate, db: AsyncSession) -> CelestialEvent:
|
|
"""Create a new celestial event"""
|
|
event = CelestialEvent(**event_data.dict())
|
|
db.add(event)
|
|
await db.commit()
|
|
await db.refresh(event)
|
|
logger.info(f"Created celestial event: {event.title} for {event.body_id}")
|
|
return event
|
|
|
|
async def get_event(self, event_id: int, db: AsyncSession) -> Optional[CelestialEvent]:
|
|
"""Get a specific celestial event by ID"""
|
|
result = await db.execute(select(CelestialEvent).where(CelestialEvent.id == event_id))
|
|
return result.scalar_one_or_none()
|
|
|
|
async def get_events(
|
|
self,
|
|
db: AsyncSession,
|
|
body_id: Optional[str] = None,
|
|
start_time: Optional[datetime] = None,
|
|
end_time: Optional[datetime] = None,
|
|
limit: int = 100,
|
|
offset: int = 0
|
|
) -> List[CelestialEvent]:
|
|
"""Get a list of celestial events, with optional filters"""
|
|
query = select(CelestialEvent).options(selectinload(CelestialEvent.body))
|
|
if body_id:
|
|
query = query.where(CelestialEvent.body_id == body_id)
|
|
if start_time:
|
|
query = query.where(CelestialEvent.event_time >= start_time)
|
|
if end_time:
|
|
query = query.where(CelestialEvent.event_time <= end_time)
|
|
|
|
query = query.order_by(CelestialEvent.event_time).offset(offset).limit(limit)
|
|
result = await db.execute(query)
|
|
return result.scalars().all()
|
|
|
|
async def delete_event(self, event_id: int, db: AsyncSession) -> bool:
|
|
"""Delete a celestial event by ID"""
|
|
event = await self.get_event(event_id, db)
|
|
if event:
|
|
await db.delete(event)
|
|
await db.commit()
|
|
logger.info(f"Deleted celestial event: {event.title} (ID: {event.id})")
|
|
return True
|
|
return False
|
|
|
|
async def delete_events_for_body_before(self, body_id: str, before_time: datetime, db: AsyncSession) -> int:
|
|
"""Delete old events for a specific body before a given time"""
|
|
result = await db.execute(
|
|
delete(CelestialEvent).where(
|
|
CelestialEvent.body_id == body_id,
|
|
CelestialEvent.event_time < before_time
|
|
)
|
|
)
|
|
await db.commit()
|
|
return result.rowcount
|
|
|
|
event_service = EventService()
|