예제 #1
0
        /// <inheritdoc/>
        public async Task <string> PublishAsync(SelfReportRequest request, long timeAtRequest, CancellationToken cancellationToken = default)
        {
            // Validate inputs
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            RequestValidationResult validationResult = request.Validate();

            validationResult.Combine(Validator.ValidateTimestamp(timeAtRequest));

            if (validationResult.Passed)
            {
                // Build MatchMessage from submitted content
                MatchMessage   message = new MatchMessage();
                BluetoothMatch matches = new BluetoothMatch();
                matches.Seeds.AddRange(request.Seeds);

                // Store in data repository
                message.BluetoothMatches.Add(matches);
                return(await this._messageRepo.InsertAsync(message, request.Region, cancellationToken));
            }
            else
            {
                throw new RequestValidationFailedException(validationResult);
            }
        }
예제 #2
0
        public async Task PublishAsync_SucceedsOnValidMessage()
        {
            // Arrange
            string repoResponse = "00000000-0000-0000-0000-000000000001";
            Region region       = new Region
            {
                LatitudePrefix  = 10.1234,
                LongitudePrefix = -10.1234,
                Precision       = 4
            };
            MatchMessage request   = new MatchMessage();
            AreaMatch    areaMatch = new AreaMatch
            {
                UserMessage = "Test user message"
            };

            areaMatch.Areas.Add(new Area
            {
                BeginTime = 0,
                EndTime   = 1,
                Location  = new Location
                {
                    Latitude  = 10.1234,
                    Longitude = -10.1234
                },
                RadiusMeters = 100
            });
            request.AreaMatches.Add(areaMatch);
            BluetoothMatch btMatch = new BluetoothMatch
            {
                UserMessage = "Test BL message"
            };

            btMatch.Seeds.Add(new BlueToothSeed
            {
                Seed              = "00000000-0000-0000-0000-000000000000",
                SequenceEndTime   = 1,
                SequenceStartTime = 0
            });
            request.BluetoothMatches.Add(btMatch);

            this._repo
            .Setup(r => r.InsertAsync(It.IsAny <MatchMessage>(), It.IsAny <Region>(), CancellationToken.None))
            .Returns(Task.FromResult(repoResponse));

            // Act
            string result = await this._service
                            .PublishAsync(request, region, CancellationToken.None);

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(repoResponse, result);
        }
예제 #3
0
        public async Task <ActionResult <IEnumerable <MatchMessage> > > PostAsync([FromBody] MessageRequest request, CancellationToken cancellationToken = default)
        {
            try
            {
                // Submit request
                IEnumerable <MessageContainer> reports = await this._reportService
                                                         .GetByIdsAsync(
                    request.RequestedQueries.Select(r => r.MessageId),
                    cancellationToken
                    );

                // Map MatchMessage types
                List <MatchMessage> messages = new List <MatchMessage>();

                foreach (MessageContainer report in reports)
                {
                    MatchMessage result = this._map.Map <MatchMessage>(report);
                    // Get BLEs
                    BluetoothMatch match = new BluetoothMatch();
                    match.Seeds.AddRange(
                        report.BluetoothSeeds.Select(s => this._map.Map <BlueToothSeed>(s))
                        );
                    // Add converted BLE match
                    result.BluetoothMatches.Add(match);
                    // Add converted MatchMessage
                    messages.Add(result);
                }

                // Return as expected proto type
                return(Ok(messages));
            }
            catch (RequestValidationFailedException ex)
            {
                // Only return validation results
                return(BadRequest(ex.ValidationResult));
            }
            catch (ArgumentNullException)
            {
                return(BadRequest());
            }
        }
예제 #4
0
        public async Task PublishAsync_ArgumentNullOnNullRegion()
        {
            // Arrange
            MatchMessage request   = new MatchMessage();
            AreaMatch    areaMatch = new AreaMatch
            {
                UserMessage = "Test user message"
            };

            areaMatch.Areas.Add(new Area
            {
                BeginTime = 0,
                EndTime   = 1,
                Location  = new Location
                {
                    Latitude  = 10.1234,
                    Longitude = -10.1234
                },
                RadiusMeters = 100
            });
            request.AreaMatches.Add(areaMatch);
            BluetoothMatch btMatch = new BluetoothMatch
            {
                UserMessage = "Test BL message"
            };

            btMatch.Seeds.Add(new BlueToothSeed
            {
                Seed              = "00000000-0000-0000-0000-000000000000",
                SequenceEndTime   = 1,
                SequenceStartTime = 0
            });
            request.BluetoothMatches.Add(btMatch);

            // Act
            string result = await this._service
                            .PublishAsync(request, null, CancellationToken.None);

            // Assert
            // Exception caught by decorator
        }