UNPKG

alepha

Version:

Easy-to-use modern TypeScript framework for building many kind of applications.

117 lines (111 loc) 3.41 kB
import { $inject, z } from "alepha"; import { $secure, SecurityProvider } from "alepha/security"; import { $action, okSchema } from "alepha/server"; import { sessionQuerySchema } from "../schemas/sessionQuerySchema.ts"; import { sessionResourceSchema } from "../schemas/sessionResourceSchema.ts"; import { SessionCrudService } from "../services/SessionCrudService.ts"; export class AdminSessionController { protected readonly url = "/sessions"; protected readonly group = "admin:sessions"; protected readonly sessionService = $inject(SessionCrudService); protected readonly securityProvider = $inject(SecurityProvider); /** * Find sessions with pagination and filtering. */ public readonly findSessions = $action({ path: this.url, group: this.group, use: [$secure({ permissions: ["admin:session:read"] })], description: "Find sessions with pagination and filtering", schema: { query: sessionQuerySchema.extend({ userRealmName: z.string().optional(), }), response: z.page(sessionResourceSchema), }, handler: ({ query, user }) => { const { userRealmName, ...q } = query; return this.sessionService.findSessions( q, this.securityProvider.assertRealmScope(user, userRealmName), ); }, }); /** * Get a session by ID. */ public readonly getSession = $action({ path: `${this.url}/:id`, group: this.group, use: [$secure({ permissions: ["admin:session:read"] })], description: "Get a session by ID", schema: { params: z.object({ id: z.uuid(), }), query: z.object({ userRealmName: z.string().optional(), }), response: sessionResourceSchema, }, handler: ({ params, query, user }) => this.sessionService.getSessionById( params.id, this.securityProvider.assertRealmScope(user, query.userRealmName), ), }); /** * Delete a session. */ public readonly deleteSession = $action({ method: "DELETE", path: `${this.url}/:id`, group: this.group, use: [$secure({ permissions: ["admin:session:delete"] })], description: "Delete a session", schema: { params: z.object({ id: z.uuid(), }), query: z.object({ userRealmName: z.string().optional(), }), response: okSchema, }, handler: async ({ params, query, user }) => { await this.sessionService.deleteSession( params.id, this.securityProvider.assertRealmScope(user, query.userRealmName), ); return { ok: true, id: params.id }; }, }); /** * Delete many sessions in one repository call. */ public readonly deleteSessions = $action({ method: "POST", path: `${this.url}/delete`, group: this.group, use: [$secure({ permissions: ["admin:session:delete"] })], description: "Delete many sessions", schema: { query: z.object({ userRealmName: z.string().optional(), }), body: z.object({ ids: z.array(z.uuid()).min(1).max(1000), }), response: z.object({ deleted: z.array(z.string()), }), }, handler: async ({ body, query, user }) => { const deleted = await this.sessionService.deleteSessions( body.ids, this.securityProvider.assertRealmScope(user, query.userRealmName), ); return { deleted }; }, }); }