변경 로그
무슨 일이야?
플랫폼에 대한 모든 개선 사항, 그것이 선적.
· 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
복구 entities + 저장소 추가; 1.3.0 (SP3)에 범프
비밀번호 재설정 토큰, SmsOtp, RecoverySession, AccountVerificationCode 추가 SP3 복구 흐름에 대한 대응 저장소와 JPA entities.
· kamo-shared-library
SecurityQuestionCatalog enum + sq1/2/3 + SeedPhraseHash를 사용자 (SP3)에 추가하십시오
· InitializerService
Add SP3 recovery table DDL + User column additions to SchemaCleanupRunner
· kamo-internal
Browser의 backend-rendered modal을 통해 경로 미리보기 (SP2)
EmailTemplateBrowser는 이제 미리보기 모드를 직접 소유하므로 Manager no longer needs intercept 행 레벨 미리보기 요청 및 모드를 수정합니다.
· kamo-internal
철사 emailTemplateEdit에 진짜 API
TemplateApi.get에서 Hydrates, TemplateApi.update를 통해 저장합니다. (주) dropdown는 인라인 카테고리 생성 감당성으로 API 구동됩니다. 변수 picker는 variableContracts.ts (ReQUIRED에 대한 선언 계약 템플릿 키; CUSTOM의 일반적인 세트. REQUIRED / 시스템 행 편집 적절한 경고 배너를 보여줍니다. 미리보기 버튼이 열립니다. 이메일TemplatePreview modal. SP2의 부분.
· kamo-internal
Wire EmailTemplateBrowser to real API + 시스템 기본 탭 추가
TemplateApi.list() 호출을 가진 모성 데이터의 ~140 줄을 대체합니다. (주) 다섯 번째 탭 '시스템 디폴트'는 top-level-org 관리자 및 렌더링에만 나타납니다 response.systemTemplates에서. 카테고리에서 팝업 필터Api.list(). 모든 행 작업 *********** 실제 히트 반환 끝점. handleApiError toast helper를 통해 경로를 변경합니다. SP2의 부분.
· kamo-internal
EmailTemplateDuplicateDialog 추가 (SP2)
· kamo-internal
EmailTemplateCategoryManager modal 추가 (SP2)
· kamo-internal
EmailTemplatePreview modal 추가하기
행 액션 미리보기를 엽니다. TemplateApi.p (review);를 통해 백엔드 렌더링 style isolation의 sandboxed iframe에 표시된 결과. 일치하기 사용하는 정확한 코드 경로, 그래서 당신이 미리보기는 어떤 수신자가 얻을. SP2의 부분.
· kamo-internal
TemplateApi + categoryApi + variableContracts 클라이언트 모듈 추가
SP1의 /api/email/templates/* 및 *********** Typed TypeScript 헬퍼와 엔드포인트. variableContracts 미러 SP1 TemplateKeys Javadoc 그래서 편집기의 변수 피커는 선언 REQUIRED 템플릿에 대한 계약. 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
Service-to-service endpoint에 대한 InternalAuthFilter 추가
/api/email/templates/send에 X-Internal-Auth 헤더를 유효성 검사합니다. /api/email/templates/seed-org/* 경로. 다른 경로 우회 이 필터 (사용자 세션 auth 그들을 처리). 비밀은 INTERNAL AUTH SECRET에서 온다 카테고리 또한 Transactional.smtp.user / transactional.smtp.pass를 추가합니다. config stubs 소모 by EmailTemplateService — 모든 세 소스 k8s configmap 에서 생산. SP1의 부분.
· EmailService
EmailTemplateCategoryService 추가 — CRUD for org-scoped 카테고리
Case-insensitive name uniqueness per org 서비스 레이어에 강제 (DB의 일부 고유 인덱스를 매칭). 삭제 null 카테고리 id 범주를 제거하기 전에 영향을받는 템플릿에. SP1의 부분.
· EmailService
Add EmailTemplateService — CRUD + send + seed + reset-to-default
거래 이메일의 핵심 오케스트라. sendToUser는 템플릿을 해결합니다. 제목/체를 렌더링, 조직에서 org의 기본 도메인을 선택합니다. 도메인, noReply@{org.domain} 으로 이메일 보내기SmtpService 를 호출합니다. SeedForOrg for new-org Lifecycle Hook 및 resetToDefault를 포함합니다. 시스템 행의 내용을 per-org REQUIRED 행에 복사합니다. Auth for the send uses cluster-wide 거래 SMTP 서비스 자격 (transactional.smtp.user / Transactional.smtp.pass)는 per-member 보다는 오히려 공급자 결의자 - 거래는 행동 회원이 없습니다. SP1의 부분.
· EmailService
Add NoReplySenderService for 'NoReply@{domain}' from-address
주소에서 거래 이메일에 대한 진실의 단일 소스. 지원하다 도메인 문자열, lowcase-normalizes, 반환 "NoReply@<domain>". Callers는 org의 도메인을 해결해야합니다 ( Organization.domains lookup 또는 유사) 그리고 그것을 안으로 전달하십시오. SP1의 부분.
· EmailService
TemplateRenderer를 {{var}} 대용 추가하기
Stateless regex 기반 렌더링기. Missing vars 대체 빈 문자열 및 템플릿키 + orgId로 WARN 로그를 방출합니다. HTML escaping 없음 v1 - 값은 서버 제어입니다. 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
CanonicalTemplateLoader + CanonicalTemplate 기록을 추가하십시오
3개의 필요한 템플릿(WELCOME, PASSWORD RESET, EMAIL VERIFICATION) 클래스 경로 리소스에서 *************** 제출하기 KamoInitializer System-row 묘종 서비스. SP1의 부분.
· kamo-shared-library
WELCOME, PASSWORD RESET, EMAIL VERIFICATION에 대한 canonical HTML + JSON 추가
시스템 행에 대한 Source-of-truth 내용. KamoInitializerService에서 로드됨 CanonicalTemplateLoader 및 UPSERTed의 시작은 email templates로 발송됩니다. SP1의 부분.
· kamo-shared-library
EmailTemplate entity + 저장소 추가
Template key (org id NULL, is system TRUE)에 대한 하나의 시스템 행 저장 Template key 당 org 당 한 clone. 소프트 환경 org id/category id. 사이트맵 driven timestamps; body blocks 및 태그에 대한 JSONB. Repository 제공 org-scoped lookups, 원자 사용 카운터 증가 및 카테고리 저장소 nullifyCategoryForOrg를 통해 정리합니다. SP1의 부분.
· kamo-shared-library
EmailTemplateCategory entity + 저장소 추가
Org-scoped 카테고리 이메일 템플릿. 소프트 BIGINT org id (FK 없음) 기존 패턴 일치. Case-insensitive 이름 고유성 per-org는 KamoInitializerService에 추가된 부분 인덱스를 통해 시행됩니다. SP1의 부분.
· kamo-shared-library
TemplateStatus enum + TemplateKeys 거래 템플릿에 대한 상수
REQUIRED/CUSTOM/ARCHIVED 수명주기 상태를 선언하고 3 필요한 템플릿 키 (WELCOME, PASSWORD RESET, EMAIL VERIFICATION). 각 REQUIRED 템플릿에 대한 가변 계약은 Javadoc으로 문서화 일정 클래스; SP3 및 SP4 콜러 참조. 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.

당신의 우주는 기다리고 있습니다.
몇 분 안에 무료로 시작하세요. 준비가 되면 언제든지 제품을 추가할 수 있습니다.
영원히 무료 - 신용 카드 필요 없음