Changelog
Ada kabar baru.
Setiap perbaikan pada platform, sebagai kapal.
· 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
Tambahkan entitas pemulihan + repos; bump ke 1.3.0 (SP3)
Tambahkan Password ResetToken, SmSOtp, RecloverySesion, AkuntVerificationCode Entitas JPA dengan repositori yang sesuai untuk aliran pemulihan SP3.
· kamo-shared-library
Tambahkan SecurityRequesonCatalog enum + sq1 / 2 / 3 + seedPhraseHash ke Pengguna (SP3)
· InitializerService
Add SP3 recovery table DDL + User column additions to SchemaCleanupRunner
· kamo-internal
Pratinjau rute melalui latar belakang Browser - modal yang dirender (bagian dari Sp2)
Peramban Templat Email kini memiliki Modal Pratilik secara langsung, jadi Manajer tidak perlu lagi mencegat permintaan pratinjau tingkat row-dan redirect to edit mode.
· kamo-internal
Wire EmailTemplateEdit ke API nyata
Hidrates dari templateApi.get, saved via templateAppi.update. Kategori dropdown adalah API- didorong dengan kategori inline-menciptakan affordance. Variabel picker dibaca dari variableContrats.ts (menyatakan kontrak untuk REQUIRED kunci template; set umum untuk CUSTOM). Edit baris REQUIRED / SYSTEM Tampilkan spanduk peringatan yang sesuai. Tombol pratilik membuka backend-diberikan Email TemplatePreview modal. Bagian dari Sp2.
· kamo-internal
Wire EmailTemplateBrowser ke API + tambahkan tab Standar Sistem
Menggantikan ~ 140 baris data mock dengan template Api.list () panggilan. Kondisional tab kelima 'Sistem Baku' hanya muncul untuk tingkat atas -org admin dan render dari response.systemTemplats. Filter kategori penduduk dari kategoryApi.list (). Semua aksi baris * * * * * * * * * * * * * * * * * hit real backend titik akhir. Galat diarahkan melalui helper bakar handleApiError. Bagian dari Sp2.
· kamo-internal
Tambahkan EmailTemplateDupcateDialog (bagian dari Sp2)
· kamo-internal
Tambahkan Modal Manajer EmailTemptategoryManager (bagian dari Sp2)
· kamo-internal
Tambahkan Modal EmailTemplatePreview
Opens on row- action Preview. Backend- dirender melalui templateApi.preview (); hasil yang ditampilkan dalam iframe sandboxed untuk isolasi gaya. Cocok jalur kode yang tepat yang mengirim penggunaan, jadi apa yang Anda preview adalah apa penerima dapatkan. Bagian dari Sp2.
· kamo-internal
Tambahkan template Api + kategoryApi + variableContracts modul klien
Wraps SP1 's / api / email / templates / * dan * * * * * * * * * * * endpoints with typeScript helpers. variableContracts cermin SP1 Javadoc TemplateKeys sehingga pertunjukan variabel penyunting dideklarasikan kontrak untuk contoh REQUIRED. Bagian dari 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
Tambahkan Email TemplateCategoryService - CRUD untuk kategori org- scoped
Menyebabkan keunikan nama sensitivitas per org dipaksa pada lapisan layanan (Cocok dengan sebagian indeks unik di DB). Penghapusan _ id kategori pada template terpengaruh sebelum menghapus baris kategori. Bagian dari SP1.
· EmailService
Tambahkan Email TemplateService - CRUD + kirim + seed + reset-to-default
Penata inti untuk email transkasional. sendToUser menyelesaikan template, membuat subjek / tubuh, memilih domain utama org dari Organisasi. domain, and hands off to EmailsmttpService with NoReply @ {org.domain} as from -address. Termasuk seedForOrg untuk kait lifecycle new-org dan resetToDefault yang menyalin sebuah isi baris SISTEM melalui sebuah baris per-org REQUIRED. Auth untuk pengiriman menggunakan kredensial layanan transkasional SMTP (transctional.smtp.user / transctional.smtp.pass) daripada per- anggota Penyedia penyedia - pengiriman transkasional tidak memiliki anggota akting. Bagian dari SP1.
· EmailService
Tambahkan Layanan Pemberitahuan untuk 'NoReply @ {domain}' dari -address
Sumber kebenaran tunggal untuk transctional- email dari alamat. Menerima domain string, lowercase-normalizes itu, kembali "NoReply @ < domain >". Penelepon harus menyelesaikan domain org (via Organisasi. Domains cari atau seperti) dan meneruskannya. Bagian dari SP1.
· EmailService
Tambah Pengatur Templat bagi pengganti {{var}}}
Stareless regex- berbasis renderer. Hilang vars pengganti string kosong dan Keluarkan sebuah log WARN dengan templateKey + orgId untuk atclate. Tidak ada HTML melarikan diri dalam v1 - nilai server- dikendalikan. Bagian dari 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
Tambahkan Canonicale TemplateLoader + CanonicalTemplate record
Membaca tiga contoh yang hilang (WELCOME, PASSWORD _ RESET, EMAIL _ VERIFIKASI) dari sumber daya classpath di * * * * * * * * * * * * * * * Dikonsumsi oleh KamoInitializerService for SYSTE-row seeding. Bagian dari SP1.
· kamo-shared-library
Tambahkan HTML + JSON untuk Welcome, PASSWORD _ RESET, EMAIL _ VERIFIKASI
Isi dari kebenaran bagi baris SISTEM. Dimuat di Layanan KamoInitializerService started by Canoniclale TemplateLoader and UPSERTed into email _ templates. Bagian dari SP1.
· kamo-shared-library
Tambahkan repositori EmailTemplate +
Toko satu baris SYSTEM per template _ key (org _ id NULL, adalah _ system TRUE) plus satu clone per org per template _ key. Soft--reference org _ id / categori _ id. DB- penanda waktu didorong; JSONB untuk body _ blocks dan tag. Repositori menyediakan pencarian org- scoped, penggunaan atom counter peningkatan, dan kategory- hapus Pembersihan melalui penghapusan Kategori ForOrg. Bagian dari SP1.
· kamo-shared-library
Tambahkan repositori Email TemplateKategori +
Kategori organik untuk template email. _ Id BIGINT Lembut (tidak ada FK) cocok dengan pola yang ada. Case- nama sensitif unik per-org adalah dipaksa melalui indeks parsial ditambahkan dalam KamoInisialerservice. Bagian dari SP1.
· kamo-shared-library
Tambahkan TemplateStatus enum + TemplateKeys konstanta untuk template trankasional
Menyatakan keadaan lifecycle REQUIRED / CUSTOM / ARCHIVED dan tiga membutuhkan kunci template (WELCOME, PASSWORD _ RESET, EMAIL _ VERIFIKASI). Kontrak variabel untuk setiap template REQUIRED yang didokumentasikan sebagai Javadoc pada kelas konstanta; SP3 dan SP4 penelepon referensi ini. Bagian dari 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.

Alam semestamu menunggu.
Mulai gratis dalam beberapa menit. Tambahkan produk kapanpun Anda siap — tidak ada migrasi, tidak ada login baru.
Gratis selamanya — tidak diperlukan kartu kredit