Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
749d346
Expiry notification first pass
jusdino Jan 27, 2026
8458af5
Add expiration reminder stack
jusdino Jan 27, 2026
60aa657
Smoke test notifications
jusdino Jan 28, 2026
5e0b0d5
Delegate search permissions to search api, notification principal pol…
jusdino Jan 28, 2026
7a4bfe9
Move search api role permissions back to original state
jusdino Jan 28, 2026
691d64d
Revise information passed through to email
jusdino Jan 29, 2026
beca60b
WIP - add pagination and break out rules per compact/cycle
landonshumway-ia Jan 30, 2026
7e36a51
Update test patches/get tests passing
landonshumway-ia Jan 30, 2026
87ff2c1
fix comment
landonshumway-ia Jan 30, 2026
1873e2b
WIP - update smoke test
landonshumway-ia Jan 30, 2026
027ffa4
Update email template to match design
landonshumway-ia Feb 2, 2026
cd3021d
Fix logo size
landonshumway-ia Feb 2, 2026
f74e302
Update power user permission policy
landonshumway-ia Feb 4, 2026
317c04f
Only include privileges in email that are active
landonshumway-ia Feb 4, 2026
e479480
Add expiration check to cosm codebase
landonshumway-ia Feb 4, 2026
fc64812
Refactor lambda/tests to use/mock config properties consistently
landonshumway-ia Feb 4, 2026
ea6c893
Formatting
landonshumway-ia Feb 4, 2026
c931cb5
Update email wording according to management feedback
landonshumway-ia Feb 4, 2026
8f06e94
Update compact connect requirements to latest
landonshumway-ia Feb 4, 2026
17f6c8f
Reduce size of load test
landonshumway-ia Feb 4, 2026
a516125
upgrade pip version in GH actions
landonshumway-ia Feb 4, 2026
6d210bc
remove ref to scope in doc
landonshumway-ia Feb 5, 2026
62c05bf
Add search with retry
landonshumway-ia Feb 5, 2026
e0a9b45
update example in cosm script
landonshumway-ia Feb 5, 2026
2c45234
PR feedback
landonshumway-ia Feb 6, 2026
c353a5d
Update node dependencies to latest
landonshumway-ia Feb 6, 2026
1313cc9
update cosmetology node deps to latest
landonshumway-ia Feb 6, 2026
e551e9c
update multi-account python deps to latest
landonshumway-ia Feb 6, 2026
48c4937
test CI/CD node test issue
landonshumway-ia Feb 6, 2026
339970f
Add jest setup for mocks
landonshumway-ia Feb 6, 2026
40da34c
update multi-account runner
landonshumway-ia Feb 6, 2026
a4a1a17
Remove expect import and rely on global jest method
landonshumway-ia Feb 6, 2026
3a5dfff
PR feedback - increment matched privilege metric
landonshumway-ia Feb 6, 2026
ad52546
PR feedback - pass calculated target date into continuation payload
landonshumway-ia Feb 6, 2026
cdeebf8
Add cleanup to load testing script
landonshumway-ia Feb 9, 2026
96b3993
Improve timeout logic for load test script
landonshumway-ia Feb 9, 2026
00ee606
Tweak search alarms
landonshumway-ia Feb 9, 2026
f1c8623
optimize load test cleanup
landonshumway-ia Feb 9, 2026
e4c6066
adjust duration alarm
landonshumway-ia Feb 9, 2026
b5047fd
PR feedback - catch single validation errors to prevent batch failure
landonshumway-ia Feb 9, 2026
b0fbb97
Do not deploy reminder stack to beta
landonshumway-ia Feb 9, 2026
cd9f7ea
remove unneeded custom class from load test
landonshumway-ia Feb 9, 2026
bb02198
formatting
landonshumway-ia Feb 9, 2026
1eb1a42
PR feedback
landonshumway-ia Feb 11, 2026
f514e92
comment rewording for clarity
landonshumway-ia Feb 11, 2026
ac94c3d
PR feedback
landonshumway-ia Feb 11, 2026
fbc44bf
update smoke test error handling
landonshumway-ia Feb 11, 2026
23ec36b
PR feedback - update smoke test cloudwatch log pagination
landonshumway-ia Feb 11, 2026
8405d03
PR feedback - avoid duplicate license types/jurisdictions in smoke test
landonshumway-ia Feb 11, 2026
c34082b
formatting
landonshumway-ia Feb 11, 2026
1be319f
update purchase requirement to address lint check
landonshumway-ia Feb 11, 2026
76333c2
reduce comment line for lint check
landonshumway-ia Feb 11, 2026
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
12 changes: 10 additions & 2 deletions .github/workflows/check-compact-connect-ui-app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ jobs:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v5

