예제 #1
0
        /// <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");
        }
예제 #2
0
        /// <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);
                }
            });
        }