Admin Panel
EasyAdmin backoffice for managing users and subscriptions
Admin Panel
The admin panel is built with EasyAdmin and provides a backoffice for managing users and subscriptions.
What's Included
- User management with search, filter, and role editing
- Subscription management with status tracking
- Manual GitHub organization invite action
- Secure form-based login with rate limiting
Access
The admin panel is available at /admin. You must have the ROLE_ADMIN role.
Creating an Admin User
- Register a user through the API
- Promote them to admin:
docker compose exec php bin/console app:user:promote-admin user@example.com
The admin panel uses form-based login at /admin/login — separate from the API's JWT auth. Login is rate-limited to 5 attempts per 15 minutes.
Users
Available Fields
| Field | Type | Editable | Notes |
|---|---|---|---|
| name | Text | No | Display only |
| No | Display only | ||
| emailValidated | Boolean | No | Shown as icon |
| provider | Text | No | email, google, apple |
| roles | Choice | Yes | ROLE_USER, ROLE_ADMIN |
| createdAt | DateTime | No | Display only |
Search by name or email. Filter by email, name, email validated status, provider, or role.
Users cannot be created or deleted from the admin panel — they must register through the API.
Subscriptions
Available Fields
| Field | Type | Editable | Notes |
|---|---|---|---|
| userId | Text | No | Display only |
| planType | Text | No | Free, Starter, Pro |
| paymentType | Text | No | Recurring or One-Time |
| status | Choice | Yes | Active, Past Due, Canceled, Expired |
| billingInterval | Text | No | Monthly or Yearly |
| stripeCustomerId | Text | No | Visible on detail page |
| githubAdded | Boolean | No | Whether user was invited to GitHub |
Filter by status, plan type, billing interval, payment type, or GitHub invite status.
GitHub Invite Action
Available on the Users list and detail pages. This action manually invites (or re-invites) a user to your GitHub organization.
The action verifies the user has a paid plan before sending the invite. Useful for re-inviting users whose initial automatic invite failed.