Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/sim/app/api/cron/reconcile-billing-seats/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { toError } from '@sim/utils/errors'
import { type NextRequest, NextResponse } from 'next/server'
import { verifyCronAuth } from '@/lib/auth/internal'
import { reconcileTeamSeatDrift } from '@/lib/billing/organizations/seat-drift'
import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers'
import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-events'
import { findDeadLetteredEvents } from '@/lib/core/outbox/service'
import { generateRequestId } from '@/lib/core/utils/request'
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
Expand Down
4 changes: 2 additions & 2 deletions apps/sim/app/api/v1/admin/outbox/[id]/requeue/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import { and, eq, sql } from 'drizzle-orm'
import { NextResponse } from 'next/server'
import { adminV1RequeueOutboxEventContract } from '@/lib/api/contracts/v1/admin'
import { getValidationErrorMessage, parseRequest } from '@/lib/api/server'
import { enterpriseMetadataSyncPayloadSchema } from '@/lib/billing/enterprise-outbox'
import {
ENTERPRISE_METADATA_SYNC_EVENT_TYPE,
ENTERPRISE_PROVISION_EVENT_TYPE,
enterpriseMetadataSyncPayloadSchema,
} from '@/lib/billing/enterprise-outbox'
} from '@/lib/billing/enterprise-outbox-events'
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
import { withAdminAuthParams } from '@/app/api/v1/admin/middleware'

Expand Down
2 changes: 1 addition & 1 deletion apps/sim/app/api/v1/admin/subscriptions/[id]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import {
} from '@/lib/api/contracts/v1/admin'
import { parseRequest } from '@/lib/api/server'
import { requireStripeClient } from '@/lib/billing/stripe-client'
import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers'
import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-events'
import { enqueueOutboxEvent } from '@/lib/core/outbox/service'
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
import { withAdminAuthParams } from '@/app/api/v1/admin/middleware'
Expand Down
1 change: 1 addition & 0 deletions apps/sim/ee/access-requests/lib/notification-events.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export const PERMISSION_ACCESS_REQUEST_CREATED_EVENT = 'permission-access-request.created'
export const PERMISSION_ACCESS_REQUEST_DECIDED_EVENT = 'permission-access-request.decided'
export const PERMISSION_ACCESS_REQUEST_NOTIFY_ADMIN_EVENT = 'permission-access-request.notify-admin'
8 changes: 4 additions & 4 deletions apps/sim/ee/access-requests/lib/notifications.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ import { getMyAccessRequestHref } from '@/ee/access-requests/lib/navigation'
import {
PERMISSION_ACCESS_REQUEST_CREATED_EVENT,
PERMISSION_ACCESS_REQUEST_DECIDED_EVENT,
PERMISSION_ACCESS_REQUEST_NOTIFY_ADMIN_EVENT,
} from '@/ee/access-requests/lib/notification-events'
import { isAccessRequestEnabled } from '@/ee/access-requests/lib/settings'

