예제 #1
0
        public void GetAccountsForDeviceTest()
        {
            const string deviceTrn          = "trn::profilex:us-west-2:device:560c2a6c-6b7e-48d8-b1a5-e4009e2d4c97";
            const string expectedAccountTrn = "trn::profilex:us-west-2:account:560c2a6c-6b7e-48d8-b1a5-e4009e2d4c97";

            var deviceAccountListResponseModel = new DeviceAccountListResponseModel
            {
                HasMore  = false,
                Accounts = new List <DeviceAccountResponseModel>()
                {
                    new DeviceAccountResponseModel()
                    {
                        TRN             = expectedAccountTrn,
                        AccountName     = "an account name",
                        RelationStatus  = RelationStatusEnum.Active,
                        TccDeviceStatus = TCCDeviceStatusEnum.Pending
                    }
                }
            };
            var route       = $"/devices/{deviceTrn}/accounts";
            var expectedUrl = $"{baseUrl}{route}?from=0&limit=20";

            mockServiceResolution.Setup(m => m.ResolveRemoteServiceEndpoint(
                                            It.IsAny <string>(), It.IsAny <ApiType>(), It.IsAny <ApiVersion>(), route, It.IsAny <IList <KeyValuePair <string, string> > >())).Returns(Task.FromResult(expectedUrl));

            MockUtilities.TestRequestSendsCorrectJson("Get accounts for a device", mockWebRequest, null, expectedUrl, HttpMethod.Get, deviceAccountListResponseModel, async() =>
            {
                var client = ServiceProvider.GetRequiredService <ICwsDeviceClient>();
                var result = await client.GetAccountsForDevice(TRNHelper.ExtractGuid(deviceTrn).Value);

                Assert.NotNull(result);
                Assert.False(result.HasMore);
                Assert.NotNull(result.Accounts);
                Assert.Single(result.Accounts);
                Assert.Equal(TRNHelper.ExtractGuidAsString(expectedAccountTrn), result.Accounts[0].Id);
                Assert.Equal(RelationStatusEnum.Active, result.Accounts[0].RelationStatus);
                return(true);
            });
        }
예제 #2
0
        public void GetDeviceLicensesTest()
        {
            const string accountId = "trn::profilex:us-west-2:account:560c2a6c-6b7e-48d8-b1a5-e4009e2d4c97";

            var deviceLicensesModel = new DeviceLicenseResponseModel
            {
                Total = 57
            };
            var route       = $"/accounts/{accountId}/devicelicense";
            var expectedUrl = $"{baseUrl}{route}";

            mockServiceResolution.Setup(m => m.ResolveRemoteServiceEndpoint(
                                            It.IsAny <string>(), It.IsAny <ApiType>(), It.IsAny <ApiVersion>(), route, It.IsAny <IList <KeyValuePair <string, string> > >())).Returns(Task.FromResult(expectedUrl));

            MockUtilities.TestRequestSendsCorrectJson("Get Device Licenses", mockWebRequest, null, expectedUrl, HttpMethod.Get, deviceLicensesModel, async() =>
            {
                var client = ServiceProvider.GetRequiredService <ICwsAccountClient>();
                var result = await client.GetDeviceLicenses(TRNHelper.ExtractGuid(accountId).Value);

                Assert.NotNull(result);
                Assert.Equal(57, result.Total);
                return(true);
            });
        }
