Skip to content

Commit d09496d

Browse files
authored
Fix project transfers (#926)
1 parent f21cfda commit d09496d

6 files changed

Lines changed: 27 additions & 23 deletions

File tree

apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/project-settings/page-client.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export default function PageClient() {
4141

4242
setIsTransferring(true);
4343
try {
44-
await project.transfer(user, selectedTeamId);
44+
await user.transferProject(project.id, selectedTeamId);
4545

4646
// Reload the page to reflect changes
4747
// we don't actually need this, but it's a nicer UX as it clearly indicates to the user that a "big" change was made

packages/stack-shared/src/interface/admin-interface.ts

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -317,23 +317,6 @@ export class StackAdminInterface extends StackServerInterface {
317317
);
318318
}
319319

320-
async transferProject(session: InternalSession, newTeamId: string): Promise<void> {
321-
await this.sendAdminRequest(
322-
"/internal/projects/transfer",
323-
{
324-
method: "POST",
325-
headers: {
326-
"content-type": "application/json",
327-
},
328-
body: JSON.stringify({
329-
project_id: this.options.projectId,
330-
new_team_id: newTeamId,
331-
}),
332-
},
333-
session,
334-
);
335-
}
336-
337320
async getMetrics(includeAnonymous: boolean = false): Promise<any> {
338321
const params = new URLSearchParams();
339322
if (includeAnonymous) {

packages/stack-shared/src/interface/client-interface.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1797,5 +1797,25 @@ export class StackClientInterface {
17971797
const { url } = await response.json() as { url: string };
17981798
return url;
17991799
}
1800+
1801+
async transferProject(internalProjectSession: InternalSession, projectIdToTransfer: string, newTeamId: string): Promise<void> {
1802+
if (this.options.projectId !== "internal") {
1803+
throw new StackAssertionError("StackClientInterface.transferProject() is only available for internal projects (please specify the project ID in the constructor)");
1804+
}
1805+
await this.sendClientRequest(
1806+
"/internal/projects/transfer",
1807+
{
1808+
method: "POST",
1809+
headers: {
1810+
"content-type": "application/json",
1811+
},
1812+
body: JSON.stringify({
1813+
project_id: projectIdToTransfer,
1814+
new_team_id: newTeamId,
1815+
}),
1816+
},
1817+
internalProjectSession,
1818+
);
1819+
}
18001820
}
18011821

packages/template/src/lib/stack-app/apps/implementations/admin-app-impl.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { StackAssertionError, throwErr } from "@stackframe/stack-shared/dist/uti
99
import { pick } from "@stackframe/stack-shared/dist/utils/objects";
1010
import { Result } from "@stackframe/stack-shared/dist/utils/results";
1111
import { useMemo } from "react"; // THIS_LINE_PLATFORM react-like
12-
import { AdminSentEmail, CurrentUser } from "../..";
12+
import { AdminSentEmail } from "../..";
1313
import { EmailConfig, stackAppInternalsSymbol } from "../../common";
1414
import { AdminEmailTemplate } from "../../email-templates";
1515
import { InternalApiKey, InternalApiKeyBase, InternalApiKeyBaseCrudRead, InternalApiKeyCreateOptions, InternalApiKeyFirstView, internalApiKeyCreateOptionsToCrud } from "../../internal-api-keys";
@@ -196,10 +196,6 @@ export class _StackAdminAppImplIncomplete<HasTokenStore extends boolean, Project
196196
async delete() {
197197
await app._interface.deleteProject();
198198
},
199-
async transfer(user: CurrentUser, newTeamId: string) {
200-
await app._interface.transferProject(user._internalSession, newTeamId);
201-
await onRefresh();
202-
},
203199
async getProductionModeErrors() {
204200
return getProductionModeErrors(data);
205201
},

packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,6 +1247,10 @@ export class _StackClientAppImplIncomplete<HasTokenStore extends boolean, Projec
12471247
createProject(newProject: AdminProjectUpdateOptions & { displayName: string, teamId: string }) {
12481248
return app._createProject(session, newProject);
12491249
},
1250+
async transferProject(projectIdToTransfer: string, newTeamId: string): Promise<void> {
1251+
await app._interface.transferProject(session, projectIdToTransfer, newTeamId);
1252+
await app._refreshProject();
1253+
},
12501254
listOwnedProjects() {
12511255
return app._listOwnedProjects(session);
12521256
},

packages/template/src/lib/stack-app/users/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ export type UserExtra = {
265265
export type InternalUserExtra =
266266
& {
267267
createProject(newProject: AdminProjectCreateOptions): Promise<AdminOwnedProject>,
268+
transferProject(projectIdToTransfer: string, newTeamId: string): Promise<void>,
268269
}
269270
& AsyncStoreProperty<"ownedProjects", [], AdminOwnedProject[], true>
270271

0 commit comments

Comments
 (0)