Basisimplementierung für Mailversandt.
This commit is contained in:
parent
8505e9217a
commit
531b9cb10e
14 changed files with 520 additions and 41 deletions
65
app/api.py
65
app/api.py
|
|
@ -1,24 +1,46 @@
|
|||
from fastapi import FastAPI, Depends, HTTPException
|
||||
from contextlib import asynccontextmanager
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from app.db import Base, engine, SessionLocal
|
||||
from app.db import Base, engine, get_session
|
||||
from app.schemas import CreateJobRequest, JobInfo, TaskInfo
|
||||
from app.schema_utils import job_to_schema
|
||||
from app.services import create_job, get_job_with_tasks
|
||||
from app.models import Job, Task
|
||||
|
||||
from app.routers.mail import router as mail_router
|
||||
|
||||
from typing import List
|
||||
from uuid import UUID
|
||||
import re, idna
|
||||
|
||||
app = FastAPI(title="Task Queue API", version="0.3.0")
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
# STARTUP Beispiele
|
||||
# await init_db_pool
|
||||
# await init_broker()
|
||||
|
||||
async def get_session() -> AsyncSession:
|
||||
async with SessionLocal() as session:
|
||||
yield session
|
||||
# Optionale Werte Beispiele
|
||||
# app.state.db_pool = get_db_pool
|
||||
# app.state.broker = get_broker()
|
||||
|
||||
@app.on_event("startup")
|
||||
async def on_startup():
|
||||
async with engine.begin() as conn:
|
||||
# Beispiel: DB-Update beim Startup
|
||||
#await conn.run_sync(Base.metadata.create_all)
|
||||
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
# SHUTDOWN Beispiele
|
||||
# await close_broker()
|
||||
# await close_db_pool()
|
||||
pass
|
||||
#await conn.run_sync(Base.metadata.create_all)
|
||||
|
||||
app = FastAPI(
|
||||
title="Task Queue API",
|
||||
version="0.3.0",
|
||||
lifespan=lifespan)
|
||||
|
||||
app.include_router(mail_router)
|
||||
|
||||
|
||||
DOMAIN_RE = re.compile(r"^(?=.{1,253}$)(?!-)[A-Za-z0-9-]{1,63}(?<!-)(\.[A-Za-z0-9-]{1,63})+$")
|
||||
|
||||
|
|
@ -38,33 +60,12 @@ async def create_job_endpoint(req: CreateJobRequest, session: AsyncSession = Dep
|
|||
domain = _validate_domain(req.domain.strip().lower())
|
||||
job = await create_job(session, req.job_type, domain, req.payload)
|
||||
job = await get_job_with_tasks(session, job.id)
|
||||
return _job_to_schema(job)
|
||||
return job_to_schema(job)
|
||||
|
||||
@app.get("/jobs/{job_id}", response_model=JobInfo)
|
||||
async def get_job_endpoint(job_id: UUID, session: AsyncSession = Depends(get_session)):
|
||||
job = await get_job_with_tasks(session, job_id)
|
||||
if not job:
|
||||
raise HTTPException(status_code=404, detail="Job not found")
|
||||
return _job_to_schema(job)
|
||||
return job_to_schema(job)
|
||||
|
||||
def _job_to_schema(job: Job) -> JobInfo:
|
||||
tasks: List[TaskInfo] = [
|
||||
TaskInfo(
|
||||
id=t.id,
|
||||
name=t.name,
|
||||
status=t.status.value if hasattr(t.status, "value") else str(t.status),
|
||||
retries=t.retries,
|
||||
max_retries=t.max_retries,
|
||||
result=t.result,
|
||||
error=t.error,
|
||||
)
|
||||
for t in job.tasks
|
||||
]
|
||||
return JobInfo(
|
||||
id=job.id,
|
||||
job_type=job.job_type,
|
||||
status=job.status.value if hasattr(job.status, "value") else str(job.status),
|
||||
domain=job.domain,
|
||||
payload=job.payload,
|
||||
tasks=tasks,
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue