#48 cleaned userService. We will use IdentityService only
This commit is contained in:
@@ -1,16 +1,21 @@
|
|||||||
using Hutopy.Application.Common.Models;
|
using Hutopy.Application.Common.Models;
|
||||||
|
using Hutopy.Domain.Models;
|
||||||
|
|
||||||
namespace Hutopy.Application.Common.Interfaces;
|
namespace Hutopy.Application.Common.Interfaces;
|
||||||
|
|
||||||
public interface IIdentityService
|
public interface IIdentityService
|
||||||
{
|
{
|
||||||
Task<string?> GetUserNameAsync(string userId);
|
Task<string?> GetUserNameAsync(string userId);
|
||||||
|
|
||||||
|
Task CreateUserAsync(string email, string userName, string firstName, string lastName, string password);
|
||||||
|
|
||||||
|
Task<UserModel?> FindUserByIdAsync(string id);
|
||||||
|
Task<UserModel?> GetCurrentUserAsync();
|
||||||
|
Task<UserModel?> FindUserByEmailAsync(string id);
|
||||||
|
|
||||||
Task<bool> IsInRoleAsync(string userId, string role);
|
Task<bool> IsInRoleAsync(string userId, string role);
|
||||||
|
|
||||||
Task<bool> AuthorizeAsync(string userId, string policyName);
|
Task<bool> AuthorizeAsync(string userId, string policyName);
|
||||||
|
|
||||||
Task<(Result Result, string UserId)> CreateUserAsync(string userName, string password);
|
|
||||||
|
|
||||||
Task<Result> DeleteUserAsync(string userId);
|
Task<Result> DeleteUserAsync(string userId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
using System.Dynamic;
|
using Hutopy.Application.Common.Interfaces;
|
||||||
using Hutopy.Application.Common.Interfaces;
|
|
||||||
using Hutopy.Domain.Entities;
|
|
||||||
using Hutopy.Domain.Interfaces;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
|
|
||||||
namespace Hutopy.Application.Users.Commands;
|
namespace Hutopy.Application.Users.Commands;
|
||||||
public record CreateUserCommand : IRequest<Guid>
|
public record CreateUserCommand : IRequest<Guid>
|
||||||
@@ -17,24 +13,20 @@ public record CreateUserCommand : IRequest<Guid>
|
|||||||
public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, Guid>
|
public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, Guid>
|
||||||
{
|
{
|
||||||
private readonly IApplicationDbContext _context;
|
private readonly IApplicationDbContext _context;
|
||||||
private readonly IUserService _userService;
|
private readonly IIdentityService _identityService;
|
||||||
|
|
||||||
public CreateUserCommandHandler(IApplicationDbContext context, IUserService userService)
|
public CreateUserCommandHandler(IApplicationDbContext context, IIdentityService identityService)
|
||||||
{
|
{
|
||||||
_context = context;
|
_context = context;
|
||||||
_userService = userService;
|
_identityService = identityService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Guid> Handle(CreateUserCommand request, CancellationToken cancellationToken)
|
public async Task<Guid> Handle(CreateUserCommand request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// Dont really need the handler for the create. The get will work like this :
|
var user = await _identityService.FindUserByEmailAsync(request.EmailAddress);
|
||||||
var user = await _userService.FindUserByIdAsync("072ae7d5-8c4a-4a0f-b250-7d39941125cb");
|
|
||||||
// var user2 = await _userService.FindUserByEmailAsync("test10@hotmail.com");
|
|
||||||
|
|
||||||
var tt = user?.FirstName;
|
|
||||||
|
|
||||||
await _context.SaveChangesAsync(cancellationToken);
|
await _context.SaveChangesAsync(cancellationToken);
|
||||||
|
|
||||||
return Guid.NewGuid();
|
return new Guid(user?.Id ?? string.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Hutopy.Application.Common.Interfaces;
|
using Hutopy.Application.Common.Interfaces;
|
||||||
using Hutopy.Domain.Interfaces;
|
|
||||||
|
|
||||||
namespace Hutopy.Application.Users.Queries.GetCurrentUser;
|
namespace Hutopy.Application.Users.Queries.GetCurrentUser;
|
||||||
|
|
||||||
@@ -8,13 +7,13 @@ public record GetCurrentUserQuery : IRequest<UserDto>;
|
|||||||
public class GetCurrentUserQueryHandler(
|
public class GetCurrentUserQueryHandler(
|
||||||
IApplicationDbContext context,
|
IApplicationDbContext context,
|
||||||
IMapper mapper,
|
IMapper mapper,
|
||||||
IUserService userService
|
IIdentityService identityService
|
||||||
)
|
)
|
||||||
: IRequestHandler<GetCurrentUserQuery, UserDto>
|
: IRequestHandler<GetCurrentUserQuery, UserDto>
|
||||||
{
|
{
|
||||||
public async Task<UserDto> Handle(GetCurrentUserQuery request, CancellationToken cancellationToken)
|
public async Task<UserDto> Handle(GetCurrentUserQuery request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var identityUser = await userService.GetCurrentUserAsync();
|
var identityUser = await identityService.GetCurrentUserAsync();
|
||||||
var currentUserId = new Guid(identityUser?.Id ?? "");
|
var currentUserId = new Guid(identityUser?.Id ?? "");
|
||||||
|
|
||||||
var transactions = await context.UserTransactions
|
var transactions = await context.UserTransactions
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Hutopy.Domain.Interfaces;
|
using Hutopy.Application.Common.Interfaces;
|
||||||
|
|
||||||
namespace Hutopy.Application.Users.Queries.GetMinimalUser;
|
namespace Hutopy.Application.Users.Queries.GetMinimalUser;
|
||||||
|
|
||||||
@@ -8,15 +8,15 @@ public record GetMinimalUserQuery : IRequest<MinimalUserDto>
|
|||||||
};
|
};
|
||||||
|
|
||||||
public class GetMinimalUserQueryHandler(
|
public class GetMinimalUserQueryHandler(
|
||||||
IUserService userService
|
IIdentityService identityService
|
||||||
)
|
)
|
||||||
: IRequestHandler<GetMinimalUserQuery, MinimalUserDto>
|
: IRequestHandler<GetMinimalUserQuery, MinimalUserDto>
|
||||||
{
|
{
|
||||||
public async Task<MinimalUserDto> Handle(GetMinimalUserQuery request, CancellationToken cancellationToken)
|
public async Task<MinimalUserDto> Handle(GetMinimalUserQuery request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var identityUser = await userService.FindUserByIdAsync(request.UserId);
|
var identityUser = await identityService.FindUserByIdAsync(request.UserId);
|
||||||
|
|
||||||
var user = new MinimalUserDto()
|
var user = new MinimalUserDto
|
||||||
{
|
{
|
||||||
FirstName = identityUser?.FirstName ?? "",
|
FirstName = identityUser?.FirstName ?? "",
|
||||||
LastName = identityUser?.LastName ?? "",
|
LastName = identityUser?.LastName ?? "",
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
using Hutopy.Domain.Models;
|
|
||||||
|
|
||||||
namespace Hutopy.Domain.Interfaces;
|
|
||||||
|
|
||||||
public interface IUserService
|
|
||||||
{
|
|
||||||
Task CreateUserAsync(string email, string userName, string firstName, string lastName, string password);
|
|
||||||
|
|
||||||
Task<UserModel?> FindUserByIdAsync(string id);
|
|
||||||
Task<UserModel?> GetCurrentUserAsync();
|
|
||||||
|
|
||||||
Task<UserModel?> FindUserByEmailAsync(string id);
|
|
||||||
}
|
|
||||||
@@ -1,11 +1,8 @@
|
|||||||
using System;
|
using Hutopy.Application.Common.Interfaces;
|
||||||
using Hutopy.Application.Common.Interfaces;
|
|
||||||
using Hutopy.Domain.Constants;
|
using Hutopy.Domain.Constants;
|
||||||
using Hutopy.Domain.Interfaces;
|
|
||||||
using Hutopy.Infrastructure.Data;
|
using Hutopy.Infrastructure.Data;
|
||||||
using Hutopy.Infrastructure.Data.Interceptors;
|
using Hutopy.Infrastructure.Data.Interceptors;
|
||||||
using Hutopy.Infrastructure.Identity;
|
using Hutopy.Infrastructure.Identity;
|
||||||
using Hutopy.Infrastructure.Services;
|
|
||||||
using Hutopy.Infrastructure.Stripe;
|
using Hutopy.Infrastructure.Stripe;
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
@@ -51,8 +48,6 @@ public static class DependencyInjection
|
|||||||
.AddBearerToken(IdentityConstants.BearerScheme);
|
.AddBearerToken(IdentityConstants.BearerScheme);
|
||||||
|
|
||||||
services.AddAuthorizationBuilder();
|
services.AddAuthorizationBuilder();
|
||||||
services.AddScoped<IUserService, UserService>();
|
|
||||||
|
|
||||||
|
|
||||||
// Might need to change and use AddIdentity<User, Role>() when we need to integrate connection via third party ( facebook, google )
|
// Might need to change and use AddIdentity<User, Role>() when we need to integrate connection via third party ( facebook, google )
|
||||||
services
|
services
|
||||||
@@ -62,7 +57,7 @@ public static class DependencyInjection
|
|||||||
.AddApiEndpoints();
|
.AddApiEndpoints();
|
||||||
|
|
||||||
services.AddSingleton(TimeProvider.System);
|
services.AddSingleton(TimeProvider.System);
|
||||||
services.AddTransient<IIdentityService, IdentityService>();
|
services.AddScoped<IIdentityService, IdentityService>();
|
||||||
services.AddTransient<IStripeService, StripeService>();
|
services.AddTransient<IStripeService, StripeService>();
|
||||||
|
|
||||||
services.AddAuthorization(options =>
|
services.AddAuthorization(options =>
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
|
using System.Security.Claims;
|
||||||
using Hutopy.Application.Common.Interfaces;
|
using Hutopy.Application.Common.Interfaces;
|
||||||
using Hutopy.Application.Common.Models;
|
using Hutopy.Application.Common.Models;
|
||||||
|
using Hutopy.Domain.Models;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
|
||||||
namespace Hutopy.Infrastructure.Identity;
|
namespace Hutopy.Infrastructure.Identity;
|
||||||
@@ -8,7 +11,9 @@ namespace Hutopy.Infrastructure.Identity;
|
|||||||
public class IdentityService(
|
public class IdentityService(
|
||||||
UserManager<ApplicationUser> userManager,
|
UserManager<ApplicationUser> userManager,
|
||||||
IUserClaimsPrincipalFactory<ApplicationUser> userClaimsPrincipalFactory,
|
IUserClaimsPrincipalFactory<ApplicationUser> userClaimsPrincipalFactory,
|
||||||
IAuthorizationService authorizationService)
|
IAuthorizationService authorizationService,
|
||||||
|
IHttpContextAccessor contextAccessor
|
||||||
|
)
|
||||||
: IIdentityService
|
: IIdentityService
|
||||||
{
|
{
|
||||||
public async Task<string?> GetUserNameAsync(string userId)
|
public async Task<string?> GetUserNameAsync(string userId)
|
||||||
@@ -30,6 +35,72 @@ public class IdentityService(
|
|||||||
|
|
||||||
return (result.ToApplicationResult(), user.Id);
|
return (result.ToApplicationResult(), user.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task CreateUserAsync(string email, string userName, string firstName, string lastName, string password)
|
||||||
|
{
|
||||||
|
var applicationUser = new ApplicationUser
|
||||||
|
{
|
||||||
|
UserName = userName,
|
||||||
|
Email = email,
|
||||||
|
FirstName = firstName,
|
||||||
|
LastName = lastName
|
||||||
|
};
|
||||||
|
|
||||||
|
//todo: Need to handle errors better for the user.
|
||||||
|
var response = await userManager.CreateAsync(applicationUser, password);
|
||||||
|
|
||||||
|
if (response.Errors.Any())
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException(response.Errors.First().Description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<UserModel?> FindUserByIdAsync(string id)
|
||||||
|
{
|
||||||
|
var response = await userManager.FindByIdAsync(id);
|
||||||
|
|
||||||
|
if (response == null) return null;
|
||||||
|
|
||||||
|
var userModel = new UserModel()
|
||||||
|
{
|
||||||
|
Id = response.Id,
|
||||||
|
UserName = response.UserName,
|
||||||
|
FirstName = response.FirstName,
|
||||||
|
LastName = response.LastName,
|
||||||
|
Email = response.Email,
|
||||||
|
};
|
||||||
|
|
||||||
|
return userModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<UserModel?> GetCurrentUserAsync()
|
||||||
|
{
|
||||||
|
var currentUserId = contextAccessor.HttpContext?.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
||||||
|
if (string.IsNullOrEmpty(currentUserId))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return await FindUserByIdAsync(currentUserId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<UserModel?> FindUserByEmailAsync(string email)
|
||||||
|
{
|
||||||
|
var response = await userManager.FindByEmailAsync(email);
|
||||||
|
|
||||||
|
if (response == null) return null;
|
||||||
|
|
||||||
|
var userModel = new UserModel
|
||||||
|
{
|
||||||
|
Id = response.Id,
|
||||||
|
UserName = response.UserName,
|
||||||
|
FirstName = response.FirstName,
|
||||||
|
LastName = response.LastName,
|
||||||
|
Email = response.Email
|
||||||
|
};
|
||||||
|
|
||||||
|
return userModel;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<bool> IsInRoleAsync(string userId, string role)
|
public async Task<bool> IsInRoleAsync(string userId, string role)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,78 +0,0 @@
|
|||||||
using System.Security.Claims;
|
|
||||||
using Hutopy.Domain.Interfaces;
|
|
||||||
using Hutopy.Domain.Models;
|
|
||||||
using Hutopy.Infrastructure.Identity;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.Identity;
|
|
||||||
|
|
||||||
namespace Hutopy.Infrastructure.Services;
|
|
||||||
|
|
||||||
public class UserService(UserManager<ApplicationUser> userManager, IHttpContextAccessor contextAccessor) : IUserService
|
|
||||||
{
|
|
||||||
public async Task CreateUserAsync(string email, string userName, string firstName, string lastName, string password)
|
|
||||||
{
|
|
||||||
var applicationUser = new ApplicationUser
|
|
||||||
{
|
|
||||||
UserName = userName,
|
|
||||||
Email = email,
|
|
||||||
FirstName = firstName,
|
|
||||||
LastName = lastName
|
|
||||||
};
|
|
||||||
|
|
||||||
//todo: Need to handle errors better for the user.
|
|
||||||
var response = await userManager.CreateAsync(applicationUser, password);
|
|
||||||
|
|
||||||
if (response.Errors.Any())
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException(response.Errors.First().Description);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<UserModel?> FindUserByIdAsync(string id)
|
|
||||||
{
|
|
||||||
var response = await userManager.FindByIdAsync(id);
|
|
||||||
|
|
||||||
if (response == null) return null;
|
|
||||||
|
|
||||||
var userModel = new UserModel()
|
|
||||||
{
|
|
||||||
Id = response.Id,
|
|
||||||
UserName = response.UserName,
|
|
||||||
FirstName = response.FirstName,
|
|
||||||
LastName = response.LastName,
|
|
||||||
Email = response.Email,
|
|
||||||
};
|
|
||||||
|
|
||||||
return userModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<UserModel?> GetCurrentUserAsync()
|
|
||||||
{
|
|
||||||
var currentUserId = contextAccessor.HttpContext?.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
|
||||||
if (string.IsNullOrEmpty(currentUserId))
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return await FindUserByIdAsync(currentUserId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<UserModel?> FindUserByEmailAsync(string email)
|
|
||||||
{
|
|
||||||
var response = await userManager.FindByEmailAsync(email);
|
|
||||||
|
|
||||||
if (response == null) return null;
|
|
||||||
|
|
||||||
var userModel = new UserModel()
|
|
||||||
{
|
|
||||||
Id = response.Id,
|
|
||||||
UserName = response.UserName,
|
|
||||||
FirstName = response.FirstName,
|
|
||||||
LastName = response.LastName,
|
|
||||||
Email = response.Email
|
|
||||||
};
|
|
||||||
|
|
||||||
return userModel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
using Azure.Identity;
|
using Azure.Identity;
|
||||||
using Hutopy.Application.Common.Interfaces;
|
using Hutopy.Application.Common.Interfaces;
|
||||||
using Hutopy.Domain.Interfaces;
|
|
||||||
using Hutopy.Infrastructure.Data;
|
using Hutopy.Infrastructure.Data;
|
||||||
using Hutopy.Infrastructure.Services;
|
|
||||||
using Hutopy.Web.Services;
|
using Hutopy.Web.Services;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NSwag;
|
using NSwag;
|
||||||
@@ -17,8 +15,6 @@ public static class DependencyInjection
|
|||||||
services.AddDatabaseDeveloperPageExceptionFilter();
|
services.AddDatabaseDeveloperPageExceptionFilter();
|
||||||
|
|
||||||
services.AddScoped<IUser, CurrentUser>();
|
services.AddScoped<IUser, CurrentUser>();
|
||||||
services.AddScoped<IUserService, UserService>();
|
|
||||||
|
|
||||||
|
|
||||||
services.AddHttpContextAccessor();
|
services.AddHttpContextAccessor();
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using Hutopy.Application.Users.Commands;
|
using Hutopy.Application.Common.Interfaces;
|
||||||
|
using Hutopy.Application.Users.Commands;
|
||||||
using Hutopy.Application.Users.Queries.GetMinimalUser;
|
using Hutopy.Application.Users.Queries.GetMinimalUser;
|
||||||
using Hutopy.Domain.Interfaces;
|
|
||||||
using Hutopy.Infrastructure.Identity;
|
using Hutopy.Infrastructure.Identity;
|
||||||
|
|
||||||
namespace Hutopy.Web.Endpoints;
|
namespace Hutopy.Web.Endpoints;
|
||||||
@@ -15,9 +15,9 @@ public class Users : EndpointGroupBase
|
|||||||
.MapIdentityApi<ApplicationUser>();
|
.MapIdentityApi<ApplicationUser>();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<Guid> CreateUser(ISender sender, CreateUserCommand command, IUserService userService)
|
private static async Task<Guid> CreateUser(ISender sender, CreateUserCommand command, IIdentityService identityService)
|
||||||
{
|
{
|
||||||
await userService.CreateUserAsync(command.EmailAddress, command.UserName, command.FirstName, command.LastName, command.Password);
|
await identityService.CreateUserAsync(command.EmailAddress, command.UserName, command.FirstName, command.LastName, command.Password);
|
||||||
return await sender.Send(command);
|
return await sender.Send(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
using Hutopy.Application;
|
using Hutopy.Application;
|
||||||
using Hutopy.Domain.Interfaces;
|
|
||||||
using Hutopy.Infrastructure;
|
using Hutopy.Infrastructure;
|
||||||
using Hutopy.Infrastructure.Data;
|
using Hutopy.Infrastructure.Data;
|
||||||
using Hutopy.Infrastructure.Services;
|
|
||||||
using Hutopy.Web;
|
using Hutopy.Web;
|
||||||
using Azure.Identity;
|
using Azure.Identity;
|
||||||
|
|
||||||
@@ -47,8 +45,6 @@ builder.Services.AddApplicationServices();
|
|||||||
builder.Services.AddInfrastructureServices(builder.Configuration);
|
builder.Services.AddInfrastructureServices(builder.Configuration);
|
||||||
builder.Services.AddWebServices();
|
builder.Services.AddWebServices();
|
||||||
|
|
||||||
builder.Services.AddScoped<IUserService, UserService>();
|
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
app.UseCors("AllowAll");
|
app.UseCors("AllowAll");
|
||||||
|
|||||||
Reference in New Issue
Block a user