works perfectly

This commit is contained in:
TheCactusBlue 2025-03-25 13:08:45 -07:00
parent f7b0582cbc
commit 71869587bb
13 changed files with 172 additions and 172 deletions

View File

@ -1,4 +1,4 @@
import { userPermissionDefinitionsCrudHandlers } from "../crud";
import { projectPermissionDefinitionsCrudHandlers } from "../crud";
export const PATCH = userPermissionDefinitionsCrudHandlers.updateHandler;
export const DELETE = userPermissionDefinitionsCrudHandlers.deleteHandler;
export const PATCH = projectPermissionDefinitionsCrudHandlers.updateHandler;
export const DELETE = projectPermissionDefinitionsCrudHandlers.deleteHandler;

View File

@ -1,11 +1,11 @@
import { createPermissionDefinition, deletePermissionDefinition, listPermissionDefinitions, updatePermissionDefinitions } from "@/lib/permissions";
import { retryTransaction } from "@/prisma-client";
import { createCrudHandlers } from "@/route-handlers/crud-handler";
import { userPermissionDefinitionsCrud } from '@stackframe/stack-shared/dist/interface/crud/user-permissions';
import { projectPermissionDefinitionsCrud } from '@stackframe/stack-shared/dist/interface/crud/project-permissions';
import { teamPermissionDefinitionIdSchema, yupObject } from "@stackframe/stack-shared/dist/schema-fields";
import { createLazyProxy } from "@stackframe/stack-shared/dist/utils/proxies";
export const userPermissionDefinitionsCrudHandlers = createLazyProxy(() => createCrudHandlers(userPermissionDefinitionsCrud, {
export const projectPermissionDefinitionsCrudHandlers = createLazyProxy(() => createCrudHandlers(projectPermissionDefinitionsCrud, {
paramsSchema: yupObject({
permission_id: teamPermissionDefinitionIdSchema.defined(),
}),

View File

@ -1,4 +1,4 @@
import { userPermissionDefinitionsCrudHandlers } from "./crud";
import { projectPermissionDefinitionsCrudHandlers } from "./crud";
export const POST = userPermissionDefinitionsCrudHandlers.createHandler;
export const GET = userPermissionDefinitionsCrudHandlers.listHandler;
export const POST = projectPermissionDefinitionsCrudHandlers.createHandler;
export const GET = projectPermissionDefinitionsCrudHandlers.listHandler;

View File

@ -1,4 +1,4 @@
import { userPermissionsCrudHandlers } from "../../crud";
import { projectPermissionsCrudHandlers } from "../../crud";
export const POST = userPermissionsCrudHandlers.createHandler;
export const DELETE = userPermissionsCrudHandlers.deleteHandler;
export const POST = projectPermissionsCrudHandlers.createHandler;
export const DELETE = projectPermissionsCrudHandlers.deleteHandler;

View File

@ -1,16 +1,16 @@
import { grantUserPermission, listUserPermissions, revokeUserPermission } from "@/lib/permissions";
import { ensureUserExists, ensureUserPermissionExists } from "@/lib/request-checks";
import { sendUserPermissionCreatedWebhook, sendUserPermissionDeletedWebhook } from "@/lib/webhooks";
import { sendProjectPermissionCreatedWebhook, sendProjectPermissionDeletedWebhook } from "@/lib/webhooks";
import { retryTransaction } from "@/prisma-client";
import { createCrudHandlers } from "@/route-handlers/crud-handler";
import { runAsynchronouslyAndWaitUntil } from "@/utils/vercel";
import { KnownErrors } from "@stackframe/stack-shared";
import { userPermissionsCrud } from '@stackframe/stack-shared/dist/interface/crud/user-permissions';
import { projectPermissionsCrud } from '@stackframe/stack-shared/dist/interface/crud/project-permissions';
import { teamPermissionDefinitionIdSchema, userIdOrMeSchema, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
import { StatusError, throwErr } from "@stackframe/stack-shared/dist/utils/errors";
import { createLazyProxy } from "@stackframe/stack-shared/dist/utils/proxies";
export const userPermissionsCrudHandlers = createLazyProxy(() => createCrudHandlers(userPermissionsCrud, {
export const projectPermissionsCrudHandlers = createLazyProxy(() => createCrudHandlers(projectPermissionsCrud, {
querySchema: yupObject({
user_id: userIdOrMeSchema.optional().meta({ openapiField: { onlyShowInOperations: [ 'List' ], description: 'Filter with the user ID. If set, only the permissions this user has will be returned. Client request must set `user_id=me`', exampleValue: 'me' } }),
permission_id: teamPermissionDefinitionIdSchema.optional().meta({ openapiField: { onlyShowInOperations: [ 'List' ], description: 'Filter with the permission ID. If set, only the permissions with this specific ID will be returned', exampleValue: '16399452-c4f3-4554-8e44-c2d67bb60360' } }),
@ -31,7 +31,7 @@ export const userPermissionsCrudHandlers = createLazyProxy(() => createCrudHandl
});
});
runAsynchronouslyAndWaitUntil(sendUserPermissionCreatedWebhook({
runAsynchronouslyAndWaitUntil(sendProjectPermissionCreatedWebhook({
projectId: auth.project.id,
data: {
id: params.permission_id,
@ -58,7 +58,7 @@ export const userPermissionsCrudHandlers = createLazyProxy(() => createCrudHandl
});
});
runAsynchronouslyAndWaitUntil(sendUserPermissionDeletedWebhook({
runAsynchronouslyAndWaitUntil(sendProjectPermissionDeletedWebhook({
projectId: auth.project.id,
data: {
id: params.permission_id,

View File

@ -1,3 +1,3 @@
import { userPermissionsCrudHandlers } from "./crud";
import { projectPermissionsCrudHandlers } from "./crud";
export const GET = userPermissionsCrudHandlers.listHandler;
export const GET = projectPermissionsCrudHandlers.listHandler;

View File

@ -1,7 +1,7 @@
import { TeamSystemPermission as DBTeamSystemPermission, Prisma } from "@prisma/client";
import { KnownErrors } from "@stackframe/stack-shared";
import { TeamPermissionDefinitionsCrud, TeamPermissionsCrud } from "@stackframe/stack-shared/dist/interface/crud/team-permissions";
import { UserPermissionsCrud } from "@stackframe/stack-shared/dist/interface/crud/user-permissions";
import { ProjectPermissionsCrud } from "@stackframe/stack-shared/dist/interface/crud/project-permissions";
import { groupBy } from "@stackframe/stack-shared/dist/utils/arrays";
import { StackAssertionError, throwErr } from "@stackframe/stack-shared/dist/utils/errors";
import { stringCompare, typedToLowercase, typedToUppercase } from "@stackframe/stack-shared/dist/utils/strings";
@ -485,7 +485,7 @@ export async function listUserPermissions(
permissionId?: string,
recursive: boolean,
}
): Promise<UserPermissionsCrud["Admin"]["Read"][]> {
): Promise<ProjectPermissionsCrud["Admin"]["Read"][]> {
const permissionDefs = await listPermissionDefinitions(tx, "PROJECT", options.tenancy);
const permissionsMap = new Map(permissionDefs.map(p => [p.id, p]));
const results = await tx.projectUserDirectPermission.findMany({

View File

@ -1,8 +1,8 @@
import { projectPermissionCreatedWebhookEvent, projectPermissionDeletedWebhookEvent } from "@stackframe/stack-shared/dist/interface/crud/project-permissions";
import { teamMembershipCreatedWebhookEvent, teamMembershipDeletedWebhookEvent } from "@stackframe/stack-shared/dist/interface/crud/team-memberships";
import { teamPermissionCreatedWebhookEvent, teamPermissionDeletedWebhookEvent } from "@stackframe/stack-shared/dist/interface/crud/team-permissions";
import { teamCreatedWebhookEvent, teamDeletedWebhookEvent, teamUpdatedWebhookEvent } from "@stackframe/stack-shared/dist/interface/crud/teams";
import { userCreatedWebhookEvent, userDeletedWebhookEvent, userUpdatedWebhookEvent } from "@stackframe/stack-shared/dist/interface/crud/users";
import { userPermissionCreatedWebhookEvent, userPermissionDeletedWebhookEvent } from "@stackframe/stack-shared/dist/interface/crud/user-permissions";
import { WebhookEvent } from "@stackframe/stack-shared/dist/interface/webhooks";
import { getEnvVariable } from "@stackframe/stack-shared/dist/utils/env";
import { StackAssertionError, captureError } from "@stackframe/stack-shared/dist/utils/errors";
@ -74,5 +74,5 @@ export const sendTeamMembershipCreatedWebhook = createWebhookSender(teamMembersh
export const sendTeamMembershipDeletedWebhook = createWebhookSender(teamMembershipDeletedWebhookEvent);
export const sendTeamPermissionCreatedWebhook = createWebhookSender(teamPermissionCreatedWebhookEvent);
export const sendTeamPermissionDeletedWebhook = createWebhookSender(teamPermissionDeletedWebhookEvent);
export const sendUserPermissionCreatedWebhook = createWebhookSender(userPermissionCreatedWebhookEvent);
export const sendUserPermissionDeletedWebhook = createWebhookSender(userPermissionDeletedWebhookEvent);
export const sendProjectPermissionCreatedWebhook = createWebhookSender(projectPermissionCreatedWebhookEvent);
export const sendProjectPermissionDeletedWebhook = createWebhookSender(projectPermissionDeletedWebhookEvent);

View File

@ -6,7 +6,7 @@ it("lists all the user permissions", async ({ expect }) => {
backendContext.set({ projectKeys: InternalProjectKeys });
const { adminAccessToken } = await Project.createAndGetAdminToken();
const response = await niceBackendFetch(`/api/v1/user-permission-definitions`, {
const response = await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "GET",
headers: {
@ -29,7 +29,7 @@ it("creates, updates, and deletes a new user permission", async ({ expect }) =>
backendContext.set({ projectKeys: InternalProjectKeys });
const { adminAccessToken } = await Project.createAndGetAdminToken();
const response1 = await niceBackendFetch(`/api/v1/user-permission-definitions`, {
const response1 = await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "POST",
body: {
@ -51,7 +51,7 @@ it("creates, updates, and deletes a new user permission", async ({ expect }) =>
`);
// create another permission with contained permissions
const response2 = await niceBackendFetch(`/api/v1/user-permission-definitions`, {
const response2 = await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "POST",
body: {
@ -74,7 +74,7 @@ it("creates, updates, and deletes a new user permission", async ({ expect }) =>
`);
// test recursive case
const response3 = await niceBackendFetch(`/api/v1/user-permission-definitions`, {
const response3 = await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "POST",
body: {
@ -98,7 +98,7 @@ it("creates, updates, and deletes a new user permission", async ({ expect }) =>
`);
// list all permissions again
const response4 = await niceBackendFetch(`/api/v1/user-permission-definitions`, {
const response4 = await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "GET",
headers: {
@ -130,7 +130,7 @@ it("creates, updates, and deletes a new user permission", async ({ expect }) =>
`);
// delete the permission
const response5 = await niceBackendFetch(`/api/v1/user-permission-definitions/p1`, {
const response5 = await niceBackendFetch(`/api/v1/project-permission-definitions/p1`, {
accessType: "admin",
method: "DELETE",
headers: {
@ -146,7 +146,7 @@ it("creates, updates, and deletes a new user permission", async ({ expect }) =>
`);
// list all permissions again
const response6 = await niceBackendFetch(`/api/v1/user-permission-definitions`, {
const response6 = await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "GET",
headers: {

View File

@ -5,7 +5,7 @@ import { ApiKey, Auth, InternalProjectKeys, Project, Team, Webhook, backendConte
it("is not allowed to list permissions from the other users on the client", async ({ expect }) => {
await Auth.Otp.signIn();
const response = await niceBackendFetch(`/api/v1/user-permissions`, {
const response = await niceBackendFetch(`/api/v1/project-permissions`, {
accessType: "client",
method: "GET",
});
@ -21,7 +21,7 @@ it("is not allowed to list permissions from the other users on the client", asyn
it("is not allowed to grant non-existing permission to a user on the server", async ({ expect }) => {
const { userId } = await Auth.Otp.signIn();
const response = await niceBackendFetch(`/api/v1/user-permissions/${userId}/does_not_exist`, {
const response = await niceBackendFetch(`/api/v1/project-permissions/${userId}/does_not_exist`, {
accessType: "server",
method: "POST",
body: {},
@ -47,7 +47,7 @@ it("can create a new permission and grant it to a user on the server", async ({
const { adminAccessToken } = await Project.createAndGetAdminToken({ config: { magic_link_enabled: true } });
// create a permission child
await niceBackendFetch(`/api/v1/user-permission-definitions`, {
await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "POST",
body: {
@ -60,7 +60,7 @@ it("can create a new permission and grant it to a user on the server", async ({
});
// create a permission parent
await niceBackendFetch(`/api/v1/user-permission-definitions`, {
await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "POST",
body: {
@ -78,7 +78,7 @@ it("can create a new permission and grant it to a user on the server", async ({
const { userId } = await Auth.Password.signUpWithEmail({ password: 'test1234' });
// list current permissions
const response1 = await niceBackendFetch(`/api/v1/user-permissions?user_id=me`, {
const response1 = await niceBackendFetch(`/api/v1/project-permissions?user_id=me`, {
accessType: "client",
method: "GET",
});
@ -94,7 +94,7 @@ it("can create a new permission and grant it to a user on the server", async ({
`);
// grant new permission
const response2 = await niceBackendFetch(`/api/v1/user-permissions/${userId}/parent`, {
const response2 = await niceBackendFetch(`/api/v1/project-permissions/${userId}/parent`, {
accessType: "server",
method: "POST",
body: {},
@ -111,7 +111,7 @@ it("can create a new permission and grant it to a user on the server", async ({
`);
// list current permissions (should have the new permission)
const response3 = await niceBackendFetch(`/api/v1/user-permissions?user_id=me`, {
const response3 = await niceBackendFetch(`/api/v1/project-permissions?user_id=me`, {
accessType: "client",
method: "GET",
});
@ -136,7 +136,7 @@ it("can customize default user permissions", async ({ expect }) => {
await Auth.Otp.signIn();
const { adminAccessToken } = await Project.createAndGetAdminToken();
const response1 = await niceBackendFetch(`/api/v1/user-permission-definitions`, {
const response1 = await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "POST",
body: {
@ -202,7 +202,7 @@ it("can customize default user permissions", async ({ expect }) => {
// sign up a new user
const { userId } = await Auth.Password.signUpWithEmail({ password: 'test1234' });
// list permissions for the new user
const response3 = await niceBackendFetch(`/api/v1/user-permissions?user_id=${userId}`, {
const response3 = await niceBackendFetch(`/api/v1/project-permissions?user_id=${userId}`, {
accessType: "client",
method: "GET",
});
@ -228,13 +228,13 @@ it("should trigger user permission webhook when a permission is granted to a use
const { userId } = await Auth.Otp.signIn();
await niceBackendFetch(`/api/v1/user-permission-definitions`, {
await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "POST",
body: { id: 'test_permission' },
});
const grantPermissionResponse = await niceBackendFetch(`/api/v1/user-permissions/${userId}/test_permission`, {
const grantPermissionResponse = await niceBackendFetch(`/api/v1/project-permissions/${userId}/test_permission`, {
accessType: "server",
method: "POST",
body: {},
@ -270,14 +270,14 @@ it("should trigger user permission webhook when a permission is revoked from a u
const { userId } = await Auth.Otp.signIn();
await niceBackendFetch(`/api/v1/user-permission-definitions`, {
await niceBackendFetch(`/api/v1/project-permission-definitions`, {
accessType: "admin",
method: "POST",
body: { id: 'test_permission' },
});
// First grant the permission
const grantPermissionResponse = await niceBackendFetch(`/api/v1/user-permissions/${userId}/test_permission`, {
const grantPermissionResponse = await niceBackendFetch(`/api/v1/project-permissions/${userId}/test_permission`, {
accessType: "server",
method: "POST",
body: {},
@ -286,7 +286,7 @@ it("should trigger user permission webhook when a permission is revoked from a u
expect(grantPermissionResponse.status).toBe(201);
// Then revoke the permission
const revokePermissionResponse = await niceBackendFetch(`/api/v1/user-permissions/${userId}/test_permission`, {
const revokePermissionResponse = await niceBackendFetch(`/api/v1/project-permissions/${userId}/test_permission`, {
accessType: "server",
method: "DELETE",
});

View File

@ -2,10 +2,10 @@ import { InternalSession } from "../sessions";
import { ApiKeysCrud } from "./crud/api-keys";
import { EmailTemplateCrud, EmailTemplateType } from "./crud/email-templates";
import { InternalEmailsCrud } from "./crud/emails";
import { ProjectPermissionDefinitionsCrud } from "./crud/project-permissions";
import { ProjectsCrud } from "./crud/projects";
import { SvixTokenCrud } from "./crud/svix-token";
import { TeamPermissionDefinitionsCrud } from "./crud/team-permissions";
import { UserPermissionDefinitionsCrud } from "./crud/user-permissions";
import { ServerAuthApplicationOptions, StackServerInterface } from "./serverInterface";
export type AdminAuthApplicationOptions = ServerAuthApplicationOptions &(
@ -194,15 +194,15 @@ export class StackAdminInterface extends StackServerInterface {
);
}
async listUserPermissionDefinitions(): Promise<UserPermissionDefinitionsCrud['Admin']['Read'][]> {
const response = await this.sendAdminRequest(`/user-permission-definitions`, {}, null);
const result = await response.json() as UserPermissionDefinitionsCrud['Admin']['List'];
async listProjectPermissionDefinitions(): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read'][]> {
const response = await this.sendAdminRequest(`/project-permission-definitions`, {}, null);
const result = await response.json() as ProjectPermissionDefinitionsCrud['Admin']['List'];
return result.items;
}
async createUserPermissionDefinition(data: UserPermissionDefinitionsCrud['Admin']['Create']): Promise<UserPermissionDefinitionsCrud['Admin']['Read']> {
async createProjectPermissionDefinition(data: ProjectPermissionDefinitionsCrud['Admin']['Create']): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read']> {
const response = await this.sendAdminRequest(
"/user-permission-definitions",
"/project-permission-definitions",
{
method: "POST",
headers: {
@ -215,9 +215,9 @@ export class StackAdminInterface extends StackServerInterface {
return await response.json();
}
async updateUserPermissionDefinition(permissionId: string, data: UserPermissionDefinitionsCrud['Admin']['Update']): Promise<UserPermissionDefinitionsCrud['Admin']['Read']> {
async updateProjectPermissionDefinition(permissionId: string, data: ProjectPermissionDefinitionsCrud['Admin']['Update']): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read']> {
const response = await this.sendAdminRequest(
`/user-permission-definitions/${permissionId}`,
`/project-permission-definitions/${permissionId}`,
{
method: "PATCH",
headers: {
@ -230,9 +230,9 @@ export class StackAdminInterface extends StackServerInterface {
return await response.json();
}
async deleteUserPermissionDefinition(permissionId: string): Promise<void> {
async deleteProjectPermissionDefinition(permissionId: string): Promise<void> {
await this.sendAdminRequest(
`/user-permission-definitions/${permissionId}`,
`/project-permission-definitions/${permissionId}`,
{ method: "DELETE" },
null,
);

View File

@ -0,0 +1,118 @@
import { CrudTypeOf, createCrud } from "../../crud";
import * as schemaFields from "../../schema-fields";
import { yupMixed, yupObject } from "../../schema-fields";
import { WebhookEvent } from "../webhooks";
// =============== Project permissions =================
export const projectPermissionsCrudClientReadSchema = yupObject({
id: schemaFields.teamPermissionDefinitionIdSchema.defined(),
user_id: schemaFields.userIdSchema.defined(),
}).defined();
export const projectPermissionsCrudServerCreateSchema = yupObject({
}).defined();
export const projectPermissionsCrudServerDeleteSchema = yupMixed();
export const projectPermissionsCrud = createCrud({
clientReadSchema: projectPermissionsCrudClientReadSchema,
serverCreateSchema: projectPermissionsCrudServerCreateSchema,
serverDeleteSchema: projectPermissionsCrudServerDeleteSchema,
docs: {
clientList: {
summary: "List project permissions",
description: "List global permissions of the current user. `user_id=me` must be set for client requests. `(user_id, permission_id)` together uniquely identify a permission.",
tags: ["Permissions"],
},
serverList: {
summary: "List project permissions",
description: "Query and filter the permission with `user_id` and `permission_id`. `(user_id, permission_id)` together uniquely identify a permission.",
tags: ["Permissions"],
},
serverCreate: {
summary: "Grant a global permission to a user",
description: "Grant a global permission to a user (the permission must be created first on the Stack dashboard)",
tags: ["Permissions"],
},
serverDelete: {
summary: "Revoke a global permission from a user",
description: "Revoke a global permission from a user",
tags: ["Permissions"],
},
},
});
export type ProjectPermissionsCrud = CrudTypeOf<typeof projectPermissionsCrud>;
export const projectPermissionCreatedWebhookEvent = {
type: "project_permission.created",
schema: projectPermissionsCrud.server.readSchema,
metadata: {
summary: "Project Permission Created",
description: "This event is triggered when a project permission is created.",
tags: ["Users"],
},
} satisfies WebhookEvent<typeof projectPermissionsCrud.server.readSchema>;
export const projectPermissionDeletedWebhookEvent = {
type: "project_permission.deleted",
schema: projectPermissionsCrud.server.readSchema,
metadata: {
summary: "Project Permission Deleted",
description: "This event is triggered when a project permission is deleted.",
tags: ["Users"],
},
} satisfies WebhookEvent<typeof projectPermissionsCrud.server.readSchema>;
// =============== Project permission definitions =================
export const projectPermissionDefinitionsCrudAdminReadSchema = yupObject({
id: schemaFields.teamPermissionDefinitionIdSchema.defined(),
description: schemaFields.teamPermissionDescriptionSchema.optional(),
contained_permission_ids: schemaFields.containedPermissionIdsSchema.defined(),
}).defined();
export const projectPermissionDefinitionsCrudAdminCreateSchema = yupObject({
id: schemaFields.customTeamPermissionDefinitionIdSchema.defined(),
description: schemaFields.teamPermissionDescriptionSchema.optional(),
contained_permission_ids: schemaFields.containedPermissionIdsSchema.optional(),
}).defined();
export const projectPermissionDefinitionsCrudAdminUpdateSchema = yupObject({
id: schemaFields.customTeamPermissionDefinitionIdSchema.optional(),
description: schemaFields.teamPermissionDescriptionSchema.optional(),
contained_permission_ids: schemaFields.containedPermissionIdsSchema.optional(),
}).defined();
export const projectPermissionDefinitionsCrudAdminDeleteSchema = yupMixed();
export const projectPermissionDefinitionsCrud = createCrud({
adminReadSchema: projectPermissionDefinitionsCrudAdminReadSchema,
adminCreateSchema: projectPermissionDefinitionsCrudAdminCreateSchema,
adminUpdateSchema: projectPermissionDefinitionsCrudAdminUpdateSchema,
adminDeleteSchema: projectPermissionDefinitionsCrudAdminDeleteSchema,
docs: {
adminList: {
summary: "List project permission definitions",
description: "Query and filter project permission definitions (the equivalent of listing permissions on the Stack dashboard)",
tags: ["Permissions"],
},
adminCreate: {
summary: "Create a new project permission definition",
description: "Create a new project permission definition (the equivalent of creating a new permission on the Stack dashboard)",
tags: ["Permissions"],
},
adminUpdate: {
summary: "Update a project permission definition",
description: "Update a project permission definition (the equivalent of updating a permission on the Stack dashboard)",
tags: ["Permissions"],
},
adminDelete: {
summary: "Delete a project permission definition",
description: "Delete a project permission definition (the equivalent of deleting a permission on the Stack dashboard)",
tags: ["Permissions"],
},
},
});
export type ProjectPermissionDefinitionsCrud = CrudTypeOf<typeof projectPermissionDefinitionsCrud>;

View File

@ -1,118 +0,0 @@
import { CrudTypeOf, createCrud } from "../../crud";
import * as schemaFields from "../../schema-fields";
import { yupMixed, yupObject } from "../../schema-fields";
import { WebhookEvent } from "../webhooks";
// =============== User permissions =================
export const userPermissionsCrudClientReadSchema = yupObject({
id: schemaFields.teamPermissionDefinitionIdSchema.defined(),
user_id: schemaFields.userIdSchema.defined(),
}).defined();
export const userPermissionsCrudServerCreateSchema = yupObject({
}).defined();
export const userPermissionsCrudServerDeleteSchema = yupMixed();
export const userPermissionsCrud = createCrud({
clientReadSchema: userPermissionsCrudClientReadSchema,
serverCreateSchema: userPermissionsCrudServerCreateSchema,
serverDeleteSchema: userPermissionsCrudServerDeleteSchema,
docs: {
clientList: {
summary: "List user permissions",
description: "List global permissions of the current user. `user_id=me` must be set for client requests. `(user_id, permission_id)` together uniquely identify a permission.",
tags: ["Permissions"],
},
serverList: {
summary: "List user permissions",
description: "Query and filter the permission with `user_id` and `permission_id`. `(user_id, permission_id)` together uniquely identify a permission.",
tags: ["Permissions"],
},
serverCreate: {
summary: "Grant a global permission to a user",
description: "Grant a global permission to a user (the permission must be created first on the Stack dashboard)",
tags: ["Permissions"],
},
serverDelete: {
summary: "Revoke a global permission from a user",
description: "Revoke a global permission from a user",
tags: ["Permissions"],
},
},
});
export type UserPermissionsCrud = CrudTypeOf<typeof userPermissionsCrud>;
export const userPermissionCreatedWebhookEvent = {
type: "user_permission.created",
schema: userPermissionsCrud.server.readSchema,
metadata: {
summary: "User Permission Created",
description: "This event is triggered when a user permission is created.",
tags: ["Users"],
},
} satisfies WebhookEvent<typeof userPermissionsCrud.server.readSchema>;
export const userPermissionDeletedWebhookEvent = {
type: "user_permission.deleted",
schema: userPermissionsCrud.server.readSchema,
metadata: {
summary: "User Permission Deleted",
description: "This event is triggered when a user permission is deleted.",
tags: ["Users"],
},
} satisfies WebhookEvent<typeof userPermissionsCrud.server.readSchema>;
// =============== User permission definitions =================
export const userPermissionDefinitionsCrudAdminReadSchema = yupObject({
id: schemaFields.teamPermissionDefinitionIdSchema.defined(),
description: schemaFields.teamPermissionDescriptionSchema.optional(),
contained_permission_ids: schemaFields.containedPermissionIdsSchema.defined(),
}).defined();
export const userPermissionDefinitionsCrudAdminCreateSchema = yupObject({
id: schemaFields.customTeamPermissionDefinitionIdSchema.defined(),
description: schemaFields.teamPermissionDescriptionSchema.optional(),
contained_permission_ids: schemaFields.containedPermissionIdsSchema.optional(),
}).defined();
export const userPermissionDefinitionsCrudAdminUpdateSchema = yupObject({
id: schemaFields.customTeamPermissionDefinitionIdSchema.optional(),
description: schemaFields.teamPermissionDescriptionSchema.optional(),
contained_permission_ids: schemaFields.containedPermissionIdsSchema.optional(),
}).defined();
export const userPermissionDefinitionsCrudAdminDeleteSchema = yupMixed();
export const userPermissionDefinitionsCrud = createCrud({
adminReadSchema: userPermissionDefinitionsCrudAdminReadSchema,
adminCreateSchema: userPermissionDefinitionsCrudAdminCreateSchema,
adminUpdateSchema: userPermissionDefinitionsCrudAdminUpdateSchema,
adminDeleteSchema: userPermissionDefinitionsCrudAdminDeleteSchema,
docs: {
adminList: {
summary: "List user permission definitions",
description: "Query and filter user permission definitions (the equivalent of listing permissions on the Stack dashboard)",
tags: ["Permissions"],
},
adminCreate: {
summary: "Create a new user permission definition",
description: "Create a new user permission definition (the equivalent of creating a new permission on the Stack dashboard)",
tags: ["Permissions"],
},
adminUpdate: {
summary: "Update a user permission definition",
description: "Update a user permission definition (the equivalent of updating a permission on the Stack dashboard)",
tags: ["Permissions"],
},
adminDelete: {
summary: "Delete a user permission definition",
description: "Delete a user permission definition (the equivalent of deleting a permission on the Stack dashboard)",
tags: ["Permissions"],
},
},
});
export type UserPermissionDefinitionsCrud = CrudTypeOf<typeof userPermissionDefinitionsCrud>;