diff --git a/.github/workflows/ci.yml.bak b/.github/workflows/ci.yml.bak index 920ad31..9e4ecda 100644 --- a/.github/workflows/ci.yml.bak +++ b/.github/workflows/ci.yml.bak @@ -10,8 +10,8 @@ env: PYTHON_VERSION: "3.12" ENCRYPTION_KEY: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" SECRET_KEY: "ci-test-secret-key-for-github-actions-only-not-for-production" - DATABASE_URL: "postgresql+asyncpg://pecflow:pecflow_ci@localhost:5432/pecflow_test" - DATABASE_URL_SYNC: "postgresql://pecflow:pecflow_ci@localhost:5432/pecflow_test" + DATABASE_URL: "postgresql+asyncpg://pechub:pechub_ci@localhost:5432/pechub_test" + DATABASE_URL_SYNC: "postgresql://pechub:pechub_ci@localhost:5432/pechub_test" REDIS_URL: "redis://localhost:6379/0" jobs: @@ -61,9 +61,9 @@ jobs: postgres: image: postgres:16-alpine env: - POSTGRES_DB: pecflow_test - POSTGRES_USER: pecflow - POSTGRES_PASSWORD: pecflow_ci + POSTGRES_DB: pechub_test + POSTGRES_USER: pechub + POSTGRES_PASSWORD: pechub_ci ports: - 5432:5432 options: >- @@ -156,7 +156,7 @@ jobs: context: ./backend file: ./backend/Dockerfile push: false - tags: pecflow-backend:${{ github.sha }} + tags: pechub-backend:${{ github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/backend/alembic/versions/0001_initial_schema.py b/backend/alembic/versions/0001_initial_schema.py index 1c75709..39890a8 100644 --- a/backend/alembic/versions/0001_initial_schema.py +++ b/backend/alembic/versions/0001_initial_schema.py @@ -1,4 +1,4 @@ -"""Initial schema – tutte le tabelle PecFlow Fase 1 +"""Initial schema – tutte le tabelle PEChub Fase 1 Revision ID: 0001 Revises: diff --git a/backend/app/__init__.py b/backend/app/__init__.py index 0aa560e..77955e8 100644 --- a/backend/app/__init__.py +++ b/backend/app/__init__.py @@ -1 +1 @@ -# PecFlow Backend +# PEChub Backend diff --git a/backend/app/config.py b/backend/app/config.py index 3df24ae..5298bc5 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -34,8 +34,8 @@ class Settings(BaseSettings): encryption_key: str = "0" * 64 # ── Database ────────────────────────────────────────────────────────────── - database_url: str = "postgresql+asyncpg://pecflow:pecflow_dev_password@db:5432/pecflow" - database_url_sync: str = "postgresql://pecflow:pecflow_dev_password@db:5432/pecflow" + database_url: str = "postgresql+asyncpg://pechub:pechub_dev_password@db:5432/pechub" + database_url_sync: str = "postgresql://pechub:pechub_dev_password@db:5432/pechub" # ── Redis ───────────────────────────────────────────────────────────────── redis_url: str = "redis://redis:6379/0" @@ -44,7 +44,7 @@ class Settings(BaseSettings): minio_endpoint: str = "minio:9000" minio_access_key: str = "minioadmin" minio_secret_key: str = "minioadmin" - minio_bucket: str = "pecflow" + minio_bucket: str = "pechub" minio_use_ssl: bool = False # ── CORS ────────────────────────────────────────────────────────────────── diff --git a/backend/app/core/exceptions.py b/backend/app/core/exceptions.py index bf71dcf..b507b58 100644 --- a/backend/app/core/exceptions.py +++ b/backend/app/core/exceptions.py @@ -1,5 +1,5 @@ """ -Eccezioni applicative custom per PecFlow. +Eccezioni applicative custom per PEChub. """ from fastapi import HTTPException, status diff --git a/backend/app/core/logging.py b/backend/app/core/logging.py index 2fe9e35..a459d29 100644 --- a/backend/app/core/logging.py +++ b/backend/app/core/logging.py @@ -1,5 +1,5 @@ """ -Structured logging per PecFlow. +Structured logging per PEChub. In produzione (LOG_JSON=true) emette log JSON per aggregatori (Loki, ELK). In sviluppo emette log leggibili colorati. """ diff --git a/backend/app/main.py b/backend/app/main.py index c212ed8..a300e83 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -31,7 +31,7 @@ async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]: setup_logging() logger.info( - "🚀 PecFlow Backend avviato", + "🚀 PEChub Backend avviato", extra={"env": settings.app_env, "debug": settings.app_debug}, ) @@ -53,14 +53,14 @@ async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]: from app.services.send_service import close_arq_pool await close_arq_pool() await engine.dispose() - logger.info("🛑 PecFlow Backend fermato") + logger.info("🛑 PEChub Backend fermato") # ─── Applicazione FastAPI ───────────────────────────────────────────────────── limiter = Limiter(key_func=get_remote_address, default_limits=["200/minute"]) app = FastAPI( - title="PecFlow API", + title="PEChub API", description="API per la gestione PEC SaaS multi-tenant", version="1.0.0", docs_url="/docs" if not settings.is_production else None, diff --git a/backend/app/models/notification.py b/backend/app/models/notification.py index 97fc29b..58ea825 100644 --- a/backend/app/models/notification.py +++ b/backend/app/models/notification.py @@ -109,7 +109,7 @@ class NotificationChannel(Base): class NotificationRule(Base): """ - Regola: evento PecFlow → canale di notifica. + Regola: evento PEChub → canale di notifica. event_type: new_message | state_changed | anomaly | send_failed | ... filter: JSONB con condizioni opzionali (mailbox_id, state, ecc.) diff --git a/backend/app/schemas/tenant.py b/backend/app/schemas/tenant.py index 0f979f4..2221401 100644 --- a/backend/app/schemas/tenant.py +++ b/backend/app/schemas/tenant.py @@ -26,7 +26,7 @@ class TenantCreateRequest(BaseModel): @field_validator("slug") @classmethod def validate_slug(cls, v: str) -> str: - reserved = {"api", "admin", "www", "mail", "smtp", "imap", "pecflow", "app"} + reserved = {"api", "admin", "www", "mail", "smtp", "imap", "pechub", "app"} if v in reserved: raise ValueError(f"Slug '{v}' riservato") return v.lower() diff --git a/backend/app/services/auth_service.py b/backend/app/services/auth_service.py index 9af5b60..8ee8ed1 100644 --- a/backend/app/services/auth_service.py +++ b/backend/app/services/auth_service.py @@ -209,7 +209,7 @@ class AuthService: # Genera URI otpauth:// totp = pyotp.TOTP(secret) - uri = totp.provisioning_uri(name=user.email, issuer_name="PecFlow") + uri = totp.provisioning_uri(name=user.email, issuer_name="PEChub") # Genera QR code qr = qrcode.QRCode(version=1, box_size=6, border=4) diff --git a/backend/pyproject.toml b/backend/pyproject.toml index e8903e1..792b925 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -3,9 +3,9 @@ requires = ["setuptools>=68", "wheel"] build-backend = "setuptools.build_meta" [project] -name = "pecflow-backend" +name = "pechub-backend" version = "1.0.0" -description = "PecFlow – Backend API per gestione PEC SaaS" +description = "PEChub – Backend API per gestione PEC SaaS" requires-python = ">=3.12" dependencies = [ diff --git a/backend/tests/integration/test_api_send.py b/backend/tests/integration/test_api_send.py index f240207..6ab4da3 100644 --- a/backend/tests/integration/test_api_send.py +++ b/backend/tests/integration/test_api_send.py @@ -143,8 +143,8 @@ class TestCreateSendJob: json={ "mailbox_id": str(active_mailbox.id), "to_addresses": ["matteo1801@spidmail.it"], - "subject": "Test PecFlow Fase 4", - "body_text": "Messaggio di test inviato da PecFlow.", + "subject": "Test PEChub Fase 4", + "body_text": "Messaggio di test inviato da PEChub.", }, headers=auth_headers, ) diff --git a/database/init/00_extensions.sql b/database/init/00_extensions.sql index 42845b0..281295c 100644 --- a/database/init/00_extensions.sql +++ b/database/init/00_extensions.sql @@ -1,8 +1,8 @@ --- Estensioni PostgreSQL richieste da PecFlow +-- Estensioni PostgreSQL richieste da PEChub -- Questo script viene eseguito automaticamente da Docker al primo avvio CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- Permette SET LOCAL per RLS (app.current_tenant_id) -ALTER DATABASE pecflow SET "app.current_tenant_id" TO ''; +ALTER DATABASE pechub SET "app.current_tenant_id" TO ''; diff --git a/database/seeds/dev_tenant.sql b/database/seeds/dev_tenant.sql index 443f33f..665a1fc 100644 --- a/database/seeds/dev_tenant.sql +++ b/database/seeds/dev_tenant.sql @@ -2,8 +2,8 @@ -- SEED: Tenant demo + utenti per sviluppo locale -- -- Credenziali: --- Admin: admin@demo.pecflow.it / Demo@PecFlow2026! --- Operator: operator@demo.pecflow.it / Oper@PecFlow2026! +-- Admin: admin@demo.pechub.it / Demo@PEChub2026! +-- Operator: operator@demo.pechub.it / Oper@PEChub2026! -- -- Esegui con: make seed -- ============================================================ @@ -25,27 +25,27 @@ VALUES ( ON CONFLICT (slug) DO NOTHING; -- Utente super_admin (global, senza tenant specifico usa il tenant demo) --- Password: SuperAdmin@PecFlow2026! (bcrypt hash) +-- Password: SuperAdmin@PEChub2026! (bcrypt hash) INSERT INTO users (id, tenant_id, email, password_hash, full_name, role, is_active) VALUES ( '00000000-0000-0000-0000-000000000001', '11111111-1111-1111-1111-111111111111', - 'superadmin@pecflow.it', - '$2b$12$y2yq6X2f3dZi22wqWZd1aumP03IU6OWrrevRMFj9054aGnUms116W', -- SuperAdmin@PecFlow2026! - 'Super Admin PecFlow', + 'superadmin@pechub.it', + '$2b$12$y2yq6X2f3dZi22wqWZd1aumP03IU6OWrrevRMFj9054aGnUms116W', -- SuperAdmin@PEChub2026! + 'Super Admin PEChub', 'super_admin', TRUE ) ON CONFLICT (tenant_id, email) DO NOTHING; -- Utente admin del tenant demo --- Password: Demo@PecFlow2026! (bcrypt hash) +-- Password: Demo@PEChub2026! (bcrypt hash) INSERT INTO users (id, tenant_id, email, password_hash, full_name, role, is_active) VALUES ( '11111111-0000-0000-0000-000000000001', '11111111-1111-1111-1111-111111111111', - 'admin@demo.pecflow.it', - '$2b$12$PmyaJvF0i7ACFR39k6hfMO2.6U.FVPYma.7OyXyrGuGuokiJOfX8y', -- Demo@PecFlow2026! + 'admin@demo.pechub.it', + '$2b$12$PmyaJvF0i7ACFR39k6hfMO2.6U.FVPYma.7OyXyrGuGuokiJOfX8y', -- Demo@PEChub2026! 'Admin Demo', 'admin', TRUE @@ -53,13 +53,13 @@ VALUES ( ON CONFLICT (tenant_id, email) DO NOTHING; -- Utente operator del tenant demo --- Password: Oper@PecFlow2026! (bcrypt hash) +-- Password: Oper@PEChub2026! (bcrypt hash) INSERT INTO users (id, tenant_id, email, password_hash, full_name, role, is_active) VALUES ( '11111111-0000-0000-0000-000000000002', '11111111-1111-1111-1111-111111111111', - 'operator@demo.pecflow.it', - '$2b$12$Z0REc7flPCD3Sb8fZHsuW.Uk2X4JiJO7HhTajNSuPiQgzppkCDmLu', -- Oper@PecFlow2026! + 'operator@demo.pechub.it', + '$2b$12$Z0REc7flPCD3Sb8fZHsuW.Uk2X4JiJO7HhTajNSuPiQgzppkCDmLu', -- Oper@PEChub2026! 'Operatore Demo', 'operator', TRUE @@ -74,7 +74,7 @@ DO $$ BEGIN RAISE NOTICE '✅ Seed completato!'; RAISE NOTICE ' Tenant demo: 11111111-1111-1111-1111-111111111111'; - RAISE NOTICE ' Admin: admin@demo.pecflow.it / Demo@PecFlow2026!'; - RAISE NOTICE ' Operator: operator@demo.pecflow.it / Oper@PecFlow2026!'; + RAISE NOTICE ' Admin: admin@demo.pechub.it / Demo@PEChub2026!'; + RAISE NOTICE ' Operator: operator@demo.pechub.it / Oper@PEChub2026!'; END $$; diff --git a/docker-compose.yml b/docker-compose.yml index 513d5e6..dbcadd7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -name: pecflow +name: pechub services: @@ -7,9 +7,9 @@ services: image: postgres:16-alpine restart: unless-stopped environment: - POSTGRES_DB: pecflow - POSTGRES_USER: pecflow - POSTGRES_PASSWORD: pecflow_dev_password + POSTGRES_DB: pechub + POSTGRES_USER: pechub + POSTGRES_PASSWORD: pechub_dev_password ports: - "5432:5432" volumes: @@ -17,12 +17,12 @@ services: - ./database/init:/docker-entrypoint-initdb.d/init:ro - ./database/seeds:/docker-entrypoint-initdb.d/seeds:ro healthcheck: - test: ["CMD-SHELL", "pg_isready -U pecflow -d pecflow"] + test: ["CMD-SHELL", "pg_isready -U pechub -d pechub"] interval: 5s timeout: 5s retries: 10 networks: - - pecflow_net + - pechub_net # ─── Redis 7 ──────────────────────────────────────────────────────────────── redis: @@ -40,7 +40,7 @@ services: timeout: 3s retries: 10 networks: - - pecflow_net + - pechub_net # ─── MinIO (Object Storage S3-compatible) ─────────────────────────────────── minio: @@ -61,7 +61,7 @@ services: timeout: 5s retries: 5 networks: - - pecflow_net + - pechub_net # ─── MinIO bucket initializer ─────────────────────────────────────────────── minio-init: @@ -72,12 +72,12 @@ services: entrypoint: > /bin/sh -c " mc alias set local http://minio:9000 minioadmin minioadmin && - mc mb --ignore-existing local/pecflow && - mc anonymous set none local/pecflow && - echo 'MinIO bucket pecflow creato' + mc mb --ignore-existing local/pechub && + mc anonymous set none local/pechub && + echo 'MinIO bucket pechub creato' " networks: - - pecflow_net + - pechub_net # ─── Backend FastAPI ───────────────────────────────────────────────────────── backend: @@ -87,8 +87,8 @@ services: restart: unless-stopped env_file: .env environment: - DATABASE_URL: postgresql+asyncpg://pecflow:pecflow_dev_password@db:5432/pecflow - DATABASE_URL_SYNC: postgresql://pecflow:pecflow_dev_password@db:5432/pecflow + DATABASE_URL: postgresql+asyncpg://pechub:pechub_dev_password@db:5432/pechub + DATABASE_URL_SYNC: postgresql://pechub:pechub_dev_password@db:5432/pechub REDIS_URL: redis://redis:6379/0 MINIO_ENDPOINT: minio:9000 ports: @@ -107,7 +107,7 @@ services: timeout: 5s retries: 5 networks: - - pecflow_net + - pechub_net # ─── Frontend React (Vite dev server) ────────────────────────────────────── frontend: @@ -128,7 +128,7 @@ services: depends_on: - backend networks: - - pecflow_net + - pechub_net # ─── Nginx reverse proxy ───────────────────────────────────────────────────── nginx: @@ -143,7 +143,7 @@ services: - backend - frontend networks: - - pecflow_net + - pechub_net # ─── Worker IMAP Sync (arq) ────────────────────────────────────────────────── worker: @@ -153,7 +153,7 @@ services: restart: unless-stopped env_file: .env environment: - DATABASE_URL: postgresql+asyncpg://pecflow:pecflow_dev_password@db:5432/pecflow + DATABASE_URL: postgresql+asyncpg://pechub:pechub_dev_password@db:5432/pechub REDIS_URL: redis://redis:6379/0 MINIO_ENDPOINT: minio:9000 volumes: @@ -166,7 +166,7 @@ services: minio: condition: service_healthy networks: - - pecflow_net + - pechub_net # ─── GreenMail (server IMAP/SMTP mock per test) ─────────────────────────────── greenmail: @@ -195,14 +195,14 @@ services: profiles: - greenmail # avviato solo con: docker compose --profile greenmail up networks: - - pecflow_net + - pechub_net # ─── PgAdmin (solo dev) ────────────────────────────────────────────────────── pgadmin: image: dpage/pgadmin4:latest restart: unless-stopped environment: - PGADMIN_DEFAULT_EMAIL: admin@pecflow.it + PGADMIN_DEFAULT_EMAIL: admin@pechub.it PGADMIN_DEFAULT_PASSWORD: admin PGADMIN_CONFIG_SERVER_MODE: "False" ports: @@ -214,7 +214,7 @@ services: profiles: - tools networks: - - pecflow_net + - pechub_net volumes: postgres_data: @@ -223,5 +223,5 @@ volumes: pgadmin_data: networks: - pecflow_net: + pechub_net: driver: bridge diff --git a/frontend/src/components/PecBadge/PecBadge.tsx b/frontend/src/components/PecBadge/PecBadge.tsx index e392d21..152f0d5 100644 --- a/frontend/src/components/PecBadge/PecBadge.tsx +++ b/frontend/src/components/PecBadge/PecBadge.tsx @@ -19,14 +19,14 @@ const STATE_COLORS: Record = { } const STATE_ICONS: Record = { - draft: '📝', - queued: '⏳', - sent: '📤', - accepted: '✅', - delivered: '📬', - received: '📥', - anomaly: '⚠️', - failed: '❌', + draft: '', + queued: '', + sent: '', + accepted: '', + delivered: '', + received: '', + anomaly: '', + failed: '', } const TYPE_COLORS: Record = { diff --git a/frontend/src/hooks/useWebSocket.ts b/frontend/src/hooks/useWebSocket.ts index bf41a8d..057219d 100644 --- a/frontend/src/hooks/useWebSocket.ts +++ b/frontend/src/hooks/useWebSocket.ts @@ -39,7 +39,7 @@ export function useWebSocket() { if (!message.is_read) { const from = message.from_address || 'Mittente sconosciuto' const subject = message.subject || '(nessun oggetto)' - toast.success(`📨 Nuova PEC da ${from}: ${subject}`, { + toast.success(` Nuova PEC da ${from}: ${subject}`, { duration: 5000, id: `new-msg-${message.id}`, }) @@ -55,7 +55,7 @@ export function useWebSocket() { } updateMailboxStatus(mailbox_id, status, error_msg) if (status === 'error') { - toast.error(`⚠️ Errore sincronizzazione casella`, { duration: 8000 }) + toast.error(` Errore sincronizzazione casella`, { duration: 8000 }) } break } @@ -67,16 +67,16 @@ export function useWebSocket() { mailbox_id: string } if (status === 'sent') { - toast.success('✅ PEC inviata con successo', { duration: 4000 }) + toast.success(' PEC inviata con successo', { duration: 4000 }) } else if (status === 'failed') { - toast.error('❌ Invio PEC fallito definitivamente', { duration: 8000 }) + toast.error(' Invio PEC fallito definitivamente', { duration: 8000 }) } break } case 'send_job:anomaly': { toast.error( - '⚠️ Anomalia invio PEC: nessuna ricevuta di accettazione entro 24h', + ' Anomalia invio PEC: nessuna ricevuta di accettazione entro 24h', { duration: 10000 }, ) break diff --git a/frontend/src/pages/Compose/ComposePage.tsx b/frontend/src/pages/Compose/ComposePage.tsx index 9abacf5..53dbb1f 100644 --- a/frontend/src/pages/Compose/ComposePage.tsx +++ b/frontend/src/pages/Compose/ComposePage.tsx @@ -260,14 +260,14 @@ export function ComposePage() { {activeCaselle.map((mb) => ( ))} {activeCaselle.some((m) => m.fromVbox) && (