- name: Upgrade pip
# Runner image ships pip 25.3; upgrade to 26.0+ so pip-audit passes (CVE-2026-1703 fixed in 26.0)
run: pip install --upgrade 'pip>=26.0'

- name: Install dev dependencies
run: "pip install -r backend/compact-connect-ui-app/requirements-dev.txt"

Expand Down Expand Up @@ -82,6 +86,10 @@ jobs:
with:
python-version: '3.14'

- name: Upgrade pip
# Runner image ships pip 25.3; upgrade to 26.0+ so pip-audit passes (CVE-2026-1703 fixed in 26.0)
run: pip install --upgrade 'pip>=26.0'

# Setup Node
- name: Setup Node
uses: actions/setup-node@v6
Expand All @@ -103,7 +111,7 @@ jobs:
run: "pip install -r backend/compact-connect-ui-app/requirements-dev.txt"

- name: Install all Python dependencies
run: "cd backend/compact-connect; pip install -U 'pip<25.3'; bin/sync_deps.sh"
run: "cd backend/compact-connect-ui-app; bin/sync_deps.sh"
Comment thread
jlkravitz marked this conversation as resolved.

- name: Test backend
- name: Test frontend
run: "cd backend/compact-connect-ui-app; bin/run_tests.sh -l all -no"
18 changes: 14 additions & 4 deletions .github/workflows/check-compact-connect.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ jobs:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v5

- name: Upgrade pip
# Runner image ships pip 25.3; upgrade to 26.0+ so pip-audit passes (CVE-2026-1703 fixed in 26.0)
run: pip install --upgrade 'pip>=26.0'

- name: Install dev dependencies
run: "pip install -r backend/compact-connect/requirements-dev.txt"

Expand Down Expand Up @@ -82,6 +86,10 @@ jobs:
with:
python-version: '3.14'

- name: Upgrade pip
# Runner image ships pip 25.3; upgrade to 26.0+ so pip-audit passes (CVE-2026-1703 fixed in 26.0)
run: pip install --upgrade 'pip>=26.0'

# Setup Node
- name: Setup Node
uses: actions/setup-node@v6
Expand All @@ -101,11 +109,9 @@ jobs:

- name: Install dev dependencies
run: "pip install -r backend/compact-connect/requirements-dev.txt"
# Note we are currently pinning the pip version to deal with compatibility issues released with pip 25.3
# see https://stackoverflow.com/a/79802727 If this issues is addressed in a later version, we can remove the
# extra pip install command so we stop pinning the pip version

- name: Install all Python dependencies
run: "cd backend/compact-connect; pip install -U 'pip<25.3'; bin/sync_deps.sh"
run: "cd backend/compact-connect; bin/sync_deps.sh"

- name: Test backend
run: "cd backend/compact-connect; bin/run_tests.sh -l all -no"
Expand All @@ -122,6 +128,10 @@ jobs:
with:
python-version: '3.12'

- name: Upgrade pip
# Runner image ships pip 25.3; upgrade to 26.0+ so pip-audit passes (CVE-2026-1703 fixed in 26.0)
run: pip install --upgrade 'pip>=26.0'

- name: Install dependencies
run: "cd backend/compact-connect/lambdas/python/purchases; pip install -r requirements.txt"

Expand Down
14 changes: 10 additions & 4 deletions .github/workflows/check-cosmetology-app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ jobs:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v5

- name: Upgrade pip
# Runner image ships pip 25.3; upgrade to 26.0+ so pip-audit passes (CVE-2026-1703 fixed in 26.0)
run: pip install --upgrade 'pip>=26.0'

- name: Install dev dependencies
run: "pip install -r backend/cosmetology-app/requirements-dev.txt"

Expand Down Expand Up @@ -81,6 +85,10 @@ jobs:
with:
python-version: '3.14'

- name: Upgrade pip
# Runner image ships pip 25.3; upgrade to 26.0+ so pip-audit passes (CVE-2026-1703 fixed in 26.0)
run: pip install --upgrade 'pip>=26.0'

# Setup Node
- name: Setup Node
uses: actions/setup-node@v6
Expand All @@ -100,11 +108,9 @@ jobs:

- name: Install dev dependencies
run: "pip install -r backend/cosmetology-app/requirements-dev.txt"
# Note we are currently pinning the pip version to deal with compatibility issues released with pip 25.3
# see https://stackoverflow.com/a/79802727 If this issues is addressed in a later version, we can remove the
# extra pip install command so we stop pinning the pip version

- name: Install all Python dependencies
run: "cd backend/cosmetology-app; pip install -U 'pip<25.3'; bin/sync_deps.sh"
run: "cd backend/cosmetology-app; bin/sync_deps.sh"

- name: Test backend
run: "cd backend/cosmetology-app; bin/run_tests.sh -l all -no"
8 changes: 8 additions & 0 deletions .github/workflows/check-multi-account.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ jobs:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2

