Skip to content

Commit

Permalink
Updated to .net 6.0 and now performance is more good
Browse files Browse the repository at this point in the history
  • Loading branch information
mahmmoudkinawy committed Nov 7, 2022
1 parent b6400f3 commit efb1676
Show file tree
Hide file tree
Showing 40 changed files with 732 additions and 846 deletions.
18 changes: 6 additions & 12 deletions src/JWTAPI/JWTAPI/Controllers/LoginController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,31 +31,25 @@ public async Task<IActionResult> LoginAsync(
}

[HttpPost("token/refresh")]
public async Task<IActionResult> RefreshTokenAsync([FromBody] RefreshTokenResource refreshTokenResource)
public async Task<IActionResult> RefreshTokenAsync(
[FromBody] RefreshTokenResource refreshTokenResource)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}

var response = await _authenticationService.RefreshTokenAsync(refreshTokenResource.Token, refreshTokenResource.UserEmail);
var response = await _authenticationService
.RefreshTokenAsync(refreshTokenResource.Token, refreshTokenResource.UserEmail);

if (!response.Success)
{
return BadRequest(response.Message);
}

var tokenResource = _mapper.Map<AccessToken, AccessTokenResource>(response.Token);

return Ok(tokenResource);
}

[HttpPost("token/revoke")]
public IActionResult RevokeToken([FromBody] RevokeTokenResource resource)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}

_authenticationService.RevokeRefreshToken(resource.Token, resource.Email);
return NoContent();
}
Expand Down
35 changes: 16 additions & 19 deletions src/JWTAPI/JWTAPI/Controllers/ProtectedController.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,22 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace JWTAPI.Controllers;

namespace JWTAPI.Controllers
[ApiController]
[Route("api/protected")]
public class ProtectedController : ControllerBase
{
[ApiController]
public class ProtectedController : Controller
[HttpGet]
[Authorize]
[Route("for-commonusers")]
public IActionResult GetProtectedData()
{
[HttpGet]
[Authorize]
[Route("/api/protectedforcommonusers")]
public IActionResult GetProtectedData()
{
return Ok("Hello world from protected controller.");
}
return Ok("Hello world from protected controller.");
}

[HttpGet]
[Authorize(Roles = "Administrator")]
[Route("/api/protectedforadministrators")]
public IActionResult GetProtectedDataForAdmin()
{
return Ok("Hello admin!");
}
[HttpGet]
[Authorize(Roles = "Administrator")]
[Route("for-administrators")]
public IActionResult GetProtectedDataForAdmin()
{
return Ok("Hello admin!");
}
}
20 changes: 8 additions & 12 deletions src/JWTAPI/JWTAPI/Controllers/Resources/RefreshTokenResource.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
using System.ComponentModel.DataAnnotations;

namespace JWTAPI.Controllers.Resources
namespace JWTAPI.Controllers.Resources;
public class RefreshTokenResource
{
public class RefreshTokenResource
{
[Required]
public string Token { get; set; }
[Required]
public string Token { get; set; }

[Required]
[DataType(DataType.EmailAddress)]
[StringLength(255)]
public string UserEmail { get; set; }
}
[Required]
[EmailAddress]
[StringLength(255)]
public string UserEmail { get; set; }
}
16 changes: 6 additions & 10 deletions src/JWTAPI/JWTAPI/Controllers/Resources/RevokeTokenResource.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
using System.ComponentModel.DataAnnotations;

namespace JWTAPI.Controllers.Resources
namespace JWTAPI.Controllers.Resources;
public class RevokeTokenResource
{
public class RevokeTokenResource
{
[Required]
public string Token { get; set; }
[Required]
public string Token { get; set; }

[Required]
public string Email { get; set; }
}
[Required]
public string Email { get; set; }
}
12 changes: 5 additions & 7 deletions src/JWTAPI/JWTAPI/Controllers/Resources/TokenResource.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
namespace JWTAPI.Controllers.Resources
namespace JWTAPI.Controllers.Resources;
public class AccessTokenResource
{
public class AccessTokenResource
{
public string AccessToken { get; set; }
public string RefreshToken { get; set; }
public long Expiration { get; set; }
}
public string AccessToken { get; set; }
public string RefreshToken { get; set; }
public long Expiration { get; set; }
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
namespace JWTAPI.Controllers.Resources;

public class UserCredentialsResource
{
[Required]
Expand Down
14 changes: 5 additions & 9 deletions src/JWTAPI/JWTAPI/Controllers/Resources/UserResource.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
using System.Collections.Generic;

namespace JWTAPI.Controllers.Resources
namespace JWTAPI.Controllers.Resources;
public class UserResource
{
public class UserResource
{
public int Id { get; set; }
public string Email { get; set; }
public IEnumerable<string> Roles { get; set; }
}
public int Id { get; set; }
public string Email { get; set; }
public IEnumerable<string> Roles { get; set; }
}
55 changes: 23 additions & 32 deletions src/JWTAPI/JWTAPI/Controllers/UsersController.cs
Original file line number Diff line number Diff line change
@@ -1,42 +1,33 @@
using AutoMapper;
using JWTAPI.Controllers.Resources;
using JWTAPI.Core.Models;
using JWTAPI.Core.Services;
using Microsoft.AspNetCore.Mvc;
namespace JWTAPI.Controllers;

namespace JWTAPI.Controllers
[ApiController]
[Route("/api/users")]
public class UsersController : ControllerBase
{
[ApiController]
[Route("/api/[controller]")]
public class UsersController : Controller
private readonly IMapper _mapper;
private readonly IUserService _userService;

public UsersController(IUserService userService, IMapper mapper)
{
private readonly IMapper _mapper;
private readonly IUserService _userService;
_userService = userService;
_mapper = mapper;
}

public UsersController(IUserService userService, IMapper mapper)
{
_userService = userService;
_mapper = mapper;
}
[HttpPost]
public async Task<IActionResult> CreateUserAsync(
[FromBody] UserCredentialsResource userCredentials)
{
var user = _mapper.Map<UserCredentialsResource, User>(userCredentials);

var response = await _userService.CreateUserAsync(user, ApplicationRole.Common);

[HttpPost]
public async Task<IActionResult> CreateUserAsync([FromBody] UserCredentialsResource userCredentials)
if (!response.Success)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return BadRequest(response.Message);
}

var user = _mapper.Map<UserCredentialsResource, User>(userCredentials);

var response = await _userService.CreateUserAsync(user, ApplicationRole.Common);
if(!response.Success)
{
return BadRequest(response.Message);
}
var userResource = _mapper.Map<User, UserResource>(response.User);

var userResource = _mapper.Map<User, UserResource>(response.User);
return Ok(userResource);
}
return Ok(userResource);
}
}
10 changes: 4 additions & 6 deletions src/JWTAPI/JWTAPI/Core/Models/ApplicationRole.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
namespace JWTAPI.Core.Models
namespace JWTAPI.Core.Models;
public enum ApplicationRole
{
public enum ApplicationRole
{
Common = 1,
Administrator = 2
}
Common = 1,
Administrator = 2
}
19 changes: 7 additions & 12 deletions src/JWTAPI/JWTAPI/Core/Models/Role.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;

