You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
vore-rpg/src/database/users.ts

47 lines
1.5 KiB

import {QueryType} from "./index.js"
export interface UsersTable {
createUserOrUpdateActiveTime(id: string): Promise<void>
getUserExistsAndIsAdmin(id: string): Promise<boolean>
createOrSetUserAsAdmin(id: string): Promise<void>
}
export class UsersTableImpl implements UsersTable {
private readonly _query: QueryType
constructor({query}: { query: QueryType }) {
this._query = query
}
async createUserOrUpdateActiveTime(id: string): Promise<void> {
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<boolean> {
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<void> {
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])
}
}