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