예제 #3
0
    public static void ConfigureAutomapper()
    {
      _automapperConfiguration = new MapperConfiguration(
        //define mappings <source type, destination type>
        cfg =>
        {
          cfg.AllowNullCollections = true; // so that byte[] can be null
          cfg.CreateMap<ProjectDatabaseModel, ProjectV6Descriptor>()
            .ForMember(dest => dest.ProjectGeofenceWKT, opt => opt.MapFrom(src => src.Boundary))
            .ForMember(dest => dest.IanaTimeZone, opt => opt.MapFrom(src => src.ProjectTimeZoneIana))
            .ForMember(dest => dest.ShortRaptorProjectId, opt => opt.MapFrom(src => src.ShortRaptorProjectId))
            .ForMember(dest => dest.IsArchived, opt => opt.MapFrom(src => src.IsArchived));
          cfg.CreateMap<ImportedFile, ImportedFileDescriptor>()
            .ForMember(dest => dest.ImportedUtc, opt => opt.MapFrom(src => src.LastActionedUtc))
            .ForMember(dest => dest.LegacyFileId, opt => opt.MapFrom(src => src.ImportedFileId))
            .ForMember(dest => dest.ImportedFileHistory, opt => opt.MapFrom(src => src.ImportedFileHistory.ImportedFileHistoryItems))
            .ForMember(dest => dest.IsActivated, opt => opt.MapFrom(x => true));
          cfg.CreateMap<Productivity3D.Project.Abstractions.Models.DatabaseModels.ImportedFileHistoryItem, MasterData.Project.WebAPI.Common.Models.ImportedFileHistoryItem>()
            .ForMember(dest => dest.FileCreatedUtc, opt => opt.MapFrom(src => src.FileCreatedUtc))
            .ForMember(dest => dest.FileUpdatedUtc, opt => opt.MapFrom(src => src.FileUpdatedUtc));
          cfg.CreateMap<ImportedFile, UpdateImportedFileEvent>()
            .ForMember(dest => dest.ImportedFileUID, opt => opt.MapFrom(src => Guid.Parse(src.ImportedFileUid)))
            .ForMember(dest => dest.ProjectUID, opt => opt.MapFrom(src => Guid.Parse(src.ProjectUid)))
            .ForMember(dest => dest.ActionUTC, opt => opt.MapFrom(src => src.LastActionedUtc));

          // for v5 TBC apis
          cfg.CreateMap<ProjectDatabaseModel, ProjectDataTBCSingleResult>()
            .ForMember(dest => dest.IsArchived, opt => opt.MapFrom(src => src.IsArchived))
            .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
            .ForMember(dest => dest.ProjectTimeZone, opt => opt.MapFrom(src => src.ProjectTimeZone))
            .ForMember(dest => dest.ProjectType, opt => opt.MapFrom(x => 0)) // old standard type
            .ForMember(dest => dest.ProjectTypeName, opt => opt.MapFrom(x => "Standard")) // old standard type
            .ForMember(dest => dest.StartDate, opt => opt.MapFrom(x => DateTime.MinValue)) // Obsolete
            .ForMember(dest => dest.EndDate, opt => opt.MapFrom(x => DateTime.MaxValue)) // Obsolete
            .ForMember(dest => dest.ProjectUid, opt => opt.MapFrom(src => src.ProjectUID))
            .ForMember(dest => dest.ProjectGeofenceWKT, opt => opt.MapFrom(src => src.Boundary))
            .ForMember(dest => dest.LegacyProjectId, opt => opt.MapFrom(src => src.ShortRaptorProjectId))
            .ForMember(dest => dest.CustomerUid, opt => opt.MapFrom(src => src.CustomerUID))
            .ForMember(dest => dest.LegacyCustomerId, opt => opt.MapFrom(src => "0")) // Obsolete
            .ForMember(dest => dest.Code, opt => opt.Ignore())
            .ForMember(dest => dest.Message, opt => opt.Ignore());
          
         cfg.CreateMap<TBCPoint, VSS.MasterData.Models.Models.Point>()
            .ForMember(dest => dest.y, opt => opt.MapFrom((src => src.Latitude)))
            .ForMember(dest => dest.x, opt => opt.MapFrom((src => src.Longitude)));
          // ProjectGeofenceAssociations
          cfg.CreateMap<GeofenceWithAssociation, GeofenceV4Descriptor>();

          // cws clients
          cfg.CreateMap<ProjectValidation, CreateProjectRequestModel>()
            .ForMember(dest => dest.TRN, opt => opt.Ignore())
            .ForMember(dest => dest.AccountId, opt => opt.MapFrom(src => src.CustomerUid))
            .ForMember(dest => dest.ProjectName, opt => opt.MapFrom(src => src.ProjectName))
            .ForMember(dest => dest.Timezone, opt => opt.Ignore())
            .ForMember(dest => dest.Boundary, opt => opt.MapFrom(src => GeometryConversion.MapProjectBoundary(src.ProjectBoundaryWKT)))
            .ForMember(dest => dest.ProjectType, opt => opt.MapFrom(src => src.ProjectType))
            .ForMember(dest => dest.CalibrationFileName, opt => opt.MapFrom(src => src.CoordinateSystemFileName))
            .ForMember(dest => dest.CalibrationFileBase64Content, opt => opt.MapFrom(src => Convert.ToBase64String(src.CoordinateSystemFileContent)))
            ;

          cfg.CreateMap<AccountResponseModel, CustomerData>()
            .ForMember(dest => dest.uid, opt => opt.MapFrom(src => src.Id))
            .ForMember(dest => dest.name, opt => opt.MapFrom(src => src.Name))
            .ForMember(dest => dest.type, opt => opt.MapFrom(c => CustomerType.Customer.ToString()))
            ;
          cfg.CreateMap<AccountResponseModel, AccountHierarchyCustomer>()
            .ForMember(dest => dest.CustomerUid, opt => opt.MapFrom(src => src.Id))
            .ForMember(dest => dest.DisplayName, opt => opt.MapFrom(src => src.Name))
            .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
            .ForMember(dest => dest.CustomerCode, opt => opt.MapFrom(src => src.Name))
            .ForMember(dest => dest.CustomerType, opt => opt.MapFrom(src => "Customer"))
            .ForMember(dest => dest.Children, opt => opt.Ignore());

          cfg.CreateMap<ProjectResponseModel, ProjectData>()
            .ForMember(dest => dest.ProjectUID, opt => opt.MapFrom(src => src.ProjectId))
            .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.ProjectName))
            .ForMember(dest => dest.CustomerUID, opt => opt.MapFrom(src => src.AccountId))
            .ForMember(dest => dest.ProjectGeofenceWKT, opt => opt.MapFrom(src => GeometryConversion.ProjectBoundaryToWKT(src.Boundary)))
            .ForMember(dest => dest.IanaTimeZone, opt => opt.MapFrom(src => src.Timezone))
            .ForMember(dest => dest.CoordinateSystemFileName, opt => opt.Ignore())
            .ForMember(dest => dest.CoordinateSystemLastActionedUTC, opt => opt.Ignore())
            .ForMember(dest => dest.ProjectTimeZone, opt => opt.Ignore())
            .ForMember(dest => dest.ShortRaptorProjectId, opt => opt.Ignore())
            .ForMember(dest => dest.ProjectType, opt => opt.MapFrom(src => src.ProjectType))
            .ForMember(dest => dest.IsArchived, opt => opt.Ignore())
            ;

          cfg.CreateMap<ProjectValidateDto, ProjectValidation>()
            .ForMember(dest => dest.CustomerUid, opt => opt.MapFrom(src => TRNHelper.ExtractGuid(src.AccountTrn)))
            .ForMember(dest => dest.ProjectUid, opt => opt.MapFrom(src => string.IsNullOrEmpty(src.ProjectTrn) ? null : TRNHelper.ExtractGuid(src.ProjectTrn)))
            .ForMember(dest => dest.ProjectType, opt => opt.MapFrom(src => src.ProjectType))
            .ForMember(dest => dest.UpdateType, opt => opt.MapFrom(src => ResolveUpdateType(src.UpdateType)))
            .ForMember(dest => dest.ProjectName, opt => opt.MapFrom(src => src.ProjectName))
            .ForMember(dest => dest.ProjectBoundaryWKT, opt => opt.MapFrom(src => GeometryConversion.ProjectBoundaryToWKT(src.Boundary)))
            .ForMember(dest => dest.CoordinateSystemFileName, opt => opt.MapFrom(src => src.CoordinateSystemFileName))
            .ForMember(dest => dest.CoordinateSystemFileContent, opt => opt.MapFrom(src => src.CoordinateSystemFileContent))
            ;
        }
      );

      _automapper = _automapperConfiguration.CreateMapper();
    }
예제 #4
0
        public async Task <IActionResult> SnsNotification()
        {
            // https://forums.aws.amazon.com/thread.jspa?threadID=69413
            // AWS SNS is in text/plain, not application/json - so need to parse manually
            var payloadMs = new MemoryStream();
            await Request.Body.CopyToAsync(payloadMs);

            var payload = Message.ParseMessage(Encoding.UTF8.GetString(payloadMs.ToArray()));

            bool isValid;

            try
            {
                isValid = payload.IsMessageSignatureValid();
            }
            catch (AmazonClientException e)
            {
                _logger.LogWarning($"Failed to validate SNS Message. Error: {e.Message}");
                return(BadRequest(e.Message));
            }

            if (!isValid)
            {
                return(BadRequest());
            }

            _logger.LogInformation($"Received SNS Message: {payload.MessageId}. Topic: {payload.TopicArn} Type: {payload.Type} Valid: {payload.IsMessageSignatureValid()}");
            if (payload.IsSubscriptionType)
            {
                _logger.LogInformation($"SNS SUBSCRIPTION REQUEST: {payload.MessageText}, Subscription URL: '{payload.SubscribeURL}'");
            }
            else if (payload.IsNotificationType)
            {
                // Got a valid message
                var notification = JsonConvert.DeserializeObject <CwsTrnUpdate>(payload.MessageText);
                if (notification != null)
                {
                    // Iterate all
                    var trns = notification.UpdatedTrns ?? new List <string>();
                    trns.Add(notification.AccountTrn);
                    trns.Add(notification.ProjectTrn);
                    var tasks = new List <Task>(trns.Count);
                    foreach (var t in trns)
                    {
                        if (string.IsNullOrEmpty(t))
                        {
                            continue;
                        }
                        var guid = TRNHelper.ExtractGuid(t);
                        if (guid.HasValue)
                        {
                            tasks.Add(_notificationHubClient.Notify(new ProjectChangedNotification(guid.Value)));
                        }
                        else
                        {
                            _logger.LogWarning($"Failed to extra GUID from TRN: {t}");
                        }
                    }

                    await Task.WhenAll(tasks);

                    _logger.LogInformation($"Processed notifications. Total TRNS: {trns.Count}");
                }
                else
                {
                    _logger.LogWarning($"Failed to parse notification message with content: {payload.MessageText}");
                }
            }

            return(Ok());
        }
예제 #5
0
        public void ExtractGuidFromTRNTest(string expectedGuidString, string TRNtype, string userTRN)
        {
            var convertedGuid = TRNHelper.ExtractGuid(userTRN);

            Assert.Equal(expectedGuidString, convertedGuid.ToString());
        }