Initial commit
[GitHub/WoltLab/blacklist.git] / src / csv-parser.ts
1 import { createHash, Hash } from 'crypto';
2 import * as csvParse from 'csv-parse';
3 import { Service } from 'typedi';
4
5 @Service()
6 export class CsvParser {
7 public async parse(buffer: Buffer): Promise<ICsvRow[]> {
8 const records = await this.parseCsv(buffer);
9
10 return records.map(
11 (columns: string[]): ICsvRow => {
12 return {
13 hash: this.getHash(columns[0]),
14 lastSeen: new Date(`${columns[2]}Z`).getTime(),
15 occurrences: parseInt(columns[1], 10),
16 };
17 },
18 );
19 }
20
21 protected async parseCsv(buffer: Buffer): Promise<string[][]> {
22 return new Promise<string[][]>(
23 (
24 resolve: (rows: string[][]) => void,
25 reject: (err: Error) => void,
26 ): void => {
27 csvParse(
28 buffer.toString(),
29 { escape: '\\' },
30 (err: Error | undefined, records: string[][] | undefined) => {
31 if (err) {
32 reject(err);
33 } else {
34 resolve(records);
35 }
36 },
37 );
38 },
39 );
40 }
41
42 protected getHash(input: string): string {
43 return createHash('sha256')
44 .update(input)
45 .digest('hex');
46 }
47 }
48
49 export interface ICsvRow {
50 hash: string;
51 lastSeen: number;
52 occurrences: number;
53 }