namespace JWTAPI.Core.Models
namespace JWTAPI.Core.Models;
public class Role
{
public class Role
{
public int Id { get; set; }
public int Id { get; set; }

[Required]
[StringLength(50)]
public string Name { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }

public ICollection<UserRole> UsersRole { get; set; } = new Collection<UserRole>();
}
public virtual ICollection<UserRole> UsersRole { get; set; } = new Collection<UserRole>();
}
25 changes: 10 additions & 15 deletions src/JWTAPI/JWTAPI/Core/Models/User.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,15 @@
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;

namespace JWTAPI.Core.Models
namespace JWTAPI.Core.Models;
public class User
{
public class User
{
public int Id { get; set; }
public int Id { get; set; }

[Required]
[DataType(DataType.EmailAddress)]
[StringLength(255)]
public string Email { get; set; }
[Required]
[EmailAddress]
[StringLength(255)]
public string Email { get; set; }

[Required]
public string Password { get; set; }
[Required]
public string Password { get; set; }

public ICollection<UserRole> UserRoles { get; set; } = new Collection<UserRole>();
}
public ICollection<UserRole> UserRoles { get; set; } = new Collection<UserRole>();
}
17 changes: 7 additions & 10 deletions src/JWTAPI/JWTAPI/Core/Models/UserRole.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace JWTAPI.Core.Models;

namespace JWTAPI.Core.Models
[Table("UserRoles")]
public class UserRole
{
[Table("UserRoles")]
public class UserRole
{
public int UserId { get; set; }
public User User { get; set; }
public int UserId { get; set; }
public User User { get; set; }

public int RoleId { get; set; }
public Role Role { get; set; }
}
public int RoleId { get; set; }
public Role Role { get; set; }
}
8 changes: 3 additions & 5 deletions src/JWTAPI/JWTAPI/Core/Repositories/IUnitOfWork.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
namespace JWTAPI.Core.Repositories
namespace JWTAPI.Core.Repositories;
public interface IUnitOfWork
{
public interface IUnitOfWork
{
Task CompleteAsync();
}
Task CompleteAsync();
}
12 changes: 4 additions & 8 deletions src/JWTAPI/JWTAPI/Core/Repositories/IUserRepository.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
using JWTAPI.Core.Models;

namespace JWTAPI.Core.Repositories
namespace JWTAPI.Core.Repositories;
public interface IUserRepository
{
public interface IUserRepository
{
Task AddAsync(User user, ApplicationRole[] userRoles);
Task<User> FindByEmailAsync(string email);
}
Task AddAsync(User user, ApplicationRole[] userRoles);
Task<User> FindByEmailAsync(string email);
}
10 changes: 4 additions & 6 deletions src/JWTAPI/JWTAPI/Core/Security/Hashing/IPasswordHasher.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
namespace JWTAPI.Core.Security.Hashing
namespace JWTAPI.Core.Security.Hashing;
public interface IPasswordHasher
{
public interface IPasswordHasher
{
string HashPassword(string password);
bool PasswordMatches(string providedPassword, string passwordHash);
}
string HashPassword(string password);
bool PasswordMatches(string providedPassword, string passwordHash);
}
18 changes: 7 additions & 11 deletions src/JWTAPI/JWTAPI/Core/Security/Tokens/AccessToken.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
namespace JWTAPI.Core.Security.Tokens
namespace JWTAPI.Core.Security.Tokens;
public class AccessToken : JsonWebToken
{
public class AccessToken : JsonWebToken
{
public RefreshToken RefreshToken { get; private set; }
public RefreshToken RefreshToken { get; private set; }

public AccessToken(string token, long expiration, RefreshToken refreshToken) : base(token, expiration)
{
if(refreshToken == null)
throw new ArgumentException("Specify a valid refresh token.");

RefreshToken = refreshToken;
}
public AccessToken(string token, long expiration, RefreshToken refreshToken) : base(token, expiration)
{
RefreshToken = refreshToken
?? throw new ArgumentException("Specify a valid refresh token.");
}
}
Loading

0 comments on commit efb1676

Please sign in to comment.