public Clue CreateProviderRoot() { var clue = this.Create(EntityType.Provider.Root, "ExchangeSharedMailbox"); //?? // TODO: Need to update? var data = clue.Data; data.EntityData.Name = "Exchange Shared Mailbox"; data.EntityData.Description = "Exchange Shared Mailbox allows you to integrate shared Mailboxes."; data.EntityData.DisplayName = "Exchange Shared Mailbox"; data.EntityData.Uri = new Uri("https://portal.office.com/Home"); data.EntityData.LastChangedBy = new PersonReference(new EntityCode(EntityType.Infrastructure.User, "CluedIn", userId.ToString())); data.EntityData.Codes.Add(new EntityCode(EntityType.Product, "CluedIn", "ExchangeSharedMailbox")); var iconBytes = GetBytes(@"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAEBAQEBAQEBAQEBAQECAgMCAgICAgQDAwIDBQQFBQUEBAQFBgcGBQUHBgQEBgkGBwgICAgIBQYJCgkICgcICAj/2wBDAQEBAQICAgQCAgQIBQQFCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAj/wAARCAEAAQADAREAAhEBAxEB/8QAHwABAAIDAAIDAQAAAAAAAAAAAAgKBwkLBQYBAgME/8QAWBAAAAUDAgMCCAgHCQ0JAAAAAAECAwQFBgcIEQkSIQoxExQ4UXZ3tLUVIjdBYXGW1BkaMjZVWJUjQlJidYGys9MXGCQzU1dydIKRk7HBFkRUc5KhpNHV/8QAHQEBAAMBAQEBAQEAAAAAAAAAAAcICQYFBAECA//EAE4RAAECBAEHBA8FBQgBBQEAAAEAAgMEBREGBwgSITFBUTU2c7ITGCIyUmFxdIGRkqGxs9IUQlRiciM0k6LBFRYXJDNTY/DCQ0SC0+Oj/9oADAMBAAIRAxEAPwC/wCICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICLwFw3Jb1q0uRWrnr9HtujMlu7MnykR2Gi2M91OLMkl0Iz6n8w/3lJGNMRBCl2F7juAJPqGtfHOT0GXhmLHeGNG8kAes6lDnIvEn0H4rhOTbr1S4kkEkzSbNFqPwzI3/8iCTzn8/LsJLo2RLFtQdoy8hEHjcNAet+iPeoyrWXHCNPbpTFQhnxNd2Q+pmkfcoK3/2gLQ7arUhNn07MeT5hf4o4FEbisKP+MuU60tJd/UkKP6BKtIzP8VTBBmXQoI8bi4+poI94UUVjPFwpLgiWbFjHdZgaPW9zT7ioI5A7SLd8mFKj4s0vW3Ragf8AiJdwXE7NbSXnXHYaYM/qJ0hLdIzKJZrgZ+fc4bwxgafQXF3VURVnPfmXNLafT2tO4veXD0ta1vWUFb746fEJvFMhqj31YeNmnN0m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"); var rawDataPart = new RawDataPart() { Type = "/RawData/PreviewImage", MimeType = MimeType.Jpeg.Code, FileName = "preview_{0}".FormatWith(clue.OriginEntityCode.Key), RawDataMD5 = FileHashUtility.GetMD5Base64String(iconBytes), RawData = Convert.ToBase64String(iconBytes) }; clue.Details.RawData.Add(rawDataPart); clue.Data.EntityData.PreviewImage = new ImageReferencePart(rawDataPart, 128, 128); this.providerRoot = clue; return(this.CreateEntityReference(clue, EntityType.Organization, "CluedIn", EntityEdgeType.UsedBy, this.organisationID, p => p.ToString())); }
public RawDataPart FetchAsRawDataPart(RestRequest request, string type, string filename) { RawDataPart rawDataPart = null; try { var data = _client.DownloadData(request); rawDataPart = new RawDataPart { Type = type, MimeType = CluedIn.Core.FileTypes.MimeType.Jpeg.Code, FileName = filename, RawDataMD5 = FileHashUtility.GetMD5Base64String(data), RawData = Convert.ToBase64String(data) }; } catch (Exception exception) { _log.Warn(() => "Could not download HubSpot thumbnail", exception); } return(rawDataPart); }
protected override Clue ConfigureProviderRoot([NotNull] Clue clue) { if (clue == null) { throw new ArgumentNullException(nameof(clue)); } clue.ValidationRuleSuppressions.Add(Constants.Validation.Rules.PROPERTIES_001_MustExist); var data = clue.Data.EntityData; data.Name = DropBoxConstants.CrawlerName; data.Uri = new Uri(DropBoxConstants.Uri); data.Description = DropBoxConstants.CrawlerDescription; data.DisplayName = DropBoxConstants.CrawlerDisplayName; // data.LastChangedBy = new PersonReference(new EntityCode(EntityType.Infrastructure.User, "CluedIn", userId.ToString())); TODO Figure out how we get user Id data.Codes.Add(new EntityCode(EntityType.Product, "CluedIn", "DropBox")); var iconBytes = GetIcon(); var rawDataPart = new RawDataPart { Type = "/RawData/PreviewImage", MimeType = MimeType.Jpeg.Code, FileName = "preview_{0}".FormatWith(clue.OriginEntityCode.Key), RawDataMD5 = FileHashUtility.GetMD5Base64String(iconBytes), RawData = Convert.ToBase64String(iconBytes) }; clue.Details.RawData.Add(rawDataPart); clue.Data.EntityData.PreviewImage = new ImageReferencePart(rawDataPart, 128, 128); ProviderRoot = clue; return(clue); }
protected override Clue MakeClueImpl([NotNull] User input, Guid accountId) { if (input == null) { throw new ArgumentNullException(nameof(input)); } var clue = _factory.Create(EntityType.Infrastructure.User, input.id.ToString(), accountId); var data = clue.Data.EntityData; if (!string.IsNullOrWhiteSpace(input.screen_name)) { data.Codes.Add(new EntityCode(EntityType.Infrastructure.User, "Twitter", input.screen_name.ToLowerInvariant())); } if (!string.IsNullOrWhiteSpace(input.screen_name)) { data.Name = input.name.ToString(); } if (!string.IsNullOrWhiteSpace(input.description)) { data.Description = input.description.ToString(); } if (!string.IsNullOrEmpty(input.created_at)) { if (DateTimeOffset.TryParse(input.created_at, out var createdDate)) { data.CreatedDate = createdDate; } } if (input.profile_image_url != null) { RawDataPart rawDataPart = null; RestClient restClient = new RestClient(input.profile_image_url); var d = restClient.DownloadData(new RestRequest(Method.GET)); rawDataPart = new RawDataPart { Type = "/RawData/PreviewImage", MimeType = CluedIn.Core.FileTypes.MimeType.Jpeg.Code, FileName = "preview_{0}".FormatWith(input.profile_image_url), RawDataMD5 = FileHashUtility.GetMD5Base64String(d), RawData = Convert.ToBase64String(d) }; if (rawDataPart != null) { clue.Details.RawData.Add(rawDataPart); clue.Data.EntityData.PreviewImage = new ImageReferencePart(rawDataPart, 255, 255); } } if (!string.IsNullOrWhiteSpace(input.following_user)) { _factory.CreateOutgoingEntityReference(clue, EntityType.Infrastructure.User, EntityEdgeType.Follows, input, input.following_user.ToLowerInvariant()); } //if (!string.IsNullOrWhiteSpace(input.id)) //{ // _factory.CreateOutgoingEntityReference(clue, EntityType.Announcement, EntityEdgeType.Created, input, input.id); //} var vocab = new TwitterUserVocabulary(); if (!data.OutgoingEdges.Any()) { _factory.CreateEntityRootReference(clue, EntityEdgeType.PartOf); } data.Properties[vocab.id] = input.id.PrintIfAvailable(); data.Properties[vocab.id_str] = input.id_str.PrintIfAvailable(); data.Properties[vocab.name] = input.name.PrintIfAvailable(); data.Properties[vocab.screen_name] = input.screen_name.PrintIfAvailable(); data.Properties[vocab.location] = input.location.PrintIfAvailable(); data.Properties[vocab.profile_location] = input.profile_location.PrintIfAvailable(); data.Properties[vocab.description] = input.description.PrintIfAvailable(); data.Properties[vocab.url] = input.url.PrintIfAvailable(); //data.Properties[vocab.entities] = input.entities.PrintIfAvailable(); data.Properties[vocab.isProtected] = input.isProtected.PrintIfAvailable(); data.Properties[vocab.followers_count] = input.followers_count.PrintIfAvailable(); data.Properties[vocab.friends_count] = input.friends_count.PrintIfAvailable(); data.Properties[vocab.listed_count] = input.listed_count.PrintIfAvailable(); data.Properties[vocab.created_at] = input.created_at.PrintIfAvailable(); data.Properties[vocab.favourites_count] = input.favourites_count.PrintIfAvailable(); data.Properties[vocab.utc_offset] = input.utc_offset.PrintIfAvailable(); data.Properties[vocab.time_zone] = input.time_zone.PrintIfAvailable(); data.Properties[vocab.geo_enabled] = input.geo_enabled.PrintIfAvailable(); data.Properties[vocab.verified] = input.verified.PrintIfAvailable(); data.Properties[vocab.statuses_count] = input.statuses_count.PrintIfAvailable(); data.Properties[vocab.lang] = input.lang.PrintIfAvailable(); data.Properties[vocab.contributors_enabled] = input.contributors_enabled.PrintIfAvailable(); data.Properties[vocab.is_translator] = input.is_translator.PrintIfAvailable(); data.Properties[vocab.is_translation_enabled] = input.is_translation_enabled.PrintIfAvailable(); data.Properties[vocab.profile_background_color] = input.profile_background_color.PrintIfAvailable(); data.Properties[vocab.profile_background_image_url] = input.profile_background_image_url.PrintIfAvailable(); data.Properties[vocab.profile_background_image_url_https] = input.profile_background_image_url_https.PrintIfAvailable(); data.Properties[vocab.profile_background_tile] = input.profile_background_tile.PrintIfAvailable(); data.Properties[vocab.profile_image_url] = input.profile_image_url.PrintIfAvailable(); data.Properties[vocab.profile_image_url_https] = input.profile_image_url_https.PrintIfAvailable(); data.Properties[vocab.profile_banner_url] = input.profile_banner_url.PrintIfAvailable(); data.Properties[vocab.profile_link_color] = input.profile_link_color.PrintIfAvailable(); data.Properties[vocab.profile_sidebar_border_color] = input.profile_sidebar_border_color.PrintIfAvailable(); data.Properties[vocab.profile_sidebar_fill_color] = input.profile_sidebar_fill_color.PrintIfAvailable(); data.Properties[vocab.profile_text_color] = input.profile_text_color.PrintIfAvailable(); data.Properties[vocab.profile_use_background_image] = input.profile_use_background_image.PrintIfAvailable(); data.Properties[vocab.has_extended_profile] = input.has_extended_profile.PrintIfAvailable(); data.Properties[vocab.default_profile] = input.default_profile.PrintIfAvailable(); data.Properties[vocab.default_profile_image] = input.default_profile_image.PrintIfAvailable(); data.Properties[vocab.following] = input.following.PrintIfAvailable(); data.Properties[vocab.follow_request_sent] = input.follow_request_sent.PrintIfAvailable(); data.Properties[vocab.notifications] = input.notifications.PrintIfAvailable(); data.Properties[vocab.translator_type] = input.translator_type.PrintIfAvailable(); return(clue); }
protected override Clue MakeClueImpl(Employee input, Guid id) { var clue = _factory.Create("/Employee", input.EmployeeId, id); var data = clue.Data.EntityData; var vocab = new EmployeeVocabulary(); //if (!string.IsNullOrEmpty(input.Degree)) //{ // data.Name = input.Degree; //} if (input.Names != null) { if (input.Names.Any()) { data.Name = string.Format("{0} {1}", input.Names.First().FirstName, input.Names.First().LastName); //foreach(var name in input.Names) //{ // data.Aliases.Add(name.); //} } } if (input.EmploymentInfo != null) { data.Properties[vocab.BusinessTitle] = input.EmploymentInfo.BusinessTitle.PrintIfAvailable(); data.Properties[vocab.CustomGroupA] = input.EmploymentInfo.CustomGroupA.PrintIfAvailable(); data.Properties[vocab.CustomGroupB] = input.EmploymentInfo.CustomGroupB.PrintIfAvailable(); data.Properties[vocab.Department] = input.EmploymentInfo.Department.PrintIfAvailable(); data.Properties[vocab.EffectiveDate] = input.EmploymentInfo.EffectiveDate.PrintIfAvailable(); data.Properties[vocab.EmployeeClass] = input.EmploymentInfo.EmployeeClass.PrintIfAvailable(); data.Properties[vocab.EmployeeType] = input.EmploymentInfo.EmployeeType.PrintIfAvailable(); data.Properties[vocab.EmploymentStatus] = input.EmploymentInfo.EmploymentStatus.PrintIfAvailable(); data.Properties[vocab.EventCode] = input.EmploymentInfo.EventCode.PrintIfAvailable(); data.Properties[vocab.EventDesc] = input.EmploymentInfo.EventDesc.PrintIfAvailable(); data.Properties[vocab.FlsaCode] = input.EmploymentInfo.FlsaCode.PrintIfAvailable(); data.Properties[vocab.JobCode] = input.EmploymentInfo.JobCode.PrintIfAvailable(); data.Properties[vocab.Location] = input.EmploymentInfo.Location.PrintIfAvailable(); data.Properties[vocab.PayGroup] = input.EmploymentInfo.PayGroup.PrintIfAvailable(); data.Properties[vocab.ReasonCode] = input.EmploymentInfo.ReasonCode.PrintIfAvailable(); data.Properties[vocab.ReasonDesc] = input.EmploymentInfo.ReasonDesc.PrintIfAvailable(); data.Properties[vocab.RegularTemporary] = input.EmploymentInfo.RegularTemporary.PrintIfAvailable(); data.Properties[vocab.ServiceDate] = input.EmploymentInfo.ServiceDate.PrintIfAvailable(); data.Properties[vocab.StandardHours] = input.EmploymentInfo.StandardHours.PrintIfAvailable(); data.Properties[vocab.Supervisor] = input.EmploymentInfo.Supervisor.PrintIfAvailable(); data.Properties[vocab.TerminationDate] = input.EmploymentInfo.TerminationDate.PrintIfAvailable(); data.Properties[vocab.WorkEmail] = input.EmploymentInfo.WorkEmail.PrintIfAvailable(); if (input.EmploymentInfo.WorkEmail != null) { var code = new EntityCode("/Employee", "CluedIn", input.EmploymentInfo.WorkEmail); data.Codes.Add(code); } data.Properties[vocab.WorkersCompCode] = input.EmploymentInfo.WorkersCompCode.PrintIfAvailable(); data.Properties[vocab.WorkPhone] = input.EmploymentInfo.WorkPhone.PrintIfAvailable(); } data.Properties[vocab.AlternateId] = input.AlternateId.PrintIfAvailable(); data.Properties[vocab.EmployeeId] = input.EmployeeId.PrintIfAvailable(); if (input.EmployeePhoto != null) { if (!string.IsNullOrEmpty(input.EmployeePhoto.Uri)) { RawDataPart rawDataPart = null; try { var download = new RestClient().DownloadData(new RestRequest(input.EmployeePhoto.Uri)); rawDataPart = new RawDataPart { Type = "/RawData/PreviewImage", MimeType = input.EmployeePhoto.MimeType, FileName = input.EmployeePhoto.Uri, RawDataMD5 = FileHashUtility.GetMD5Base64String(download), RawData = Convert.ToBase64String(download) }; if (rawDataPart != null) { clue.Details.RawData.Add(rawDataPart); clue.Data.EntityData.PreviewImage = new ImageReferencePart(rawDataPart, 255, 255); } } catch (Exception exception) { _log.LogWarning(exception, "Could not download Trinet Photo Url for Employee"); } } if (!data.OutgoingEdges.Any()) { _factory.CreateEntityRootReference(clue, EntityEdgeType.PartOf); } } return(clue); }
protected void PopulateContact(Clue clue, ContactModel contact, ExchangeService service) { var value = contact.Object; var data = clue.Data.EntityData; data.Name = value.ExPrintIfAvailable(v => v.DisplayName); data.CreatedDate = value.ExGetIfAvailable(v => v.DateTimeCreated, data.CreatedDate); data.Culture = CultureInfo.InvariantCulture; this.PopulateItem(clue, contact, ExchangeSharedMailboxVocabulary.Contact, service); contact.LoadContactSchemaProperties(); data.DisplayName = value.ExPrintIfAvailable(v => v.DisplayName) ?? data.DisplayName; data.Properties[ExchangeSharedMailboxVocabulary.Contact.Alias] = value.ExPrintIfAvailable(v => v.Alias); data.Properties[ExchangeSharedMailboxVocabulary.Contact.AssistantName] = value.ExPrintIfAvailable(v => v.AssistantName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Birthday] = value.ExPrintIfAvailable(v => v.Birthday); data.Properties[ExchangeSharedMailboxVocabulary.Contact.BusinessHomePage] = value.ExPrintIfAvailable(v => v.BusinessHomePage); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Companies] = value.ExPrintIfAvailable(v => v.Companies); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompanyName] = value.ExPrintIfAvailable(v => v.CompanyName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.FullName] = value.ExPrintIfAvailable(v => v.CompleteName?.FullName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.GivenName] = value.ExPrintIfAvailable(v => v.CompleteName?.GivenName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Initials] = value.ExPrintIfAvailable(v => v.CompleteName?.Initials); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.MiddleName] = value.ExPrintIfAvailable(v => v.CompleteName?.MiddleName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.NickName] = value.ExPrintIfAvailable(v => v.CompleteName?.NickName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Suffix] = value.ExPrintIfAvailable(v => v.CompleteName?.Suffix); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Surname] = value.ExPrintIfAvailable(v => v.CompleteName?.Surname); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Title] = value.ExPrintIfAvailable(v => v.CompleteName?.Title); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.YomiGivenName] = value.ExPrintIfAvailable(v => v.CompleteName?.YomiGivenName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.YomiSurname] = value.ExPrintIfAvailable(v => v.CompleteName?.YomiSurname); data.Properties[ExchangeSharedMailboxVocabulary.Contact.ContactSource] = value.ExPrintIfAvailable(v => v.ContactSource); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Department] = value.ExPrintIfAvailable(v => v.Department); data.Properties[ExchangeSharedMailboxVocabulary.Contact.DirectoryId] = value.ExPrintIfAvailable(v => v.DirectoryId); data.Properties[ExchangeSharedMailboxVocabulary.Contact.DisplayName] = value.ExPrintIfAvailable(v => v.DisplayName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.FileAs] = value.ExPrintIfAvailable(v => v.FileAs); data.Properties[ExchangeSharedMailboxVocabulary.Contact.FileAsMapping] = value.ExPrintIfAvailable(v => v.FileAsMapping != FileAsMapping.None ? v.FileAsMapping.ToString() : null); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Generation] = value.ExPrintIfAvailable(v => v.Generation); data.Properties[ExchangeSharedMailboxVocabulary.Contact.GivenName] = value.ExPrintIfAvailable(v => v.GivenName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.HasPicture] = value.ExPrintIfAvailable(v => v.HasPicture); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Initials] = value.ExPrintIfAvailable(v => v.Initials); data.Properties[ExchangeSharedMailboxVocabulary.Contact.JobTitle] = value.ExPrintIfAvailable(v => v.JobTitle); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Manager] = value.ExPrintIfAvailable(v => v.Manager); data.Properties[ExchangeSharedMailboxVocabulary.Contact.MiddleName] = value.ExPrintIfAvailable(v => v.MiddleName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Mileage] = value.ExPrintIfAvailable(v => v.Mileage); data.Properties[ExchangeSharedMailboxVocabulary.Contact.NickName] = value.ExPrintIfAvailable(v => v.NickName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Notes] = value.ExPrintIfAvailable(v => v.Notes); data.Properties[ExchangeSharedMailboxVocabulary.Contact.OfficeLocation] = value.ExPrintIfAvailable(v => v.OfficeLocation); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneticFirstName] = value.ExPrintIfAvailable(v => v.PhoneticFirstName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneticFullName] = value.ExPrintIfAvailable(v => v.PhoneticFullName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneticLastName] = value.ExPrintIfAvailable(v => v.PhoneticLastName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PostalAddressIndex] = value.ExPrintIfAvailable(v => v.PostalAddressIndex); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Profession] = value.ExPrintIfAvailable(v => v.Profession); data.Properties[ExchangeSharedMailboxVocabulary.Contact.SpouseName] = value.ExPrintIfAvailable(v => v.SpouseName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Surname] = value.ExPrintIfAvailable(v => v.Surname); data.Properties[ExchangeSharedMailboxVocabulary.Contact.WeddingAnniversary] = value.ExPrintIfAvailable(v => v.WeddingAnniversary); // EmailAddresses try { var emails = contact.GetEmailAddresses(); var filteredEmails = contact.GetSmtpEmailAddresses(emails).ToList(); if (filteredEmails.Any()) { data.Properties[ExchangeSharedMailboxVocabulary.Contact.EmailAddress] = filteredEmails.First(); if (filteredEmails.Count > 1) { data.Properties[ExchangeSharedMailboxVocabulary.Contact.EmailAddresses] = string.Join(";", filteredEmails); } data.Aliases.AddRange(filteredEmails); } clue.Data.EntityData.Codes.AddRange(contact.CreateEntityCodesFromEmailAddresses(emails)); } catch (ServiceObjectPropertyException e) { this.state.Log.Warn(() => "Could not get email addresses", e); } // PhoneNumbers { data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.AssistantPhone] = GetPhoneNumber(value, PhoneNumberKey.AssistantPhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessFax] = GetPhoneNumber(value, PhoneNumberKey.BusinessFax); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessPhone] = GetPhoneNumber(value, PhoneNumberKey.BusinessPhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessPhone2] = GetPhoneNumber(value, PhoneNumberKey.BusinessPhone2); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Callback] = GetPhoneNumber(value, PhoneNumberKey.Callback); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.CarPhone] = GetPhoneNumber(value, PhoneNumberKey.CarPhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.CompanyMainPhone] = GetPhoneNumber(value, PhoneNumberKey.CompanyMainPhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.HomeFax] = GetPhoneNumber(value, PhoneNumberKey.HomeFax); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.HomePhone] = GetPhoneNumber(value, PhoneNumberKey.HomePhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.HomePhone2] = GetPhoneNumber(value, PhoneNumberKey.HomePhone2); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Isdn] = GetPhoneNumber(value, PhoneNumberKey.Isdn); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.MobilePhone] = GetPhoneNumber(value, PhoneNumberKey.MobilePhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.OtherFax] = GetPhoneNumber(value, PhoneNumberKey.OtherFax); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessFax] = GetPhoneNumber(value, PhoneNumberKey.BusinessFax); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Pager] = GetPhoneNumber(value, PhoneNumberKey.Pager); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.OtherTelephone] = GetPhoneNumber(value, PhoneNumberKey.OtherTelephone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.RadioPhone] = GetPhoneNumber(value, PhoneNumberKey.RadioPhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Telex] = GetPhoneNumber(value, PhoneNumberKey.Telex); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.TtyTddPhone] = GetPhoneNumber(value, PhoneNumberKey.TtyTddPhone); } // DirectoryPhoto try { var version = (int)contact.Service.RequestedServerVersion; var additional = new List <PropertyDefinitionBase>() { ContactSchema.Photo }; var filtered = additional.Where(p => ((int)p.Version) <= version).ToArray(); if (filtered.Any()) { var tmp = new PropertySet(BasePropertySet.FirstClassProperties, filtered.Concat(new[] { ItemSchema.Attachments })); if (value.Id != null) { value.ExLoad(this.state, tmp); } var directoryPhoto = value.ExGetIfAvailable(v => v.DirectoryPhoto, null); if (directoryPhoto != null) { using (var stream = new MemoryStream(directoryPhoto)) { var mimeType = FileCrawlingUtility.DetectMimeType(new FileInfo("PreviewImage"), new DataPart(), stream, this.state); if (mimeType.FileDescriptor.Category == FileCategory.ImageBitmap) { var rawDataPart = new RawDataPart() { Type = "/RawData/PreviewImage", MimeType = mimeType.Code, FileName = "preview_{0}".FormatWith(data.OriginEntityCode.Key), RawDataMD5 = FileHashUtility.GetMD5Base64String(directoryPhoto), RawData = Convert.ToBase64String(directoryPhoto) }; clue.Details.RawData.Add(rawDataPart); data.PreviewImage = new ImageReferencePart(rawDataPart); } else { this.state.Log.Info(() => $"DirectoryPhoto is not an image: {mimeType.Code}"); } } } } if (value.Attachments != null) { var contactPhotos = value.Attachments.Where(a => a is FileAttachment && ((FileAttachment)a).IsContactPhoto).Cast <FileAttachment>().ToList(); var contactPhoto = contactPhotos.FirstOrDefault(); if (contactPhoto != null) { using (var tempFile = new TemporaryFile(contactPhoto.Name)) { contactPhoto.ExLoad(this.state, tempFile.FilePath); var mimeType = tempFile.FileInfo.ToMimeType(); using (var stream = File.OpenRead(tempFile.FilePath)) { mimeType = FileCrawlingUtility.DetectMimeType(tempFile.FileInfo, new DataPart(), stream, this.state); } if (mimeType.FileDescriptor.Category == FileCategory.ImageBitmap) { using (var stream = File.OpenRead(tempFile.FilePath)) { var bytes = stream.ToArray(); var rawDataPart = new RawDataPart() { Type = "/RawData/PreviewImage", MimeType = mimeType.Code, FileName = "preview_{0}".FormatWith(data.OriginEntityCode.Key), RawDataMD5 = FileHashUtility.GetMD5Base64String(bytes), RawData = Convert.ToBase64String(bytes) }; clue.Details.RawData.Add(rawDataPart); data.PreviewImage = new ImageReferencePart(rawDataPart); } } else { this.state.Log.Info(() => $"ContactPhoto is not an image: {mimeType.Code}"); } } } } } catch (OperationCanceledException) { } catch (Exception e) { this.state.Log.Warn(() => "Could not get DirectoryPhoto", e); } }
protected override Clue MakeClueImpl(Candidate input, Guid id) { var clue = _factory.Create("/Candidate", input.Id.ToString(), id); var data = clue.Data.EntityData; var vocab = new CandidateVocabulary(); if (!string.IsNullOrEmpty(input.FirstName) && !string.IsNullOrEmpty(input.LastName)) { data.Name = string.Format("{0}{1}", input.FirstName, input.LastName); } DateTimeOffset modifiedDate; if (DateTimeOffset.TryParse(input.UpdatedAt.ToString(), out modifiedDate)) { data.ModifiedDate = modifiedDate; } DateTimeOffset createdDate; if (DateTimeOffset.TryParse(input.CreatedAt.ToString(), out createdDate)) { data.CreatedDate = createdDate; } if (input.Tags != null) { foreach (var tag in input.Tags) { data.Tags.Add(new Tag(tag.ToString())); } } if (input.SocialMediaAddresses != null) { foreach (var socialMediaAddress in input.SocialMediaAddresses) { data.Aliases.Add(socialMediaAddress.ToString()); } } if (input.PhoneNumbers != null) { foreach (var phoneNumbers in input.PhoneNumbers) { data.Aliases.Add(phoneNumbers.ToString()); } } if (input.EmailAddresses != null) { foreach (var emailAddress in input.EmailAddresses) { var code = new EntityCode("/Candidate", "CluedIn", emailAddress.Value); data.Codes.Add(code); } } if (input.Educations != null) { foreach (var education in input.Educations) { _factory.CreateOutgoingEntityReference(clue, "/School", EntityEdgeType.Attended, education, education.Id.ToString()); } } //if (input.Employments != null) // foreach (var employment in input.Employments) // { // _factory.CreateOutgoingEntityReference(clue, "/Placement", EntityEdgeType.Attended, employment, employment.Id.ToString()); // } if (input.Company != null) { _factory.CreateOutgoingEntityReference(clue, EntityType.Organization, EntityEdgeType.Attended, input, input.Company); } if (input.Attachments != null) { foreach (var attachment in input.Attachments) { //You might need to parse this. _factory.CreateOutgoingEntityReference(clue, EntityType.Files.File, EntityEdgeType.PartOf, attachment, attachment.Url.ToString()); } } if (input.Applications != null) { foreach (var application in input.ApplicationIds) { _factory.CreateOutgoingEntityReference(clue, "/Application", EntityEdgeType.For, application, application.ToString()); } } if (input.Addresses != null) { foreach (var address in input.Addresses) { _factory.CreateOutgoingEntityReference(clue, EntityType.Location, EntityEdgeType.For, address, address.Value.ToString()); } } data.Properties[vocab.Title] = input.Title.PrintIfAvailable(); data.Properties[vocab.PhotoUrl] = input.PhotoUrl.PrintIfAvailable(); if (input.PhotoUrl != null) { RawDataPart rawDataPart = null; try { var download = new RestClient().DownloadData(new RestRequest(input.PhotoUrl.ToString())); rawDataPart = new RawDataPart { Type = "/RawData/PreviewImage", MimeType = CluedIn.Core.FileTypes.MimeType.Jpeg.Code, FileName = input.PhotoUrl.ToString(), RawDataMD5 = FileHashUtility.GetMD5Base64String(download), RawData = Convert.ToBase64String(download) }; if (rawDataPart != null) { clue.Details.RawData.Add(rawDataPart); clue.Data.EntityData.PreviewImage = new ImageReferencePart(rawDataPart, 255, 255); } } catch (Exception exception) { _log.LogWarning(exception, "Could not download Greenhouse Photo Url for Candidate"); } } data.Properties[vocab.LastName] = input.LastName.PrintIfAvailable(); data.Properties[vocab.LastActivity] = input.LastActivity.ToString().PrintIfAvailable(); data.Properties[vocab.Coordinator] = input.Coordinator.PrintIfAvailable(); data.Properties[vocab.CanEmail] = input.CanEmail.PrintIfAvailable(); data.Properties[vocab.FirstName] = input.FirstName.PrintIfAvailable(); if (!data.OutgoingEdges.Any()) { _factory.CreateEntityRootReference(clue, EntityEdgeType.PartOf); } return(clue); }
protected override Clue MakeClueImpl([NotNull] FileMetadata input, Guid accountId) { if (input == null) { throw new ArgumentNullException(nameof(input)); } var clue = _factory.Create(EntityType.Files.File, input.PathLower, accountId); clue.ValidationRuleSuppressions.Add(Constants.Validation.Rules.DATA_001_File_MustBeIndexed); var data = clue.Data.EntityData; var value = input.AsFile; if (value.Name != null) { data.Name = value.Name; data.DisplayName = value.Name; data.Properties[DropBoxVocabulary.File.ItemName] = value.Name; } data.DocumentSize = (long)value.Size; data.ModifiedDate = value.ServerModified; try { var url = _uriBuilder.GetUri(value); data.Uri = url; data.Properties[DropBoxVocabulary.File.EditUrl] = url.ToString().Replace("www.dropbox.com/", "www.dropbox.com/ow/msft/edit/").Replace("?preview=", "/").Replace("+", "%20"); } catch (Exception exc) { _log.Warn(() => "Could not create ShareTask Dropbox File", exc); //Handle error } data.Properties[DropBoxVocabulary.File.Bytes] = value.Size.PrintIfAvailable(); data.Properties[DropBoxVocabulary.File.ClientMTime] = value.ClientModified.PrintIfAvailable(); if (value.PathLower != null) { data.Properties[DropBoxVocabulary.File.Path] = value.PathLower.PrintIfAvailable(); _factory.CreateOutgoingEntityReference(clue, EntityType.Files.Directory, "Parent", value, "/" + VirtualPathUtility.GetDirectory(value.PathLower).Trim(_trimChars)); } data.Properties[DropBoxVocabulary.File.Rev] = value.Rev.PrintIfAvailable(); if (value.Rev != null) { data.Revision = value.Rev.ToString(CultureInfo.InvariantCulture); } data.Properties[DropBoxVocabulary.File.ParentSharedFolderId] = value.ParentSharedFolderId.PrintIfAvailable(); _factory.CreateOutgoingEntityReference(clue, EntityType.Provider.Root, EntityEdgeType.ManagedIn, _providerRoot, _providerRoot.OriginEntityCode.Value); var shouldIndexFile = _jobData.FileSizeLimit == null || _jobData.FileSizeLimit.Value == 0 || (long)value.Size < _jobData.FileSizeLimit.Value; var client = _clientFactory.CreateNew(_jobData); if (shouldIndexFile) { try { var indexer = new FileIndexer(client, _state, _context); Task.Run(() => indexer.Index(value, clue).ConfigureAwait(false)); } catch (OperationCanceledException) { } catch (Exception exc) { _log.Warn(() => "Could not index Dropbox File", exc); //Handle error } } if (data.PreviewImage == null) { var extension = string.Empty; try { extension = new FileInfo(input.Name).Extension; } catch (ArgumentException) { } var allowedExtensions = new[] { ".jpg", ".jpeg", ".tif", ".tiff", ".png", ".gif", ".bmp" }.ToHashSet(); if (!string.IsNullOrEmpty(extension) && allowedExtensions.Contains(extension.ToLowerInvariant())) { try { var thumbnail = client.GetThumbnailAsync(value.PathLower, ThumbnailFormat.Jpeg.Instance, ThumbnailSize.W1024h768.Instance).Result; var bytes = thumbnail.GetContentAsByteArrayAsync().Result; var rawDataPart = new RawDataPart { Type = "/RawData/PreviewImage", MimeType = CluedIn.Core.FileTypes.MimeType.Jpeg.Code, FileName = "preview_{0}".FormatWith(data.OriginEntityCode.Key), RawDataMD5 = FileHashUtility.GetMD5Base64String(bytes), RawData = Convert.ToBase64String(bytes) }; clue.Details.RawData.Add(rawDataPart); data.PreviewImage = new ImageReferencePart(rawDataPart); } catch (OperationCanceledException) { } catch (DropboxException exc) { _log.Warn(new { FileExtention = extension }, () => "Could not get thumbnail from Dropbox: " + extension, exc); } } } return(clue); }