53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
"""Campaign Engine DTOs — Phase 7.4."""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
from app.models.types import CampaignApplicationStatus
|
|
from app.schemas.common import ORMBase
|
|
|
|
_FORBID = ConfigDict(extra="forbid")
|
|
|
|
|
|
class CampaignRulesUpdateRequest(BaseModel):
|
|
model_config = _FORBID
|
|
|
|
rules: dict = Field(default_factory=dict)
|
|
|
|
|
|
class ApplyCampaignRequest(BaseModel):
|
|
model_config = _FORBID
|
|
|
|
member_id: UUID
|
|
point_account_id: UUID | None = None
|
|
base_amount: int | None = Field(default=None, ge=0)
|
|
idempotency_key: str | None = Field(default=None, max_length=100)
|
|
metadata_json: dict | None = None
|
|
|
|
|
|
class CampaignApplicationRead(ORMBase):
|
|
id: UUID
|
|
tenant_id: UUID
|
|
campaign_id: UUID
|
|
program_id: UUID
|
|
member_id: UUID
|
|
point_account_id: UUID
|
|
rule_version: int
|
|
points_granted: int
|
|
ledger_entry_id: UUID | None
|
|
status: CampaignApplicationStatus
|
|
idempotency_key: str | None
|
|
actor_user_id: str | None
|
|
metadata_json: dict | None
|
|
created_at: datetime
|
|
|
|
|
|
class CampaignApplicationPage(BaseModel):
|
|
items: list[CampaignApplicationRead]
|
|
total: int
|
|
offset: int
|
|
limit: int
|