added blocked database
This commit is contained in:
parent
91afd0ebde
commit
cd40a04e40
3 changed files with 72 additions and 1 deletions
|
|
@ -4,11 +4,13 @@ import { FastifyInstance, FastifyPluginAsync } from 'fastify';
|
|||
import { isNullish } from '@shared/utils';
|
||||
import { Database as DbImpl } from './mixin/_base';
|
||||
import { IUserDb, UserImpl } from './mixin/user';
|
||||
import { IBlockedDb, BlockedImpl } from './mixin/blocked';
|
||||
|
||||
|
||||
Object.assign(DbImpl.prototype, UserImpl);
|
||||
Object.assign(DbImpl.prototype, BlockedImpl);
|
||||
|
||||
export interface Database extends DbImpl, IUserDb { }
|
||||
export interface Database extends DbImpl, IUserDb, IBlockedDb { }
|
||||
|
||||
// When using .decorate you have to specify added properties for Typescript
|
||||
declare module 'fastify' {
|
||||
|
|
|
|||
|
|
@ -7,3 +7,17 @@ CREATE TABLE IF NOT EXISTS user (
|
|||
guest INTEGER NOT NULL DEFAULT 0,
|
||||
oauth2 TEXT DEFAULT NULL
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS blocked (
|
||||
id INTEGER PRIMARY KEY NOT NULL,
|
||||
user TEXT NOT NULL,
|
||||
blocked TEXT NOT NULL,
|
||||
|
||||
FOREIGN KEY(user) REFERENCES user(id);
|
||||
FOREIGN KEY(blocked) REFERENCES user(id);
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_blocked_user_pair
|
||||
ON blocked(user, blocked);
|
||||
|
||||
|
|
|
|||
55
src/@shared/src/database/mixin/blocked.ts
Normal file
55
src/@shared/src/database/mixin/blocked.ts
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
import { isNullish } from '@shared/utils';
|
||||
import type { Database } from './_base';
|
||||
import { UserId } from './user';
|
||||
|
||||
// never use this directly
|
||||
|
||||
// describe every function in the object
|
||||
export interface IBlockedDb extends Database {
|
||||
getBlockedUserFor(id: UserId): BlockedData[],
|
||||
addBlockedUserFor(id: UserId, blocked: UserId): void,
|
||||
removeBlockedUserFor(id: UserId, blocked: UserId): void,
|
||||
unblockAllUserFor(id: UserId): void,
|
||||
};
|
||||
|
||||
export const BlockedImpl: Omit<IBlockedDb, keyof Database> = {
|
||||
getBlockedUserFor(this: IBlockedDb, id: UserId): BlockedData[] {
|
||||
const query = this.prepare('SELECT * FROM blocked WHERE user = @id');
|
||||
const data = query.all({ id }) as Partial<BlockedData>[];
|
||||
return data.map(blockedFromRow).filter(b => !isNullish(b));
|
||||
},
|
||||
|
||||
unblockAllUserFor(this: IBlockedDb, id: UserId): void {
|
||||
this.prepare('DELETE FROM blocked WHERE user = @id').run({ id });
|
||||
},
|
||||
addBlockedUserFor(this: IBlockedDb, id: UserId, blocked: UserId): void {
|
||||
this.prepare('INSERT OR IGNORE INTO blocked (user, blocked) VALUES (@id, @blocked)').run({ id, blocked });
|
||||
},
|
||||
removeBlockedUserFor(this: IBlockedDb, id: UserId, blocked: UserId): void {
|
||||
this.prepare('DELETE FROM blocked WHERE user = @id AND blocked = @blocked').run({ id, blocked });
|
||||
},
|
||||
};
|
||||
|
||||
export type BlockedId = number & { readonly __brand: unique symbol };
|
||||
|
||||
export type BlockedData = {
|
||||
readonly id: BlockedId;
|
||||
readonly user: UserId;
|
||||
readonly blocked: UserId;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get a blocked from a row
|
||||
*
|
||||
* @param row The data from sqlite
|
||||
*
|
||||
* @returns The blocked if it exists, undefined otherwise
|
||||
*/
|
||||
export function blockedFromRow(row?: Partial<BlockedData>): BlockedData | undefined {
|
||||
if (isNullish(row)) return undefined;
|
||||
if (isNullish(row.id)) return undefined;
|
||||
if (isNullish(row.user)) return undefined;
|
||||
if (isNullish(row.blocked)) return undefined;
|
||||
|
||||
return row as BlockedData;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue