MCS Building Keys
WordPress plugin for the MCS physical key database
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/alscheuring/mcs-building-keys-plugin/archive/refs/heads/main.zipReadme
MCS Building Keys
WordPress plugin for managing the MCS physical key database — a port of the key management module from portal.mcs.cmu.edu/facilities.
Features
- Key inventory — track every physical key by number, building, department, lab, and room
- Key assignment — assign keys to key holders with a two-step flow (assign → complete assignment form)
- Verification — mark keys as verified by an admin
- Missing keys — report and resolve missing keys with audit trail
- Key requests — requestors submit a form; admins approve (auto-assigns an available key) or deny
- Key holders — auto-created for
@andrew.cmu.edu/@cmu.eduemail addresses - Audit trail — every key action is logged with admin email, holder, and notes
- CSV export — download the full key inventory as a spreadsheet
- Reference data — manage buildings, departments, and labs from the admin UI
Requirements
- WordPress 6.0+
- PHP 8.1+
- MySQL 5.7+
Installation
- Upload the
mcs-building-keysfolder towp-content/plugins/ - Activate the plugin — database tables are created automatically on activation
- Navigate to Building Keys in the WordPress admin menu
Database Tables
All tables use the wp_mcs_bk_ prefix:
| Table | Purpose |
|---|---|
wp_mcs_bk_buildings |
Building lookup (name) |
wp_mcs_bk_departments |
Department lookup (name) |
wp_mcs_bk_labs |
Lab/room lookup (name, room number, building) |
wp_mcs_bk_keyholders |
Key holder records (name, andrew email) |
wp_mcs_bk_keys |
Physical keys with assignment/verification/missing state |
wp_mcs_bk_requests |
Key requests with approval workflow |
wp_mcs_bk_audits |
Full audit trail for every key action |
Key Status
Key status is derived, not stored:
| Status | Condition |
|---|---|
missing |
reported_missing_at is set and missing_resolved_at is null |
verified |
verified_at is set (and not missing) |
unverified |
Neither of the above |
REST API
Namespace: mcs-building-keys/v1
Authentication: WordPress nonce (X-WP-Nonce) + capability mcs_manage_building_keys or manage_options
Keys
| Method | Endpoint | Description |
|---|---|---|
| GET | /keys |
List keys (search, filters, pagination) |
| POST | /keys |
Create key |
| GET | /keys/{id} |
Get key |
| PATCH | /keys/{id} |
Update key |
| DELETE | /keys/{id} |
Delete key |
| POST | /keys/{id}/assign |
Assign to holder |
| POST | /keys/{id}/unassign |
Unassign |
| POST | /keys/{id}/verify |
Toggle verified status |
| POST | /keys/{id}/complete-form |
Mark assignment form complete |
| POST | /keys/{id}/report-missing |
Report key missing |
| POST | /keys/{id}/resolve-missing |
Resolve missing status |
| GET | /keys/{id}/audits |
Get audit trail |
| GET | /export |
Download CSV |
Requests
| Method | Endpoint | Description |
|---|---|---|
| GET | /requests |
List requests |
| POST | /requests |
Submit request |
| GET | /requests/{id} |
Get request |
| POST | /requests/{id}/approve |
Approve and assign key |
| POST | /requests/{id}/deny |
Deny |
Key Holders
| Method | Endpoint | Description |
|---|---|---|
| GET | /keyholders |
List all holders |
| POST | /keyholders |
Create holder |
| PATCH | /keyholders/{id} |
Update holder |
| GET | /keyholders/search?q= |
Search by name/email |
Reference Data
| Method | Endpoint | Description |
|---|---|---|
| GET | /reference |
Get buildings, departments, labs |
| POST | /reference/buildings |
Add building |
| POST | /reference/departments |
Add department |
| GET | /reference/labs |
List labs |
| POST | /reference/labs |
Add lab |
| DELETE | /reference/labs/{id} |
Delete lab |
| GET | /stats |
Dashboard stats |
Roles & Capabilities
| Role | Capability |
|---|---|
administrator |
mcs_manage_building_keys (added automatically) |
building_keys_manager |
mcs_manage_building_keys |
Key Holders Auto-Creation
When a key request is submitted with an @andrew.cmu.edu or @cmu.edu email, a KeyHolder record is automatically created if one doesn't exist. This mirrors the behavior of the original Laravel portal.
Assignment Form Flow
- Admin assigns a key →
assignment_form_completed = false(pending) - Admin marks form complete (with optional signer name) →
assignment_form_completed = true
The admin dashboard highlights keys with a pending form in the stats bar.
File Structure
mcs-building-keys/
├── mcs-building-keys.php # Plugin entry point
├── includes/
│ ├── class-mcs-bk-db.php # Database schema installation
│ ├── class-mcs-bk-key.php # Key CRUD, assign/unassign, status, stats
│ ├── class-mcs-bk-keyholder.php # Key holder CRUD + auto-create
│ ├── class-mcs-bk-audit.php # Audit log
│ ├── class-mcs-bk-request.php # Key request CRUD + approve/deny
│ └── class-mcs-bk-api.php # WP REST API routes
├── admin/
│ ├── class-mcs-bk-admin.php # Admin menu, role, asset enqueue
│ └── partials/
│ └── main.php # Admin page HTML
└── assets/
├── css/admin.css # Admin styles
└── js/admin.js # Admin SPA (vanilla JS)Read the full README on GitHub →
Releases
| Tag | Published |
|---|---|
| v1.0.0 | Jul 16, 2026 |
These releases are tags only. The author does not attach a packaged zip, so there are no download counts to report.