mirror of
https://github.com/idrainformatica/PecFlow.git
synced 2026-06-16 20:55:41 +02:00
250 lines
7.6 KiB
Python
250 lines
7.6 KiB
Python
"""
|
|
Router Notifiche Multi-canale (Fase 2).
|
|
|
|
Endpoint:
|
|
POST /notifications/channels → crea canale
|
|
GET /notifications/channels → lista canali
|
|
GET /notifications/channels/{id} → dettaglio canale
|
|
PATCH /notifications/channels/{id} → aggiorna canale
|
|
DELETE /notifications/channels/{id} → elimina canale
|
|
POST /notifications/channels/{id}/test → test canale
|
|
POST /notifications/rules → crea regola
|
|
GET /notifications/rules → lista regole
|
|
GET /notifications/rules/{id} → dettaglio regola
|
|
PATCH /notifications/rules/{id} → aggiorna regola
|
|
DELETE /notifications/rules/{id} → elimina regola
|
|
GET /notifications/logs → log invii
|
|
"""
|
|
|
|
import uuid
|
|
|
|
from fastapi import APIRouter, Query
|
|
|
|
from app.dependencies import AdminUser, DB
|
|
from app.schemas.notification import (
|
|
ChannelTestResult,
|
|
NotificationChannelCreate,
|
|
NotificationChannelListResponse,
|
|
NotificationChannelResponse,
|
|
NotificationChannelUpdate,
|
|
NotificationLogListResponse,
|
|
NotificationLogResponse,
|
|
NotificationRuleCreate,
|
|
NotificationRuleListResponse,
|
|
NotificationRuleResponse,
|
|
NotificationRuleUpdate,
|
|
)
|
|
from app.services.notification_service import NotificationService
|
|
|
|
router = APIRouter(prefix="/notifications", tags=["Notifiche"])
|
|
|
|
|
|
# ─── Channels ─────────────────────────────────────────────────────────────────
|
|
|
|
@router.post(
|
|
"/channels",
|
|
response_model=NotificationChannelResponse,
|
|
status_code=201,
|
|
summary="Crea un canale di notifica",
|
|
)
|
|
async def create_channel(
|
|
body: NotificationChannelCreate,
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
) -> NotificationChannelResponse:
|
|
service = NotificationService(db)
|
|
channel = await service.create_channel(current_user.tenant_id, body, current_user.id)
|
|
return NotificationChannelResponse.model_validate(channel)
|
|
|
|
|
|
@router.get(
|
|
"/channels",
|
|
response_model=NotificationChannelListResponse,
|
|
summary="Lista canali di notifica",
|
|
)
|
|
async def list_channels(
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
page: int = Query(1, ge=1),
|
|
page_size: int = Query(20, ge=1, le=100),
|
|
) -> NotificationChannelListResponse:
|
|
service = NotificationService(db)
|
|
items, total = await service.list_channels(current_user.tenant_id, page, page_size)
|
|
return NotificationChannelListResponse(
|
|
items=[NotificationChannelResponse.model_validate(c) for c in items],
|
|
total=total,
|
|
page=page,
|
|
page_size=page_size,
|
|
)
|
|
|
|
|
|
@router.get(
|
|
"/channels/{channel_id}",
|
|
response_model=NotificationChannelResponse,
|
|
summary="Dettaglio canale",
|
|
)
|
|
async def get_channel(
|
|
channel_id: uuid.UUID,
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
) -> NotificationChannelResponse:
|
|
service = NotificationService(db)
|
|
channel = await service.get_channel(channel_id, current_user.tenant_id)
|
|
return NotificationChannelResponse.model_validate(channel)
|
|
|
|
|
|
@router.patch(
|
|
"/channels/{channel_id}",
|
|
response_model=NotificationChannelResponse,
|
|
summary="Aggiorna canale",
|
|
)
|
|
async def update_channel(
|
|
channel_id: uuid.UUID,
|
|
body: NotificationChannelUpdate,
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
) -> NotificationChannelResponse:
|
|
service = NotificationService(db)
|
|
channel = await service.update_channel(channel_id, current_user.tenant_id, body)
|
|
return NotificationChannelResponse.model_validate(channel)
|
|
|
|
|
|
@router.delete(
|
|
"/channels/{channel_id}",
|
|
status_code=204,
|
|
summary="Elimina canale",
|
|
)
|
|
async def delete_channel(
|
|
channel_id: uuid.UUID,
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
) -> None:
|
|
service = NotificationService(db)
|
|
await service.delete_channel(channel_id, current_user.tenant_id)
|
|
|
|
|
|
@router.post(
|
|
"/channels/{channel_id}/test",
|
|
response_model=ChannelTestResult,
|
|
summary="Test canale di notifica",
|
|
description="Invia un messaggio di test al canale per verificarne la configurazione.",
|
|
)
|
|
async def test_channel(
|
|
channel_id: uuid.UUID,
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
) -> ChannelTestResult:
|
|
service = NotificationService(db)
|
|
return await service.test_channel(channel_id, current_user.tenant_id)
|
|
|
|
|
|
# ─── Rules ────────────────────────────────────────────────────────────────────
|
|
|
|
@router.post(
|
|
"/rules",
|
|
response_model=NotificationRuleResponse,
|
|
status_code=201,
|
|
summary="Crea una regola di notifica",
|
|
)
|
|
async def create_rule(
|
|
body: NotificationRuleCreate,
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
) -> NotificationRuleResponse:
|
|
service = NotificationService(db)
|
|
rule = await service.create_rule(current_user.tenant_id, body)
|
|
return NotificationRuleResponse.model_validate(rule)
|
|
|
|
|
|
@router.get(
|
|
"/rules",
|
|
response_model=NotificationRuleListResponse,
|
|
summary="Lista regole di notifica",
|
|
)
|
|
async def list_rules(
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
channel_id: uuid.UUID | None = Query(None),
|
|
page: int = Query(1, ge=1),
|
|
page_size: int = Query(50, ge=1, le=200),
|
|
) -> NotificationRuleListResponse:
|
|
service = NotificationService(db)
|
|
items, total = await service.list_rules(
|
|
current_user.tenant_id, channel_id, page, page_size
|
|
)
|
|
return NotificationRuleListResponse(
|
|
items=[NotificationRuleResponse.model_validate(r) for r in items],
|
|
total=total,
|
|
)
|
|
|
|
|
|
@router.get(
|
|
"/rules/{rule_id}",
|
|
response_model=NotificationRuleResponse,
|
|
summary="Dettaglio regola",
|
|
)
|
|
async def get_rule(
|
|
rule_id: uuid.UUID,
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
) -> NotificationRuleResponse:
|
|
service = NotificationService(db)
|
|
rule = await service.get_rule(rule_id, current_user.tenant_id)
|
|
return NotificationRuleResponse.model_validate(rule)
|
|
|
|
|
|
@router.patch(
|
|
"/rules/{rule_id}",
|
|
response_model=NotificationRuleResponse,
|
|
summary="Aggiorna regola",
|
|
)
|
|
async def update_rule(
|
|
rule_id: uuid.UUID,
|
|
body: NotificationRuleUpdate,
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
) -> NotificationRuleResponse:
|
|
service = NotificationService(db)
|
|
rule = await service.update_rule(rule_id, current_user.tenant_id, body)
|
|
return NotificationRuleResponse.model_validate(rule)
|
|
|
|
|
|
@router.delete(
|
|
"/rules/{rule_id}",
|
|
status_code=204,
|
|
summary="Elimina regola",
|
|
)
|
|
async def delete_rule(
|
|
rule_id: uuid.UUID,
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
) -> None:
|
|
service = NotificationService(db)
|
|
await service.delete_rule(rule_id, current_user.tenant_id)
|
|
|
|
|
|
# ─── Logs ─────────────────────────────────────────────────────────────────────
|
|
|
|
@router.get(
|
|
"/logs",
|
|
response_model=NotificationLogListResponse,
|
|
summary="Log notifiche",
|
|
)
|
|
async def list_logs(
|
|
current_user: AdminUser,
|
|
db: DB,
|
|
channel_id: uuid.UUID | None = Query(None),
|
|
page: int = Query(1, ge=1),
|
|
page_size: int = Query(50, ge=1, le=200),
|
|
) -> NotificationLogListResponse:
|
|
service = NotificationService(db)
|
|
items, total = await service.list_logs(
|
|
current_user.tenant_id, channel_id, page, page_size
|
|
)
|
|
return NotificationLogListResponse(
|
|
items=[NotificationLogResponse.model_validate(l) for l in items],
|
|
total=total,
|
|
page=page,
|
|
page_size=page_size,
|
|
)
|