/// <summary> /// Sets up static properties that act as global variables. /// </summary> /// <param name="config">Contains the session id and connection information.</param> protected static void Setup(ExporterConfiguration config) { sessionId = config.Id; string mongoUrl = $"mongodb://{config.Mongo.ConnectionString}:{config.Mongo.Port}"; db = new MongoClient(mongoUrl).GetDatabase("ec"); string minioHost = $"{AppConfiguration.Minio.ConnectionString}:{AppConfiguration.Minio.Port}"; os = new MinioClientExtra(minioHost, "minio", "minio123"); }
/// <summary> /// Initializes a new instance of the <see cref="Export"/> class. /// </summary> /// <param name="accessRepo">Supplied through DI.</param> /// <param name="sessionRepo">Supplied through DI.</param> /// <param name="threader">Supplied through DI.</param> /// <param name="os">Supplied through DI.</param> /// <param name="date">Supplied through DI.</param> public Export( IRepository <AccessTokenSchema> accessRepo, IRepository <SessionSchema> sessionRepo, IThreadExtra threader, IMinioClient os, IDateExtra date) : base("/sessions/{id}/export") { this.Before += PreSecurity.CheckAccess(accessRepo, date); this.Post <PostExport>("/", async(req, res) => { string id = req.RouteValues.As <string>("id"); var sessionDoc = await sessionRepo .FindById(id); if (sessionDoc == null) { res.StatusCode = Status404NotFound; return; } var exporterConfig = new ExporterConfiguration { Mongo = new ConnectionConfiguration { ConnectionString = AppConfiguration.Mongo.ConnectionString, Port = AppConfiguration.Mongo.Port, }, Minio = new ConnectionConfiguration { ConnectionString = AppConfiguration.Minio.ConnectionString, Port = AppConfiguration.Minio.Port, }, Id = id, }; threader.Run(ExportHandler.Entry, exporterConfig); var filter = Builders <SessionSchema> .Filter .Where(s => s.Id == id); var update = Builders <SessionSchema> .Update .Set(s => s.ExportState, ExportOptions.Pending); await sessionRepo.Update(filter, update); await res.FromString(); }); this.Get <GetExport>("/", async(req, res) => { string id = req.RouteValues.As <string>("id"); var sessionDoc = await sessionRepo.FindById(id); if (sessionDoc == null) { res.StatusCode = Status404NotFound; return; } if (sessionDoc.ExportState == ExportOptions.Pending) { res.StatusCode = Status202Accepted; await res.FromString("PENDING"); return; } // Export job hasn't been created, so return not found if (sessionDoc.ExportState == ExportOptions.NotStarted) { res.StatusCode = Status404NotFound; return; } // Not sure what to do about an error if (sessionDoc.ExportState == ExportOptions.Error) { res.StatusCode = Status500InternalServerError; return; } string bucketName = "sessions.exported"; string objectName = $"{id}_session_exported.zip"; byte[] body = await os.GetBytesAsync(bucketName, objectName); var about = new ContentDisposition { FileName = objectName }; using (var stream = new MemoryStream(body)) { res.ContentLength = body.Length; await res.FromStream(stream, "application/zip", about); } }); }