Skip to content
Snippets Groups Projects
Select Git revision
  • a46e9a02574c3f7af52f7b35f1339fc60467c294
  • master default protected
2 results

MrX.entity.ts

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    MrX.entity.ts 1.83 KiB
    import { sql } from "../db";
    
    export class MrXEntry {
    	id!: number;
    	mrx!: number;
    	time!: Date;
    	text!: string|null;
    	image!: string|null;
    	
    	static parse(data: any): MrXEntry|undefined {
    		if(!data) return;
    		return Object.assign(new MrXEntry(), data, { time: new Date(data.time) });
    	}
    	static async create(entry: Omit<MrXEntry, "id">): Promise<number> {
    		return (await sql`INSERT INTO mrx_entries ${sql(entry)} RETURNING id`)[0].id;
    	}
    	static async update(id: number, entry: Partial<MrXEntry>): Promise<void> {
    		await sql`UPDATE mrx_entries SET ${sql(entry)} WHERE id=${id}`;
    	}
    	static async delete(id: number): Promise<void> {
    		await sql`DELETE FROM mrx_entries WHERE id = ${id}`;
    	}
    }
    
    export class MrX {
    	id!: number;
    	name!: string;
    	entries!: MrXEntry[];
    	
    	static parse(data: any): MrX|undefined {
    		if(!data) return;
    		const m = Object.assign(new MrX(), data);
    		m.entries = (data.entries as any[] || [])
    				.map(e => MrXEntry.parse(e))
    				.filter(e=>!!e)
    				.sort((a,b)=>b.time.getTime()-a.time.getTime());
    		return m;
    	}
    	static async getById(id: number): Promise<MrX|undefined> {
    		const row = (await sql`SELECT row_to_json(mrx.*) AS mr_x, json_agg(row_to_json(mrx_entries.*)) AS entries FROM mrx LEFT JOIN mrx_entries ON mrx.id = mrx_entries.mrx WHERE mrx.id = ${id} GROUP BY mrx.id`)[0];
    		if(!row) return;
    		return MrX.parse(Object.assign(row.mrX, { entries: row.entries }));
    	}
    	static async getAll(): Promise<MrX[]> {
    		const rows = await sql`SELECT row_to_json(mrx.*) AS mr_x, json_agg(row_to_json(mrx_entries.*)) AS entries FROM mrx LEFT JOIN mrx_entries ON mrx.id = mrx_entries.mrx GROUP BY mrx.id`;
    		return rows.map((row: any) => MrX.parse(Object.assign(row.mrX, { entries: row.entries }))!);
    	}
    	static async create(mrX: Omit<MrX, "id"|"entries">): Promise<number> {
    		return (await sql`INSERT INTO mrx ${sql(mrX)} RETURNING id`)[0].id;
    	}
    }