mirror of
https://github.com/Sea-Haven-Industries/seahaven-door-unlock-api.git
synced 2026-09-30 11:43:12 +00:00
88 lines
4.5 KiB
Markdown
88 lines
4.5 KiB
Markdown
# Sea Haven Door Unlock API
|
|
|
|

|
|

|
|

|
|
|
|
AWS Lambda middleware that allows Yealink desk phones to unlock the front door and manage lockdown profiles via LenelS2 Elements.
|
|
|
|
```
|
|
Yealink T54W/T58W → HTTPS GET (?token=) → API Gateway (token authorizer) → Lambda → LenelS2 Elements API
|
|
```
|
|
|
|
## Architecture
|
|
|
|
- **API Gateway (HTTP API)** — `GET /unlock`, `GET /lockdown`, `GET /lockdown/status` with throttling (5 burst / 2 sustained req/sec)
|
|
- **Token authorizer Lambda** — a REQUEST-type Lambda authorizer validates the `?token=` query-string value (the same shared secret the phones already send) against the `/seahaven/door-unlock/auth-token` SSM parameter, so unauthenticated callers are rejected at the gateway (401/403) before any handler runs. Identity source is `$request.querystring.token`; results are cached 5 minutes. Fail-closed. The handlers also re-validate the token as defense-in-depth.
|
|
- **Unlock Lambda** — validates a shared auth token, calls the Elements `TemporaryUnlock` command
|
|
- **Lockdown Lambda** — toggles lockdown profiles (start/stop) and checks status, returns Yealink XML TextScreen responses
|
|
- **Lockdown Poller Lambda** — VPC-connected, polls Elements API every 15 seconds for lockdown status (runs 4x per 1-minute EventBridge schedule)
|
|
- **SSM Parameter Store** — stores the Elements API key, auth token, door ID, and phone IPs
|
|
- **Secrets Manager** — stores the Yealink phone admin password
|
|
- **Custom Domain** — `doorunlock.seahaven.com` via Route 53 + ACM wildcard cert
|
|
|
|
## Lockdown Profiles
|
|
|
|
Two lockdown profiles are configured:
|
|
|
|
| Profile | Elements ID | Line Key |
|
|
|---------|-------------|----------|
|
|
| Bohemia - Whole Building | `4b4a3e6b-c903-4cce-8cd6-288612bf0542` | 3 |
|
|
| Ronkonkoma - Whole Building | `ff9876bc-c54f-472e-aef9-d2bffd4b7cf7` | 4 |
|
|
|
|
Pressing the line key toggles the lockdown on/off and displays the current status on the phone screen.
|
|
|
|
**Known limitation:** Line key LED color does not currently change to reflect lockdown status. The T58W's XML Browser key type (17) does not support persistent LED color changes via Push XML or Execute commands — LED commands are transient and immediately overridden by the phone's key type management.
|
|
|
|
## SSM Parameters
|
|
|
|
| Parameter | Type | Description |
|
|
|-----------|------|-------------|
|
|
| `/seahaven/door-unlock/elements-api-key` | SecureString | LenelS2 Elements API key |
|
|
| `/seahaven/door-unlock/auth-token` | SecureString | Shared secret embedded in the Yealink DSS key URL |
|
|
| `/seahaven/door-unlock/door-id` | String | Elements device ID for the front door reader |
|
|
| `/seahaven/door-unlock/phone-ips` | String | Comma-separated phone IPs for lockdown poller |
|
|
|
|
## Secrets Manager
|
|
|
|
| Secret | Description |
|
|
|--------|-------------|
|
|
| `door-unlock-api/phone-password` | Yealink phone admin password for Push XML |
|
|
|
|
## CI/CD
|
|
|
|
GitHub Actions, using the Sea Haven reusable workflows:
|
|
|
|
- **`.github/workflows/ci.yaml`** — on pull requests to `main`, runs the `ci-typescript-cdk` reusable workflow (build, lint, synth).
|
|
- **`.github/workflows/deploy.yaml`** — on push to `main`, runs the `cd-cdk` reusable workflow which assumes the `githubdeploy-seahaven-door-unlock-api` OIDC role (`AWS_DEPLOY_ROLE_ARN` repo secret) and runs `cdk deploy`.
|
|
|
|
The legacy CodePipeline/CodeBuild deploy path has been fully decommissioned.
|
|
|
|
## Manual Deployment
|
|
|
|
```bash
|
|
npm install
|
|
npx cdk deploy
|
|
```
|
|
|
|
## Phone Configuration
|
|
|
|
Configure DSS keys on the Yealink T54W/T58W (via phone web UI or 3CX):
|
|
|
|
- **Key 2 — Unlock Door**
|
|
- Type: URL
|
|
- Value: `https://doorunlock.seahaven.com/unlock?token=<auth-token>`
|
|
|
|
- **Keys 3-4 — Lockdown Toggle**
|
|
- Type: XML Browser (17)
|
|
- Value: `https://doorunlock.seahaven.com/lockdown?token=<auth-token>&profile=bohemia|ronkonkoma`
|
|
|
|
## 3CX Provisioning Templates
|
|
|
|
Custom 3CX templates are included with door unlock and lockdown URLs hardcoded.
|
|
|
|
| Template | Model | Key 2 | Keys 3-4 | Display |
|
|
|----------|-------|-------|----------|---------|
|
|
| `yealinkT54W-door-unlock.ph.xml` | T54W | Unlock Door | Managed by 3CX BLF | Dim after 5 min, never sleep |
|
|
| `yealinkT54W-door-unlock-with-sp.ph.xml` | T54W | Unlock Door | Shared Parking SP1-3 | Dim after 5 min, never sleep |
|
|
| `yealinkT58W-door-unlock.ph.xml` | T58W | Unlock Door | Lockdown Toggle (Bohemia/Ronkonkoma) | Default T58W display settings |
|