/
persistor.js
59 lines (46 loc) · 2.42 KB
/
persistor.js
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
import path from 'path';
import fsApi from 'fs';
const fs = fsApi.promises;
import async from 'async';
const commitQueue = async.queue(_commit, 1);
commitQueue.error((err, { serviceProviderId, policyType, isSanitized, reject }) => {
reject(new Error(`Could not commit ${policyType} for ${serviceProviderId} (${isSanitized ? 'sanitized' : 'raw'} version) due to error: ${err}`));
});
import * as git from './git.js';
const __dirname = path.dirname(new URL(import.meta.url).pathname);
const ROOT_DIRECTORY = path.resolve(__dirname, `../..${process.env.NODE_ENV === 'test' ? '/test/' : '/'}data`);
export const RAW_DIRECTORY = `${ROOT_DIRECTORY}/raw`;
export const SANITIZED_DIRECTORY = `${ROOT_DIRECTORY}/sanitized`;
export async function persist({ serviceProviderId, policyType, fileContent, isSanitized }) {
await save({ serviceProviderId, policyType, fileContent, isSanitized });
return await commit({ serviceProviderId, policyType, isSanitized });
}
export async function save({ serviceProviderId, policyType, fileContent, isSanitized }) {
const directory = `${isSanitized ? SANITIZED_DIRECTORY : RAW_DIRECTORY}/${serviceProviderId}`;
if (!fsApi.existsSync(directory)) {
await fs.mkdir(directory);
}
const filePath = `${directory}/${policyType}.${isSanitized ? 'md' : 'html'}`;
return fs.writeFile(filePath, fileContent).then(() => {
console.log(`File ${filePath} saved.`)
});
}
export async function commit({ serviceProviderId, policyType, isSanitized }) {
const directory = `${isSanitized ? SANITIZED_DIRECTORY : RAW_DIRECTORY}/${serviceProviderId}`;
const fileExtension = isSanitized ? 'md' : 'html'
// Git needs a path relative to the .git directory, not an absolute one
const filePath = path.relative(path.resolve(__dirname, '../..'), `${directory}/${policyType}.${fileExtension}`);
const status = await git.status(filePath);
if (!status.match(/^\*?(modified|added)/)) {
return;
}
return new Promise((resolve, reject) => {
commitQueue.push({ serviceProviderId, policyType, isSanitized, fileExtension, filePath, resolve, reject });
});
}
async function _commit({ serviceProviderId, policyType, isSanitized, fileExtension, filePath, resolve }) {
await git.add(filePath);
const sha = await git.commit(`Update ${isSanitized ? 'sanitized' : 'raw'} ${policyType} for ${serviceProviderId}`);
console.log(`Commit ID for document "${serviceProviderId}/${policyType}.${fileExtension}": ${sha}`);
resolve(sha);
}