const logger = createLogger('PermissionAccessRequestNotifications')
const ADMIN_RECIPIENT_PAGE_SIZE = 50
const ADMIN_NOTIFICATION_EVENT = 'permission-access-request.notify-admin'
const notificationPayloadSchema = z.object({ requestId: z.string().min(1).max(256) }).strict()
const createdPayloadSchema = notificationPayloadSchema.extend({
afterMemberId: z.string().min(1).max(256).optional(),
Expand Down Expand Up @@ -176,8 +176,8 @@ export const permissionAccessRequestOutboxHandlers = {
.insert(outboxEvent)
.values(
recipients.map((recipient) => ({
id: `${ADMIN_NOTIFICATION_EVENT}:${requestId}:${recipient.userId}`,
eventType: ADMIN_NOTIFICATION_EVENT,
id: `${PERMISSION_ACCESS_REQUEST_NOTIFY_ADMIN_EVENT}:${requestId}:${recipient.userId}`,
eventType: PERMISSION_ACCESS_REQUEST_NOTIFY_ADMIN_EVENT,
payload: { requestId, recipientUserId: recipient.userId },
}))
)
Expand All @@ -187,7 +187,7 @@ export const permissionAccessRequestOutboxHandlers = {
return continueOutboxHandler('Continue access request administrator notifications')
}
},
[ADMIN_NOTIFICATION_EVENT]: async (rawPayload, context) => {
[PERMISSION_ACCESS_REQUEST_NOTIFY_ADMIN_EVENT]: async (rawPayload, context) => {
const { requestId, recipientUserId } = adminPayloadSchema.parse(rawPayload)
const request = await loadRequest(requestId)
if (
Expand Down
11 changes: 8 additions & 3 deletions apps/sim/ee/workspace-forking/application/admit-sync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@ import { generateId } from '@sim/utils/id'
import { truncate } from '@sim/utils/string'
import { enqueueOutboxEvent } from '@/lib/core/outbox/service'
import type { DbOrTx } from '@/lib/db/types'
import {
WORKSPACE_MCP_CHANGED_EVENT,
WORKSPACE_OPERATION_OBSERVE_EVENT,
WORKSPACE_WORKFLOWS_CHANGED_EVENT,
} from '@/lib/workspaces/operations/outbox-events'
import {
insertWorkspaceOperationReceipt,
type WorkspaceOperationReport,
Expand Down Expand Up @@ -100,7 +105,7 @@ export async function admitForkSync(
}
if (params.mcpAttachmentServerIds.length)
report.effectEventIds!.push(
await enqueueOutboxEvent(tx, 'workspace.mcp.changed', {
await enqueueOutboxEvent(tx, WORKSPACE_MCP_CHANGED_EVENT, {
serverIds: params.mcpAttachmentServerIds,
})
)
Expand All @@ -117,10 +122,10 @@ export async function admitForkSync(
? 'completed_with_warnings'
: 'completed'
}
await enqueueOutboxEvent(tx, 'workspace.workflows.changed', {
await enqueueOutboxEvent(tx, WORKSPACE_WORKFLOWS_CHANGED_EVENT, {
workspaceId: params.targetWorkspaceId,
})
await enqueueOutboxEvent(tx, 'workspace.operation.observe', {
await enqueueOutboxEvent(tx, WORKSPACE_OPERATION_OBSERVE_EVENT, {
workspaceId: report.workspaceId,
operationId: report.operationId,
})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const FORK_CONTENT_COPY_EVENT = 'workspace.fork.content.copy'
5 changes: 3 additions & 2 deletions apps/sim/ee/workspace-forking/application/content-outbox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
} from '@/lib/core/outbox/service'
import type { DbOrTx } from '@/lib/db/types'
import type { WorkspaceOperationReport } from '@/lib/workspaces/operations/receipts'
import { FORK_CONTENT_COPY_EVENT } from '@/ee/workspace-forking/application/content-outbox-event'
import {
type ForkContentCopyPayload,
runForkContentCopy,
Expand Down Expand Up @@ -153,11 +154,11 @@ export async function enqueueDurableForkContent(
})
if (Buffer.byteLength(JSON.stringify(payload)) > 8 * 1024 * 1024)
throw new OrchestrationError('payload_too_large', 'Fork background work exceeds 8 MiB')
return enqueueOutboxEvent(tx, 'workspace.fork.content.copy', payload)
return enqueueOutboxEvent(tx, FORK_CONTENT_COPY_EVENT, payload)
}

export const forkContentOutboxHandlers = {
'workspace.fork.content.copy': withOutboxHandlerTimeout(async (raw, context) => {
[FORK_CONTENT_COPY_EVENT]: withOutboxHandlerTimeout(async (raw, context) => {
const payload = contentPayloadSchema.parse(raw)
const [receipt] = await db
.select({ report: workspaceOperationReceipt.report })
Expand Down
3 changes: 2 additions & 1 deletion apps/sim/ee/workspace-forking/lib/create-fork.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
collectReferencedFileFolderPaths,
} from '@/lib/workflows/references/reference-scan'
import type { ForkRemapKind } from '@/lib/workflows/references/remap-references'
import { WORKSPACE_OPERATION_OBSERVE_EVENT } from '@/lib/workspaces/operations/outbox-events'
import {
findWorkspaceOperationReceipt,
insertWorkspaceOperationReceipt,
Expand Down Expand Up @@ -625,7 +626,7 @@ export async function createFork(params: CreateForkParams): Promise<CreateForkRe
requestId: admission.requestId,
})
}
await enqueueOutboxEvent(tx, 'workspace.operation.observe', {
await enqueueOutboxEvent(tx, WORKSPACE_OPERATION_OBSERVE_EVENT, {
workspaceId: report.workspaceId,
operationId: report.operationId,
})
Expand Down
1 change: 0 additions & 1 deletion apps/sim/lib/admin/dashboard-credit-grant.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ vi.mock('@/lib/billing/enterprise-provisioning', () => ({
getLatestEnterpriseProvisionings: vi.fn(async () => new Map()),
}))
vi.mock('@/lib/billing/enterprise-outbox', () => ({
ENTERPRISE_METADATA_SYNC_EVENT_TYPE: 'stripe.sync-enterprise-metadata',
resolveEnterpriseMetadataIntent: vi.fn(),
}))
vi.mock('@/lib/core/outbox/service', () => outboxServiceMock)
Expand Down
1 change: 0 additions & 1 deletion apps/sim/lib/admin/dashboard-organizations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ vi.mock('@/lib/billing/enterprise-provisioning', () => ({
getLatestEnterpriseProvisionings: vi.fn(async () => hoistedMocks.provisionings),
}))
vi.mock('@/lib/billing/enterprise-outbox', () => ({
ENTERPRISE_METADATA_SYNC_EVENT_TYPE: 'stripe.sync-enterprise-metadata',
enterpriseMetadataSyncPayloadSchema: { safeParse: vi.fn() },
resolveEnterpriseMetadataIntent: hoistedMocks.resolveMetadataIntent,
}))
Expand Down
2 changes: 1 addition & 1 deletion apps/sim/lib/admin/dashboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ import {
} from '@/lib/billing/core/reporting-period'
import { creditsToDollars, dollarsToCredits } from '@/lib/billing/credits/conversion'
import {
ENTERPRISE_METADATA_SYNC_EVENT_TYPE,
enterpriseMetadataSyncPayloadSchema,
resolveEnterpriseMetadataIntent,
} from '@/lib/billing/enterprise-outbox'
import { ENTERPRISE_METADATA_SYNC_EVENT_TYPE } from '@/lib/billing/enterprise-outbox-events'
import {
type EnterpriseProvisioningView,
getLatestEnterpriseProvisionings,
Expand Down
1 change: 1 addition & 0 deletions apps/sim/lib/admin/invitation-operation-event.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const ADMIN_INVITATION_OPERATION_EVENT_TYPE = 'admin.organization-invitation-operation'
2 changes: 1 addition & 1 deletion apps/sim/lib/admin/invitation-operation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ vi.mock('@/lib/billing/organizations/membership', () => organizationMembershipMo
vi.mock('@/lib/core/outbox/service', () => outboxServiceMock)

import {
ADMIN_INVITATION_OPERATION_EVENT_TYPE,
adminInvitationOperationOutboxHandlers,
createAdminInvitationOperation,
} from '@/lib/admin/invitation-operation'
import { ADMIN_INVITATION_OPERATION_EVENT_TYPE } from '@/lib/admin/invitation-operation-event'

const mocks = {
enqueue: outboxServiceMockFns.mockEnqueueOutboxEvent,
Expand Down
8 changes: 3 additions & 5 deletions apps/sim/lib/admin/invitation-operation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@ import { member, outboxEvent, user, workspace } from '@sim/db/schema'
import { normalizeEmail } from '@sim/utils/string'
import { and, count, eq, inArray, sql } from 'drizzle-orm'
import { z } from 'zod'
import {
ENTERPRISE_INVITE_PEOPLE_EVENT_TYPE,
enterpriseInvitePeoplePayloadSchema,
} from '@/lib/billing/enterprise-outbox'
import { ADMIN_INVITATION_OPERATION_EVENT_TYPE } from '@/lib/admin/invitation-operation-event'
import { enterpriseInvitePeoplePayloadSchema } from '@/lib/billing/enterprise-outbox'
import { ENTERPRISE_INVITE_PEOPLE_EVENT_TYPE } from '@/lib/billing/enterprise-outbox-events'
import { acquireOrganizationMutationLock } from '@/lib/billing/organizations/membership'
import {
deferOutboxHandler,
Expand All @@ -21,7 +20,6 @@ import {
} from '@/lib/invitations/direct-grant-event'
import { MAX_INVITE_EMAILS, MAX_INVITE_WORKSPACES } from '@/lib/invitations/limits'

export const ADMIN_INVITATION_OPERATION_EVENT_TYPE = 'admin.organization-invitation-operation'
const MAX_INVITATION_OPERATION_FAILURE_DETAILS = 100

const adminInvitationOperationRequestSchema = z.object({
Expand Down
1 change: 1 addition & 0 deletions apps/sim/lib/admin/member-operation-event.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const ADMIN_MEMBER_OPERATION_EVENT_TYPE = 'admin.organization-member-operation'
1 change: 0 additions & 1 deletion apps/sim/lib/admin/member-operation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ vi.mock('@/lib/billing/organizations/member-limits', () => organizationMemberLim
vi.mock('@/lib/billing/organizations/seats', () => organizationSeatsMock)
vi.mock('@/lib/billing/core/usage', () => billingUsageMock)
vi.mock('@/lib/workspaces/admin-move', () => ({
MIGRATED_INVITATION_EMAIL_EVENT_TYPE: 'invitation.send-migrated-link',
moveWorkspaceToOrganization: hoisted.moveWorkspace,
}))
vi.mock('@/lib/workspaces/organization-workspaces', () => ({
Expand Down
8 changes: 3 additions & 5 deletions apps/sim/lib/admin/member-operation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { createLogger } from '@sim/logger'
import { getErrorMessage } from '@sim/utils/errors'
import { and, count, desc, eq, inArray, sql } from 'drizzle-orm'
import { z } from 'zod'
import { ADMIN_MEMBER_OPERATION_EVENT_TYPE } from '@/lib/admin/member-operation-event'
import { syncUsageLimitsFromSubscription } from '@/lib/billing/core/usage'
import { acquireUserBillingIdentityLock } from '@/lib/billing/organizations/billing-identity-lock'
import { setOrgMemberUsageLimit } from '@/lib/billing/organizations/member-limits'
Expand All @@ -23,13 +24,10 @@ import {
outboxPayloadHasSourceOperationId,
} from '@/lib/core/outbox/service'
import type { DbOrTx } from '@/lib/db/types'
import {
MIGRATED_INVITATION_EMAIL_EVENT_TYPE,
moveWorkspaceToOrganization,
} from '@/lib/workspaces/admin-move'
import { moveWorkspaceToOrganization } from '@/lib/workspaces/admin-move'
import { MIGRATED_INVITATION_EMAIL_EVENT_TYPE } from '@/lib/workspaces/admin-move-event'
import { ownedAttachableWorkspacesWhere } from '@/lib/workspaces/organization-workspaces'

export const ADMIN_MEMBER_OPERATION_EVENT_TYPE = 'admin.organization-member-operation'
const MEMBER_OPERATION_WORKSPACE_BATCH_SIZE = 10
const ADMIN_API_AUDIT_EMAIL = 'admin-api@internal.simstudio.ai'
const logger = createLogger('AdminMemberOperation')
Expand Down
2 changes: 1 addition & 1 deletion apps/sim/lib/admin/subscription-lifecycle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import type { AdminMutationActor } from '@/lib/admin/dashboard'
import { acquireOrganizationMutationLock } from '@/lib/billing/organizations/membership'
import { requireStripeClient } from '@/lib/billing/stripe-client'
import { ENTITLED_SUBSCRIPTION_STATUSES } from '@/lib/billing/subscriptions/utils'
import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers'
import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-events'
import { enqueueOutboxEvent } from '@/lib/core/outbox/service'

const RECENT_INVOICE_LIMIT = 12
Expand Down
2 changes: 1 addition & 1 deletion apps/sim/lib/billing/cycle-close.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import { computeWeeklyRefreshConsumed } from '@/lib/billing/credits/weekly-refre
import { getPlanWeeklyRefreshDollars, isEnterprise, isFree } from '@/lib/billing/plan-helpers'
import { ENTITLED_SUBSCRIPTION_STATUSES, getPlanPricing } from '@/lib/billing/subscriptions/utils'
import { toDecimal, toNumber } from '@/lib/billing/utils/decimal'
import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers'
import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-events'
import { enqueueOutboxEvent } from '@/lib/core/outbox/service'
import { mapWithConcurrency } from '@/lib/core/utils/concurrency'
import type { DbOrTx } from '@/lib/db/types'
Expand Down
5 changes: 5 additions & 0 deletions apps/sim/lib/billing/enterprise-outbox-events.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const ENTERPRISE_PROVISION_EVENT_TYPE = 'stripe.provision-enterprise'
export const ENTERPRISE_METADATA_SYNC_EVENT_TYPE = 'stripe.sync-enterprise-metadata'
export const ENTERPRISE_WORKSPACE_MOVE_EVENT_TYPE = 'enterprise.move-workspace'
export const ENTERPRISE_MEMBER_RECONCILIATION_EVENT_TYPE = 'enterprise.reconcile-members'
export const ENTERPRISE_INVITE_PEOPLE_EVENT_TYPE = 'enterprise.invite-people'
10 changes: 4 additions & 6 deletions apps/sim/lib/billing/enterprise-outbox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,14 @@ import { and, desc, eq, sql } from 'drizzle-orm'
import type Stripe from 'stripe'
import { z } from 'zod'
import { MAX_BILLING_CONCURRENCY_LIMIT } from '@/lib/billing/concurrency-defaults'
import {
ENTERPRISE_METADATA_SYNC_EVENT_TYPE,
ENTERPRISE_PROVISION_EVENT_TYPE,
} from '@/lib/billing/enterprise-outbox-events'
import { MAX_WORKFLOW_EXECUTION_TIMEOUT_SECONDS } from '@/lib/billing/execution-timeout-defaults'
import type { DbOrTx } from '@/lib/db/types'
import { MAX_INVITE_EMAILS } from '@/lib/invitations/limits'

export const ENTERPRISE_PROVISION_EVENT_TYPE = 'stripe.provision-enterprise'
export const ENTERPRISE_METADATA_SYNC_EVENT_TYPE = 'stripe.sync-enterprise-metadata'
export const ENTERPRISE_WORKSPACE_MOVE_EVENT_TYPE = 'enterprise.move-workspace'
export const ENTERPRISE_MEMBER_RECONCILIATION_EVENT_TYPE = 'enterprise.reconcile-members'
export const ENTERPRISE_INVITE_PEOPLE_EVENT_TYPE = 'enterprise.invite-people'

const nonnegativeInteger = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER)

export const enterpriseProvisionRequestSchema = z.object({
Expand Down
2 changes: 2 additions & 0 deletions apps/sim/lib/billing/enterprise-owner-claim-events.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export const ENTERPRISE_OWNER_CLAIM_EVENT_TYPE = 'enterprise.invite-owner'
export const ENTERPRISE_OWNER_ACTIVATION_EVENT_TYPE = 'enterprise.activate-owner-claim'
6 changes: 4 additions & 2 deletions apps/sim/lib/billing/enterprise-owner-claim.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ import { z } from 'zod'
import { getEmailSubject, renderEnterpriseOwnerInvitationEmail } from '@/components/emails'
import { parseBillingConcurrencyLimit } from '@/lib/billing/concurrency-defaults'
import { dollarsToCredits } from '@/lib/billing/credits/conversion'
import {
ENTERPRISE_OWNER_ACTIVATION_EVENT_TYPE,
ENTERPRISE_OWNER_CLAIM_EVENT_TYPE,
} from '@/lib/billing/enterprise-owner-claim-events'
import {
assertEnterpriseInvitationEligibility,
EnterpriseProvisioningError,
Expand Down Expand Up @@ -42,8 +46,6 @@ import {
} from '@/lib/workspaces/create'
import { ownedAttachableWorkspacesWhere } from '@/lib/workspaces/organization-workspaces'

export const ENTERPRISE_OWNER_CLAIM_EVENT_TYPE = 'enterprise.invite-owner'
export const ENTERPRISE_OWNER_ACTIVATION_EVENT_TYPE = 'enterprise.activate-owner-claim'
export const ENTERPRISE_OWNER_CLAIM_EXPIRY_DAYS = INVITATION_EXPIRY_DAYS

const logger = createLogger('EnterpriseOwnerClaim')
Expand Down
28 changes: 12 additions & 16 deletions apps/sim/lib/billing/enterprise-provisioning.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,8 @@ import {
sql,
} from 'drizzle-orm'
import type Stripe from 'stripe'
import {
ADMIN_INVITATION_OPERATION_EVENT_TYPE,
parseAdminInvitationOperationPayload,
} from '@/lib/admin/invitation-operation'
import { parseAdminInvitationOperationPayload } from '@/lib/admin/invitation-operation'
import { ADMIN_INVITATION_OPERATION_EVENT_TYPE } from '@/lib/admin/invitation-operation-event'
import { parseBillingConcurrencyLimit } from '@/lib/billing/concurrency-defaults'
import { getBillingConcurrencyLimit } from '@/lib/billing/concurrency-limits'
import { resolveEnterpriseReportingPeriod } from '@/lib/billing/core/reporting-period'
Expand All @@ -44,11 +42,6 @@ import {
import { creditsToDollars, dollarsToCredits } from '@/lib/billing/credits/conversion'
import {
deriveEnterpriseOperationStatus,
ENTERPRISE_INVITE_PEOPLE_EVENT_TYPE,
ENTERPRISE_MEMBER_RECONCILIATION_EVENT_TYPE,
ENTERPRISE_METADATA_SYNC_EVENT_TYPE,
ENTERPRISE_PROVISION_EVENT_TYPE,
ENTERPRISE_WORKSPACE_MOVE_EVENT_TYPE,
type EnterpriseInvitePeoplePayload,
type EnterpriseMetadataSyncPayload,
type EnterpriseOperationStatus,
Expand All @@ -63,6 +56,13 @@ import {
enterpriseWorkspaceMovePayloadSchema,
parseEnterpriseProvisionPayload,
} from '@/lib/billing/enterprise-outbox'
import {
ENTERPRISE_INVITE_PEOPLE_EVENT_TYPE,
ENTERPRISE_MEMBER_RECONCILIATION_EVENT_TYPE,
ENTERPRISE_METADATA_SYNC_EVENT_TYPE,
ENTERPRISE_PROVISION_EVENT_TYPE,
ENTERPRISE_WORKSPACE_MOVE_EVENT_TYPE,
} from '@/lib/billing/enterprise-outbox-events'
import {
parseWorkflowExecutionTimeoutSeconds,
resolveEnterpriseWorkflowExecutionTimeoutFallbackSeconds,
Expand All @@ -76,7 +76,7 @@ import { requireStripeClient } from '@/lib/billing/stripe-client'
import { TERMINAL_SUBSCRIPTION_STATUSES } from '@/lib/billing/subscriptions/utils'
import { countPendingSeatInvitations } from '@/lib/billing/validation/seat-management'
import { withEnterpriseReconciliationLease } from '@/lib/billing/webhooks/enterprise-reconciliation-lease'
import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers'
import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-events'
import { env } from '@/lib/core/config/env'
import {
continueOutboxHandler,
Expand All @@ -94,10 +94,8 @@ import {
createWorkspaceInvitation,
prepareWorkspaceInvitationContext,
} from '@/lib/invitations/workspace-invitations'
import {
MIGRATED_INVITATION_EMAIL_EVENT_TYPE,
moveWorkspaceToOrganization,
} from '@/lib/workspaces/admin-move'
import { moveWorkspaceToOrganization } from '@/lib/workspaces/admin-move'
import { MIGRATED_INVITATION_EMAIL_EVENT_TYPE } from '@/lib/workspaces/admin-move-event'
import { ownedAttachableWorkspacesWhere } from '@/lib/workspaces/organization-workspaces'

const TERMINAL_STATUSES = new Set<string>(TERMINAL_SUBSCRIPTION_STATUSES)
Expand Down Expand Up @@ -3215,5 +3213,3 @@ export async function getLatestEnterpriseProvisionings(
}
return result
}

export { ENTERPRISE_METADATA_SYNC_EVENT_TYPE, ENTERPRISE_PROVISION_EVENT_TYPE }
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const MEMBER_BILLING_RECONCILIATION_EVENT_TYPE = 'billing.reconcile-member-after-org-leave'
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { syncUsageLimitsFromSubscription } from '@/lib/billing/core/usage'
import {
MEMBER_BILLING_RECONCILIATION_EVENT_TYPE,
restoreUserProSubscription,
} from '@/lib/billing/organizations/membership'
import { restoreUserProSubscription } from '@/lib/billing/organizations/membership'
import { MEMBER_BILLING_RECONCILIATION_EVENT_TYPE } from '@/lib/billing/organizations/membership-reconciliation-event'
import type { OutboxHandler } from '@/lib/core/outbox/service'

interface MemberBillingReconciliationPayload {
Expand Down
Loading
Loading