From 1bfb3dbab8d58922a9521ea2423c8f14f2077b60 Mon Sep 17 00:00:00 2001
From: Klaus Fischer <klaus.fischer@eloware.com>
Date: Tue, 7 Jun 2022 08:16:43 +0200
Subject: [PATCH] feat: Get OAuth token working from code

---
 E2ETests/E2ETests.csproj              |  4 ++++
 E2ETests/SenderTest.cs                | 11 +++++++++++
 FitConnect/FunctionalBaseClass.cs     | 22 ++++++++++++++++++++++
 FitConnect/Models/OAuthAccessToken.cs | 17 +++++++++++++++++
 4 files changed, 54 insertions(+)
 create mode 100644 FitConnect/Models/OAuthAccessToken.cs

diff --git a/E2ETests/E2ETests.csproj b/E2ETests/E2ETests.csproj
index f6f674dd..5c22f888 100644
--- a/E2ETests/E2ETests.csproj
+++ b/E2ETests/E2ETests.csproj
@@ -15,4 +15,8 @@
         <PackageReference Include="coverlet.collector" Version="3.1.0" />
     </ItemGroup>
 
+    <ItemGroup>
+      <ProjectReference Include="..\FitConnect\FitConnect.csproj" />
+    </ItemGroup>
+
 </Project>
diff --git a/E2ETests/SenderTest.cs b/E2ETests/SenderTest.cs
index fc1e9c85..4482f720 100644
--- a/E2ETests/SenderTest.cs
+++ b/E2ETests/SenderTest.cs
@@ -1,5 +1,6 @@
 using System;
 using System.IO;
+using FitConnect;
 using FluentAssertions;
 using Newtonsoft.Json;
 using NUnit.Framework;
@@ -9,6 +10,7 @@ namespace E2ETests;
 public class SenderTest {
     private string _clientId = "";
     private string _clientSecret = "";
+    private Sender _sender;
 
     [OneTimeSetUp]
     public void OneTimeSetup() {
@@ -37,6 +39,8 @@ public class SenderTest {
 
     [SetUp]
     public void Setup() {
+        _sender = new Sender(null,
+            FitConnectEndpoints.Create(FitConnectEndpoints.EndpointType.Development));
     }
 
     [Test]
@@ -44,4 +48,11 @@ public class SenderTest {
         _clientId.Should().NotBe("00000000-0000-0000-0000-000000000000");
         _clientSecret.Should().NotBe("0000000000000000000000000000000000000000000");
     }
+
+    [Test]
+    public void GetAccessToken() {
+        var token = _sender.GetTokenAsync(_clientId, _clientSecret).Result;
+        token.Should().NotBeNull();
+        token.ExpiresIn.Should().Be(1800);
+    }
 }
diff --git a/FitConnect/FunctionalBaseClass.cs b/FitConnect/FunctionalBaseClass.cs
index 13ecf7df..9b7ba4c6 100644
--- a/FitConnect/FunctionalBaseClass.cs
+++ b/FitConnect/FunctionalBaseClass.cs
@@ -1,5 +1,7 @@
+using System.Net.Http.Headers;
 using System.Net.Http.Json;
 using System.Text;
+using FitConnect.Models;
 using Microsoft.Extensions.Logging;
 
 namespace FitConnect;
@@ -85,6 +87,26 @@ public class FunctionalBaseClass {
     }
 
 
+    public async Task<OAuthAccessToken?> GetTokenAsync(string clientId, string clientSecret) {
+        var client = new HttpClient();
+        client.DefaultRequestHeaders.Accept.Add(
+            MediaTypeWithQualityHeaderValue.Parse("application/json"));
+        var content = new FormUrlEncodedContent(new[] {
+            new KeyValuePair<string, string>("grant_type", "client_credentials"),
+            new KeyValuePair<string, string>("client_id", clientId),
+            new KeyValuePair<string, string>("client_secret", clientSecret)
+        });
+
+        var request = new HttpRequestMessage(HttpMethod.Post, Endpoints.TokenUrl) {
+            Content = content,
+            Method = HttpMethod.Post
+        };
+
+        var response = await client.SendAsync(request);
+
+        return await response.Content.ReadFromJsonAsync<OAuthAccessToken>();
+    }
+
     private async Task<T?> RestCall<T>(Uri uri, HttpMethod method, string body) {
         var client = new HttpClient();
         client.DefaultRequestHeaders.Add("Accept", "application/json");
diff --git a/FitConnect/Models/OAuthAccessToken.cs b/FitConnect/Models/OAuthAccessToken.cs
new file mode 100644
index 00000000..87ac3872
--- /dev/null
+++ b/FitConnect/Models/OAuthAccessToken.cs
@@ -0,0 +1,17 @@
+using System.Text.Json.Serialization;
+
+namespace FitConnect.Models;
+
+public class OAuthAccessToken {
+    [JsonPropertyName("access_token")]
+    public string AccessToken { get; set; }
+
+    [JsonPropertyName("scope")]
+    public string Scope { get; set; }
+
+    [JsonPropertyName("token_type")]
+    public string TokenType { get; set; }
+
+    [JsonPropertyName("expires_in")]
+    public int ExpiresIn { get; set; }
+}
-- 
GitLab