mirror of
https://github.com/bellingcat/datasheet-server.git
synced 2026-06-10 04:18:31 +03:00
69 lines
2.0 KiB
JavaScript
69 lines
2.0 KiB
JavaScript
import fs from 'mz/fs'
|
|
import errors from '../lib/errors'
|
|
|
|
const STORAGE_DIRNAME = 'temp'
|
|
|
|
function partsFromFilename (fname) {
|
|
const body = fname.slice(0, -5)
|
|
return body.split('__')
|
|
}
|
|
|
|
class StoreJson {
|
|
index () {
|
|
return Promise.resolve()
|
|
.then(() => fs.readdir(STORAGE_DIRNAME))
|
|
.then(files => files.filter(f => f.match(/.*\.json$/)))
|
|
.then(jsons => jsons.map(partsFromFilename))
|
|
.then(parts => parts.map(p => `${p[0]}/${p[1]}/${p[2]}`))
|
|
}
|
|
|
|
save (url, data) {
|
|
const parts = url.split('/')
|
|
|
|
return fs.writeFile(
|
|
`${STORAGE_DIRNAME}/${parts[0]}__${parts[1]}__${parts[2]}.json`,
|
|
JSON.stringify(data)
|
|
)
|
|
}
|
|
|
|
load (url) {
|
|
const parts = url.split('/')
|
|
const fname = `${STORAGE_DIRNAME}/${parts[0]}__${parts[1]}__${
|
|
parts[2]
|
|
}.json`
|
|
if (fs.existsSync(fname)) {
|
|
return fs.readFile(fname, 'utf8')
|
|
.then(data => JSON.parse(data))
|
|
.then(data => {
|
|
if (parts.length === 3) {
|
|
// No lookup if the requested url doesn't have a fragment
|
|
return data
|
|
} else if (parts[2] === 'ids') {
|
|
// Do a lookup if fragment is included to filter a relevant item
|
|
// When the resource requested is 'ids'
|
|
const id = parseInt(parts[3])
|
|
if (!isNaN(id) && id >= 0 && id < data.length) {
|
|
return data[id]
|
|
} else {
|
|
throw errors.noFragment(parts)
|
|
}
|
|
} else {
|
|
// Do a lookup if fragment is included to filter a relevant item
|
|
const index = parseInt(parts[3])
|
|
if (!isNaN(index) && index >= 0 && index < data.length) {
|
|
return data.filter((vl, idx) => idx === index)[0]
|
|
} else {
|
|
throw errors.noFragment(parts)
|
|
}
|
|
}
|
|
})
|
|
} else {
|
|
return Promise.reject(errors.noResource(parts))
|
|
}
|
|
}
|
|
|
|
// TODO: add method to build blueprint from data sheet
|
|
}
|
|
|
|
export default StoreJson
|