Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· SecurityService
Add AccountSettingsController + Service for phone + security questions (SP3)
Allows logged-in users to set/verify phone and configure 3 security questions. Routes to /api/account/* (session-authenticated via KSESSION_DATA).
· SecurityService
Add BulkTextSmsClient + EmailTemplateServiceClient + PasswordRecoveryController (SP3)
Full password recovery flow: email-link, SMS OTP, security questions, seed phrase. Routes to /api/recover/* (unauthenticated). Uses SP1 email pipeline + VOIPService SMS.
· VOIPService
Add InternalAuthFilter + POST /api/bulktext/send for service-to-service SMS (SP3)
· kamo-shared-library
Aggiungere entità di recupero + repos; urto a 1.3.0 (SP3)
Aggiunge PasswordResetToken, SmsOtp, RecoverySession, AccountVerificationCode entità JPA con corrispondenti repository per il flusso di recupero SP3.
· kamo-shared-library
Aggiungi SecurityQuestionCatalog enum + sq1/2/3 + seedPhraseHash all'utente (SP3)
· InitializerService
Add SP3 recovery table DDL + User column additions to SchemaCleanupRunner
· kamo-internal
Anteprima del percorso attraverso il backend di Browser-rendered modal (parte di SP2)
Il EmailTemplateBrowser ora possiede l'anteprima modale direttamente, quindi il Manager non ha più bisogno di intercettare richieste di anteprima a livello di riga e reindirizzare alla modalità di modifica.
· kamo-internal
Wire EmailTemplateEdit to real API
Idrata da templateApi.get, salva tramite templateApi.update. Categoria dropdown è API-driven con la garanzia di creazione di categoria in linea. Variabili picker legge da variabiliContracts.ts (contratti dichiarati per REQUIRED chiavi modello; set comune per CUSTOM). REQUIRED / editing file SYSTEM mostra il banner di avviso appropriato. Anteprima pulsante apre il backend-rendered EmailTemplatePreview modal. Parte di SP2.
· kamo-internal
Wire EmailTemplateBrowser a API reale + aggiungere la scheda Default di sistema
Sostituisce ~140 linee di dati mock con le chiamate templateApi.list(). Condizione quinta scheda 'System Defaults' appare solo per gli amministratori e i render di top-level-org da risposta.systemTemplates. Filtro categoria popolato dalla categoriaApi.list(). Tutte le azioni di riga E' vero. backend endpoints. Errori indirizzati attraverso la manigliaApiError tostapane helper. Parte di SP2.
· kamo-internal
Aggiungi EmailTemplateDuplicateDialog (parte di SP2)
· kamo-internal
Aggiungi EmailTemplateCategoryManager modal (parte di SP2)
· kamo-internal
Aggiungi EmailTemplatePreview modal
Si apre su Anteprima azione riga. Backend-rendered tramite templateApi.preview(); risultato visualizzato in un iframe sabbiato per isolamento stile. Corrisponde alle percorso di codice esatto che l'invio utilizza, quindi quello che si prevede è ciò che i destinatari ottengono. Parte di SP2.
· kamo-internal
Aggiungi templateApi + categoriaApi + variabiliContraccia i moduli client
E' una specie di... endpoints con helper TypeScript digitati. variabiliContratti specchi SP1 TemplateKeys Javadoc così il raccoglitore variabile dell'editor mostra dichiarato contratti per modelli REQUIRED. Parte di SP2.
· SecurityService
Wire EmailTemplateSeedClient into ****************
Thin RestTemplate client that POSTs to EmailService's **************** after an org + owner TeamMember are persisted. Retries twice with backoff; failure throws OrgProvisioningException and rolls back the surrounding @Transactional so the org + owner-TeamMember save is undone (per SP1 spec). Mirrors the existing TranslateServiceClient X-Internal-Auth pattern. k8s/configmap.yaml adds: email.service.url (EmailService internal URL) internal.auth.secret (cluster-wide X-Internal-Auth header value) pom.xml bumps kamo-shared-library 1.1.0 → 1.2.0. Part of SP1.
· EmailService
Add EmailTemplateCategoryController REST endpoints
**************** CRUD. Delete response includes reassignedCount — the number of templates that became uncategorized as a result of removing the category. Session context read via the same **************** pattern as other EmailService controllers. Part of SP1.
· EmailService
Add EmailTemplateController REST endpoints + DTOs
Exposes /api/email/templates/* CRUD + preview + duplicate + reset-to-default + service-to-service /send + /seed-org/{orgId}. Top-level orgs (no parent) additionally see systemTemplates in the list response. Service-to-service endpoints are protected by the existing InternalAuthFilter. Session context (orgID, memberID) read from OTKPreAuthFilter's REQ_ATTR_SESSION attribute — the same pattern already used by AliasController / MailboxController. Part of SP1.
· EmailService
Add InternalAuthFilter for service-to-service endpoints
Validates X-Internal-Auth header on /api/email/templates/send and /api/email/templates/seed-org/* paths. Other paths bypass this filter (user session auth handles them). Secret comes from INTERNAL_AUTH_SECRET env var. Also adds transactional.smtp.user / transactional.smtp.pass config stubs consumed by EmailTemplateService — all three are sourced from the k8s configmap in production. Part of SP1.
· EmailService
Aggiungi EmailTemplateCategoryService — CRUD per le categorie org-scope
Caso-insensibile nome unicità per org applicato a livello di servizio (scelga l'indice unico parziale nel DB). Cancellazione nulls categoria id sui modelli interessati prima di rimuovere la riga di categoria. Parte della SP1.
· EmailService
Add EmailTemplateService — CRUD + send + seed + reset-to-default
Core orchestrator for transactional email. sendToUser resolves the template, renders subject/body, picks the org's primary domain from Organization.domains, and hands off to EmailSmtpService with NoReply@{org.domain} as from-address. Includes seedForOrg for new-org lifecycle hook and resetToDefault that copies a SYSTEM row's content over a per-org REQUIRED row. Auth for the send uses cluster-wide transactional SMTP service credentials (transactional.smtp.user / transactional.smtp.pass) rather than the per-member provider resolver — transactional sends have no acting member. Part of SP1.
· EmailService
Aggiungi NoReplySenderService per 'NoReply@{domain}' dall'indirizzo
Singola fonte di verità per e-mail transazionale da indirizzi. Accetta un stringa di dominio, abbassare-normalizza, restituisce "NoReply@θdomain>". I chiamanti devono risolvere il dominio dell'org (tramite Organization.domains lookup o simile) e passarlo dentro. Parte della SP1.
· EmailService
Aggiungi TemplateRenderer per la sostituzione {{var}}
Render basato su regex senza stato. I vars mancanti sostituiscono la stringa vuota e emettere un registro WARN con templateKey + orgId per attribuzione. Nessuna fuga HTML in v1 — i valori sono controllati dal server. Parte della SP1.
· InitializerService
Add EmailTemplateSeedRunner for SYSTEM + per-org seeding
Runs at @Order(20) on KamoInitializerService startup. Loads canonical templates from kamo-shared-library resources; upserts SYSTEM rows (no clobber); backfills per-org rows for every org that doesn't yet have them. Idempotent — safe to re-run on every startup. Part of SP1.
· InitializerService
Add partial unique indexes + CHECK constraints for email_templates
Hibernate ddl-auto can't generate partial unique indexes or computed-CHECK constraints. This commit adds them via the existing idempotent DDL runner pattern after Hibernate creates the base tables from the new entities. Part of SP1.
· kamo-shared-library
Aggiungi CanonicalTemplateLoader + CanonicalTemplate record
Legge i tre modelli REQUIRED (WELCOME, PASSWORD RESET, EMAIL VERIFICAZIONE) dalle risorse dei percorsi di classe E' il momento giusto. Consumato da KamoInitializerService per la semina a dorsale SYSTEM. Parte della SP1.
· kamo-shared-library
Aggiungi HTML canonica + JSON per WELCOME, PASSWORD RESET, EMAIL VERIFICATION
Contenuto fondamentale per le righe SYSTEM. Caricato su KamoInitializerService avvio da CanonicalTemplateLoader e UPSERTed in email templates. Parte della SP1.
· kamo-shared-library
Aggiungere EmailTemplate entità + repository
Memorizza una riga SYSTEM per template key (org id NULL, is system TRUE) plus un clone per org per template key. Riferimento morbido org id/category id. DB... timestamp guidati; JSONB per body block e tag. Repository fornisce org-scoped lookups, uso atomico contro incremento, e categoria-delete pulizia tramite nullifyCategoryForOrg. Parte della SP1.
· kamo-shared-library
Aggiungi EmailTemplateCategory entità + repository
Le categorie Org-scoped per i modelli di posta elettronica. Soft BIGINT org id (no FK) corrisponde a modelli esistenti. L'unicità del nome Case-insensibile per-org è applicato tramite un indice parziale aggiunto in KamoInitializerService. Parte della SP1.
· kamo-shared-library
Aggiungi TemplateStatus enum + TemplateKeys costanti per modelli transazionali
Dichiara il ciclo di vita REQUIRED/CUSTOM/ARCHIVED e i tre chiavi di modello richieste (WELCOME, PASSWORD RESET, EMAIL VERIFICATION). Contratti variabili per ogni modello REQUIRED documentati come Javadoc su la classe costante; SP3 e SP4 chiamanti di riferimento questi. Parte della SP1.
· InitializerService
Seed KamoCRM with ALL_WORK_ELIGIBLE on fresh installs
The createOrg() helper applies this single argument to both ageReqTypeMember and ageReqTypeTeamMember; consistent with platform convention. Pairs with KamoCRMAgeReqUpdateRunner which handles existing deployments via a conditional UPDATE. Completes SP5.
· InitializerService
Add one-time runner to migrate KamoCRM agereq to ALL_WORK_ELIGIBLE
Conditional idempotent UPDATE runs on service startup; WHERE clause checks the expected old value so re-runs are no-ops. Errors are logged and swallowed — startup must not block on this non-critical migration. Part of SP5. Pairs with the DataLoader edit in the next commit that makes fresh installs seed the new value directly.

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta