in backend/src/lib/controllers/ingestapi-ctrl.ts [16:116]
async function createDataset(req: Request, res: Response) {
const { metadata, data } = req.body;
if (!metadata.name) {
return res.status(400).send("Missing required field `metadata.name`");
}
if (!data) {
return res.status(400).send("Missing required field `data`");
}
if (metadata.schema === "Metrics") {
for (let datum in data) {
//symbol should be valid input or empty
if (
!["", NumberDataType.Percentage, NumberDataType.Currency].includes(
data[datum].percentage
)
) {
return res
.status(400)
.send(
"Invalid symbol type. Choose either `Currency`, `Percentage` or ``"
);
}
//currency should be valid input or empty
if (
![
"",
CurrencyDataType["Dollar $"],
CurrencyDataType["Euro €"],
CurrencyDataType["Pound £"],
].includes(data[datum].currency)
) {
return res
.status(400)
.send(
"Invalid symbol type. Choose either ``, `Dollar $`, `Euro €` or `Pound £`"
);
}
//if symbol is currency, then a currency should be indicated
if (
data[datum].percentage === NumberDataType.Currency &&
data[datum].currency === ""
) {
return res.status(400).send("Missing optional field `currency`");
}
//if currencies are indicated, then symbol should be currency
if (
data[datum].percentage !== NumberDataType.Currency &&
(data[datum].currency === CurrencyDataType["Dollar $"] ||
data[datum].currency === CurrencyDataType["Euro €"] ||
data[datum].currency === CurrencyDataType["Pound £"])
) {
return res
.status(400)
.send("Can only input currency type along with `Currency`");
}
}
}
if (
metadata.schema &&
!Object.values(DatasetSchema).includes(metadata.schema)
) {
return res
.status(400)
.send(`Unknown schema provided '${escapeHtml(metadata.schema)}'`);
}
const repo = DatasetRepository.getInstance();
let parsedData: DatasetContent;
try {
parsedData = DatasetService.parse(data, metadata.schema);
} catch (err) {
logger.warn("Unable to parse dataset %o", data);
return res.status(400).send(err.message);
}
try {
const s3Key = await repo.uploadDatasetContent(parsedData);
const dataset = DatasetFactory.createNew({
fileName: metadata.name,
createdBy: "ingestapi",
s3Key: {
raw: s3Key,
json: s3Key,
},
sourceType: SourceType.IngestApi,
schema: metadata.schema,
});
await repo.saveDataset(dataset);
res.json(dataset);
} catch (err) {
logger.error("Failed to create dataset %o, %o", metadata, parsedData);
res.status(400).send("Unable to create dataset");
}
}