Initial commit: breakpilot-core - Shared Infrastructure

Docker Compose with 24+ services:
- PostgreSQL (PostGIS), Valkey, MinIO, Qdrant
- Vault (PKI/TLS), Nginx (Reverse Proxy)
- Backend Core API, Consent Service, Billing Service
- RAG Service, Embedding Service
- Gitea, Woodpecker CI/CD
- Night Scheduler, Health Aggregator
- Jitsi (Web/XMPP/JVB/Jicofo), Mailpit

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Boenisch
2026-02-11 23:47:13 +01:00
commit ad111d5e69
244 changed files with 84288 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
"""
Models Package
Data Models for AI Content Generator
"""
from .generation_job import GenerationJob, JobStatus
__all__ = [
"GenerationJob",
"JobStatus"
]

View File

@@ -0,0 +1,101 @@
"""
Generation Job Model
Tracking für Content-Generierungs-Jobs
"""
from enum import Enum
from datetime import datetime
from typing import Optional, Dict, Any
import uuid
class JobStatus(str, Enum):
"""Job Status"""
PENDING = "pending"
PROCESSING = "processing"
COMPLETED = "completed"
FAILED = "failed"
class GenerationJob:
"""Content-Generierungs-Job"""
def __init__(
self,
topic: str,
description: Optional[str] = None,
target_grade: Optional[str] = None,
material_count: int = 0
):
self.job_id = str(uuid.uuid4())
self.topic = topic
self.description = description
self.target_grade = target_grade
self.material_count = material_count
self.status = JobStatus.PENDING
self.progress = 0
self.message = "Job created"
self.result: Optional[Dict[str, Any]] = None
self.error: Optional[str] = None
self.created_at = datetime.utcnow()
self.updated_at = datetime.utcnow()
def update_progress(self, progress: int, message: str):
"""Update Job Progress"""
self.progress = progress
self.message = message
self.status = JobStatus.PROCESSING
self.updated_at = datetime.utcnow()
def complete(self, result: Dict[str, Any]):
"""Mark Job as Completed"""
self.status = JobStatus.COMPLETED
self.progress = 100
self.message = "Content generation completed"
self.result = result
self.updated_at = datetime.utcnow()
def fail(self, error: str):
"""Mark Job as Failed"""
self.status = JobStatus.FAILED
self.message = "Content generation failed"
self.error = error
self.updated_at = datetime.utcnow()
def to_dict(self) -> Dict[str, Any]:
"""Convert to dict"""
return {
"job_id": self.job_id,
"topic": self.topic,
"description": self.description,
"target_grade": self.target_grade,
"material_count": self.material_count,
"status": self.status.value,
"progress": self.progress,
"message": self.message,
"result": self.result,
"error": self.error,
"created_at": self.created_at.isoformat(),
"updated_at": self.updated_at.isoformat()
}
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> "GenerationJob":
"""Create from dict"""
job = cls(
topic=data["topic"],
description=data.get("description"),
target_grade=data.get("target_grade"),
material_count=data.get("material_count", 0)
)
job.job_id = data["job_id"]
job.status = JobStatus(data["status"])
job.progress = data["progress"]
job.message = data["message"]
job.result = data.get("result")
job.error = data.get("error")
job.created_at = datetime.fromisoformat(data["created_at"])
job.updated_at = datetime.fromisoformat(data["updated_at"])
return job