- name: Upgrade pip
# Runner image ships pip 25.3; upgrade to 26.0+ so pip-audit passes (CVE-2026-1703 fixed in 26.0)
run: pip install --upgrade 'pip>=26.0'

- name: Install dev dependencies
run: "pip install -r backend/multi-account/control-tower/requirements-dev.txt"

Expand All @@ -45,6 +49,10 @@ jobs:
with:
python-version: '3.12'

- name: Upgrade pip
# Runner image ships pip 25.3; upgrade to 26.0+ so pip-audit passes (CVE-2026-1703 fixed in 26.0)
run: pip install --upgrade 'pip>=26.0'

- name: Install dev dependencies
run: "pip install -r backend/multi-account/control-tower/requirements-dev.txt"

Expand Down
2 changes: 1 addition & 1 deletion backend/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ cdk.out
cdk.context.json
*-cdk.context.json
# smoke test env
smoke_tests_env.json
*smoke_tests_env.json
1 change: 0 additions & 1 deletion backend/compact-connect/app_clients/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ The following scopes are available at the jurisdiction level:
{jurisdiction}/{compact}.admin
{jurisdiction}/{compact}.write
{jurisdiction}/{compact}.readPrivate
{jurisdiction}/{compact}.readSSN
```

Currently, the most common scope needed by app clients is `{jurisdiction}/{compact}.write`, which allows uploading
Expand Down
5 changes: 3 additions & 2 deletions backend/compact-connect/bin/generate_privilege_test_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -470,8 +470,9 @@ def main():

# Check if provider already has a privilege for this specific license type in the target state
existing_privileges = provider_user_records.get_privilege_records(
filter_condition=lambda p, license_type=target_license_type: p.jurisdiction == args.privilege_state
and p.licenseType == license_type
filter_condition=lambda p, license_type=target_license_type: (
p.jurisdiction == args.privilege_state and p.licenseType == license_type
)
)
if existing_privileges:
if args.provider_id:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { Context } from 'aws-lambda';
import { EnvironmentVariablesService } from '../lib/environment-variables-service';
import { CompactConfigurationClient } from '../lib/compact-configuration-client';
import { JurisdictionClient } from '../lib/jurisdiction-client';
import { EmailNotificationService, EncumbranceNotificationService, InvestigationNotificationService } from '../lib/email';
import { EmailNotificationService, EncumbranceNotificationService, InvestigationNotificationService, type PrivilegeExpirationReminderRow } from '../lib/email';
import { EmailNotificationEvent, EmailNotificationResponse } from '../lib/models/email-notification-service-event';

const environmentVariables = new EnvironmentVariablesService();
Expand Down Expand Up @@ -386,6 +386,41 @@ export class Lambda implements LambdaInterface {
event.templateVariables?.auditNote || ''
);
break;
case 'privilegeExpirationReminder': {
if (!event.specificEmails?.length) {
throw new Error('No recipients found for privilege expiration reminder email');
}
if (!event.templateVariables?.providerFirstName
|| !event.templateVariables?.expirationDate
|| !event.templateVariables?.privileges) {
throw new Error('Missing required template variables for privilegeExpirationReminder template.');
}
const privileges = event.templateVariables.privileges as Array<{ jurisdiction?: string;
licenseType?: string; privilegeId?:
string; dateOfExpiration?: string;
formattedExpirationDate?: string }>;

if (!Array.isArray(privileges) || privileges.length === 0) {
throw new Error('privilegeExpirationReminder template requires a non-empty privileges array.');
}
for (let i = 0; i < privileges.length; i++) {
const p = privileges[i];

if (!p?.jurisdiction || !p?.licenseType || !p?.privilegeId || !p?.dateOfExpiration) {
throw new Error(
`privilegeExpirationReminder template requires each privilege to have jurisdiction, licenseType, privilegeId, and dateOfExpiration (ISO 8601). Invalid privilege at index ${i}.`
);
}
}
await this.emailService.sendPrivilegeExpirationReminderEmail(
event.compact,
event.specificEmails,
event.templateVariables.providerFirstName,
event.templateVariables.expirationDate,
privileges as PrivilegeExpirationReminderRow[]
);
break;
}
case 'licenseInvestigationStateNotification':
if (!event.jurisdiction) {
throw new Error('No jurisdiction provided for license investigation state notification email');
Expand Down
1 change: 1 addition & 0 deletions backend/compact-connect/lambdas/nodejs/jest.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export default {
testMatch: ['**/tests/**/*.test.[jt]s?(x)'],
moduleFileExtensions: ['ts', 'js'],
verbose: true,
setupFilesAfterEnv: ['<rootDir>/tests/jest.setup.ts'],
testPathIgnorePatterns: [
'<rootDir>/node_modules/',
],
Expand Down
Loading
Loading