/
queries.ts
141 lines (124 loc) · 3.88 KB
/
queries.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/**
* Copyright (c) 2019 Paul Armstrong
*/
import Build from '@build-tracker/build';
import { Build as BuildStruct } from '@build-tracker/server';
import { Pool } from 'mysql';
import { NotFoundError, UnimplementedError } from '@build-tracker/api-errors';
export default class Queries {
private _pool: Pool;
public constructor(pool: Pool) {
this._pool = pool;
}
public getByRevision = (revision: string): Promise<BuildStruct> => {
return new Promise((resolve, reject) => {
this._pool.query(
'SELECT meta, artifacts FROM builds WHERE revision = ?',
[revision],
(err, results): void => {
if (err) {
reject(err);
return;
}
if (results.length !== 1) {
reject(new NotFoundError());
return;
}
resolve(this._formatRow(results[0]));
}
);
});
};
public insert = ({ meta, artifacts }: BuildStruct): Promise<string> => {
const build = new Build(meta, artifacts);
return new Promise((resolve, reject) => {
this._pool.query(
'INSERT INTO builds (branch, revision, timestamp, parentRevision, meta, artifacts) VALUES (?, ?, ?, ?, ?, ?)',
[
build.getMetaValue('branch'),
build.getMetaValue('revision'),
build.meta.timestamp,
build.getMetaValue('parentRevision'),
JSON.stringify(build.meta),
JSON.stringify(build.artifacts)
],
(err, results): void => {
if (err) {
reject(err);
return;
}
resolve(results.insertId);
}
);
});
};
public getByRevisions = (revisions: Array<string>): Promise<Array<BuildStruct>> => {
return new Promise((resolve, reject) => {
this._pool.query(
'SELECT meta, artifacts FROM builds WHERE revision IN (?)',
[revisions],
(err, results): void => {
if (err) {
reject(err);
return;
}
if (!results.length) {
reject(new NotFoundError());
return;
}
resolve(results.map(this._formatRow));
}
);
});
};
public getByRevisionRange = (startRevision: string, endRevision: string): Promise<Array<BuildStruct>> => {
return new Promise((_resolve, reject) => {
reject(new UnimplementedError(`revision range ${startRevision} - ${endRevision}`));
});
};
public getByTimeRange = (
startTimestamp: number,
endTimestamp: number,
branch: string
): Promise<Array<BuildStruct>> => {
return new Promise((resolve, reject) => {
this._pool.query(
'SELECT meta, artifacts FROM builds WHERE timestamp >= ? AND timestamp <= ? AND branch = ? ORDER BY timestamp',
[startTimestamp, endTimestamp, branch],
(err, results): void => {
if (err) {
reject(err);
return;
}
if (!results.length) {
reject(new NotFoundError());
return;
}
resolve(results.map(this._formatRow));
}
);
});
};
public getRecent = (limit: number = 20, branch: string): Promise<Array<BuildStruct>> => {
return new Promise((resolve, reject) => {
this._pool.query(
'SELECT meta, artifacts FROM builds WHERE branch = ? ORDER BY timestamp DESC LIMIT ?',
[branch, limit],
(err, results): void => {
if (err) {
reject(err);
return;
}
if (!results.length) {
reject(new NotFoundError());
return;
}
resolve(results.map(this._formatRow).sort((a, b) => a.meta.timestamp - b.meta.timestamp));
}
);
});
};
private _formatRow(row: { meta: Buffer; artifacts: Buffer }): BuildStruct {
return { meta: JSON.parse(row.meta.toString()), artifacts: JSON.parse(row.artifacts.toString()) };
}
}