diff --git a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts index ce90419b2..2efdcf076 100644 --- a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts +++ b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts @@ -871,51 +871,66 @@ export class _StackClientAppImplIncomplete { - const recursive = options?.recursive ?? true; - const permissions = Result.orThrow(await app._currentUserPermissionsCache.getOrWait([session, scope.id, recursive], "write-only")); - return permissions.map((crud) => app._clientTeamPermissionFromCrud(crud)); - }, - async listProjectPermissions(options?: { recursive?: boolean }): Promise { - const recursive = options?.recursive ?? true; - const permissions = Result.orThrow(await app._currentUserProjectPermissionsCache.getOrWait([session, recursive], "write-only")); - return permissions.map((crud) => app._clientTeamPermissionFromCrud(crud)); + async listPermissions(scopeOrOptions?: Team | { recursive?: boolean }, options?: { recursive?: boolean }): Promise { + if (scopeOrOptions && 'id' in scopeOrOptions) { + const scope = scopeOrOptions; + const recursive = options?.recursive ?? true; + const permissions = Result.orThrow(await app._currentUserPermissionsCache.getOrWait([session, scope.id, recursive], "write-only")); + return permissions.map((crud) => app._clientTeamPermissionFromCrud(crud)); + } else { + const opts = scopeOrOptions; + const recursive = opts?.recursive ?? true; + const permissions = Result.orThrow(await app._currentUserProjectPermissionsCache.getOrWait([session, recursive], "write-only")); + return permissions.map((crud) => app._clientTeamPermissionFromCrud(crud)); + } }, // IF_PLATFORM react-like - usePermissions(scope: Team, options?: { recursive?: boolean }): TeamPermission[] { - const recursive = options?.recursive ?? true; - const permissions = useAsyncCache(app._currentUserPermissionsCache, [session, scope.id, recursive] as const, "user.usePermissions()"); - return useMemo(() => permissions.map((crud) => app._clientTeamPermissionFromCrud(crud)), [permissions]); - }, - useProjectPermissions(options?: { recursive?: boolean }): TeamPermission[] { - const recursive = options?.recursive ?? true; - const permissions = useAsyncCache(app._currentUserProjectPermissionsCache, [session, recursive] as const, "user.useProjectPermissions()"); - return useMemo(() => permissions.map((crud) => app._clientTeamPermissionFromCrud(crud)), [permissions]); + usePermissions(scopeOrOptions?: Team | { recursive?: boolean }, options?: { recursive?: boolean }): TeamPermission[] { + if (scopeOrOptions && 'id' in scopeOrOptions) { + const scope = scopeOrOptions; + const recursive = options?.recursive ?? true; + const permissions = useAsyncCache(app._currentUserPermissionsCache, [session, scope.id, recursive] as const, "user.usePermissions()"); + return useMemo(() => permissions.map((crud) => app._clientTeamPermissionFromCrud(crud)), [permissions]); + } else { + const opts = scopeOrOptions; + const recursive = opts?.recursive ?? true; + const permissions = useAsyncCache(app._currentUserProjectPermissionsCache, [session, recursive] as const, "user.usePermissions()"); + return useMemo(() => permissions.map((crud) => app._clientTeamPermissionFromCrud(crud)), [permissions]); + } }, // END_PLATFORM // IF_PLATFORM react-like - usePermission(scope: Team, permissionId: string): TeamPermission | null { - const permissions = this.usePermissions(scope); - return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]); - }, - useProjectPermission(permissionId: string): TeamPermission | null { - const permissions = this.useProjectPermissions(); - return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]); + usePermission(scopeOrPermissionId: Team | string, permissionId?: string): TeamPermission | null { + if (scopeOrPermissionId && typeof scopeOrPermissionId !== 'string') { + const scope = scopeOrPermissionId; + const permissions = this.usePermissions(scope); + return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]); + } else { + const pid = scopeOrPermissionId; + const permissions = this.usePermissions(); + return useMemo(() => permissions.find((p) => p.id === pid) ?? null, [permissions, pid]); + } }, // END_PLATFORM - async getPermission(scope: Team, permissionId: string): Promise { - const permissions = await this.listPermissions(scope); - return permissions.find((p) => p.id === permissionId) ?? null; + async getPermission(scopeOrPermissionId: Team | string, permissionId?: string): Promise { + if (scopeOrPermissionId && typeof scopeOrPermissionId !== 'string') { + const scope = scopeOrPermissionId; + const permissions = await this.listPermissions(scope); + return permissions.find((p) => p.id === permissionId) ?? null; + } else { + const pid = scopeOrPermissionId; + const permissions = await this.listPermissions(); + return permissions.find((p) => p.id === pid) ?? null; + } }, - async hasPermission(scope: Team, permissionId: string): Promise { - return (await this.getPermission(scope, permissionId)) !== null; - }, - async getProjectPermission(permissionId: string): Promise { - const permissions = await this.listProjectPermissions(); - return permissions.find((p) => p.id === permissionId) ?? null; - }, - async hasProjectPermission(permissionId: string): Promise { - return (await this.getProjectPermission(permissionId)) !== null; + async hasPermission(scopeOrPermissionId: Team | string, permissionId?: string): Promise { + if (scopeOrPermissionId && typeof scopeOrPermissionId !== 'string') { + const scope = scopeOrPermissionId; + return (await this.getPermission(scope, permissionId as string)) !== null; + } else { + const pid = scopeOrPermissionId; + return (await this.getPermission(pid)) !== null; + } }, async update(update) { return await app._updateClientUser(update, session); diff --git a/packages/template/src/lib/stack-app/apps/implementations/server-app-impl.ts b/packages/template/src/lib/stack-app/apps/implementations/server-app-impl.ts index 224828134..2f02acf9b 100644 --- a/packages/template/src/lib/stack-app/apps/implementations/server-app-impl.ts +++ b/packages/template/src/lib/stack-app/apps/implementations/server-app-impl.ts @@ -322,55 +322,66 @@ export class _StackServerAppImplIncomplete { - const recursive = options?.recursive ?? true; - const permissions = Result.orThrow(await app._serverTeamUserPermissionsCache.getOrWait([scope.id, crud.id, recursive], "write-only")); - return permissions.map((crud) => app._serverPermissionFromCrud(crud)); + async listPermissions(scopeOrOptions?: Team | { recursive?: boolean }, options?: { recursive?: boolean }): Promise { + if (scopeOrOptions && 'id' in scopeOrOptions) { + const scope = scopeOrOptions; + const recursive = options?.recursive ?? true; + const permissions = Result.orThrow(await app._serverTeamUserPermissionsCache.getOrWait([scope.id, crud.id, recursive], "write-only")); + return permissions.map((crud) => app._serverPermissionFromCrud(crud)); + } else { + const opts = scopeOrOptions; + const recursive = opts?.recursive ?? true; + const permissions = Result.orThrow(await app._serverUserProjectPermissionsCache.getOrWait([crud.id, recursive], "write-only")); + return permissions.map((crud) => app._serverPermissionFromCrud(crud)); + } }, // IF_PLATFORM react-like - usePermissions(scope: Team, options?: { recursive?: boolean }): AdminTeamPermission[] { - const recursive = options?.recursive ?? true; - const permissions = useAsyncCache(app._serverTeamUserPermissionsCache, [scope.id, crud.id, recursive] as const, "user.usePermissions()"); - return useMemo(() => permissions.map((crud) => app._serverPermissionFromCrud(crud)), [permissions]); + usePermissions(scopeOrOptions?: Team | { recursive?: boolean }, options?: { recursive?: boolean }): AdminTeamPermission[] { + if (scopeOrOptions && 'id' in scopeOrOptions) { + const scope = scopeOrOptions; + const recursive = options?.recursive ?? true; + const permissions = useAsyncCache(app._serverTeamUserPermissionsCache, [scope.id, crud.id, recursive] as const, "user.usePermissions()"); + return useMemo(() => permissions.map((crud) => app._serverPermissionFromCrud(crud)), [permissions]); + } else { + const opts = scopeOrOptions; + const recursive = opts?.recursive ?? true; + const permissions = useAsyncCache(app._serverUserProjectPermissionsCache, [crud.id, recursive] as const, "user.usePermissions()"); + return useMemo(() => permissions.map((crud) => app._serverPermissionFromCrud(crud)), [permissions]); + } }, // END_PLATFORM - async getPermission(scope: Team, permissionId: string): Promise { - const permissions = await this.listPermissions(scope); - return permissions.find((p) => p.id === permissionId) ?? null; + async getPermission(scopeOrPermissionId: Team | string, permissionId?: string): Promise { + if (scopeOrPermissionId && typeof scopeOrPermissionId !== 'string') { + const scope = scopeOrPermissionId; + const permissions = await this.listPermissions(scope); + return permissions.find((p) => p.id === permissionId) ?? null; + } else { + const pid = scopeOrPermissionId; + const permissions = await this.listPermissions(); + return permissions.find((p) => p.id === pid) ?? null; + } }, // IF_PLATFORM react-like - usePermission(scope: Team, permissionId: string): AdminTeamPermission | null { - const permissions = this.usePermissions(scope); - return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]); + usePermission(scopeOrPermissionId: Team | string, permissionId?: string): AdminTeamPermission | null { + if (scopeOrPermissionId && typeof scopeOrPermissionId !== 'string') { + const scope = scopeOrPermissionId; + const permissions = this.usePermissions(scope); + return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]); + } else { + const pid = scopeOrPermissionId; + const permissions = this.usePermissions(); + return useMemo(() => permissions.find((p) => p.id === pid) ?? null, [permissions, pid]); + } }, // END_PLATFORM - async hasPermission(scope: Team, permissionId: string): Promise { - return await this.getPermission(scope, permissionId) !== null; - }, - async listProjectPermissions(options?: { recursive?: boolean }): Promise { - const recursive = options?.recursive ?? true; - const permissions = Result.orThrow(await app._serverUserProjectPermissionsCache.getOrWait([crud.id, recursive], "write-only")); - return permissions.map((crud) => app._serverPermissionFromCrud(crud)); - }, - // IF_PLATFORM react-like - useProjectPermissions(options?: { recursive?: boolean }): AdminTeamPermission[] { - const recursive = options?.recursive ?? true; - const permissions = useAsyncCache(app._serverUserProjectPermissionsCache, [crud.id, recursive] as const, "user.useProjectPermissions()"); - return useMemo(() => permissions.map((crud) => app._serverPermissionFromCrud(crud)), [permissions]); - }, - // END_PLATFORM - async getProjectPermission(permissionId: string): Promise { - const permissions = await this.listProjectPermissions(); - return permissions.find((p) => p.id === permissionId) ?? null; - }, - // IF_PLATFORM react-like - useProjectPermission(permissionId: string): AdminTeamPermission | null { - const permissions = this.useProjectPermissions(); - return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]); - }, - // END_PLATFORM - async hasProjectPermission(permissionId: string): Promise { - return await this.getProjectPermission(permissionId) !== null; + async hasPermission(scopeOrPermissionId: Team | string, permissionId?: string): Promise { + if (scopeOrPermissionId && typeof scopeOrPermissionId !== 'string') { + const scope = scopeOrPermissionId; + return (await this.getPermission(scope, permissionId as string)) !== null; + } else { + const pid = scopeOrPermissionId; + return (await this.getPermission(pid)) !== null; + } }, async update(update: ServerUserUpdateOptions) { await app._updateServerUser(crud.id, update); diff --git a/packages/template/src/lib/stack-app/users/index.ts b/packages/template/src/lib/stack-app/users/index.ts index a32613401..f50bf7030 100644 --- a/packages/template/src/lib/stack-app/users/index.ts +++ b/packages/template/src/lib/stack-app/users/index.ts @@ -187,12 +187,20 @@ export type UserExtra = { // END_PLATFORM hasPermission(scope: Team, permissionId: string): Promise, - getProjectPermission(permissionId: string): Promise, - hasProjectPermission(permissionId: string): Promise, - listProjectPermissions(options?: { recursive?: boolean }): Promise, + hasPermission(permissionId: string): Promise, + + getPermission(scope: Team, permissionId: string): Promise, + getPermission(permissionId: string): Promise, + + listPermissions(scope: Team, options?: { recursive?: boolean }): Promise, + listPermissions(options?: { recursive?: boolean }): Promise, + // IF_PLATFORM react-like - useProjectPermissions(options?: { recursive?: boolean }): TeamPermission[], - useProjectPermission(permissionId: string): TeamPermission | null, + usePermissions(scope: Team, options?: { recursive?: boolean }): TeamPermission[], + usePermissions(options?: { recursive?: boolean }): TeamPermission[], + + usePermission(scope: Team, permissionId: string): TeamPermission | null, + usePermission(permissionId: string): TeamPermission | null, // END_PLATFORM readonly selectedTeam: Team | null, @@ -277,12 +285,21 @@ export type ServerBaseUser = { grantPermission(scope: Team, permissionId: string): Promise, revokePermission(scope: Team, permissionId: string): Promise, - getProjectPermission(permissionId: string): Promise, - hasProjectPermission(permissionId: string): Promise, - listProjectPermissions(options?: { recursive?: boolean }): Promise, + getPermission(scope: Team, permissionId: string): Promise, + getPermission(permissionId: string): Promise, + + hasPermission(scope: Team, permissionId: string): Promise, + hasPermission(permissionId: string): Promise, + + listPermissions(scope: Team, options?: { recursive?: boolean }): Promise, + listPermissions(options?: { recursive?: boolean }): Promise, + // IF_PLATFORM react-like - useProjectPermissions(options?: { recursive?: boolean }): TeamPermission[], - useProjectPermission(permissionId: string): TeamPermission | null, + usePermissions(scope: Team, options?: { recursive?: boolean }): TeamPermission[], + usePermissions(options?: { recursive?: boolean }): TeamPermission[], + + usePermission(scope: Team, permissionId: string): TeamPermission | null, + usePermission(permissionId: string): TeamPermission | null, // END_PLATFORM /**