dump method

Future<APIResponse<Object>> dump(
  1. bool zip
)

Implementation

Future<APIResponse<Object>> dump(bool zip) async {
  if (onlyOnDevelopment && !development) {
    return APIResponse.error(error: "Unsupported request!");
  }

  _log.info("APIDBModule[REQUEST]> dump");

  var allRepositories = (await entityRepositoryProviders).allRepositories();

  var dump = await allRepositories.values
      .map((repo) => MapEntry(repo.name, repo.selectAll()))
      .toMapFromEntries()
      .resolveAllValues();

  var dumpJson = dump.entries
      .map((e) => MapEntry(e.key, _entitiesToJsonMap(e.value)))
      .where((e) => e.value.isNotEmpty)
      .toMapFromEntries();

  if (zip) {
    var apiName =
        apiRoot.name.toLowerCase().trim().replaceAll(RegExp(r'\W+'), '_');

    var zipTime = DateTime.now().millisecondsSinceEpoch;

    var zipName = 'db-dump--$apiName--$zipTime';

    var archive = Archive();

    {
      var dumpJsonBytes = Json.encodeToBytes(dumpJson);

      var archiveFile = ArchiveFile(
          '$zipName/dump.json', dumpJsonBytes.length, dumpJsonBytes);
      archive.addFile(archiveFile);
    }

    var zipEncoder = ZipEncoder();

    var encode = zipEncoder.encode(archive)!;
    var zipData = encode is Uint8List ? encode : Uint8List.fromList(encode);

    var zipFileName = '$zipName.zip';

    return APIResponse.ok(zipData, mimeType: 'application/zip', headers: {
      'Content-Disposition': 'attachment; filename="$zipFileName"'
    });
  }

  return APIResponse.ok(dumpJson, mimeType: 'json');
}