Per-instance 자원 관제사 + org 집계 + 내부 sync
Per-instance 자원 CRUD (확장 / 사용자 / 장치 / 음성 메일) : - VoipExtensionsController at *********** - VoipUsersController at /api/voip/instances/{id}/users 에서 - VoipDevice...
Multi-instance provider refactor + full FreePBX + Flowroute SMS
Core model change: one org → many VoipProviderInstances (was: one per org). Every provider API call is now instance-scoped. PhoneProvider interface: - New meth...
Kamo-shared-library 업데이트에 대한 재건 (remove OrganizationType, add isTopLevel)
Kamo-shared-library 업데이트에 대한 재건 (remove OrganizationType, add isTopLevel)
Kamo-shared-library 업데이트에 대한 재건 (CREATE CHILD ORG 오른쪽 + 적용 플래그)
새로운 RoleRightType.CREATE CHILD ORG (id 131)을 잡아, ChildOrgSecurityModel의 3개의 적용 대상 플래그, 2개의 13-arg 서비스 하중 및 AppliedModelEnforcementService Creator-type 헬퍼.
Kamo-shared-library 업데이트에 대한 재건 (appConfig upsert-only fix)
더 이상 AppConfig 행을 삭제하지 않은 ****************는 콜러의 페이로드에서 서비스 유형이 absent 인 appConfig 행을 삭제합니다. 부분 페이로드가 수신되면 침묵 데이터 손실을 방지합니다.
Kamo-shared-library 업데이트에 대한 재건 (효과적인 기능 해결자)
새로운 AppliedModelEnforcementService 메소드 (computeAvailabilityMap, isAppEffectivelyEnabled, getEffectivelyEnabledAppTypes, computeEffectiveFeatures)를 선택하여 이 서비스에서 ...
Bump kamo-shared-library 에 1.5.0 적용 모델 시행
Kamo-shared-library 1.5.0에이 서비스를 가져 와서 새로운 AppliedModelEnforcementService, ChildOrgSecurityModelAppConfig entity, ServiceAvailability를 선택합니다. 유형 enum, 조직. isPri...
Kamo-shared-library 업데이트에 대 한 재건 (시간 힘 규칙 + DEFAULT fallback in MemberRightsAppliedService)
Triggers는 업데이트된 ***********를 선택하여 템플릿의 힘 규칙과 DEFAULT-template fallbacks를 적용했습니다.
Kamo-shared-library 업데이트에 대 한 재건 (마스터 모델, 기본 역할 템플릿, 힘-rule 해결자)
Triggers는 조직.branchTypeID, Organization.masterModelID, ****************를 포함하는 새로운 kamo-shared-library 개정을 잡아 역할RightTemplateSetting 유형 enum, DefaultRoleType enu...
Bump kamo-shared-library to 1.4.0
Docker Stage 1 builds kamo-shared-library main (now 1.4.0) and installs it to the local .m2; the service pom still referenced 1.0.0 which Maven could not find, ...
Add InternalAuthFilter + POST /api/bulktext/send for service-to-service SMS (SP3)
Handle RC webhook validation token; make body optional for verification requests
Add MMS attachment support — multipart send, base64 storage, image display
- RingCentralProvider: override sendSms with multipart/form-data MMS path - VoipMessageService: accept attachment bytes, store base64 data URL in attachmentUrl ...
Add call event webhook pipeline; branch SMS vs telephony events before processing
Add capabilities, SIP credentials, and call management REST controllers
Implement RingCentral call management methods (sip, history, voicemail, presence, queues)
Extend PhoneProvider interface with call management methods; update stubs
Explicitly stringify Long IDs in SmsController responses
**************** Long-as-string approach was not taking effect. Directly call .toString() on all Long IDs in the controller flat-map responses to guarantee no J...
Serialize Long IDs as strings to prevent JS precision loss
CockroachDB unique_rowid() generates 64-bit integers larger than Number.MAX_SAFE_INTEGER (2^53-1). JS JSON.parse silently rounds them, causing conversation ID m...
Return flat map from send endpoint to prevent LazyInitializationException
VoipMessage.conversation is FetchType.LAZY; after @Transactional commits, Jackson serializing the entity would throw LazyInitializationException causing a 500, ...
Fall back to org mainPhoneNumber when member has no VOIP config
Members without an individual MemberVoipConfig (or no fromPhoneNumber set) now use the org's mainPhoneNumber from VoipProviderConfig as the outbound number, ins...
Remove getJwtKey() from WebhookController after OAuth migration
Signature validation used jwtKey as HMAC secret which no longer exists on VoipProviderConfig. Skip validation for now consistent with ****************
Refactor RingCentral to OAuth 2.0 Authorization Code flow
- New OAuthController: /oauth/start (returns authUrl), /oauth/callback (exchanges code, saves tokens), /oauth/status, DELETE /oauth/token - OTKValidationFilte...
Read RingCentral client-id/secret from platform config, not per-org DB
Client ID and Secret identify the Kamo app on RingCentral's platform — they are shared across all orgs. Inject them from Spring Boot properties (backed by the K...
Use correct session key casing for orgID and memberID
KSessionService stores keys as orgID and memberID (capital D). Both controllers were calling .get("orgId") and .get("memberId") which always returns null, causi...
Add Dockerfile for VOIPService
Matches the shared-library + service two-stage build pattern used by EmailService and other Java services.
