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); }); }
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); }); }
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(); }
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()); }
public void ExtractGuidFromTRNTest(string expectedGuidString, string TRNtype, string userTRN) { var convertedGuid = TRNHelper.ExtractGuid(userTRN); Assert.Equal(expectedGuidString, convertedGuid.ToString()); }