From a2526e46aa3b117e067ca7281d9393661bc6c02b Mon Sep 17 00:00:00 2001 From: NRG-Drink Date: Thu, 23 May 2024 17:30:33 +0200 Subject: [PATCH 1/3] feat: find user by mail and user-principle-name --- .../CalendarFinderService.cs | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/NRG.CalendarFinder/NRG.CalendarFinder/CalendarFinderService.cs b/NRG.CalendarFinder/NRG.CalendarFinder/CalendarFinderService.cs index eb14245..1bd0e78 100644 --- a/NRG.CalendarFinder/NRG.CalendarFinder/CalendarFinderService.cs +++ b/NRG.CalendarFinder/NRG.CalendarFinder/CalendarFinderService.cs @@ -1,5 +1,6 @@ using Microsoft.Graph; using Microsoft.Graph.Models; +using Microsoft.Graph.Models.ODataErrors; using NRG.CalendarFinder.MsGraphFactories; namespace NRG.CalendarFinder; @@ -15,7 +16,7 @@ public async Task FindUserAsyncOrThrow(string userIdentifier) throw new ArgumentException(userIdentifier, nameof(userIdentifier)); } - var user = await _graph.Users[userIdentifier].GetAsync(); + var user = await TryFindUser(userIdentifier); if (user is null || user.Id is null) { @@ -25,6 +26,58 @@ public async Task FindUserAsyncOrThrow(string userIdentifier) return user; } + private async Task TryFindUser(string userIdentifier) + { + try + { + return await GetUserByIdentifier(userIdentifier); + } + catch (ODataError _) + { + var nickname = GetMailNickname(userIdentifier); + + var mailUser = await GetUserByMail(nickname); + if (mailUser is not null) + { + return mailUser; + } + + var principleUser = await GetUserByPrincipleName(nickname); + + return principleUser; + } + } + + private static string GetMailNickname(string userIdentifier) + => userIdentifier + .Split("@") + .FirstOrDefault() + ?? userIdentifier; + + private async Task GetUserByPrincipleName(string nickname) + { + var users = await _graph.Users.GetAsync(e => + { + e.QueryParameters.Filter = $"startsWith(userPrincipleName,'{nickname}')"; + }); + + return users?.Value?.FirstOrDefault(); + } + + private async Task GetUserByMail(string nickname) + { + var users = await _graph.Users.GetAsync(e => + { + e.QueryParameters.Filter = $"startsWith(mail,'{nickname}')"; + }); + + return users?.Value?.FirstOrDefault(); + } + + + private Task GetUserByIdentifier(string userIdentifier) + => _graph.Users[userIdentifier].GetAsync(); + public async Task> FindCalendarsAsyncOrThrow(User user) { var calendarResponse = await _graph.Users[user.Id ?? user.Mail].Calendars.GetAsync(); From bc0248db79b36fdcd137912718cc28e0236ebb47 Mon Sep 17 00:00:00 2001 From: NRG-Drink Date: Thu, 23 May 2024 17:52:57 +0200 Subject: [PATCH 2/3] chore: find by whole mail first --- .../NRG.CalendarFinder/CalendarFinderService.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/NRG.CalendarFinder/NRG.CalendarFinder/CalendarFinderService.cs b/NRG.CalendarFinder/NRG.CalendarFinder/CalendarFinderService.cs index 1bd0e78..82a76d9 100644 --- a/NRG.CalendarFinder/NRG.CalendarFinder/CalendarFinderService.cs +++ b/NRG.CalendarFinder/NRG.CalendarFinder/CalendarFinderService.cs @@ -34,14 +34,20 @@ public async Task FindUserAsyncOrThrow(string userIdentifier) } catch (ODataError _) { - var nickname = GetMailNickname(userIdentifier); - - var mailUser = await GetUserByMail(nickname); + var mailUser = await GetUserByMail(userIdentifier); if (mailUser is not null) { return mailUser; } + var nickname = GetMailNickname(userIdentifier); + + var mailNicknameUser = await GetUserByMail(nickname); + if (mailNicknameUser is not null) + { + return mailNicknameUser; + } + var principleUser = await GetUserByPrincipleName(nickname); return principleUser; From a0a61f960b0ccfc6eef5f2244603555004def354 Mon Sep 17 00:00:00 2001 From: NRG-Drink Date: Thu, 23 May 2024 17:53:32 +0200 Subject: [PATCH 3/3] docs: change readme to new scenario #12 --- README.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++----- image-1.png | Bin 38627 -> 0 bytes 2 files changed, 68 insertions(+), 6 deletions(-) delete mode 100644 image-1.png diff --git a/README.md b/README.md index bd43945..f10edf3 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,80 @@ The `CalendarFinder` is an app to find all calendars of a user and some user-data in an easy way without making any `http` requests in ms-graph. ## Usage -In the example below, the calendars for the `UserPrincipalName` 'aula@iseschool.ch are found. -### Query -In this section, the parameters the exe is calles with are listed. -### Result -In this section, the found values are listed. +1. Create a file (like mydata.json) put the `Azure Ad App` Registration and your user-identifiers as shown in the example. +2. Start the app with the input file (step 1) as parameter. +3. The result file (like mydata.result.json) will be opened in `Visual Studio Code` automatically. + ### Example -![alt text](image-1.png) +#### Input Data As Json +```json +{ + "MsGraphClients": [ + { + "TenantId": "adzure_ad_app_tenant_guid", + "ClientId": "adzure_ad_app_client_guid", + "Thumbprint": "certificate_thumbprint", + "Scopes": null + } + ], + "UserIdentifier": [ + "my_guid_user_identifier", + "my_user_principle_name_identifier", + "my_user_mail_identifier" + ] +} +``` +#### Start Process (CMD) +```cmd +> NRG.CalendarFinder.exe -f mydata.json +``` +#### Result Data As Json +```json +[ + { + "Input": { + "UserIdentifier": "my_input_user_identifier" + }, + "User": { + "DisplayName": "output_display_name", + "PrincipalName": "output_user_principla_name", + "Mail": "output_user_mail", + "UserId": "output_user_guid", + "CalendarId": "only_or_default_calendar_id" + }, + "Calendars": [ + { + "Id": "calendar_id", + "Name": "calendar_name", + "Owner": "owner_mail", + "IsDefault": true + } + ] + } + { + ... + } +] +``` ## Needs - [Appregistration (Azure Ad App)](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app) - Necessary Permissions on the App (Azure Ad App) +## Nice To Know +### Need Help In Console To Use The App? +Type `--help` to see the help text and the required and optional arguments. +### Supress File Opening After Finish +To not open the file in `Visual Studio Code` after finish searching, use the command with the argument `-e false` (e is for editor). +### How Are The Users Found? +By default `ms-graph` allows to find users directly by providing the user-id or user-principle-name. +That's how this order came about: +1. user-id / user-principle-name +2. user-mail +3. user-mail-nickname\* +4. user-principle-nickname\* +\**the mail-nickname is the part left of the @ in the mail-address (nickname@provider.com -> nickname)* + ## Used Libraries - [Command Line Parser](https://github.com/commandlineparser/commandline) - [Ms Graph](https://github.com/microsoftgraph/msgraph-sdk-dotnet) diff --git a/image-1.png b/image-1.png deleted file mode 100644 index bab657e9a3281c8c52f08ec1f0007b13d42d7392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38627 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