feat: ConnectWise PSA Integration — Slice 1 (Foundation) #106

Merged
chihlasm merged 29 commits from feat/connectwise-psa-integration into main 2026-03-15 05:45:36 +00:00
chihlasm commented 2026-03-15 02:15:41 +00:00 (Migrated from github.com)

Summary

  • PSA abstraction layer with abstract PSAProvider interface, typed exceptions, and normalized data models
  • ConnectWise HTTP client with auth, dynamic base URL resolution, pagination, retry, SSRF prevention
  • Fernet credential encryption with HKDF key derivation from SECRET_KEY
  • PsaConnection model + migration 058
  • Connection CRUD API endpoints with owner+ RBAC
  • Frontend Integrations page (Connection tab) — setup form, connected status view, edit mode, connection testing

Test plan

  • Encryption round-trip tests pass (test_psa_encryption.py)
  • Connection CRUD RBAC tests pass (test_psa_connections.py)
  • Frontend build passes
  • Navigate to Account → Integrations page as owner
  • Verify setup form renders with all fields
  • Test with real ConnectWise sandbox credentials (if available)
  • Verify non-owner users cannot access connection management

🤖 Generated with Claude Code

## Summary - PSA abstraction layer with abstract `PSAProvider` interface, typed exceptions, and normalized data models - ConnectWise HTTP client with auth, dynamic base URL resolution, pagination, retry, SSRF prevention - Fernet credential encryption with HKDF key derivation from SECRET_KEY - `PsaConnection` model + migration 058 - Connection CRUD API endpoints with owner+ RBAC - Frontend Integrations page (Connection tab) — setup form, connected status view, edit mode, connection testing ## Test plan - [ ] Encryption round-trip tests pass (`test_psa_encryption.py`) - [ ] Connection CRUD RBAC tests pass (`test_psa_connections.py`) - [ ] Frontend build passes - [ ] Navigate to Account → Integrations page as owner - [ ] Verify setup form renders with all fields - [ ] Test with real ConnectWise sandbox credentials (if available) - [ ] Verify non-owner users cannot access connection management 🤖 Generated with [Claude Code](https://claude.com/claude-code)
railway-app[bot] commented 2026-03-15 02:16:02 +00:00 (Migrated from github.com)

🚅 Deployed to the patherly-pr-106 environment in selfless-grace

Service Status Web Updated (UTC)
patherly 🕗 Deploying (View Logs) Web Mar 15, 2026 at 5:45 am
hopeful-liberation 🕒 Building (View Logs) Web Mar 15, 2026 at 5:45 am
<!-- railway-bot-comment-version=2 --> <!-- railway-project-id="22b9b58c-271b-42e5-a10e-6fdec8d00134" railway-project-name="selfless-grace" --> 🚅 Deployed to the [patherly-pr-106](https://railway.com/project/22b9b58c-271b-42e5-a10e-6fdec8d00134?environmentId=30aecfba-34bc-4376-825f-96be81cc6d89) environment in **[selfless-grace](https://railway.com/project/22b9b58c-271b-42e5-a10e-6fdec8d00134)** | **Service** | **Status** | **Web** | **Updated** (UTC) | | :--- | :--- | :--- | :--- | | patherly | 🕗 Deploying ([View Logs](https://railway.com/project/22b9b58c-271b-42e5-a10e-6fdec8d00134/service/95f556ff-5264-4116-a0c2-618a2fc53ba4?id=79e7751a-5805-4561-bccd-acc8d34363fb&environmentId=30aecfba-34bc-4376-825f-96be81cc6d89)) | [Web](https://patherly-patherly-pr-106.up.railway.app) | Mar 15, 2026 at 5:45 am | | hopeful-liberation | 🕒 Building ([View Logs](https://railway.com/project/22b9b58c-271b-42e5-a10e-6fdec8d00134/service/e1db2ee3-d241-4f45-abe4-c9c5fdf483d5?id=3e7928a2-aaa7-4870-a8b6-44df1845533c&environmentId=30aecfba-34bc-4376-825f-96be81cc6d89)) | [Web](https://hopeful-liberation-patherly-pr-106.up.railway.app) | Mar 15, 2026 at 5:45 am |
Sign in to join this conversation.