NobGit
public anord read

Ledger

Why work hard when you can work easier?

Languages

Repository composition by tracked source files.

TypeScript
TypeScript 86% CSS 10% SQL 3% Shell 1% HTML 0%
Create file Wiki Documentation
Clone
https://nobgit.com/orgs/anord/ledger.git
ssh://[email protected]:2222/orgs/anord/ledger.git
auth.ts
import bcrypt from "bcryptjs";
import jwt from "jsonwebtoken";
import type { SessionUser } from "@ledger/shared";
import { env } from "../config/env.js";
import { pool } from "../db/pool.js";

export async function hashPassword(password: string): Promise<string> {
  return bcrypt.hash(`${password}${env.PASSWORD_PEPPER}`, 12);
}

export async function verifyPassword(password: string, hash: string): Promise<boolean> {
  return bcrypt.compare(`${password}${env.PASSWORD_PEPPER}`, hash);
}

export function createSessionToken(user: SessionUser): string {
  return jwt.sign(user, env.JWT_SECRET, { expiresIn: "7d" });
}

export function verifySessionToken(token: string): SessionUser {
  return jwt.verify(token, env.JWT_SECRET) as SessionUser;
}

export async function getUserForSession(userId: string): Promise<SessionUser | null> {
  const result = await pool.query(
    `
      SELECT
        u.id,
        u.email,
        u.display_name,
        r.key AS role_key,
        COALESCE(array_agg(gm.group_id) FILTER (WHERE gm.group_id IS NOT NULL), '{}') AS group_ids
      FROM users u
      JOIN roles r ON r.id = u.primary_role_id
      LEFT JOIN group_memberships gm ON gm.user_id = u.id
      WHERE u.id = $1 AND u.is_active = true
      GROUP BY u.id, r.key
    `,
    [userId]
  );

  if (!result.rowCount) {
    return null;
  }

  const row = result.rows[0];
  return {
    id: row.id,
    email: row.email,
    displayName: row.display_name,
    role: row.role_key,
    groupIds: row.group_ids
  };
}