- Le caselle con 📥 sono accessibili tramite Virtual Box + Le caselle con sono accessibili tramite Virtual Box

)} diff --git a/frontend/src/pages/Inbox/InboxPage.tsx b/frontend/src/pages/Inbox/InboxPage.tsx index b1e8c47..4a99c74 100644 --- a/frontend/src/pages/Inbox/InboxPage.tsx +++ b/frontend/src/pages/Inbox/InboxPage.tsx @@ -825,7 +825,7 @@ function MessageRow({ {/* Indicatore allegati */} {message.has_attachments && ( - 📎 + )} diff --git a/frontend/src/pages/Notifications/NotificationsPage.tsx b/frontend/src/pages/Notifications/NotificationsPage.tsx index 7f5f127..5b55f3f 100644 --- a/frontend/src/pages/Notifications/NotificationsPage.tsx +++ b/frontend/src/pages/Notifications/NotificationsPage.tsx @@ -229,9 +229,9 @@ function ChannelsTab({ onEdit }: ChannelsTabProps) { mutationFn: (id: string) => notificationsApi.testChannel(id), onSuccess: (result) => { if (result.success) { - toast.success(`✅ ${result.message}`) + toast.success(` ${result.message}`) } else { - toast.error(`❌ ${result.message}`) + toast.error(` ${result.message}`) } }, onError: (e) => toast.error(getErrorMessage(e)), diff --git a/frontend/src/pages/Permissions/PermissionsPage.tsx b/frontend/src/pages/Permissions/PermissionsPage.tsx index aa48bfe..0188a8e 100644 --- a/frontend/src/pages/Permissions/PermissionsPage.tsx +++ b/frontend/src/pages/Permissions/PermissionsPage.tsx @@ -234,7 +234,7 @@ function PermissionRow({ perm, mailboxId, onRevoke }: PermissionRowProps) { : 'border-muted-foreground/40 bg-background hover:border-primary', )} > - {perm[field] && } + {perm[field] && } ))} diff --git a/frontend/src/pages/Settings/SettingsPage.tsx b/frontend/src/pages/Settings/SettingsPage.tsx index b4150ca..ce2e7ea 100644 --- a/frontend/src/pages/Settings/SettingsPage.tsx +++ b/frontend/src/pages/Settings/SettingsPage.tsx @@ -219,8 +219,8 @@ export function SettingsPage() { toast.success( updated.archival_mode === 'production' - ? '✅ Archiviazione attivata in modalità PRODUZIONE' - : '🧪 Archiviazione impostata in modalità mock' + ? ' Archiviazione attivata in modalità PRODUZIONE' + : ' Archiviazione impostata in modalità mock' ) } catch (err: unknown) { const msg = (err as { response?: { data?: { detail?: string } } }) @@ -510,12 +510,12 @@ export function SettingsPage() { Vengono salvate cifrate (AES-256-GCM). {archivalSettings?.conservatore_username_configured && ( - ✓ Username configurata + Username configurata )} {archivalSettings?.conservatore_password_configured && ( - ✓ Password configurata + Password configurata )}

@@ -613,7 +613,7 @@ export function SettingsPage() { Credenziali:{' '} {archivalSettings.conservatore_username_configured && archivalSettings.conservatore_password_configured - ? Configurate ✓ + ? Configurate : Non configurate } diff --git a/frontend/src/pages/VirtualBoxes/VirtualBoxesPage.tsx b/frontend/src/pages/VirtualBoxes/VirtualBoxesPage.tsx index 17557f8..717dcf7 100644 --- a/frontend/src/pages/VirtualBoxes/VirtualBoxesPage.tsx +++ b/frontend/src/pages/VirtualBoxes/VirtualBoxesPage.tsx @@ -276,7 +276,7 @@ function VBoxCard({ ) : (

- ⚠ Nessuna casella PEC associata + Nessuna casella PEC associata

)} @@ -581,7 +581,7 @@ function VBoxFormDialog({ open, editingVbox, onClose, onSaved }: VBoxFormDialogP )} {(selectedMailboxIds ?? []).length === 0 && availableMailboxes.length > 0 && (

- ⚠ Seleziona almeno una casella PEC reale da associare. + Seleziona almeno una casella PEC reale da associare.

)} diff --git a/worker/app/__init__.py b/worker/app/__init__.py index 8baafb0..b8d5bc3 100644 --- a/worker/app/__init__.py +++ b/worker/app/__init__.py @@ -1 +1 @@ -# Worker PecFlow +# Worker PEChub diff --git a/worker/app/config.py b/worker/app/config.py index 09c4414..ed68f52 100644 --- a/worker/app/config.py +++ b/worker/app/config.py @@ -21,7 +21,7 @@ class WorkerSettings(BaseSettings): log_level: str = "INFO" # ── Database ────────────────────────────────────────────────────────────── - database_url: str = "postgresql+asyncpg://pecflow:pecflow_dev_password@db:5432/pecflow" + database_url: str = "postgresql+asyncpg://pechub:pechub_dev_password@db:5432/pechub" # ── Redis ───────────────────────────────────────────────────────────────── redis_url: str = "redis://redis:6379/0" @@ -30,7 +30,7 @@ class WorkerSettings(BaseSettings): minio_endpoint: str = "minio:9000" minio_access_key: str = "minioadmin" minio_secret_key: str = "minioadmin" - minio_bucket: str = "pecflow" + minio_bucket: str = "pechub" minio_use_ssl: bool = False # ── Cifratura credenziali (ADR-002) ─────────────────────────────────────── diff --git a/worker/app/main.py b/worker/app/main.py index 151c235..75a9ff9 100644 --- a/worker/app/main.py +++ b/worker/app/main.py @@ -1,5 +1,5 @@ """ -Entrypoint worker arq – PecFlow IMAP Sync Engine. +Entrypoint worker arq – PEChub IMAP Sync Engine. Avvio: python -m app.main @@ -55,7 +55,7 @@ async def on_startup(ctx: dict[str, Any]) -> None: """ global _mailbox_pool - logger.info("🚀 PecFlow Worker avviato") + logger.info("🚀 PEChub Worker avviato") logger.info(f" DB: {settings.database_url.split('@')[-1]}") logger.info(f" Redis: {settings.redis_url}") logger.info(f" MinIO: {settings.minio_endpoint}") @@ -85,7 +85,7 @@ async def on_shutdown(ctx: dict[str, Any]) -> None: """Cleanup all'arresto del worker.""" global _mailbox_pool - logger.info("🛑 PecFlow Worker in arresto...") + logger.info("🛑 PEChub Worker in arresto...") pool = ctx.get("mailbox_pool") or _mailbox_pool if pool: @@ -161,5 +161,5 @@ class WorkerSettings: # ─── Entrypoint ─────────────────────────────────────────────────────────────── if __name__ == "__main__": - logger.info("Avvio PecFlow Worker (arq)...") + logger.info("Avvio PEChub Worker (arq)...") run_worker(WorkerSettings) diff --git a/worker/app/smtp/sender.py b/worker/app/smtp/sender.py index 34278bb..4ca7815 100644 --- a/worker/app/smtp/sender.py +++ b/worker/app/smtp/sender.py @@ -115,7 +115,7 @@ class SmtpSender: body_container = msg # Headers obbligatori - message_id = make_msgid(domain="pecflow.local") + message_id = make_msgid(domain="pechub.local") msg["From"] = self.mailbox.email_address msg["To"] = ", ".join(to_addresses) if cc_addresses: diff --git a/worker/app/storage/minio_client.py b/worker/app/storage/minio_client.py index 3119b43..1027733 100644 --- a/worker/app/storage/minio_client.py +++ b/worker/app/storage/minio_client.py @@ -1,8 +1,8 @@ """ Client MinIO/S3 asincrono per il worker. -Percorso EML raw: pecflow/tenants/{tenant_id}/mailboxes/{mailbox_id}/raw/{uid}.eml -Percorso allegati: pecflow/tenants/{tenant_id}/mailboxes/{mailbox_id}/attachments/{msg_id}/{filename} +Percorso EML raw: pechub/tenants/{tenant_id}/mailboxes/{mailbox_id}/raw/{uid}.eml +Percorso allegati: pechub/tenants/{tenant_id}/mailboxes/{mailbox_id}/attachments/{msg_id}/{filename} """ import io diff --git a/worker/tests/integration/test_smtp_real_aruba.py b/worker/tests/integration/test_smtp_real_aruba.py index 23eaddc..404511d 100644 --- a/worker/tests/integration/test_smtp_real_aruba.py +++ b/worker/tests/integration/test_smtp_real_aruba.py @@ -11,7 +11,7 @@ Testa: 5. Rilevazione ricevute accettazione/consegna Eseguire DENTRO il container worker: - docker exec -e PYTHONPATH=/worker pecflow-worker-1 python \ + docker exec -e PYTHONPATH=/worker pechub-worker-1 python \ /worker/tests/integration/test_smtp_real_aruba.py """ @@ -28,7 +28,7 @@ from unittest.mock import MagicMock if "ENCRYPTION_KEY" not in os.environ: os.environ["ENCRYPTION_KEY"] = "6465762d656e6372797074696f6e2d6b65792d6e6f742d666f722d70726f6400" os.environ.setdefault("SECRET_KEY", "dev-secret-key-not-for-production-use-only-for-local-0000000000000") -os.environ.setdefault("DATABASE_URL", "postgresql+asyncpg://pecflow:pecflow_dev_password@db:5432/pecflow") +os.environ.setdefault("DATABASE_URL", "postgresql+asyncpg://pechub:pechub_dev_password@db:5432/pechub") os.environ.setdefault("REDIS_URL", "redis://redis:6379/0") os.environ.setdefault("MINIO_ENDPOINT", "minio:9000") @@ -157,9 +157,9 @@ async def test_smtp_send() -> tuple[str | None, bool]: sender = SmtpSender(mailbox) ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - subject = f"[PecFlow TEST] Verifica SMTP+Ricevute – {ts}" + subject = f"[PEChub TEST] Verifica SMTP+Ricevute – {ts}" body = ( - f"Messaggio di test automatico PecFlow – {ts}\n\n" + f"Messaggio di test automatico PEChub – {ts}\n\n" "Verifica:\n" " 1. Connessione SMTP SSL porta 465 → smtps.pec.aruba.it\n" " 2. Autenticazione e invio PEC\n" @@ -167,7 +167,7 @@ async def test_smtp_send() -> tuple[str | None, bool]: " 4. Ricezione ricevuta di avvenuta consegna\n\n" f"Mittente : {PEC_EMAIL}\n" f"Destinato: {TO_ADDRESS}\n\n" - "Non rispondere. Generato da PecFlow SaaS.\n" + "Non rispondere. Generato da PEChub SaaS.\n" ) _sep() @@ -458,7 +458,7 @@ async def test_imap_full_inspection() -> None: print(" • I messaggi in INBOX non sono ancora stati aggiornati") print() print(" 💡 Ri-esegui lo STEP 2 manualmente tra qualche secondo con:") - print(" docker exec -e PYTHONPATH=/worker pecflow-worker-1 python -c \"") + print(" docker exec -e PYTHONPATH=/worker pechub-worker-1 python -c \"") print(" import asyncio, sys; sys.path.insert(0,'/worker')") print(" from tests.integration.test_smtp_real_aruba import test_imap_full_inspection") print(" asyncio.run(test_imap_full_inspection())\"") @@ -481,7 +481,7 @@ def _sep(char: str = "─", width: int = 60) -> None: def _banner() -> None: _sep("═") - print(" PecFlow – Test SMTP/IMAP Reale (Aruba PEC)") + print(" PEChub – Test SMTP/IMAP Reale (Aruba PEC)") _sep("═") print(f" Timestamp : {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print(f" Casella PEC : {PEC_EMAIL}")