Self-Service Portal
The SelfServicePortalController at /api/v1/tenants/{tenantId}/portal provides tenant administrators with self-service capabilities for managing settings and team invitations without platform admin intervention.
Settings Management
Tenant settings are organized into categories via the TenantSettings.SettingsCategory enum. Each category stores key-value configuration as JSON.
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /portal/settings | Get all settings |
GET | /portal/settings/{category} | Get settings by category |
POST | /portal/settings/initialize | Initialize all default settings |
PUT | /portal/settings/{category} | Update settings for a category |
Example: Get All Settings
curl http://localhost:8082/api/v1/tenants/{tenantId}/portal/settings \
-H "Authorization: Bearer $TOKEN"Example: Update Settings
curl -X PUT http://localhost:8082/api/v1/tenants/{tenantId}/portal/settings/GENERAL \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-H "X-User-Id: user-uuid" \
-d '{
"values": {
"timezone": "America/New_York",
"dateFormat": "MM/DD/YYYY",
"language": "en-US"
}
}'Team Invitations
The self-service portal manages team invitations with a complete lifecycle: create, resend, revoke, accept, and decline.
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /portal/invitations | List invitations (paginated) |
GET | /portal/invitations/pending | List pending invitations |
GET | /portal/invitations/summary | Get invitation statistics |
POST | /portal/invitations | Create invitation |
POST | /portal/invitations/bulk | Bulk invite |
GET | /portal/invitations/{id} | Get invitation by ID |
POST | /portal/invitations/{id}/resend | Resend invitation email |
POST | /portal/invitations/{id}/revoke | Revoke invitation |
GET | /portal/invitations/token/{token} | Get invitation by token |
POST | /portal/invitations/token/{token}/accept | Accept invitation |
POST | /portal/invitations/token/{token}/decline | Decline invitation |
Example: Create Invitation
curl -X POST http://localhost:8082/api/v1/tenants/{tenantId}/portal/invitations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"email": "newuser@acme.com",
"role": "DATA_ANALYST",
"message": "Join our analytics team"
}'Example: Bulk Invite
curl -X POST http://localhost:8082/api/v1/tenants/{tenantId}/portal/invitations/bulk \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '[
{ "email": "user1@acme.com", "role": "VIEWER" },
{ "email": "user2@acme.com", "role": "DATA_ANALYST" },
{ "email": "user3@acme.com", "role": "ADMIN" }
]'Source Files
| File | Path |
|---|---|
| Controller | control-plane/tenant-service/src/main/java/com/matih/tenant/controller/SelfServicePortalController.java |
| Service | control-plane/tenant-service/src/main/java/com/matih/tenant/service/SelfServicePortalService.java |
| Settings Entity | control-plane/tenant-service/src/main/java/com/matih/tenant/entity/TenantSettings.java |
| Invitation Entity | control-plane/tenant-service/src/main/java/com/matih/tenant/entity/TeamInvitation.java |