[34588f42] Feat: Versandzeit-Steuerung für Freigabe-Anfragen hinzugefügt

- Backend unterstützt nun zeitgesteuerten Versand (scheduled_time) via BackgroundTasks.
- Frontend um ein Zeitauswahl-Feld erweitert.
This commit is contained in:
2026-04-17 20:21:44 +00:00
parent 929d92afeb
commit 1f5805e64c
2 changed files with 74 additions and 5 deletions

View File

@@ -1,4 +1,4 @@
from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi import APIRouter, Depends, HTTPException, Request, BackgroundTasks
from pydantic import BaseModel
from sqlalchemy.orm import Session
from database import get_db, DiscountCode
@@ -6,6 +6,9 @@ import datetime
import logging
from gmail_service import GmailService
import re
import time
import asyncio
from typing import List, Dict, Optional
router = APIRouter(prefix="/api/publish-request", tags=["publish-request"])
logger = logging.getLogger("publish-request")
@@ -13,6 +16,54 @@ logger = logging.getLogger("publish-request")
class CodesUpload(BaseModel):
codes: str # comma separated
class SendReleaseRequest(BaseModel):
emails: List[Dict[str, str]]
scheduled_time: Optional[str] = None # e.g. "10:00"
async def delayed_send(emails: List[Dict[str, str]], scheduled_time: str, db: Session):
try:
# Calculate delay
now = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=2))) # Berlin Time Approx
target_h, target_m = map(int, scheduled_time.split(":"))
target_time = now.replace(hour=target_h, minute=target_m, second=0, microsecond=0)
if target_time < now:
target_time += datetime.timedelta(days=1)
delay_seconds = (target_time - now).total_seconds()
logger.info(f"Scheduling {len(emails)} emails for {scheduled_time} (in {delay_seconds} seconds)")
await asyncio.sleep(delay_seconds)
service = GmailService(db)
success_count = 0
for email_data in emails:
if service.send_email(email_data["to"], email_data["subject"], email_data["body"]):
success_count += 1
await asyncio.sleep(1) # Rate limiting
logger.info(f"Scheduled send complete: {success_count}/{len(emails)} success.")
except Exception as e:
logger.exception("Error in delayed_send background task")
@router.post("/send")
async def send_requests(data: SendReleaseRequest, background_tasks: BackgroundTasks, db: Session = Depends(get_db)):
if data.scheduled_time:
background_tasks.add_task(delayed_send, data.emails, data.scheduled_time, db)
return {"status": "scheduled", "message": f"Versand für {data.scheduled_time} geplant."}
# Immediate send
service = GmailService(db)
success = 0
failed = []
for email_data in data.emails:
if service.send_email(email_data["to"], email_data["subject"], email_data["body"]):
success += 1
else:
failed.append(email_data["to"])
return {"status": "success", "success": success, "failed": failed}
@router.get("/stats")
def get_stats(db: Session = Depends(get_db)):
total = db.query(DiscountCode).count()