import { CanActivate, ExecutionContext, Injectable } from "@nestjs/common"; import { Request } from "express"; import { ApiKeyService } from "./api-key.service"; export type ApiKeyRequest = Request & { apiKeyAuth?: { userId: string; keyId: string; scopes: string[] }; }; @Injectable() export class ApiKeyGuard implements CanActivate { constructor(private readonly apiKeyService: ApiKeyService) {} async canActivate(context: ExecutionContext): Promise { const request = context.switchToHttp().getRequest(); const rawKey = request.header("x-ledgerone-api-key") ?? request.header("x-api-key"); if (!rawKey) { await this.apiKeyService.authenticate(""); return false; } request.apiKeyAuth = await this.apiKeyService.authenticate(rawKey); return true; } }