From 50756b3e65d465edd58a48cd33c590cf6cfa8c8e Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Tue, 28 Apr 2026 21:08:12 +0200 Subject: [PATCH] feat(web): add invites + checkInvite to api client --- packages/web/src/api/client.ts | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/web/src/api/client.ts b/packages/web/src/api/client.ts index d80d49e0..e5b9b117 100644 --- a/packages/web/src/api/client.ts +++ b/packages/web/src/api/client.ts @@ -56,6 +56,13 @@ import type { ApprovalRequest, PeeringSubscription, PeeringNotification, + InviteLinkSummary, + InviteRedemption, + CreateInviteRequest, + UpdateInviteRequest, + ReinstateInviteRequest, + ReinstateInviteResponse, + CheckInviteResponse, } from '@backspace/shared'; export type { FederationPeer, ApprovalRequest, PeeringSubscription, PeeringNotification }; @@ -74,6 +81,7 @@ export class BackspaceApiClient { register: (data: RegisterRequest) => Promise; login: (data: LoginRequest) => Promise; checkUsername: (username: string) => Promise<{ available: boolean; reason?: string }>; + checkInvite: (token: string) => Promise; }; readonly users: { @@ -232,6 +240,16 @@ export class BackspaceApiClient { markAllPeeringNotificationsRead: () => Promise<{ success: boolean; count: number }>; }; + readonly invites: { + list: (status?: 'active' | 'archived') => Promise<{ invites: InviteLinkSummary[] }>; + create: (body: CreateInviteRequest) => Promise; + patch: (id: string, body: UpdateInviteRequest) => Promise; + revoke: (id: string) => Promise<{ invite: InviteLinkSummary }>; + reinstate: (id: string, body: ReinstateInviteRequest) => Promise; + delete: (id: string) => Promise<{ success: boolean }>; + redemptions: (id: string) => Promise<{ redemptions: InviteRedemption[] }>; + }; + readonly admin: { storageStats: () => Promise; storageOrphans: () => Promise<{ orphans: OrphanedFile[] }>; @@ -393,6 +411,8 @@ export class BackspaceApiClient { request('POST', '/auth/login', data, false), checkUsername: (username: string) => request<{ available: boolean; reason?: string }>('GET', `/auth/check-username?username=${encodeURIComponent(username)}`, undefined, false), + checkInvite: (token: string) => + request('GET', `/auth/check-invite?token=${encodeURIComponent(token)}`, undefined, false), }; this.users = { @@ -720,6 +740,23 @@ export class BackspaceApiClient { ), }; + this.invites = { + list: (status: 'active' | 'archived' = 'active') => + request<{ invites: InviteLinkSummary[] }>('GET', `/admin/invites?status=${status}`), + create: (body: CreateInviteRequest) => + request('POST', '/admin/invites', body), + patch: (id: string, body: UpdateInviteRequest) => + request('PATCH', `/admin/invites/${id}`, body), + revoke: (id: string) => + request<{ invite: InviteLinkSummary }>('POST', `/admin/invites/${id}/revoke`), + reinstate: (id: string, body: ReinstateInviteRequest) => + request('POST', `/admin/invites/${id}/reinstate`, body), + delete: (id: string) => + request<{ success: boolean }>('DELETE', `/admin/invites/${id}`), + redemptions: (id: string) => + request<{ redemptions: InviteRedemption[] }>('GET', `/admin/invites/${id}/redemptions`), + }; + this.admin = { storageStats: () => request('GET', '/admin/storage/stats'), storageOrphans: () => request<{ orphans: OrphanedFile[] }>('GET', '/admin/storage/orphans'),