மாற்று பதிவேடு
என்ன புதிது.
அது கப்பல்கள் போல், தளத்தில் ஒவ்வொரு மேம்பாடு.
· VOIPService
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 methods for extension/user/device CRUD + voicemail audio/transcription. - New capability flags (extensionManagement, userManagement, deviceManagement, voicemailTranscription). Defaults throw **************** (HTTP 501) so stub providers don't break. Frontend checks getCapabilities() to hide/disable actions per provider. - ProviderException (HTTP 502) for external-dependency failures. PhoneProviderFactory: - getInstance(UUID) / **************** replace legacy getProvider(Long orgId); getPrimaryForOrg(Long) kept for legacy call sites (CallController, CapabilitiesController, SipController, webhook inbound). - RingCentral OAuth tokens now scoped by (orgId, provider, instanceId) so one org can authenticate multiple independent RingCentral deployments. - FreePBX construction reads config_json → {baseUrl, clientId, clientSecret, ignoreSslErrors} and instantiates a dedicated FreePBXGraphQLClient. RingCentral (RingCentralProvider): - Constructor takes instanceId for log context. - New methods: listExtensions / createExtension / updateExtension / deleteExtension; listUsers / createUser / updateUser / deleteUser (RC models both as type=User extensions); listDevices / createDevice / updateDevice / deleteDevice; fetchVoicemailAudio (streams attachment content) and fetchVoicemailTranscription. FreePBX (FreePBXProvider) — full implementation replaces placeholder: - Client-credentials OAuth2 token caching via FreePBXTokenCache (~1h TTL, auto-refresh on 401, per-instance). - FreePBXGraphQLClient: GraphQL + REST transports with optional skip-SSL-verification for self-signed on-prem PBXes. - Extensions, User Manager users, Endpoint Manager devices, voicemail list/mark-read/delete + audio stream, CDR call history, SIP credentials derived from the extension's pjsip secret, health via fetchAsteriskInfo. - SMS explicitly unsupported (capability sms=false) — FreePBX doesn't handle carrier SMS. Flowroute SMS (FlowrouteTextProvider): - Messages v2.1 API with HTTP Basic (accessKey, secretKey). - Health probe hits GET /numbers?limit=1. - Registered with BulkTextProviderFactory via new FLOWROUTE enum value. Controllers: - VoipInstanceController (renamed from ProviderConfigController) — full CRUD at /api/voip/instances with per-instance test/sync. Secrets redacted in GET responses ('***'); merge-update lets UI round-trip redacted fields without clobbering stored credentials. - BulkTextInstanceController (renamed from BulkTextConfigController) — mirror CRUD at /api/bulktext/instances with test / test-send / send. - OAuthController rewritten for instance-scoped OAuth: start, callback, status, disconnect all take instanceId. - SmsController resolves instance from member.instanceId → org primary, attaches to upserted conversations. - CallController / CapabilitiesController / SipController fall back to the org's primary active instance for legacy single-instance endpoints. Services: - InstanceSyncService: pull-through cache sync — extensions/users/devices/ voicemails copied from provider to local tables, missing rows soft-marked UNKNOWN. Each sub-step wrapped so one unsupported capability doesn't fail the entire sync (e.g. FreePBX no-SMS + has-extensions). - VoipMessageService: all conversation/message paths propagate instanceId. Tests: pre-existing VoipProviderConfig-specific tests removed (covered the renamed types; rewriting is out of scope per design spec §10 — no TDD infrastructure is being added in this refactor). Builds green with updated kamo-shared-library.
· InitializerService
Multi-instance phone/SMS provider migration
Runs after Hibernate ddl-auto:update creates new tables (VOIP_PROVIDER_INSTANCE, BULK_TEXT_PROVIDER_INSTANCE, PHONE_EXTENSION, PHONE_END_USER, PHONE_DEVICE, PHONE_VOICEMAIL, SYSTEM_CONFIGURATION) from the renamed/new entities in kamo-shared-library commit 232d731. Handles what Hibernate cannot: - Copy rows from legacy voip_provider_config / bulk_text_provider_config into new *_instance tables, synthesizing instance_name from provider type. - Drop NOT_CONFIGURED (ordinal 0) rows — absence is now the "no provider" state. - Drop the now-empty legacy *_config tables. - Backfill instance_id on member_voip_config, voip_conversations, and kamotokens.org_oauth_token using each org's oldest active instance. - Rebuild org_oauth_token unique index from (org_id, provider) to (org_id, provider, instance_id) so multiple RingCentral instances per org work. - Drop orphan unique indexes from voip_conversations + provider instance tables. - Seed the system_configuration singleton row (voip sync interval 10min default, enabled true) — platform operator configures this via the new platform config VOIP & SMS tab. All statements idempotent; re-running on already-migrated DB is safe. Order 20 — after SchemaCleanupRunner (1), OrganizationTypeRemovalRunner (2), KamoCRMAgeReqUpdateRunner (10).
· kamo-shared-library
Multi-instance phone/SMS provider schema foundation
- Rename VoipProviderConfig → VoipProviderInstance; drop UNIQUE(org_id), add instance_name, config_json, last_sync_at, last_sync_error. - Rename BulkTextProviderConfig → BulkTextProviderInstance; same multi-instance treatment. - New entities: PhoneExtension, PhoneEndUser, PhoneDevice, PhoneVoicemail, SystemConfiguration. - Add instance_id to MemberVoipConfig, VoipConversation, OrgOAuthToken (multiple RingCentral instances per org). - New enums: PhoneExtensionStatus, PhoneEndUserStatus, PhoneDeviceType, PhoneDeviceRegistrationStatus. - Deprecate NOT_CONFIGURED in **************** (kept at ordinal 0 to preserve existing rows under EnumType.ORDINAL). - Add FLOWROUTE to BulkTextProviderType for new Flowroute SMS provider. - Provider-abstraction DTOs (ExtensionDto, PhoneUserDto, DeviceDto, VoicemailEntryDto, InstanceHealthDto, Create/Update requests). First phase of multi-instance phone/SMS refactor — see **************** (in kamo-login repo). KamoInitializer migration + service refactors to follow.
· KlusterServices
Deploy FreePBX 17 + Jigasi SIP bridge on k1m1 and k2m1
FreePBX (tiredofit/freepbx:17-latest) runs with hostNetwork so SIP/RTP preserves real client IPs, pinned one-per-node via nodeSelector. SIP on 5060 UDP/TCP (5061 TLS), RTP range 18000-18999 chosen to avoid Janus (20000-20999), Coturn (52000-65535), and WireGuard (51820-51821). Meet Jigasi added as an internal ClusterIP SIP bridge so FreePBX can trunk calls into Meet conferences; Prosody now provisions a jigasi user from JIGASI_XMPP_PASSWORD. Admin UI reachable via Traefik at pbx.k1.kluster.kamocrm.com / pbx.k2.kluster.kamocrm.com with certs seeded through auto-cert STATIC_DOMAINS.
· kamo-internal
Platform-admin view, pagination, live search, filters, org logos
Platform admins (top-level org owner) now see every org in the system via the new /api/security/org/all-networks endpoint instead of just their own memberships. The header title and subtitle update to reflect the admin context. Other enhancements: - Pagination: client-side, default 25/page, configurable (10/25/50/100) - Live search: filters by title, short title, or domain in real time - Filter chips: "All", "Orgs I Own", "DNS Not Yet Configured" - Result count shown next to page-size selector - Page number buttons with ellipsis collapse for large page counts - OrgLogo component consolidates logo rendering (short logo via getOrgLogoUrl) for both the current-org card and all org cards in the list - ENTER button correctly guarded by org.memberId (shared user+member record) - ENTER AS SYSTEM MEMBER available for all orgs when canEnterAsSystemMember
· SecurityService
Add GET /api/security/org/all-networks for platform admins
Top-level org owners can now fetch all organizations in the system with membership info relative to the caller. Orgs where the caller has a member record get isOwner/memberId populated; others get memberId: null, isOwner: false. Endpoint enforces that the caller is both in the top-level org and is an owner.
· kamo-internal
Sub-tabs in security-model editor + cleanup
- Security-model editor on **************** is now split into four sub-tabs: General (Basic Info, Visibility, Who Can Create, Platform Settings, Domain Config, Commerce Markets), Censorship (alcohol/ tobacco/firearms + member + team-member age ranges), Allowed Apps, and Default Security Roles. - New **************** lets an admin edit a model's allowRootSubdomains flag and parent aliases alongside the rest of that model's settings. Previously this lived inside the org-wide Subdomain Branches popup. - Subdomain Branches popup is simplified to the org-level bits only — GoDaddy credentials + master enable toggle. Per-model aliases moved out of both the dialog and its prop surface; SecurityRoleManager drops the now-unused props too. - Removes every reference to teamMemberPayFeesSetting / PayFeesSetting / TriStateFeeOption — the "Employee Self-Pay Kamo Fees" select on the model editor and its chip in the models table are gone, along with the type aliases in useAppliedModel. - /settings/platform/events and /settings/platform/plans pages are deleted (they were placeholders from the deprecated billing surface). The landing page, SettingsStatusWindow sub-topic list, and route/icon maps all drop the matching entries. - Manage Group sub-tab on **************** now displays the Default Group's title as a disabled read-only field (was previously hidden entirely behind an info alert) so admins can see the group's name while understanding it can't be changed.
· kamo-internal
Alias visibility UI + Subdomain Branches button on branch-types page
SubdomainBranchesDialog: - Alias editor replaced chip list with a table-style row list showing Members and Team Members checkboxes per alias — admins control which creator types see each parent alias in /network/create - onUpdateModelSubdomainConfig signature updated to pass full alias objects (alias, visibleToMembers, visibleToTeamMembers) instead of plain strings SecurityRoleManager: - fullSecurityModels state + loadFullSecurityModels map aliases with **************** flags - persistModelSubdomainConfig passes full alias objects to the backend BranchSetupManager **************** - Added Subdomain Branches button (mirrors security-roles page) with the same SubdomainBranchesDialog, status-fetch on mount, and model reload when the dialog opens
· SecurityService
Alias visibility filtering + auto-verify subdomain ownership
OrganizationController: - Web-alias org creation now auto-marks ownershipVerified=true and isDnsVerified=true on the created OrgDomain — no TXT record needed since we provisioned DNS on GoDaddy on their behalf - CUSTOM parentAliasType path now enforces per-alias creator-type visibility (mirrors /creatable filter so the backend can't be bypassed) BranchTypeController /creatable: - parentAliases list is now filtered by the caller's creatorType: MEMBERS see only visibleToMembers=true aliases, TEAM_MEMBERS see only visibleToTeamMembers=true aliases, OWNERS see all - Each alias DTO now includes visibleToMembers + visibleToTeamMembers flags SecurityModelController: - processSubdomainBranchConfig now reads **************** from alias map objects and calls replaceAllFull to persist them
· kamo-shared-library
Add per-alias creator-type visibility flags
Add visibleToMembers / visibleToTeamMembers boolean columns to ChildOrgSecurityModelAlias so admins can restrict which parent aliases appear to Members vs Team Members when creating child orgs. - Entity: two @Builder.Default true columns with BOOL DEFAULT TRUE - SubdomainAliasDTO: expose both flags in fromEntity - **************** new AliasEntry record + replaceAllFull overload that persists visibility; replaceAll(strings) delegates to it
· kamo-internal
Settings dialog, web-alias wizard path, and DNS provisioning panel
Adds the Subdomain Branches UI across three surfaces: - **************** new "Subdomain Branches" button opens a dialog for the org-level enable toggle + GoDaddy creds, with a per-security-model editor for allowRootSubdomains + parent aliases (reuses the wizard's isValidAlias/toSafeAlias helpers) - /network/create: BasicsStep now branches between a bring-your-own-domain path and a Kamo web-alias path (gated on the parent org's enable flag, GoDaddy status, and the selected branch type's aliases). Parent Alias dropdown lists ROOT (when allowed) plus per-model aliases; live help preview updates as the user changes either field - /setup/dns: new DnsProvisioningPanel polls the org's provisioning log and surfaces per-record GoDaddy status with a retry-failed action Backed by Next.js BFF proxy routes under ****************
· SecurityService
Org-level config, GoDaddy client, and web-alias org create path
Wires the new Subdomain Branches feature end-to-end on the backend: - SubdomainBranchesController for org-level enable + GoDaddy creds (live-verified) - GoDaddyDnsClient performs idempotent CNAME upserts and credential checks - DnsProvisioningService async-queues the standard KnownAliases subset and writes per-record rows to OrgDnsProvisionLog - SecurityModelController carries allowRootSubdomains + aliases[] on create/update - **************** accepts the web-alias path (useWebAlias + parentAliasType + parentAliasId + webAlias), computes the resulting FQDN under the parent's root zone, and kicks off DNS provisioning after the transactional org create completes - BranchTypeController's /creatable endpoint exposes the per-model aliases and parent-org subdomain-branches status so the wizard can gate the UI
· kamo-shared-library
Add entities, cipher, and alias/DNS log scaffolding
Adds per-org GoDaddy creds (AES-GCM encrypted), an allowRootSubdomains flag and child-org alias collection on the security model, a DNS provisioning audit log, and a shared SecretCipher helper used by SecurityService to round-trip stored API keys without ever returning them to the frontend.
· kamo-internal
Prefix/suffix dropdowns, mailbox domain gate, explicit status
- Name prefix and suffix are now dropdowns populated from the NamePrefixType / NameSuffixType catalogs delivered by the org-config endpoint. Displays abbreviation + full name per option. - "Provision organization email mailbox" is now disabled unless the organization email's domain matches one of the org's verified mailbox domains (pulled from GET /api/email/domains). Clear inline messaging explains whether it's disabled due to missing email, no verified domains configured, or a domain mismatch — and names the actual configured domains so the admin knows what to use. - Team membership status no longer defaults to PROSPECT; admins must pick a lifecycle state explicitly or submit is blocked. Summary panel shows "not set" until a status is chosen.
· SecurityService
Explicit team status + name prefix/suffix catalogs
- GET **************** now returns namePrefixes and nameSuffixes, sourced from NamePrefixType and NameSuffixType so the Add Member / Add Team Member forms don't have to hard-code them. - POST /create-team-member now rejects a request that omits teamMembershipStatus (400). The previous silent PROSPECT fallback is gone — the caller must pick a lifecycle state explicitly so team members are never mis-tagged by default.
· kamo-internal
Full-width, three-pane Add Member form layout
Reworks the create form to use the entire content area instead of a 1100px-wide centered column. - 3-column responsive layout: sticky left section nav (md+), full-width form (always), live summary panel on the right (xl+). - Field rows now scale to available width: name section is 5-up at md+, contact + role rows go up to 4-up at xl breakpoints. - Sticky bottom action bar spans full width with a status hint and a gradient primary CTA. - Section nav uses scroll-spy to highlight the section the user is in and supports click-to-scroll. - Polished card style — soft borders, subtle hover lift, gradient section-header icons. - New right-pane summary card mirrors the form data live (avatar initials, name, username, email, role, status chip) and shows a ready-to-create indicator once validation passes.
· kamo-register
Merge alias/email/name/phone into a single "My Profile" step
Combine the previously separate "My E-Mail & Alias", "My Name", and "Phone Number" steps into one "My Profile" step for 13+ registrants, with alias + e-mail + legal name required and phone number optional (verified via SMS when entered). Under-13 registrants now see a single renamed "My User Alias" step — no e-mail, legal name, or phone. - RegisterFlow: simplified step list, unified handleNext validation, new renderStepContent cases. The profile step is internally scrollable so the three sections fit within the viewport. - RegisterStatus gains a "REGISTERED" value for under-13 completions where there is no email to verify — they're routed straight to the login page with ?registered=1 instead of the email-verification page.
· SecurityService
Make email + legal name optional for under-13 signups
The /api/security/register endpoint previously rejected any request missing email, first name, or last name. That made the under-13 path (KIDS_ONLY orgs, or ALL_AGES with a sub-13 registrant) impossible — those accounts legitimately have only an alias + password + seed phrase. Validation now requires alias + password on every path, and treats email + first name + last name as an all-or-nothing triple: supplying any one of them requires all three. The verification-email send and the response email field now guard on whether an email was actually provided, and the response status is "REGISTERED" (vs the existing "EMAIL_VERIFICATION_REQUIRED") when there is no email to verify.
· kamo-shared-library
Add **************** for enter-as checks
· kamo-internal
System User Configuration page + network ENTER AS SYSTEM MEMBER
Adds Platform Administration → Configuration, a parent-org-owner-only page that grants or revokes permission to impersonate the platform System User by department, job title, or individual team member. Registered in all three nav locations (settings page tile list, SettingsStatusWindow routes + sub-topics, and the page itself). Updates /network to use the new /api/security/enter-as endpoint for the existing ENTER button, so the destination domain receives a session built from the target org's member (fixing the bug where the source org's memberID/orgID leaked into the new session). Adds an ENTER AS SYSTEM MEMBER button next to ENTER that only renders after **************** confirms the caller is eligible.
· SecurityService
Backfill, enter-as flow, mutation guards, config API
Self-heal provisioning: SystemUserBackfillService runs on every SecurityService boot (from DataLoader) to add the is_system_user column and system_user_access table if missing, ensure the singleton System User record exists, and create an Administrator-role TeamMember in every non-top-level org it doesn't already belong to. Also runs at createOrganization time so new orgs get a System User membership immediately rather than waiting for the next restart. Cross-org enter flow: replaces the old /api/generate-otk hand-off (which leaked the caller's source-org session to the destination domain) with /api/security/enter-as. The new endpoint builds a fresh *** scoped to the target org's actual member, so memberID/orgID/rights always match the org being entered. Adds a SUDO_MEMBER_ID field to session JSON so that System User impersonation carries the human operator's memberId for audit attribution. Guards: SystemUserGuard refuses any API-driven mutation to the System User record or any of its memberships (wired into MemberController, MemberSecurityController, **************** Hides the System User from the GetMembersAndSubscribers, getTeamMembersAndContractors, and getMembersByDepartment endpoints so tenants never see it in lists. Config surface: SystemUserConfigController exposes CRUD over the grant table for top-level-org owners only, and SystemUserCapabilityController returns a boolean the /network page uses to decide whether to render the ENTER AS SYSTEM MEMBER button.
· kamo-shared-library
Add System User flag + access-grant entity
Introduces the platform-wide System User model: a User.isSystemUser flag (unique partial index enforces a singleton), plus a SystemUserAccess table that records which top-level-org departments, job titles, or team members may impersonate the System User to enter child orgs. Access rows are platform-internal (not RoleRightType entries) so they stay out of the tenant-facing rights surface.
· kamo-register
Add phone verification + security questions steps
Insert two new steps between Password and Account Recovery for 13+ registrants: a phone-number step (optional, skippable, with SMS code verification) and a security-questions step (required, 3 distinct questions with answers). Under-13 registrants continue to skip both and rely on their seed phrase for recovery. - FormPhoneNumber: idle -> entering-code -> verified state machine, per-step Capcha widget gating SMS send, change-number and skip paths. - FormSecurityQuestions: 3 dropdowns + answers, uniqueness enforced, catalog fetched from the new public backend endpoint. - RegisterFlow: new formData fields, conditional steps, handleNext validation, phone + securityQuestions wired into the submit body. - /api/security proxy now forwards X-Forwarded-Host so the backend can resolve the org for SMS provider selection.
· SecurityService
Collect phone + security questions during signup
Move phone-number and security-question collection into the self-service registration flow (where they were originally intended) rather than requiring a post-signup settings page. - New RegistrationPhoneService: generates/verifies 6-digit SMS codes via BulkTextSmsClient, 10-minute TTL, 5-per-hour rate limit per number. - RegistrationService now accepts a RegistrationParams record with optional verifiedPhone and a 3-entry security-question list; security questions are bcrypt-hashed with the existing answer-normalization rule. - /api/security/register accepts **************** and claims the verified phone against the code before persisting the User. - New public endpoints POST /register/phone/initiate (Capcha-gated), POST /register/phone/verify, and GET ****************
· kamo-shared-library
Add RegistrationPhoneCode entity + repository
New table `registration_phone_codes` stores one-shot SMS verification codes issued during self-service registration, before a User entity exists. Kept separate from AccountVerificationCode to avoid carrying a NULL userId on that table.
· kamo-internal
Add Member / Add Team Member pages
- /account: replace single ambiguous button with tab-scoped buttons Add <Member> on the Members tab, Add <Team Member> on the Team Members tab. Each button routes to a dedicated create page instead of the old broken fall-through to the member detail view. - New /settings/member/new and /settings/team-member/new pages, both backed by a shared MemberCreateForm with a "variant" prop. - Form is a single-page, section-oriented layout (name, identity, contact, org mailbox, team-member-only role/location, review). Live user-lookup on email and username warns when a user already exists or is already linked as a member in this org. - Honors the org's AgeReqType: if the requirement allows users under 13, personal and organization email fields are hidden and username becomes the primary identifier. - Optional "Provision organization email mailbox" checkbox creates the mailbox via EmailService and assigns it as the member's primary mailbox. - Profile tab on /settings/member/[id] now includes Work Location, Team Membership Status, and Official Job Title for TeamMember records, wired to the existing PUT /api/security/members/{id} endpoint.
· SecurityService
Add Member / Add Team Member creation flow
- New MemberCreateController exposes: * GET **************** — age-req, timezone, departments, job titles * GET **************** — debounced existence check by email or username * POST /api/security/members/create — create Member in caller's org * POST **************** — create TeamMember with department / job title / work location / membership status / security level - Reuses an existing User when email or username already matches; otherwise creates a net-new User and sends the EMAIL_VERIFICATION template. WELCOME template is always sent on creation. - For orgs whose AgeReqType permits under-13 users, email collection is skipped and username becomes the primary identifier. - Extends GET /members/{id} to return location + teamMembershipStatus + isOrganizationOwner for TeamMembers, and PUT to persist location, teamMembershipStatus, and jobTitleOfficial when the record is a TeamMember. - Default role assignment + rights materialization delegated to MemberService so every new member lands with their effective rights already applied. - Fix EntitlementService: boolean getter was spelled getIsOrganizationOwner (Lombok generates isOrganizationOwner for primitive boolean fields).
· kamo-shared-library
Add AgeReqType.allowsUnder13() helper
Used by the Add Member / Add Team Member flow to skip email collection for orgs whose age requirement permits users under 13 (ALL_AGES, KIDS_ONLY, ALL_COPPA_GRADS).
· kamo-internal
Rebuild member Plans & Billing around Billing Groups
- Member page Plans & Billing tab is now right-aligned with a pulsing glow and a StarRate icon on the tab bar. Visible when the viewed member is the signed-in user OR the signed-in user owns the org. Contents split into four sub-tabs: Subscriptions, Invoices, Payment Info, Manage Group. Billing-group selector dropdown + "Add Billing Group" icon button live on the right of the sub-tab bar; the group selection drives every panel. - Subscriptions panel shows one card per active market (FREE_DEFAULT KamoCRM always present), with change-plan / cancel / reactivate and a per-seat license-assignment grid. Priority auto-deactivation runs server-side on seat reduction. - Payment Info panel wraps Stripe Elements via StripeProvider + a refactored PaymentMethodForm that attaches to a billing group (not the old org-level customer). - Manage Group panel edits title / billing contact / member permissions (Licensee, Group Plan Manager, canManageSubscription, canManageBilling) and adds/removes members. The Default Group is read-only — its roster is implicit (everyone not in an explicit group), and no title or permission edits are allowed. - /settings/account?tab=billing deleted outright. BillingManager + PlanCalculator removed. Links everywhere updated to the new member Plans & Billing tab. - SettingsStatusWindow + /settings landing nav both pruned (three-way sync per the nav-sync rule). - BranchSetupManager gets a new "Commerce Markets" section inside the security-model editor, using the new SecurityModelMarketController to attach/detach SUBSCRIPTION markets with per-scope Public/Member/ Team-Member toggles. - **************** rewritten to show per-org Billing Groups + per-group subscriptions + MRR. /settings/platform/events and /settings/platform/plans become placeholder pages (their old contents are gone with the clean-slate cut). - New API proxies: /api/security/entitlements and **************** New useEntitlements hook consumes SecurityService EntitlementService for feature-gating in the UI. Legacy consumer files (StatsManager, FeaturesManager, BranchSetupManager) carry @ts-nocheck until their subscription-based gating code is reworked onto useEntitlements.
· SecurityService
Add EntitlementService + SecurityModel commerce markets
- EntitlementService computes per-member feature grants by unioning active BillingGroupLicense plan features + KamoCRM Free-tier baseline. Caches 15-minute projections in Redis keyed on memberId. - EntitlementInvalidationListener subscribes to the kamo.entitlements.invalidate Redis channel (MEMBER:/GROUP:/ORG: payloads) so BillingService mutations propagate immediately. - EntitlementController at /api/security/entitlements exposes /me, **************** and a cache-invalidation POST. - SecurityModelMarketController at **************** attaches/detaches CommerceMarkets to a ChildOrgSecurityModel and flips the Public / Member / Team-Member scope booleans.

உங்கள் உலகம் காத்திருக்கிறது.
நிமிடங்களில் இலவசமாகத் தொடங்கவும். நீங்கள் தயாராக இருக்கும் போது பொருட்களை சேர்க்கவும் - எந்த மாற்றமும் இல்லை, புதிய உள்நுழைவுகள் இல்லை.
எப்பொழுதும் இலவசம் — கடன் அட்டை தேவையில்லை