import {QueryType} from "./index.js" export interface UserTable { createUserOrUpdateActiveTime(id: string): Promise getUserExistsAndIsAdmin(id: string): Promise createOrSetUserAsAdmin(id: string): Promise } export class UserTableImpl implements UserTable { private readonly _query: QueryType constructor({query}: { query: QueryType }) { this._query = query } async createUserOrUpdateActiveTime(id: string): Promise { await this._query<{ id: string }, [string]>( `INSERT INTO users (id, is_admin, created_at, updated_at, active_at) VALUES ($1, FALSE, now(), now(), now()) ON CONFLICT (id) DO UPDATE SET active_at = now() RETURNING id;`, [id]) } async getUserExistsAndIsAdmin(id: string): Promise { const result = await this._query<{ is_admin: boolean }, [string]>( `UPDATE users SET active_at = NOW() WHERE id = $1 RETURNING is_admin;`, [id]) if (result.rowCount === 0) { return false } return result.rows[0].is_admin } async createOrSetUserAsAdmin(id: string): Promise { await this._query<{}, [string]>( `INSERT INTO users (id, is_admin, created_at, updated_at) VALUES ($1, TRUE, now(), now()) ON CONFLICT (id) DO UPDATE SET is_admin = TRUE, updated_at = NOW() WHERE users.is_admin = FALSE;`, [id]) } }