|
3 | 3 | using System.Text.Json; |
4 | 4 | using Microsoft.AspNetCore.Builder; |
5 | 5 | using Microsoft.AspNetCore.Http; |
6 | | -using Microsoft.Extensions.Caching.Memory; |
7 | 6 | using Microsoft.Extensions.DependencyInjection; |
8 | 7 | using Withings.NET.Client; |
9 | 8 | using Withings.NET.Models; |
10 | 9 |
|
11 | 10 | var builder = WebApplication.CreateBuilder(args); |
12 | | -builder.Services.AddMemoryCache(); |
13 | | -var app = builder.Build(); |
| 11 | + |
| 12 | +// Add services to the container. |
| 13 | +builder.Services.AddDistributedMemoryCache(); |
| 14 | +builder.Services.AddSession(options => |
| 15 | +{ |
| 16 | + options.IdleTimeout = TimeSpan.FromMinutes(30); |
| 17 | + options.Cookie.HttpOnly = true; |
| 18 | + options.Cookie.IsEssential = true; |
| 19 | +}); |
14 | 20 |
|
15 | 21 | var credentials = new WithingsCredentials(); |
16 | 22 | credentials.SetCallbackUrl(Environment.GetEnvironmentVariable("WithingsCallbackUrl")); |
17 | 23 | credentials.SetConsumerProperties( |
18 | 24 | Environment.GetEnvironmentVariable("WithingsConsumerKey"), |
19 | 25 | Environment.GetEnvironmentVariable("WithingsConsumerSecret")); |
20 | 26 |
|
21 | | -var authenticator = new Authenticator(credentials); |
22 | | -var session = new Dictionary<string, string>(); |
| 27 | +builder.Services.AddSingleton(credentials); |
| 28 | +builder.Services.AddSingleton<Authenticator>(); |
| 29 | +builder.Services.AddSingleton<WithingsClient>(); |
| 30 | + |
| 31 | +var app = builder.Build(); |
23 | 32 |
|
24 | | -var activityStartDate = new DateTime(2017, 1, 1); |
25 | | -var activityEndDate = new DateTime(2017, 3, 30); |
26 | | -var bodyStartDate = new DateTime(2017, 5, 8); |
27 | | -var bodyEndDate = new DateTime(2017, 5, 10); |
| 33 | +app.UseSession(); |
28 | 34 |
|
29 | 35 | app.MapGet("/", () => Results.Redirect("/api/oauth/authorize", permanent: true)); |
30 | 36 |
|
31 | | -app.MapGet("/api/oauth/authorize", () => |
| 37 | +app.MapGet("/api/oauth/authorize", (HttpContext context, Authenticator authenticator) => |
32 | 38 | { |
33 | 39 | var state = Guid.NewGuid().ToString(); |
34 | | - session["State"] = state; |
| 40 | + context.Session.SetString("State", state); |
35 | 41 | var scope = "user.info,user.metrics,user.activity"; |
36 | 42 | var url = authenticator.GetAuthCodeUrl(scope, state); |
37 | 43 | return Results.Redirect(url); |
38 | 44 | }); |
39 | 45 |
|
40 | | -app.MapGet("/api/oauth/callback", async (HttpContext context) => |
| 46 | +app.MapGet("/api/oauth/callback", async (HttpContext context, Authenticator authenticator) => |
41 | 47 | { |
42 | 48 | var query = context.Request.Query; |
43 | 49 |
|
|
49 | 55 | if (string.IsNullOrWhiteSpace(state)) |
50 | 56 | return Results.BadRequest("Missing required query parameter 'state'."); |
51 | 57 |
|
52 | | - if (!session.TryGetValue("State", out var storedState) || storedState != state) |
| 58 | + var storedState = context.Session.GetString("State"); |
| 59 | + if (string.IsNullOrEmpty(storedState) || storedState != state) |
53 | 60 | return Results.BadRequest("Invalid state."); |
54 | 61 |
|
55 | 62 | var token = await authenticator.GetAccessToken(code); |
56 | 63 |
|
57 | | - session["AccessToken"] = token.AccessToken; |
58 | | - session["RefreshToken"] = token.RefreshToken; |
59 | | - session["UserId"] = token.UserId; |
| 64 | + context.Session.SetString("AccessToken", token.AccessToken); |
| 65 | + context.Session.SetString("RefreshToken", token.RefreshToken); |
| 66 | + context.Session.SetString("UserId", token.UserId); |
60 | 67 |
|
61 | 68 | return Results.Json(token); |
62 | 69 | }); |
63 | 70 |
|
64 | | -app.MapGet("/api/withings/activity", async (IMemoryCache cache) => |
| 71 | +app.MapGet("/api/withings/activity", async (HttpContext context, WithingsClient client) => |
65 | 72 | { |
66 | | - var start = DateTime.Parse("2017-01-01"); |
67 | | - var end = DateTime.Parse("2017-03-30"); |
68 | | - var userId = session["UserId"]; |
69 | | - var accessToken = session["AccessToken"]; |
70 | | - |
71 | | - var key = $"activity_{userId}_{start:yyyyMMdd}_{end:yyyyMMdd}"; |
72 | | - |
73 | | - var activity = await cache.GetOrCreateAsync(key, async entry => |
74 | | - { |
75 | | - var client = new WithingsClient(credentials); |
76 | | - entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10); |
77 | | - return await client.GetActivityMeasures( |
78 | | - start, |
79 | | - end, |
80 | | - userId, |
81 | | - accessToken); |
82 | | - }); |
| 73 | + var userId = context.Session.GetString("UserId"); |
| 74 | + var accessToken = context.Session.GetString("AccessToken"); |
| 75 | + |
| 76 | + if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(accessToken)) |
| 77 | + return Results.Unauthorized(); |
83 | 78 |
|
| 79 | + var activity = await client.GetActivityMeasures( |
| 80 | + DateTime.Parse("2017-01-01"), |
| 81 | + DateTime.Parse("2017-03-30"), |
| 82 | + userId, |
| 83 | + accessToken); |
84 | 84 | return Results.Json(activity); |
85 | 85 | }); |
86 | 86 |
|
87 | | -app.MapGet("/api/withings/dailyactivity", async () => |
| 87 | +app.MapGet("/api/withings/dailyactivity", async (HttpContext context, WithingsClient client) => |
88 | 88 | { |
89 | | - var client = new WithingsClient(credentials); |
| 89 | + var userId = context.Session.GetString("UserId"); |
| 90 | + var accessToken = context.Session.GetString("AccessToken"); |
| 91 | + |
| 92 | + if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(accessToken)) |
| 93 | + return Results.Unauthorized(); |
| 94 | + |
90 | 95 | var activity = await client.GetActivityMeasures( |
91 | 96 | DateTime.Today.AddDays(-30), |
92 | | - session["UserId"], |
93 | | - session["AccessToken"]); |
| 97 | + userId, |
| 98 | + accessToken); |
94 | 99 | return Results.Json(activity); |
95 | 100 | }); |
96 | 101 |
|
97 | | -app.MapGet("/api/withings/sleepsummary", async () => |
| 102 | +app.MapGet("/api/withings/sleepsummary", async (HttpContext context, WithingsClient client) => |
98 | 103 | { |
99 | | - var client = new WithingsClient(credentials); |
| 104 | + var accessToken = context.Session.GetString("AccessToken"); |
| 105 | + if (string.IsNullOrEmpty(accessToken)) |
| 106 | + return Results.Unauthorized(); |
| 107 | + |
100 | 108 | var activity = await client.GetSleepSummary( |
101 | 109 | "2017-01-01", |
102 | 110 | "2017-03-30", |
103 | | - session["AccessToken"]); |
| 111 | + accessToken); |
104 | 112 | return Results.Json(activity); |
105 | 113 | }); |
106 | 114 |
|
107 | | -app.MapGet("/api/withings/workouts", async () => |
| 115 | +app.MapGet("/api/withings/workouts", async (HttpContext context, WithingsClient client) => |
108 | 116 | { |
109 | | - var client = new WithingsClient(credentials); |
| 117 | + var accessToken = context.Session.GetString("AccessToken"); |
| 118 | + if (string.IsNullOrEmpty(accessToken)) |
| 119 | + return Results.Unauthorized(); |
| 120 | + |
110 | 121 | var activity = await client.GetWorkouts( |
111 | 122 | "2017-06-01", |
112 | 123 | "2017-06-05", |
113 | | - session["AccessToken"]); |
| 124 | + accessToken); |
114 | 125 | return Results.Json(activity); |
115 | 126 | }); |
116 | 127 |
|
117 | | -app.MapGet("/api/withings/sleepmeasures", async () => |
| 128 | +app.MapGet("/api/withings/sleepmeasures", async (HttpContext context, WithingsClient client) => |
118 | 129 | { |
119 | | - var client = new WithingsClient(credentials); |
| 130 | + var userId = context.Session.GetString("UserId"); |
| 131 | + var accessToken = context.Session.GetString("AccessToken"); |
| 132 | + |
| 133 | + if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(accessToken)) |
| 134 | + return Results.Unauthorized(); |
| 135 | + |
120 | 136 | var activity = await client.GetSleepMeasures( |
121 | | - session["UserId"], |
| 137 | + userId, |
122 | 138 | DateTime.Now.AddDays(-90), |
123 | 139 | DateTime.Now.AddDays(-1), |
124 | | - session["AccessToken"]); |
| 140 | + accessToken); |
125 | 141 | return Results.Json(activity); |
126 | 142 | }); |
127 | 143 |
|
128 | | -app.MapGet("/api/withings/body", async () => |
| 144 | +app.MapGet("/api/withings/body", async (HttpContext context, WithingsClient client) => |
129 | 145 | { |
130 | | - var client = new WithingsClient(credentials); |
| 146 | + var userId = context.Session.GetString("UserId"); |
| 147 | + var accessToken = context.Session.GetString("AccessToken"); |
| 148 | + |
| 149 | + if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(accessToken)) |
| 150 | + return Results.Unauthorized(); |
| 151 | + |
131 | 152 | var activity = await client.GetBodyMeasures( |
132 | | - session["UserId"], |
133 | | - bodyStartDate, |
134 | | - bodyEndDate, |
135 | | - session["AccessToken"]); |
| 153 | + userId, |
| 154 | + DateTime.Parse("2017-05-08"), |
| 155 | + DateTime.Parse("2017-05-10"), |
| 156 | + accessToken); |
136 | 157 | return Results.Json(activity); |
137 | 158 | }); |
138 | 159 |
|
139 | | -app.MapGet("/api/withings/bodysince", async () => |
| 160 | +app.MapGet("/api/withings/bodysince", async (HttpContext context, WithingsClient client) => |
140 | 161 | { |
141 | | - var client = new WithingsClient(credentials); |
| 162 | + var userId = context.Session.GetString("UserId"); |
| 163 | + var accessToken = context.Session.GetString("AccessToken"); |
| 164 | + |
| 165 | + if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(accessToken)) |
| 166 | + return Results.Unauthorized(); |
| 167 | + |
142 | 168 | var activity = await client.GetBodyMeasures( |
143 | | - session["UserId"], |
144 | | - bodyStartDate, |
145 | | - session["AccessToken"]); |
| 169 | + userId, |
| 170 | + DateTime.Parse("2017-05-08"), |
| 171 | + accessToken); |
146 | 172 | return Results.Json(activity); |
147 | 173 | }); |
148 | 174 |
|
149 | | -app.MapGet("/api/withings/intraday", async () => |
| 175 | +app.MapGet("/api/withings/intraday", async (HttpContext context, WithingsClient client) => |
150 | 176 | { |
151 | | - var client = new WithingsClient(credentials); |
| 177 | + var userId = context.Session.GetString("UserId"); |
| 178 | + var accessToken = context.Session.GetString("AccessToken"); |
| 179 | + |
| 180 | + if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(accessToken)) |
| 181 | + return Results.Unauthorized(); |
| 182 | + |
152 | 183 | var activity = await client.GetIntraDayActivity( |
153 | | - session["UserId"], |
| 184 | + userId, |
154 | 185 | DateTime.Now.AddDays(-90), |
155 | 186 | DateTime.Now.AddDays(-1), |
156 | | - session["AccessToken"]); |
| 187 | + accessToken); |
157 | 188 | return Results.Json(activity); |
158 | 189 | }); |
159 | 190 |
|
|
0 commit comments