jasonraimondi/typescript-oauth2-server

View on GitHub
example/src/repositories/auth_code_repository.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { PrismaClient } from "@prisma/client";
import { DateInterval, generateRandomToken, OAuthAuthCode, OAuthAuthCodeRepository } from "@jmondi/oauth2-server";

import { AuthCode } from "../entities/auth_code.js";
import { Client } from "../entities/client.js";
import { Scope } from "../entities/scope.js";
import { User } from "../entities/user.js";

export class AuthCodeRepository implements OAuthAuthCodeRepository {
  constructor(private readonly prisma: PrismaClient) {}

  async getByIdentifier(authCodeCode: string): Promise<AuthCode> {
    const entity = await this.prisma.oAuthAuthCode.findUnique({
      rejectOnNotFound: true,
      where: {
        code: authCodeCode,
      },
      include: {
        client: true,
      },
    });
    return new AuthCode(entity);
  }

  async isRevoked(authCodeCode: string): Promise<boolean> {
    const authCode = await this.getByIdentifier(authCodeCode);
    return authCode.isExpired;
  }

  issueAuthCode(client: Client, user: User | undefined, scopes: Scope[]): OAuthAuthCode {
    return new AuthCode({
      redirectUri: null,
      code: generateRandomToken(),
      codeChallenge: null,
      codeChallengeMethod: "S256",
      expiresAt: new DateInterval("15m").getEndDate(),
      client,
      clientId: client.id,
      user,
      userId: user?.id ?? null,
      scopes,
    });
  }

  async persist({ user, client, scopes, ...authCode }: AuthCode): Promise<void> {
    await this.prisma.oAuthAuthCode.create({ data: authCode });
  }

  async revoke(authCodeCode: string): Promise<void> {
    await this.prisma.oAuthAuthCode.update({
      where: { code: authCodeCode },
      data: {
        expiresAt: new Date(0),
      },
    });
  }
}