@dakkitor/api-contracts 1.1.154 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abilities/abilities.contract.d.ts +53 -1
- package/dist/abilities/abilities.contract.d.ts.map +1 -1
- package/dist/abilities/abilities.contract.js +92 -1
- package/dist/abilities/abilities.contract.spec.d.ts +2 -0
- package/dist/abilities/abilities.contract.spec.d.ts.map +1 -0
- package/dist/abilities/abilities.contract.spec.js +145 -0
- package/dist/abilities/admin-dashboard.abilities.test.d.ts +2 -0
- package/dist/abilities/admin-dashboard.abilities.test.d.ts.map +1 -0
- package/dist/abilities/admin-dashboard.abilities.test.js +33 -0
- package/dist/abilities/admin.abilities.json +19 -0
- package/dist/abilities/bot.abilities.json +13 -4
- package/dist/abilities/first-agent.abilities.json +317 -70
- package/dist/abilities/interconnection.abilities.json +75 -0
- package/dist/abilities/kpi.abilities.json +68 -0
- package/dist/abilities/office-manager.abilities.json +111 -0
- package/dist/abilities/second-agent.abilities.json +417 -43
- package/dist/abilities/team-leads.json +71 -6
- package/dist/abilities/worker-curator.abilities.json +233 -0
- package/dist/actives/actives.contract.d.ts +19379 -23651
- package/dist/actives/actives.contract.d.ts.map +1 -1
- package/dist/actives/actives.contract.js +517 -114
- package/dist/agent-client-links/agent-client-links.contract.d.ts +1431 -291
- package/dist/agent-client-links/agent-client-links.contract.d.ts.map +1 -1
- package/dist/auth/auth.contract.d.ts +1050 -81
- package/dist/auth/auth.contract.d.ts.map +1 -1
- package/dist/auth/auth.contract.js +115 -3
- package/dist/bookings/booking-worker-summary.spec.d.ts +2 -0
- package/dist/bookings/booking-worker-summary.spec.d.ts.map +1 -0
- package/dist/bookings/booking-worker-summary.spec.js +25 -0
- package/dist/bookings/bookings.contract.d.ts +20643 -26117
- package/dist/bookings/bookings.contract.d.ts.map +1 -1
- package/dist/bookings/bookings.contract.js +383 -91
- package/dist/bookings/bookings.contract.spec.d.ts +2 -0
- package/dist/bookings/bookings.contract.spec.d.ts.map +1 -0
- package/dist/bookings/bookings.contract.spec.js +11 -0
- package/dist/bookings/job-lock.spec.d.ts +2 -0
- package/dist/bookings/job-lock.spec.d.ts.map +1 -0
- package/dist/bookings/job-lock.spec.js +56 -0
- package/dist/bot-parse-cache/bot-parse-cache.contract.d.ts +232 -0
- package/dist/bot-parse-cache/bot-parse-cache.contract.d.ts.map +1 -0
- package/dist/bot-parse-cache/bot-parse-cache.contract.js +64 -0
- package/dist/call-history/call-history.contract.d.ts +1336 -767
- package/dist/call-history/call-history.contract.d.ts.map +1 -1
- package/dist/call-history/call-history.contract.js +86 -10
- package/dist/calls-feed/calls-feed.contract.d.ts +417 -0
- package/dist/calls-feed/calls-feed.contract.d.ts.map +1 -0
- package/dist/calls-feed/calls-feed.contract.js +32 -0
- package/dist/client-contacts/client-contacts.contract.d.ts +410 -226
- package/dist/client-contacts/client-contacts.contract.d.ts.map +1 -1
- package/dist/client-contacts/client-contacts.contract.js +35 -4
- package/dist/clients/clients.contract.d.ts +227 -73
- package/dist/clients/clients.contract.d.ts.map +1 -1
- package/dist/clients/clients.contract.js +45 -21
- package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts +2908 -1834
- package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts.map +1 -1
- package/dist/collaboration-checkings/collaboration-checkings.contract.js +14 -9
- package/dist/collaborations/collaborations.contract.d.ts +2676 -1409
- package/dist/collaborations/collaborations.contract.d.ts.map +1 -1
- package/dist/collaborations/collaborations.contract.js +33 -9
- package/dist/common/call-rating.schema.d.ts.map +1 -1
- package/dist/common/call-rating.schema.js +4 -2
- package/dist/common/common-schemas.d.ts +59 -11
- package/dist/common/common-schemas.d.ts.map +1 -1
- package/dist/common/common-schemas.js +55 -29
- package/dist/common/error-schemas.d.ts +2 -2
- package/dist/common/pagination-query.schema.d.ts +13 -2
- package/dist/common/pagination-query.schema.d.ts.map +1 -1
- package/dist/common/pagination-query.schema.js +21 -2
- package/dist/common/pagination-query.schema.spec.d.ts +2 -0
- package/dist/common/pagination-query.schema.spec.d.ts.map +1 -0
- package/dist/common/pagination-query.schema.spec.js +53 -0
- package/dist/companies/companies.contract.d.ts +53 -28
- package/dist/companies/companies.contract.d.ts.map +1 -1
- package/dist/companies/companies.contract.js +11 -10
- package/dist/crews/crews.contract.d.ts +1010 -196
- package/dist/crews/crews.contract.d.ts.map +1 -1
- package/dist/crews/crews.contract.js +98 -17
- package/dist/crews/crews.contract.spec.d.ts +2 -0
- package/dist/crews/crews.contract.spec.d.ts.map +1 -0
- package/dist/crews/crews.contract.spec.js +67 -0
- package/dist/cron-executions/cron-executions.contract.d.ts +988 -59
- package/dist/cron-executions/cron-executions.contract.d.ts.map +1 -1
- package/dist/cron-executions/cron-executions.contract.js +127 -7
- package/dist/curated-worker-leads/__tests__/disposition-reason.spec.d.ts +2 -0
- package/dist/curated-worker-leads/__tests__/disposition-reason.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/__tests__/disposition-reason.spec.js +40 -0
- package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.d.ts +2 -0
- package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.js +16 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.d.ts +21650 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.js +921 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.spec.d.ts +2 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.spec.js +51 -0
- package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts +2364 -0
- package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-edit-session.contract.js +173 -0
- package/dist/curated-worker-leads/consent-queue.contract.d.ts +4497 -0
- package/dist/curated-worker-leads/consent-queue.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/consent-queue.contract.js +201 -0
- package/dist/curated-worker-leads/contact-history.spec.d.ts +2 -0
- package/dist/curated-worker-leads/contact-history.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/contact-history.spec.js +88 -0
- package/dist/curated-worker-leads/contact-session.contract.spec.d.ts +2 -0
- package/dist/curated-worker-leads/contact-session.contract.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/contact-session.contract.spec.js +315 -0
- package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts +489 -0
- package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/curated-worker-lead-config.contract.js +88 -0
- package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts +135 -0
- package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/curated-worker-leads.contract.js +32 -0
- package/dist/curated-worker-leads/job-candidate-cards.spec.d.ts +2 -0
- package/dist/curated-worker-leads/job-candidate-cards.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/job-candidate-cards.spec.js +157 -0
- package/dist/curated-worker-leads/job-candidates.spec.d.ts +2 -0
- package/dist/curated-worker-leads/job-candidates.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/job-candidates.spec.js +140 -0
- package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.d.ts +2 -0
- package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.js +19 -0
- package/dist/curated-worker-leads/jobs-tab.contract.d.ts +18365 -0
- package/dist/curated-worker-leads/jobs-tab.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/jobs-tab.contract.js +642 -0
- package/dist/curated-worker-leads/lead-agent-area.contract.d.ts +348 -0
- package/dist/curated-worker-leads/lead-agent-area.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/lead-agent-area.contract.js +51 -0
- package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts +1116 -0
- package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/owned-jobs-tab.contract.js +93 -0
- package/dist/curated-workers/curated-filter-additions.spec.d.ts +2 -0
- package/dist/curated-workers/curated-filter-additions.spec.d.ts.map +1 -0
- package/dist/curated-workers/curated-filter-additions.spec.js +17 -0
- package/dist/curated-workers/curated-job-seeking.spec.d.ts +2 -0
- package/dist/curated-workers/curated-job-seeking.spec.d.ts.map +1 -0
- package/dist/curated-workers/curated-job-seeking.spec.js +53 -0
- package/dist/curated-workers/curated-workers-id-documents.spec.d.ts +2 -0
- package/dist/curated-workers/curated-workers-id-documents.spec.d.ts.map +1 -0
- package/dist/curated-workers/curated-workers-id-documents.spec.js +38 -0
- package/dist/curated-workers/curated-workers.contract.d.ts +6160 -1906
- package/dist/curated-workers/curated-workers.contract.d.ts.map +1 -1
- package/dist/curated-workers/curated-workers.contract.js +333 -51
- package/dist/dashboards/agent-daily-metrics.contract.d.ts +10 -10
- package/dist/dashboards/agent-daily-metrics.contract.js +1 -1
- package/dist/dashboards/dashboard-widgets.contract.d.ts +3800 -496
- package/dist/dashboards/dashboard-widgets.contract.d.ts.map +1 -1
- package/dist/dashboards/dashboard-widgets.contract.js +527 -29
- package/dist/dashboards/dashboard.contract.d.ts +8 -8
- package/dist/document-intake/document-intake.contract.d.ts +3132 -0
- package/dist/document-intake/document-intake.contract.d.ts.map +1 -0
- package/dist/document-intake/document-intake.contract.js +418 -0
- package/dist/export-jobs/export-jobs.contract.d.ts +3918 -0
- package/dist/export-jobs/export-jobs.contract.d.ts.map +1 -0
- package/dist/export-jobs/export-jobs.contract.js +240 -0
- package/dist/exports-events/exports-events.schemas.d.ts +90 -0
- package/dist/exports-events/exports-events.schemas.d.ts.map +1 -0
- package/dist/exports-events/exports-events.schemas.js +56 -0
- package/dist/files/files.contract.d.ts +133 -126
- package/dist/files/files.contract.d.ts.map +1 -1
- package/dist/files/files.contract.js +8 -0
- package/dist/health/health.contract.d.ts +4 -4
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +87 -1
- package/dist/interactions/interactions.contract.d.ts +162 -0
- package/dist/interactions/interactions.contract.d.ts.map +1 -0
- package/dist/interactions/interactions.contract.js +42 -0
- package/dist/job-clusters/job-clusters.contract.d.ts +1584 -0
- package/dist/job-clusters/job-clusters.contract.d.ts.map +1 -0
- package/dist/job-clusters/job-clusters.contract.js +133 -0
- package/dist/jobs/jobs.contract.d.ts +16517 -8495
- package/dist/jobs/jobs.contract.d.ts.map +1 -1
- package/dist/jobs/jobs.contract.js +394 -190
- package/dist/jobs/jobs.contract.spec.d.ts +2 -0
- package/dist/jobs/jobs.contract.spec.d.ts.map +1 -0
- package/dist/jobs/jobs.contract.spec.js +70 -0
- package/dist/kpi-impersonation/kpi-impersonation.contract.d.ts +75 -75
- package/dist/lead-assignments/lead-assignments.contract.d.ts +2933 -1122
- package/dist/lead-assignments/lead-assignments.contract.d.ts.map +1 -1
- package/dist/lead-assignments/lead-assignments.contract.js +29 -7
- package/dist/lead-distribution/agent-lead-distribution.contract.d.ts +328 -64
- package/dist/lead-distribution/agent-lead-distribution.contract.d.ts.map +1 -1
- package/dist/lead-distribution/agent-lead-distribution.contract.js +1 -1
- package/dist/lead-distribution/lead-distribution-config.contract.d.ts +31 -31
- package/dist/leads/leads.contract.d.ts +830 -368
- package/dist/leads/leads.contract.d.ts.map +1 -1
- package/dist/leads/leads.contract.js +106 -26
- package/dist/locations/locations.contract.d.ts +36 -36
- package/dist/notifications/notifications.contract.d.ts +1039 -0
- package/dist/notifications/notifications.contract.d.ts.map +1 -0
- package/dist/notifications/notifications.contract.js +110 -0
- package/dist/offices/offices.contract.d.ts +210 -60
- package/dist/offices/offices.contract.d.ts.map +1 -1
- package/dist/offices/offices.contract.js +18 -4
- package/dist/outreach/__tests__/outreach-claim.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach-claim.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach-claim.test.js +97 -0
- package/dist/outreach/__tests__/outreach-confirm-release.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach-confirm-release.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach-confirm-release.test.js +98 -0
- package/dist/outreach/__tests__/outreach-routes.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach-routes.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach-routes.test.js +57 -0
- package/dist/outreach/__tests__/outreach.schemas.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach.schemas.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach.schemas.test.js +140 -0
- package/dist/outreach/outreach.contract.d.ts +809 -0
- package/dist/outreach/outreach.contract.d.ts.map +1 -0
- package/dist/outreach/outreach.contract.js +195 -0
- package/dist/outreach/outreach.schemas.d.ts +113 -0
- package/dist/outreach/outreach.schemas.d.ts.map +1 -0
- package/dist/outreach/outreach.schemas.js +132 -0
- package/dist/own-research/own-research.contract.d.ts +1356 -552
- package/dist/own-research/own-research.contract.d.ts.map +1 -1
- package/dist/own-research/own-research.contract.js +14 -3
- package/dist/postcodes/postcodes.contract.d.ts +16 -16
- package/dist/proofs/proof-category.enum.d.ts +4 -0
- package/dist/proofs/proof-category.enum.d.ts.map +1 -0
- package/dist/proofs/proof-category.enum.js +5 -0
- package/dist/proofs/proof-entity-type.enum.d.ts +4 -0
- package/dist/proofs/proof-entity-type.enum.d.ts.map +1 -0
- package/dist/proofs/proof-entity-type.enum.js +5 -0
- package/dist/proofs/proof-type.enum.d.ts +28 -0
- package/dist/proofs/proof-type.enum.d.ts.map +1 -0
- package/dist/proofs/proof-type.enum.js +14 -0
- package/dist/proofs/proofs.contract.d.ts +3009 -0
- package/dist/proofs/proofs.contract.d.ts.map +1 -0
- package/dist/proofs/proofs.contract.js +92 -0
- package/dist/proofs/proofs.dtos.d.ts +1319 -0
- package/dist/proofs/proofs.dtos.d.ts.map +1 -0
- package/dist/proofs/proofs.dtos.js +178 -0
- package/dist/qualifications/qualifications.contract.d.ts +94 -94
- package/dist/realtime/data-changed.d.ts +21 -0
- package/dist/realtime/data-changed.d.ts.map +1 -0
- package/dist/realtime/data-changed.js +37 -0
- package/dist/shared/booking-history.schema.d.ts +27 -0
- package/dist/shared/booking-history.schema.d.ts.map +1 -0
- package/dist/shared/booking-history.schema.js +22 -0
- package/dist/shared/booking-history.spec.d.ts +2 -0
- package/dist/shared/booking-history.spec.d.ts.map +1 -0
- package/dist/shared/booking-history.spec.js +44 -0
- package/dist/shared/contact-suppressions.contract.d.ts +22 -0
- package/dist/shared/contact-suppressions.contract.d.ts.map +1 -0
- package/dist/shared/contact-suppressions.contract.js +13 -0
- package/dist/shared/live-booking.schema.d.ts +57 -0
- package/dist/shared/live-booking.schema.d.ts.map +1 -0
- package/dist/shared/live-booking.schema.js +34 -0
- package/dist/shared/summary-schemas.d.ts +218 -0
- package/dist/shared/summary-schemas.d.ts.map +1 -0
- package/dist/shared/summary-schemas.js +56 -0
- package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.d.ts +2 -0
- package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.d.ts.map +1 -0
- package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.js +20 -0
- package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.d.ts +2 -0
- package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.d.ts.map +1 -0
- package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.js +41 -0
- package/dist/sheets-sync/sheets-sync-events.schemas.d.ts +43 -0
- package/dist/sheets-sync/sheets-sync-events.schemas.d.ts.map +1 -0
- package/dist/sheets-sync/sheets-sync-events.schemas.js +29 -0
- package/dist/sheets-sync/sheets-sync.contract.d.ts +7258 -0
- package/dist/sheets-sync/sheets-sync.contract.d.ts.map +1 -0
- package/dist/sheets-sync/sheets-sync.contract.js +323 -0
- package/dist/telegram/telegram.contract.d.ts +727 -0
- package/dist/telegram/telegram.contract.d.ts.map +1 -0
- package/dist/telegram/telegram.contract.js +75 -0
- package/dist/trades/trade-rate-assessment.d.ts +18 -0
- package/dist/trades/trade-rate-assessment.d.ts.map +1 -0
- package/dist/trades/trade-rate-assessment.js +46 -0
- package/dist/trades/trade-rate-assessment.spec.d.ts +2 -0
- package/dist/trades/trade-rate-assessment.spec.d.ts.map +1 -0
- package/dist/trades/trade-rate-assessment.spec.js +223 -0
- package/dist/trades/trades.contract.d.ts +111 -0
- package/dist/trades/trades.contract.d.ts.map +1 -1
- package/dist/trades/trades.contract.js +49 -1
- package/dist/trades/trades.contract.spec.d.ts +2 -0
- package/dist/trades/trades.contract.spec.d.ts.map +1 -0
- package/dist/trades/trades.contract.spec.js +173 -0
- package/dist/user-access-grants/build-user-access-grant-rules.d.ts +10 -0
- package/dist/user-access-grants/build-user-access-grant-rules.d.ts.map +1 -0
- package/dist/user-access-grants/build-user-access-grant-rules.js +69 -0
- package/dist/user-access-grants/build-user-access-grant-rules.spec.d.ts +2 -0
- package/dist/user-access-grants/build-user-access-grant-rules.spec.d.ts.map +1 -0
- package/dist/user-access-grants/build-user-access-grant-rules.spec.js +77 -0
- package/dist/user-access-grants/user-access-grant-templates.json +454 -0
- package/dist/user-access-grants/user-access-grants.contract.d.ts +3886 -0
- package/dist/user-access-grants/user-access-grants.contract.d.ts.map +1 -0
- package/dist/user-access-grants/user-access-grants.contract.js +189 -0
- package/dist/user-access-grants/user-access-grants.contract.spec.d.ts +2 -0
- package/dist/user-access-grants/user-access-grants.contract.spec.d.ts.map +1 -0
- package/dist/user-access-grants/user-access-grants.contract.spec.js +149 -0
- package/dist/users/users.contract.d.ts +1959 -349
- package/dist/users/users.contract.d.ts.map +1 -1
- package/dist/users/users.contract.js +222 -37
- package/dist/users/users.contract.spec.d.ts +2 -0
- package/dist/users/users.contract.spec.d.ts.map +1 -0
- package/dist/users/users.contract.spec.js +103 -0
- package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts +4609 -0
- package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts.map +1 -0
- package/dist/worker-identity-cases/worker-identity-cases.contract.js +409 -0
- package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts +1511 -0
- package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts.map +1 -0
- package/dist/worker-merge-proposals/worker-merge-proposals.contract.js +150 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts +1106 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts.map +1 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.js +85 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.d.ts +2 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.d.ts.map +1 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.js +216 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts +453 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts.map +1 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.js +109 -0
- package/dist/workers/do-not-contact.contract.d.ts +46 -0
- package/dist/workers/do-not-contact.contract.d.ts.map +1 -0
- package/dist/workers/do-not-contact.contract.js +41 -0
- package/dist/workers/do-not-contact.contract.spec.d.ts +2 -0
- package/dist/workers/do-not-contact.contract.spec.d.ts.map +1 -0
- package/dist/workers/do-not-contact.contract.spec.js +47 -0
- package/dist/workers/duplicate-group-worker.spec.d.ts +2 -0
- package/dist/workers/duplicate-group-worker.spec.d.ts.map +1 -0
- package/dist/workers/duplicate-group-worker.spec.js +34 -0
- package/dist/workers/filter-exact-flags.spec.d.ts +2 -0
- package/dist/workers/filter-exact-flags.spec.d.ts.map +1 -0
- package/dist/workers/filter-exact-flags.spec.js +37 -0
- package/dist/workers/worker-source-attribution.contract.spec.d.ts +2 -0
- package/dist/workers/worker-source-attribution.contract.spec.d.ts.map +1 -0
- package/dist/workers/worker-source-attribution.contract.spec.js +442 -0
- package/dist/workers/worker-source.spec.d.ts +2 -0
- package/dist/workers/worker-source.spec.d.ts.map +1 -0
- package/dist/workers/worker-source.spec.js +13 -0
- package/dist/workers/worker-status-facets.spec.d.ts +2 -0
- package/dist/workers/worker-status-facets.spec.d.ts.map +1 -0
- package/dist/workers/worker-status-facets.spec.js +34 -0
- package/dist/workers/workers.contract.d.ts +19534 -5969
- package/dist/workers/workers.contract.d.ts.map +1 -1
- package/dist/workers/workers.contract.js +1096 -113
- package/dist/workers/workers.contract.spec.d.ts +2 -0
- package/dist/workers/workers.contract.spec.d.ts.map +1 -0
- package/dist/workers/workers.contract.spec.js +31 -0
- package/package.json +5 -4
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Description: Exports CASL ability definitions for each user role.
|
|
6
6
|
* These are the single source of truth for role-based permissions.
|
|
7
7
|
*/
|
|
8
|
+
import { type UserRole } from '../users/users.contract';
|
|
8
9
|
export interface AbilityRule {
|
|
9
10
|
action: string;
|
|
10
11
|
subject: string;
|
|
@@ -19,6 +20,9 @@ export declare const SecondAgentAbilities: AbilityRule[];
|
|
|
19
20
|
export declare const TeamLeadAbilities: AbilityRule[];
|
|
20
21
|
export declare const BotAbilities: AbilityRule[];
|
|
21
22
|
export declare const CronSchedulerAbilities: AbilityRule[];
|
|
23
|
+
export declare const OfficeManagerAbilities: AbilityRule[];
|
|
24
|
+
export declare const WorkerCuratorAbilities: AbilityRule[];
|
|
25
|
+
export declare const InterconnectionAbilities: AbilityRule[];
|
|
22
26
|
export declare const RoleAbilities: {
|
|
23
27
|
readonly ADMIN: AbilityRule[];
|
|
24
28
|
readonly KPI: AbilityRule[];
|
|
@@ -27,6 +31,9 @@ export declare const RoleAbilities: {
|
|
|
27
31
|
readonly TEAM_LEADS: AbilityRule[];
|
|
28
32
|
readonly BOT: AbilityRule[];
|
|
29
33
|
readonly CRON_SCHEDULER: AbilityRule[];
|
|
34
|
+
readonly OFFICE_MANAGER: AbilityRule[];
|
|
35
|
+
readonly WORKER_CURATOR: AbilityRule[];
|
|
36
|
+
readonly INTERCONNECTION: AbilityRule[];
|
|
30
37
|
};
|
|
31
38
|
export type RoleAbilitiesType = typeof RoleAbilities;
|
|
32
39
|
/**
|
|
@@ -34,5 +41,50 @@ export type RoleAbilitiesType = typeof RoleAbilities;
|
|
|
34
41
|
* Used for feature-level permission checking.
|
|
35
42
|
* These must be kept in sync with the subjects in the abilities JSON files.
|
|
36
43
|
*/
|
|
37
|
-
export type VirtualSubjects = 'FaDashboardWidgets' | 'SaDashboardWidgets' | 'DashboardTrends' | 'FirstAgentTutorials' | 'SecondAgentTutorials';
|
|
44
|
+
export type VirtualSubjects = 'FaDashboardWidgets' | 'SaDashboardWidgets' | 'DashboardTrends' | 'AdminFaDashboardWidgets' | 'AdminSaDashboardWidgets' | 'AdminAgentStats' | 'AdminProofs' | 'AdminDashboardTrends' | 'FirstAgentTutorials' | 'CuratedMatchWorkspace' | 'JobCandidate' | 'LeadActivityEvent' | 'FilterCandidateContactHistorySchema' | 'SecondAgentTutorials' | 'SortActiveSchema' | 'SortBookingSchema' | 'SortJobSchema' | 'SortWorkerSchema' | 'SortCuratedWorkerSchema' | 'SortLeadSchema' | 'SortOwnResearchLeadSchema' | 'SortClientSchema' | 'SortCompanySchema' | 'SortCollaborationSchema' | 'SortCollaborationCheckingSchema' | 'SortClientContactSchema' | 'SortCallHistorySchema' | 'SortUserSchema' | 'SortCrewSchema' | 'FilterExportJobSchema';
|
|
45
|
+
/**
|
|
46
|
+
* Roles an OFFICE_MANAGER may assign to users they create.
|
|
47
|
+
* Single source of truth for the office-manager create-user role policy.
|
|
48
|
+
*/
|
|
49
|
+
export declare const OFFICE_MANAGER_ASSIGNABLE_ROLES: readonly ["FIRST_AGENT", "SECOND_AGENT"];
|
|
50
|
+
/**
|
|
51
|
+
* Roles the acting user must NOT be allowed to assign when creating a user
|
|
52
|
+
* as an office manager. Resolves the `{{ rolesOmCannotAssign }}` ability
|
|
53
|
+
* placeholder. Computed as the COMPLEMENT of the allowed set (fail-safe: a
|
|
54
|
+
* newly-added role defaults to disallowed). Returns `[]` for admins so the
|
|
55
|
+
* inverted ability rule never fires for an admin-who-is-also-an-OM.
|
|
56
|
+
*/
|
|
57
|
+
export declare function getRolesOmCannotAssign(actingUserRoles: readonly UserRole[] | undefined): UserRole[];
|
|
58
|
+
export declare const SHARED_CURATED_MATCH_ROLES: readonly ["ADMIN", "WORKER_CURATOR", "INTERCONNECTION"];
|
|
59
|
+
export declare function hasSharedCuratedMatchAccess(roles: readonly string[] | null | undefined): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Roles whose JOB-FIRST CANDIDATE scope is global: inside a specific job's
|
|
62
|
+
* candidate ranking, counts, hydration, and tuple-authorized actions they see
|
|
63
|
+
* the whole eligible pool instead of an assignment-scoped slice.
|
|
64
|
+
*
|
|
65
|
+
* This is NOT a general curated-record permission (spec 2026-07-15 superseded
|
|
66
|
+
* that use). Do not consult it on directory, consent-queue, worker-first, or
|
|
67
|
+
* any surface that is not keyed by a jobId — those surfaces gate
|
|
68
|
+
* INTERCONNECTION with isCandidateOnlyCuratedViewer instead. Deliberately
|
|
69
|
+
* does not widen owned-worker scoping (only ADMIN sees all owned workers).
|
|
70
|
+
*
|
|
71
|
+
* @deprecated Use SHARED_CURATED_MATCH_ROLES for new match-workspace policy.
|
|
72
|
+
*/
|
|
73
|
+
export declare const GLOBAL_CURATED_SCOPE_ROLES: readonly ["ADMIN", "INTERCONNECTION"];
|
|
74
|
+
/**
|
|
75
|
+
* @deprecated Use hasSharedCuratedMatchAccess for new match-workspace policy.
|
|
76
|
+
*/
|
|
77
|
+
export declare function hasGlobalCuratedCandidateScope(roles: readonly string[] | null | undefined): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Roles whose curated-worker access is restricted to the match workspaces:
|
|
80
|
+
* true only for the SECOND_AGENT+INTERCONNECTION modifier pair, excluding
|
|
81
|
+
* privileged curated roles. Such users may see curated workers through
|
|
82
|
+
* job-scoped candidates and worker-first job matches. Generic curated
|
|
83
|
+
* directory/detail/search/export surfaces reject them before querying. Used by
|
|
84
|
+
* API guards and the web
|
|
85
|
+
* (navigation, server-page guards, tabs, filters) so both stay in agreement.
|
|
86
|
+
*
|
|
87
|
+
* @deprecated Retained temporarily for rolling compatibility.
|
|
88
|
+
*/
|
|
89
|
+
export declare function isCandidateOnlyCuratedViewer(roles: readonly string[] | null | undefined): boolean;
|
|
38
90
|
//# sourceMappingURL=abilities.contract.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abilities.contract.d.ts","sourceRoot":"","sources":["../../contracts/abilities/abilities.contract.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"abilities.contract.d.ts","sourceRoot":"","sources":["../../contracts/abilities/abilities.contract.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,EAAE,WAAW,EAAoC,CAAC;AAC7E,eAAO,MAAM,YAAY,EAAE,WAAW,EAAkC,CAAC;AACzE,eAAO,MAAM,mBAAmB,EAAE,WAAW,EACP,CAAC;AACvC,eAAO,MAAM,oBAAoB,EAAE,WAAW,EACP,CAAC;AACxC,eAAO,MAAM,iBAAiB,EAAE,WAAW,EACP,CAAC;AACrC,eAAO,MAAM,YAAY,EAAE,WAAW,EAAkC,CAAC;AACzE,eAAO,MAAM,sBAAsB,EAAE,WAAW,EACP,CAAC;AAC1C,eAAO,MAAM,sBAAsB,EAAE,WAAW,EACP,CAAC;AAC1C,eAAO,MAAM,sBAAsB,EAAE,WAAW,EACP,CAAC;AAC1C,eAAO,MAAM,wBAAwB,EAAE,WAAW,EACP,CAAC;AAE5C,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,OAAO,aAAa,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACvB,oBAAoB,GACpB,oBAAoB,GACpB,iBAAiB,GACjB,yBAAyB,GACzB,yBAAyB,GACzB,iBAAiB,GACjB,aAAa,GACb,sBAAsB,GACtB,qBAAqB,GACrB,uBAAuB,GACvB,cAAc,GACd,mBAAmB,GACnB,qCAAqC,GACrC,sBAAsB,GACtB,kBAAkB,GAClB,mBAAmB,GACnB,eAAe,GACf,kBAAkB,GAClB,yBAAyB,GACzB,gBAAgB,GAChB,2BAA2B,GAC3B,kBAAkB,GAClB,mBAAmB,GACnB,yBAAyB,GACzB,iCAAiC,GACjC,yBAAyB,GACzB,uBAAuB,GACvB,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,CAAC;AAE5B;;;GAGG;AACH,eAAO,MAAM,+BAA+B,0CAGJ,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,GAC/C,QAAQ,EAAE,CAMZ;AAED,eAAO,MAAM,0BAA0B,yDAIC,CAAC;AAWzC,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAQT;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,0BAA0B,uCAGC,CAAC;AAEzC;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAIT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAMT"}
|
|
@@ -10,14 +10,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
10
10
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
11
|
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.RoleAbilities = exports.CronSchedulerAbilities = exports.BotAbilities = exports.TeamLeadAbilities = exports.SecondAgentAbilities = exports.FirstAgentAbilities = exports.KpiAbilities = exports.AdminAbilities = void 0;
|
|
13
|
+
exports.GLOBAL_CURATED_SCOPE_ROLES = exports.SHARED_CURATED_MATCH_ROLES = exports.OFFICE_MANAGER_ASSIGNABLE_ROLES = exports.RoleAbilities = exports.InterconnectionAbilities = exports.WorkerCuratorAbilities = exports.OfficeManagerAbilities = exports.CronSchedulerAbilities = exports.BotAbilities = exports.TeamLeadAbilities = exports.SecondAgentAbilities = exports.FirstAgentAbilities = exports.KpiAbilities = exports.AdminAbilities = void 0;
|
|
14
|
+
exports.getRolesOmCannotAssign = getRolesOmCannotAssign;
|
|
15
|
+
exports.hasSharedCuratedMatchAccess = hasSharedCuratedMatchAccess;
|
|
16
|
+
exports.hasGlobalCuratedCandidateScope = hasGlobalCuratedCandidateScope;
|
|
17
|
+
exports.isCandidateOnlyCuratedViewer = isCandidateOnlyCuratedViewer;
|
|
14
18
|
const admin_abilities_json_1 = __importDefault(require("./admin.abilities.json"));
|
|
15
19
|
const bot_abilities_json_1 = __importDefault(require("./bot.abilities.json"));
|
|
16
20
|
const cron_scheduler_abilities_json_1 = __importDefault(require("./cron-scheduler.abilities.json"));
|
|
17
21
|
const first_agent_abilities_json_1 = __importDefault(require("./first-agent.abilities.json"));
|
|
18
22
|
const kpi_abilities_json_1 = __importDefault(require("./kpi.abilities.json"));
|
|
23
|
+
const office_manager_abilities_json_1 = __importDefault(require("./office-manager.abilities.json"));
|
|
19
24
|
const second_agent_abilities_json_1 = __importDefault(require("./second-agent.abilities.json"));
|
|
20
25
|
const team_leads_json_1 = __importDefault(require("./team-leads.json"));
|
|
26
|
+
const worker_curator_abilities_json_1 = __importDefault(require("./worker-curator.abilities.json"));
|
|
27
|
+
const interconnection_abilities_json_1 = __importDefault(require("./interconnection.abilities.json"));
|
|
28
|
+
const users_contract_1 = require("../users/users.contract");
|
|
21
29
|
exports.AdminAbilities = admin_abilities_json_1.default;
|
|
22
30
|
exports.KpiAbilities = kpi_abilities_json_1.default;
|
|
23
31
|
exports.FirstAgentAbilities = first_agent_abilities_json_1.default;
|
|
@@ -25,6 +33,9 @@ exports.SecondAgentAbilities = second_agent_abilities_json_1.default;
|
|
|
25
33
|
exports.TeamLeadAbilities = team_leads_json_1.default;
|
|
26
34
|
exports.BotAbilities = bot_abilities_json_1.default;
|
|
27
35
|
exports.CronSchedulerAbilities = cron_scheduler_abilities_json_1.default;
|
|
36
|
+
exports.OfficeManagerAbilities = office_manager_abilities_json_1.default;
|
|
37
|
+
exports.WorkerCuratorAbilities = worker_curator_abilities_json_1.default;
|
|
38
|
+
exports.InterconnectionAbilities = interconnection_abilities_json_1.default;
|
|
28
39
|
exports.RoleAbilities = {
|
|
29
40
|
ADMIN: exports.AdminAbilities,
|
|
30
41
|
KPI: exports.KpiAbilities,
|
|
@@ -33,4 +44,84 @@ exports.RoleAbilities = {
|
|
|
33
44
|
TEAM_LEADS: exports.TeamLeadAbilities,
|
|
34
45
|
BOT: exports.BotAbilities,
|
|
35
46
|
CRON_SCHEDULER: exports.CronSchedulerAbilities,
|
|
47
|
+
OFFICE_MANAGER: exports.OfficeManagerAbilities,
|
|
48
|
+
WORKER_CURATOR: exports.WorkerCuratorAbilities,
|
|
49
|
+
INTERCONNECTION: exports.InterconnectionAbilities,
|
|
36
50
|
};
|
|
51
|
+
/**
|
|
52
|
+
* Roles an OFFICE_MANAGER may assign to users they create.
|
|
53
|
+
* Single source of truth for the office-manager create-user role policy.
|
|
54
|
+
*/
|
|
55
|
+
exports.OFFICE_MANAGER_ASSIGNABLE_ROLES = [
|
|
56
|
+
'FIRST_AGENT',
|
|
57
|
+
'SECOND_AGENT',
|
|
58
|
+
];
|
|
59
|
+
/**
|
|
60
|
+
* Roles the acting user must NOT be allowed to assign when creating a user
|
|
61
|
+
* as an office manager. Resolves the `{{ rolesOmCannotAssign }}` ability
|
|
62
|
+
* placeholder. Computed as the COMPLEMENT of the allowed set (fail-safe: a
|
|
63
|
+
* newly-added role defaults to disallowed). Returns `[]` for admins so the
|
|
64
|
+
* inverted ability rule never fires for an admin-who-is-also-an-OM.
|
|
65
|
+
*/
|
|
66
|
+
function getRolesOmCannotAssign(actingUserRoles) {
|
|
67
|
+
if (actingUserRoles?.includes('ADMIN')) {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
const allowed = new Set(exports.OFFICE_MANAGER_ASSIGNABLE_ROLES);
|
|
71
|
+
return users_contract_1.UserRoleSchema.options.filter((role) => !allowed.has(role));
|
|
72
|
+
}
|
|
73
|
+
exports.SHARED_CURATED_MATCH_ROLES = [
|
|
74
|
+
'ADMIN',
|
|
75
|
+
'WORKER_CURATOR',
|
|
76
|
+
'INTERCONNECTION',
|
|
77
|
+
];
|
|
78
|
+
function hasInterconnectionModifierPair(roles) {
|
|
79
|
+
return (roles?.includes('SECOND_AGENT') === true &&
|
|
80
|
+
roles.includes('INTERCONNECTION'));
|
|
81
|
+
}
|
|
82
|
+
function hasSharedCuratedMatchAccess(roles) {
|
|
83
|
+
if (!roles)
|
|
84
|
+
return false;
|
|
85
|
+
return (roles.includes('ADMIN') ||
|
|
86
|
+
roles.includes('WORKER_CURATOR') ||
|
|
87
|
+
hasInterconnectionModifierPair(roles));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Roles whose JOB-FIRST CANDIDATE scope is global: inside a specific job's
|
|
91
|
+
* candidate ranking, counts, hydration, and tuple-authorized actions they see
|
|
92
|
+
* the whole eligible pool instead of an assignment-scoped slice.
|
|
93
|
+
*
|
|
94
|
+
* This is NOT a general curated-record permission (spec 2026-07-15 superseded
|
|
95
|
+
* that use). Do not consult it on directory, consent-queue, worker-first, or
|
|
96
|
+
* any surface that is not keyed by a jobId — those surfaces gate
|
|
97
|
+
* INTERCONNECTION with isCandidateOnlyCuratedViewer instead. Deliberately
|
|
98
|
+
* does not widen owned-worker scoping (only ADMIN sees all owned workers).
|
|
99
|
+
*
|
|
100
|
+
* @deprecated Use SHARED_CURATED_MATCH_ROLES for new match-workspace policy.
|
|
101
|
+
*/
|
|
102
|
+
exports.GLOBAL_CURATED_SCOPE_ROLES = [
|
|
103
|
+
'ADMIN',
|
|
104
|
+
'INTERCONNECTION',
|
|
105
|
+
];
|
|
106
|
+
/**
|
|
107
|
+
* @deprecated Use hasSharedCuratedMatchAccess for new match-workspace policy.
|
|
108
|
+
*/
|
|
109
|
+
function hasGlobalCuratedCandidateScope(roles) {
|
|
110
|
+
return (roles?.includes('ADMIN') === true || hasInterconnectionModifierPair(roles));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Roles whose curated-worker access is restricted to the match workspaces:
|
|
114
|
+
* true only for the SECOND_AGENT+INTERCONNECTION modifier pair, excluding
|
|
115
|
+
* privileged curated roles. Such users may see curated workers through
|
|
116
|
+
* job-scoped candidates and worker-first job matches. Generic curated
|
|
117
|
+
* directory/detail/search/export surfaces reject them before querying. Used by
|
|
118
|
+
* API guards and the web
|
|
119
|
+
* (navigation, server-page guards, tabs, filters) so both stay in agreement.
|
|
120
|
+
*
|
|
121
|
+
* @deprecated Retained temporarily for rolling compatibility.
|
|
122
|
+
*/
|
|
123
|
+
function isCandidateOnlyCuratedViewer(roles) {
|
|
124
|
+
return (hasInterconnectionModifierPair(roles) &&
|
|
125
|
+
!roles?.includes('ADMIN') &&
|
|
126
|
+
!roles?.includes('WORKER_CURATOR'));
|
|
127
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abilities.contract.spec.d.ts","sourceRoot":"","sources":["../../contracts/abilities/abilities.contract.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const abilities_contract_1 = require("./abilities.contract");
|
|
4
|
+
describe('hasGlobalCuratedCandidateScope', () => {
|
|
5
|
+
it('true for ADMIN', () => {
|
|
6
|
+
expect((0, abilities_contract_1.hasGlobalCuratedCandidateScope)(['ADMIN'])).toBe(true);
|
|
7
|
+
});
|
|
8
|
+
it('true for SECOND_AGENT + INTERCONNECTION', () => {
|
|
9
|
+
expect((0, abilities_contract_1.hasGlobalCuratedCandidateScope)(['SECOND_AGENT', 'INTERCONNECTION'])).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
it('false for plain SECOND_AGENT', () => {
|
|
12
|
+
expect((0, abilities_contract_1.hasGlobalCuratedCandidateScope)(['SECOND_AGENT'])).toBe(false);
|
|
13
|
+
});
|
|
14
|
+
it('false for standalone or incorrectly paired INTERCONNECTION', () => {
|
|
15
|
+
expect((0, abilities_contract_1.hasGlobalCuratedCandidateScope)(['INTERCONNECTION'])).toBe(false);
|
|
16
|
+
expect((0, abilities_contract_1.hasGlobalCuratedCandidateScope)(['FIRST_AGENT', 'INTERCONNECTION'])).toBe(false);
|
|
17
|
+
});
|
|
18
|
+
it('keeps WORKER_CURATOR outside the deprecated candidate-global helper', () => {
|
|
19
|
+
expect((0, abilities_contract_1.hasGlobalCuratedCandidateScope)(['WORKER_CURATOR'])).toBe(false);
|
|
20
|
+
});
|
|
21
|
+
it('false for undefined/empty', () => {
|
|
22
|
+
expect((0, abilities_contract_1.hasGlobalCuratedCandidateScope)(undefined)).toBe(false);
|
|
23
|
+
expect((0, abilities_contract_1.hasGlobalCuratedCandidateScope)([])).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('shared curated match access', () => {
|
|
27
|
+
it.each([
|
|
28
|
+
[['SECOND_AGENT', 'INTERCONNECTION'], true],
|
|
29
|
+
[['INTERCONNECTION', 'SECOND_AGENT'], true],
|
|
30
|
+
[['ADMIN'], true],
|
|
31
|
+
[['WORKER_CURATOR'], true],
|
|
32
|
+
[['INTERCONNECTION'], false],
|
|
33
|
+
[['FIRST_AGENT', 'INTERCONNECTION'], false],
|
|
34
|
+
[['SECOND_AGENT'], false],
|
|
35
|
+
[['FIRST_AGENT'], false],
|
|
36
|
+
[[], false],
|
|
37
|
+
])('%j => %s', (roles, expected) => {
|
|
38
|
+
expect((0, abilities_contract_1.hasSharedCuratedMatchAccess)(roles)).toBe(expected);
|
|
39
|
+
});
|
|
40
|
+
it('grants only the purpose-limited workspace, not curated internals', () => {
|
|
41
|
+
expect(abilities_contract_1.InterconnectionAbilities).toEqual(expect.arrayContaining([
|
|
42
|
+
{ action: 'read', subject: 'CuratedMatchWorkspace' },
|
|
43
|
+
{ action: 'update', subject: 'CuratedMatchWorkspace' },
|
|
44
|
+
]));
|
|
45
|
+
const subjects = abilities_contract_1.InterconnectionAbilities.map((rule) => rule.subject);
|
|
46
|
+
for (const forbidden of [
|
|
47
|
+
'CuratedWorker',
|
|
48
|
+
'WorkerJobMatch',
|
|
49
|
+
'WorkerLeadAssignment',
|
|
50
|
+
'WorkerLeadProfile',
|
|
51
|
+
]) {
|
|
52
|
+
expect(subjects).not.toContain(forbidden);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('isCandidateOnlyCuratedViewer', () => {
|
|
57
|
+
it('is true for the SECOND_AGENT + INTERCONNECTION modifier pair', () => {
|
|
58
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(['SECOND_AGENT', 'INTERCONNECTION'])).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it('is false for every other role set', () => {
|
|
61
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(['ADMIN'])).toBe(false);
|
|
62
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(['SECOND_AGENT'])).toBe(false);
|
|
63
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(['WORKER_CURATOR'])).toBe(false);
|
|
64
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(['INTERCONNECTION'])).toBe(false);
|
|
65
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(['FIRST_AGENT', 'INTERCONNECTION'])).toBe(false);
|
|
66
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(['ADMIN', 'INTERCONNECTION'])).toBe(false);
|
|
67
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(['WORKER_CURATOR', 'INTERCONNECTION'])).toBe(false);
|
|
68
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)([
|
|
69
|
+
'ADMIN',
|
|
70
|
+
'SECOND_AGENT',
|
|
71
|
+
'INTERCONNECTION',
|
|
72
|
+
])).toBe(false);
|
|
73
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)([])).toBe(false);
|
|
74
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(undefined)).toBe(false);
|
|
75
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(null)).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
it('is order-independent', () => {
|
|
78
|
+
expect((0, abilities_contract_1.isCandidateOnlyCuratedViewer)(['INTERCONNECTION', 'SECOND_AGENT'])).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('JobCandidate grants (candidates-page entry ability)', () => {
|
|
82
|
+
const hasRule = (rules, action) => rules.some((r) => r.action === action && r.subject === 'JobCandidate');
|
|
83
|
+
it.each(['SECOND_AGENT', 'WORKER_CURATOR', 'INTERCONNECTION'])('%s holds read+update JobCandidate', (role) => {
|
|
84
|
+
expect(hasRule(abilities_contract_1.RoleAbilities[role], 'read')).toBe(true);
|
|
85
|
+
expect(hasRule(abilities_contract_1.RoleAbilities[role], 'update')).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it('ADMIN is covered by manage all', () => {
|
|
88
|
+
expect(abilities_contract_1.RoleAbilities.ADMIN.some((r) => r.action === 'manage' && r.subject === 'all')).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('LeadActivityEvent grants (contact-history resource)', () => {
|
|
92
|
+
it.each(['SECOND_AGENT', 'WORKER_CURATOR', 'INTERCONNECTION'])('%s can read and update only owned contact events', (role) => {
|
|
93
|
+
for (const action of ['read', 'update']) {
|
|
94
|
+
expect(abilities_contract_1.RoleAbilities[role]).toContainEqual(expect.objectContaining({
|
|
95
|
+
action,
|
|
96
|
+
subject: 'LeadActivityEvent',
|
|
97
|
+
conditions: { agentId: '{{ id }}' },
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
it.each(['SECOND_AGENT', 'WORKER_CURATOR', 'INTERCONNECTION'])('%s can read the safe layered contact-session projections', (role) => {
|
|
102
|
+
const rule = abilities_contract_1.RoleAbilities[role].find((candidate) => candidate.action === 'read' &&
|
|
103
|
+
candidate.subject === 'LeadActivityEvent');
|
|
104
|
+
expect(rule?.fields).toEqual(expect.arrayContaining([
|
|
105
|
+
'contactSessionId',
|
|
106
|
+
'connection',
|
|
107
|
+
'workerState',
|
|
108
|
+
'workerState.*',
|
|
109
|
+
'jobResult',
|
|
110
|
+
'jobResult.*',
|
|
111
|
+
]));
|
|
112
|
+
});
|
|
113
|
+
it('ADMIN is unrestricted through manage all', () => {
|
|
114
|
+
expect(abilities_contract_1.RoleAbilities.ADMIN).toContainEqual({
|
|
115
|
+
action: 'manage',
|
|
116
|
+
subject: 'all',
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('FilterCandidateContactHistorySchema grants', () => {
|
|
121
|
+
it.each(['SECOND_AGENT', 'WORKER_CURATOR', 'INTERCONNECTION'])('%s can filter owned history fields but not by another contacting agent', (role) => {
|
|
122
|
+
const rule = abilities_contract_1.RoleAbilities[role].find((candidate) => candidate.action === 'read' &&
|
|
123
|
+
candidate.subject === 'FilterCandidateContactHistorySchema');
|
|
124
|
+
expect(rule?.fields).toEqual(expect.arrayContaining(['worker', 'job', 'status', 'channel']));
|
|
125
|
+
expect(rule?.fields).not.toContain('contactedById');
|
|
126
|
+
});
|
|
127
|
+
it('ADMIN can use contactedById through manage all', () => {
|
|
128
|
+
expect(abilities_contract_1.RoleAbilities.ADMIN).toContainEqual({
|
|
129
|
+
action: 'manage',
|
|
130
|
+
subject: 'all',
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('OFFICE_MANAGER reference-data grants', () => {
|
|
135
|
+
it.each(['Qualification', 'QualificationType', 'Trade'])('can read %s', (subject) => {
|
|
136
|
+
expect(abilities_contract_1.RoleAbilities.OFFICE_MANAGER).toContainEqual({
|
|
137
|
+
action: 'read',
|
|
138
|
+
subject,
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
it.each(['Qualification', 'QualificationType', 'Trade'])('does not receive write access to %s', (subject) => {
|
|
142
|
+
expect(abilities_contract_1.RoleAbilities.OFFICE_MANAGER.some((rule) => rule.subject === subject &&
|
|
143
|
+
['create', 'update', 'delete', 'manage'].includes(rule.action))).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-dashboard.abilities.test.d.ts","sourceRoot":"","sources":["../../contracts/abilities/admin-dashboard.abilities.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const abilities_contract_1 = require("./abilities.contract");
|
|
4
|
+
const subjects = [
|
|
5
|
+
'AdminFaDashboardWidgets',
|
|
6
|
+
'AdminSaDashboardWidgets',
|
|
7
|
+
'AdminAgentStats',
|
|
8
|
+
'AdminProofs',
|
|
9
|
+
'AdminDashboardTrends',
|
|
10
|
+
];
|
|
11
|
+
function canRead(rules, subject) {
|
|
12
|
+
return rules.some((rule) => !rule.inverted &&
|
|
13
|
+
(rule.action === 'read' || rule.action === 'manage') &&
|
|
14
|
+
(rule.subject === subject || rule.subject === 'all'));
|
|
15
|
+
}
|
|
16
|
+
describe('admin dashboard ability matrix', () => {
|
|
17
|
+
it.each(subjects)('allows Admin, KPI and Office Manager to read %s', (subject) => {
|
|
18
|
+
expect(canRead(abilities_contract_1.AdminAbilities, subject)).toBe(true);
|
|
19
|
+
expect(canRead(abilities_contract_1.KpiAbilities, subject)).toBe(true);
|
|
20
|
+
expect(canRead(abilities_contract_1.OfficeManagerAbilities, subject)).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it.each(subjects)('does not grant %s to personal FA/SA roles', (subject) => {
|
|
23
|
+
expect(canRead(abilities_contract_1.FirstAgentAbilities, subject)).toBe(false);
|
|
24
|
+
expect(canRead(abilities_contract_1.SecondAgentAbilities, subject)).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
it('retains managed-office row scope for Office Manager', () => {
|
|
27
|
+
expect(abilities_contract_1.OfficeManagerAbilities).toContainEqual({
|
|
28
|
+
action: 'view-stats',
|
|
29
|
+
subject: 'User',
|
|
30
|
+
conditions: { officeId: { $in: '{{ managedOfficeIds }}' } },
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -32,5 +32,24 @@
|
|
|
32
32
|
"id": "{{ id }}"
|
|
33
33
|
},
|
|
34
34
|
"inverted": true
|
|
35
|
+
},
|
|
36
|
+
{ "action": "manage", "subject": "Proof" },
|
|
37
|
+
{ "action": "manage", "subject": "ProofPhoto" },
|
|
38
|
+
{ "action": "manage", "subject": "ProofEntityLink" },
|
|
39
|
+
{ "action": "read", "subject": "FilterProofsSchema" },
|
|
40
|
+
{
|
|
41
|
+
"action": "read",
|
|
42
|
+
"subject": "FilterExportJobSchema",
|
|
43
|
+
"fields": [
|
|
44
|
+
"entity",
|
|
45
|
+
"status",
|
|
46
|
+
"userId",
|
|
47
|
+
"requestedAt",
|
|
48
|
+
"requestedAt.*",
|
|
49
|
+
"sort",
|
|
50
|
+
"sort.*",
|
|
51
|
+
"page",
|
|
52
|
+
"limit"
|
|
53
|
+
]
|
|
35
54
|
}
|
|
36
55
|
]
|
|
@@ -13,13 +13,22 @@
|
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"action": "read",
|
|
16
|
-
"subject": "User"
|
|
17
|
-
"conditions": {
|
|
18
|
-
"id": "{{ id }}"
|
|
19
|
-
}
|
|
16
|
+
"subject": "User"
|
|
20
17
|
},
|
|
21
18
|
{
|
|
22
19
|
"action": "read",
|
|
23
20
|
"subject": "Office"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"action": "read",
|
|
24
|
+
"subject": "Job"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"action": "create",
|
|
28
|
+
"subject": "Job"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"action": "update",
|
|
32
|
+
"subject": "Job"
|
|
24
33
|
}
|
|
25
34
|
]
|