public AnalyticsAgent(RecognitionTaskQueue queue,
                              IAnalyticsClient analyticsClient,
                              ILoggerFactory loggerFactory,
                              IPhotoRepository photoRepository,
                              IRecognitionResultsRepository recognitionRepository,
                              IConfiguration configuration)
        {
            this.queue                 = queue;
            this.analyticsClient       = analyticsClient;
            this.photoRepository       = photoRepository;
            this.configuration         = configuration;
            this.recognitionRepository = recognitionRepository;
            logger = loggerFactory.CreateLogger <AnalyticsAgent>();

            PollingTask();
        }
Beispiel #2
0
        public IActionResult UploadPhotoAndStartSession([FromBody] PhotoRequest photoRequest,
                                                        [FromServices] UserManager <ApplicationUser> userManager,
                                                        [FromServices] SessionTracker sessionTracker,
                                                        [FromServices] IImageDecryptor imageDecryptor,
                                                        [FromServices] RecognitionTaskQueue taskQueue,
                                                        [FromServices] IConfiguration configuration,
                                                        [FromServices] AnalyticsAgent agent)
        {
            using (_logger.BeginScope(nameof(UploadPhotoAndStartSession)))
            {
                //validate request
                if (photoRequest == null)
                {
                    _logger.LogError("Attempt to start a session because of null mobile photo request.");
                    return(BadRequest(new { message = "Error: something in your request is empty" }));
                }

                try
                {
                    //try start new session
                    var session = sessionTracker.StartSession(Convert.ToInt32(userManager.GetUserId(HttpContext.User)), photoRequest.TimeStamp);

                    //decrypt image and send to db
                    _logger.LogInformation($"Trying decrypt image...");
                    var decrypredImage = imageDecryptor.Decrypt(Convert.FromBase64String(photoRequest.Image));
                    var image          = new Photo(session.SessionID, decrypredImage, photoRequest.TimeStamp);
                    _photoRepository.Add(image);
                    _logger.LogInformation($"Ecrypted image was decrypted and saved to db.");

                    //send to analytics task queue
                    _logger.LogInformation($"Trying send photoId to RecognitionTaskQueue");
                    string modelName = configuration.GetSection("ModelName").Value; // get model name for analytics
                    taskQueue.Enqueue(new RecognitionTask(modelName, image.PhotoID));
                    _logger.LogInformation("Photo was sent to RecognitionTaskQueue");

                    var sessionResponse = new SessionResponse(session.SessionID);
                    return(Ok(sessionResponse));
                }
                catch (Exception ex)
                {
                    _logger.LogError("Exception caught: {0}, {1}", ex.Message, ex.StackTrace);
                    return(StatusCode(409, new { message = ex.Message }));
                }
            }
        }
Beispiel #3
0
        public async void GetSessionId()
        {
            //Arrange
            var user = new ApplicationUser {
                UserName = "******", Email = "*****@*****.**"
            };
            await app.UserManager.CreateAsync(user, "UserTest@123");

            await app.SetUser(user);

            var testSession = new Session(user.Id, DateTime.UtcNow, DateTime.UtcNow, SessionStatus.FINISHED);

            testSession.SessionID = 1;
            var testPhoto = new Photo(testSession.SessionID, new byte[] { 0x20, 0x20, 0x20 }, DateTime.UtcNow);

            testPhoto.PhotoID = 2;

            IImageDecryptor decryptor = Mock.Of <IImageDecryptor>(
                id => id.Decrypt(It.IsAny <byte[]>()) == testPhoto.Image);

            RecognitionTaskQueue taskQueue = new RecognitionTaskQueue(new LoggerFactory());

            //Act
            PhotoController controller = CreateController(testSession, testPhoto);

            var result = (controller.UploadPhotoAndStartSession(
                              new PhotoRequest("MQ==", DateTime.UtcNow),
                              app.UserManager,
                              new SessionTracker(new LoggerFactory(), sessionRepository, conf, new SessionValidator(new LoggerFactory())),
                              decryptor,
                              taskQueue,
                              conf,
                              null)
                          as OkObjectResult).Value;

            var resultValue = result.GetType().GetProperty("SessionId").GetValue(result) as string;

            //Assert
            Assert.Equal <int>(0, Convert.ToInt32(resultValue));
        }