public async Task Export(string path, List <CtfChallangeModel> ctfChallanges) { if (!Directory.Exists(path)) { try { Directory.CreateDirectory(path); } catch (Exception ex) { _logger.Error($"Failed to create folder for ctf. {ex.Message}"); return; } } string exportFile = Path.Combine(path, $"{Guid.NewGuid()}.zip"); using FileStream fileStream = new FileStream(exportFile, FileMode.CreateNew); using ZipArchive zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Create, false); CTFdBaseModel <CTFdAlembicVersionModel> alembicVersion = GetAlembicVersion(); await WriteZipDbEntry(zipArchive, ALEMBIC_VERSION_ENTRY_NAME, alembicVersion); CTFdBaseModel <CTFdChallengeModel> challanges = GetChallanges(ctfChallanges); await WriteZipDbEntry(zipArchive, CHALLENGES_ENTRY_NAME, challanges); CTFdBaseModel <CTFdFlagModel> flags = GetFlags(ctfChallanges); await WriteZipDbEntry(zipArchive, FLAGS_ENTRY_NAME, flags); }
private static async Task WriteZipDbEntry <T>(ZipArchive zipArchive, string entryName, CTFdBaseModel <T> model) { JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { NamingStrategy = new SnakeCaseNamingStrategy(), }, DateTimeZoneHandling = DateTimeZoneHandling.Utc, }; using Stream zipStream = zipArchive.CreateEntry(entryName, CompressionLevel.Fastest).Open(); string json = JsonConvert.SerializeObject(model, jsonSerializerSettings); byte[] data = Encoding.UTF8.GetBytes(json); await zipStream.WriteAsync(data, 0, data.Length); }