Skip to content

Commit 292a6b5

Browse files
authored
Merge pull request #118 from dagstuan/handleNulluser
Handle case where user that wanted to subscribe could not be registered.
2 parents f1e83d9 + 2d8ab06 commit 292a6b5

9 files changed

Lines changed: 52 additions & 16 deletions

SkredvarselGarminWeb/SkredvarselGarminWeb/Database/DbContextUserExtensions.cs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,40 @@
22
using System.Security.Principal;
33
using Microsoft.EntityFrameworkCore;
44
using SkredvarselGarminWeb.Entities;
5+
using SkredvarselGarminWeb.Extensions;
56
using SkredvarselGarminWeb.Helpers;
67

78
namespace SkredvarselGarminWeb.Database;
89

910
public static class DbContextUserExtensions
1011
{
11-
public static User GetUserOrThrow(this SkredvarselDbContext dbContext, IIdentity? identity)
12+
public static User? GetUserOrNull(this SkredvarselDbContext dbContext, ClaimsPrincipal? principal)
1213
{
13-
if (identity == null)
14+
if (principal == null)
1415
{
15-
throw new Exception("Unauthenticated user.");
16+
return null;
1617
}
1718

18-
var email = ((ClaimsIdentity)identity).FindFirst("email")!.Value;
19+
var claims = principal.Claims;
1920

20-
return dbContext.Users.First(u => u.Email == email);
21+
var email = claims.GetClaimValueOrNull("email");
22+
23+
var user = dbContext.Users.FirstOrDefault(u => u.Email == email);
24+
25+
if (user == null)
26+
{
27+
var sub = claims.GetClaimValueOrNull("sub");
28+
29+
return dbContext.Users.FirstOrDefault(u => u.Id == sub);
30+
}
31+
32+
return user;
33+
}
34+
35+
public static User GetUserOrThrow(this SkredvarselDbContext dbContext, ClaimsPrincipal? principal)
36+
{
37+
return dbContext.GetUserOrNull(principal)
38+
?? throw new Exception("Unable to find user for principal.");
2139
}
2240

2341
public static User? GetUserForWatchOrNull(this SkredvarselDbContext dbContext, string watchId)

SkredvarselGarminWeb/SkredvarselGarminWeb/Endpoints/StripeSubscriptionEndpointsRouteBuilderExtensions.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ public static void MapStripeSubscriptionEndpoints(this IEndpointRouteBuilder app
1717
app.MapGet("/createStripeSubscription", async (
1818
HttpContext ctx,
1919
SkredvarselDbContext dbContext,
20+
IUserService userService,
2021
IStripeClient stripeClient,
2122
IOptions<StripeOptions> stripeOptions) =>
2223
{
23-
var user = dbContext.GetUserOrThrow(ctx.User.Identity);
24+
var user = await userService.GetUserOrRegisterLogin(ctx.User);
25+
2426
var baseUrl = ctx.GetBaseUrl();
2527

2628
var userHasActiveStripeSubscriptions = dbContext.StripeSubscriptions
@@ -79,7 +81,7 @@ public static void MapStripeSubscriptionEndpoints(this IEndpointRouteBuilder app
7981
IStripeClient stripeClient,
8082
SkredvarselDbContext dbContext) =>
8183
{
82-
var user = dbContext.GetUserOrThrow(ctx.User.Identity);
84+
var user = dbContext.GetUserOrThrow(ctx.User);
8385
var baseUrl = ctx.GetBaseUrl();
8486

8587
var options = new Stripe.BillingPortal.SessionCreateOptions

SkredvarselGarminWeb/SkredvarselGarminWeb/Endpoints/SubscriptionEndpointsRouteBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public static void MapSubscriptionApiEndpoints(this IEndpointRouteBuilder app)
2121
IBackgroundJobClient backgroundJobClient,
2222
SkredvarselDbContext dbContext) =>
2323
{
24-
var user = dbContext.GetUserOrThrow(ctx.User.Identity);
24+
var user = dbContext.GetUserOrThrow(ctx.User);
2525

2626
var vippsAgreementsInDb = dbContext.Agreements
2727
.OrderByDescending(a => a.Created)

SkredvarselGarminWeb/SkredvarselGarminWeb/Endpoints/TestEndpointsRouteBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public static void MapTestEndpoints(this IEndpointRouteBuilder app)
3232

3333
app.MapGet("/api/test/agreements/create", async (HttpContext ctx, IVippsApiClient vippsApiClient, SkredvarselDbContext dbContext) =>
3434
{
35-
var user = dbContext.GetUserOrThrow(ctx.User.Identity);
35+
var user = dbContext.GetUserOrThrow(ctx.User);
3636

3737
var baseUrl = "https://skredvarsel.app";
3838

SkredvarselGarminWeb/SkredvarselGarminWeb/Endpoints/UserRouteBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public static void MapUserEndpoints(this IEndpointRouteBuilder app)
2222
}
2323
else
2424
{
25-
var userInDb = dbContext.GetUserOrThrow(ctx.User.Identity);
25+
var userInDb = dbContext.GetUserOrThrow(ctx.User);
2626
var isAdmin = await authorizationService.AuthorizeAsync(ctx.User, "Admin");
2727
return Results.Ok(new User
2828
{

SkredvarselGarminWeb/SkredvarselGarminWeb/Endpoints/VippsSubscriptionEndpointsRouteBuilderExtensions.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ public static void MapVippsSubscriptionEndpoints(this IEndpointRouteBuilder app)
2424
app.MapGet("/createVippsAgreement", async (
2525
HttpContext ctx,
2626
IVippsApiClient vippsApiClient,
27+
IUserService userService,
2728
SkredvarselDbContext dbContext,
2829
IDateTimeNowProvider dateTimeNowProvider) =>
2930
{
30-
var user = dbContext.GetUserOrThrow(ctx.User.Identity);
31+
var user = await userService.GetUserOrRegisterLogin(ctx.User);
3132

3233
var userId = user.Id;
3334

@@ -152,7 +153,7 @@ public static void MapVippsSubscriptionEndpoints(this IEndpointRouteBuilder app)
152153
INtfyApiClient ntifyApiClient,
153154
SkredvarselDbContext dbContext) =>
154155
{
155-
var user = dbContext.GetUserOrThrow(ctx.User.Identity);
156+
var user = dbContext.GetUserOrThrow(ctx.User);
156157

157158
var agreementInDb = dbContext.Agreements
158159
.Where(a => a.Status == AgreementStatus.ACTIVE)
@@ -183,7 +184,7 @@ public static void MapVippsSubscriptionEndpoints(this IEndpointRouteBuilder app)
183184
INtfyApiClient ntifyApiClient,
184185
SkredvarselDbContext dbContext) =>
185186
{
186-
var user = dbContext.GetUserOrThrow(ctx.User.Identity);
187+
var user = dbContext.GetUserOrThrow(ctx.User);
187188

188189
var agreementInDb = dbContext.Agreements
189190
.Where(a => a.Status == AgreementStatus.UNSUBSCRIBED)

SkredvarselGarminWeb/SkredvarselGarminWeb/Endpoints/WatchApiRouteBuilderExtensions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public static void MapWatchApiEndpoints(this IEndpointRouteBuilder app)
6464

6565
app.MapGet("/api/watches", (HttpContext ctx, SkredvarselDbContext dbContext) =>
6666
{
67-
var user = dbContext.GetUserOrThrow(ctx.User.Identity);
67+
var user = dbContext.GetUserOrThrow(ctx.User);
6868

6969
var watches = dbContext.Watches.Where(w => w.UserId == user.Id);
7070

@@ -73,7 +73,7 @@ public static void MapWatchApiEndpoints(this IEndpointRouteBuilder app)
7373

7474
app.MapPost("/api/watches/{watchAddKey}", (HttpContext ctx, string watchAddKey, SkredvarselDbContext dbContext) =>
7575
{
76-
var user = dbContext.GetUserOrThrow(ctx.User.Identity);
76+
var user = dbContext.GetUserOrThrow(ctx.User);
7777

7878
var watchAddRequest = dbContext.WatchAddRequests.FirstOrDefault(r => r.Key == watchAddKey);
7979

@@ -96,7 +96,7 @@ public static void MapWatchApiEndpoints(this IEndpointRouteBuilder app)
9696

9797
app.MapDelete("/api/watches/{watchId}", (HttpContext ctx, SkredvarselDbContext dbContext, string watchId) =>
9898
{
99-
var user = dbContext.GetUserOrThrow(ctx.User.Identity);
99+
var user = dbContext.GetUserOrThrow(ctx.User);
100100

101101
var watch = dbContext.Watches.FirstOrDefault(w => w.Id == watchId && w.UserId == user.Id);
102102

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
using System.Security.Claims;
2+
using SkredvarselGarminWeb.Entities;
23

34
namespace SkredvarselGarminWeb.Services;
45

56
public interface IUserService
67
{
8+
Task<User> GetUserOrRegisterLogin(ClaimsPrincipal principal);
9+
710
Task RegisterLogin(ClaimsPrincipal user);
811
}

SkredvarselGarminWeb/SkredvarselGarminWeb/Services/UserService.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,18 @@ public class UserService(
1111
SkredvarselDbContext dbContext,
1212
IDateTimeNowProvider dateTimeNowProvider) : IUserService
1313
{
14+
public async Task<User> GetUserOrRegisterLogin(ClaimsPrincipal principal)
15+
{
16+
var user = dbContext.GetUserOrNull(principal);
17+
18+
if (user == null)
19+
{
20+
await RegisterLogin(principal);
21+
}
22+
23+
return dbContext.GetUserOrThrow(principal);
24+
}
25+
1426
public async Task RegisterLogin(ClaimsPrincipal user)
1527
{
1628
var dateNow = DateOnly.FromDateTime(dateTimeNowProvider.Now);

0 commit comments

Comments
 (0)