async function createDataset()

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");
  }
}