[READ-ONLY] Mirror of https://github.com/openstatusHQ/openstatus. 馃珫 Status page with uptime monitoring & API monitoring as code 馃珫 openstatus.dev
bun drizzle-orm monitoring monitoring-as-code nextjs observability on-call open-source shadcn-ui status-page statuspage synthetic-monitoring tinybird turso uptime uptime-checker uptime-monitor

feat(dashboard): transfer workspace ownership (#2927) master

* feat(dashboard): transfer workspace ownership An owner can make another member the owner from Settings > General > Members, behind a type-to-confirm dialog. The transfer is immediate: the target becomes owner, the caller becomes member. - services: `transferOwnership` verb; promotes before it demotes and the demote is conditional on `role = 'owner'`, so concurrent transfers resolve to one winner. Two `member.update` audit rows, paired via metadata. `transferOwnershipInWorkspace` is the internal body for support transfers with a system actor. - api: `member.transferOwnership`. After the response it emails both people and moves the Stripe customer email to the new owner when it still equals the former owner's. `afterResponse` moves to lib. - emails: `ownership-transferred` template. - dashboard: `FormAlertDialog` becomes composable parts (the delete preset keeps its API); members show role badges, and only owners see the row actions. - docs: workspace members reference. * fix(members): address ownership transfer review Require transfer metadata on member.update audit rows, keep the confirm action neutral outside the delete preset, label the confirm input, show the billing note whenever a Stripe customer is linked, document the admin role, and avoid a nested transaction in the rollback test. * fix(members): scope billing email copy to openstatus emails


+1399 -86
20 changed files