import jwt from 'jsonwebtoken';
import { Container } from 'typedi';
import { v4 as uuidv4 } from 'uuid';
import { Config } from '../config';
import { JWTPayload } from '../types';<% if (auth) { %>

/**
 * Returns the secret used to sign a JWT token.
 */
export const getJwtSecret = (passwordHash: string): string => {
  const config = Container.get<Config>('config');

  return config.jwt.secret + passwordHash;
};

/**
 * Generates and returns a signed JWT.
 */
export const generateSignedJWT = (
  userId: string,
  passwordHash: string,
  payload: JWTPayload,
): string => {
  const config = Container.get<Config>('config');

  const secret = getJwtSecret(passwordHash);

  return jwt.sign(payload, secret, {
    algorithm: 'HS256',
    issuer: config.publicHost,
    subject: userId,
    jwtid: uuidv4(),
  });
};<% } else { %>

/**
 * Generates and returns a signed JWT.
 */
export const generateSignedJWT = (userId: string, payload: JWTPayload): string => {
  const config = Container.get<Config>('config');

  return jwt.sign(payload, config.jwt.secret, {
    algorithm: 'HS256',
    issuer: config.publicHost,
    subject: userId,
    jwtid: uuidv4(),
  });
};<% } %>
