Fix two bugs preventing developer applications from appearing in SilverDESK:
1. Application creation payload used wrong types - ticketId was parsed as
int (GetInt32) but SilverDESK expects a Guid string, and appliedRole
was cast to int but the DTO expects "Tester"/"Developer" strings.
2. Approval provisioning now updates the DeveloperApplication record in
SilverDESK after Mattermost/Mailcow provisioning, setting status to
Approved and the correct provisioning flags.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace free-text timezone input with a dropdown populated from system
timezones. Replace "Why SilverLabs?" motivation section with a
skills-focused "What You Bring" section that collects what candidates
can contribute to the team, with role-specific placeholders.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
SilverDESK rate-limits /api/auth/check-username after ~2 requests with a
5-minute cooldown. The old 500ms debounce per keystroke quickly exhausted
this limit, breaking the form. Now checks only on field blur, validates
format client-side while typing, and caches results to skip redundant calls.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CheckUsernameAsync returned false (taken) on any API failure, making every
username appear taken when SilverDESK was unreachable. Now returns nullable
bool so errors show a warning instead of blocking submission.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After registering the user and creating the ticket, call the
SilverDESK developer-program API to create a proper application
record linking the user and ticket. This ensures applications
appear in the /developer-program/applications dashboard.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users now pick a password and get a SilverDESK account immediately on
submit. The form includes debounced username availability checking,
password fields with validation, and a post-submit link to SilverDESK.
The approval flow no longer creates a SilverDESK user (already exists)
and only provisions Mattermost + Mailcow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The approval endpoint now always returns 200 when provisioning was
attempted, with success/failure details in the response body. This
allows the SilverDESK webhook step to proceed with remaining actions
(note, reply, status change) even when individual services fail.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add the Mailcow read/write API key so mailbox provisioning actually
authenticates. Also set password2 to match password as required by
the Mailcow API.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The CreateUserDto expects `fullName` and `password` but the payload
was sending `name` (wrong property name) and omitting password
entirely, causing 400 BadRequest validation errors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Change approve endpoint from int to string ticketId to match SilverDESK
GUIDs. Remove body parameter requirement so the endpoint works as a
webhook target. Add DeveloperTicketParsingService to fetch and parse
applicant details from ticket descriptions. Remove redundant ticket
status update from ProvisioningService since SilverDESK action engine
now handles SetStatus/AddNote/AddReply steps.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add developer application page with form submission that creates tickets
in SilverDESK. Includes provisioning service scaffolding for Mattermost,
Mailcow, and Gitea account creation. Fixes API key header casing
(X-API-Key) and ticket payload to match SilverDESK's CreateTicketDto
contract.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Blazor Web App requires the ASP.NET runtime to function properly,
as it uses interactive server components. Changed from nginx serving
static files to running the full .NET application.
Changes:
- Updated Dockerfile to use aspnet:9.0 runtime image
- Removed nginx configuration (no longer needed)
- Disabled HTTPS redirection (running behind reverse proxy)
- Added publish/ folder to .gitignore
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major architectural upgrade from static HTML site to modern Blazor Web App:
- Migrated to .NET 9.0 Blazor Web App framework
- Converted home page with 4 gateway cards (Help Desk, App Store, Cloud, SDK)
- Added new SDK card linking to comprehensive SDK documentation
- Converted SDK documentation page to Blazor component
- Updated template download links to nuget.silverlabs.uk repository
- Implemented multi-stage Docker build with .NET SDK 9.0
- Created Blazor-optimized nginx configuration
- Preserved all original styling and animations
- Added .gitignore for Blazor build artifacts
Technical changes:
- New BlazorApp/ project structure with Components architecture
- MainLayout simplified (no default navigation)
- CSS ported to wwwroot (styles.css + sdk-styles.css)
- Multi-stage Dockerfile: Build with dotnet SDK, serve with nginx
- GitLab CI/CD pipeline compatible (auto-detects new Dockerfile)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>