Add UserDbContext, UserDbDal, DbTestPage, etc...

This commit is contained in:
jozsef.b@aycode.com 2023-11-24 00:29:16 +01:00
parent 4ba61ba048
commit 4bed3bc4f4
24 changed files with 255 additions and 79 deletions

View File

@ -11,11 +11,20 @@ namespace TIAM.Database.DataLayers.Users
{
public class UserDal : TiamDalBase<UserDbContext>
{
private DbSet<User> Users { get; set; }
public UserDal() : base()
{
}
//public User
public Task<List<User>> GetUsersAsync()
{
return Ctx.Users.ToListAsync();
}
public Task<User?> GetUserByEmailAsync(string email)
{
var emailLower = email.ToLower();
return Ctx.Users.SingleOrDefaultAsync(x=>x.Email.ToLower() == emailLower);
}
}
}

View File

@ -6,12 +6,13 @@ using System.Threading.Tasks;
using AyCode.Database.DbContexts;
using Microsoft.EntityFrameworkCore;
using TIAM.Entities.TransferDestinations;
using TIAM.Entities.Users;
namespace TIAM.Database.DbContexts
{
public class UserDbContext : TiamDbContextBase
{
public DbSet<TransferDestination> TransferDestinations { get; set; }
public DbSet<User> Users { get; set; }
public UserDbContext() //: this(string.Empty)
{

View File

@ -9,5 +9,9 @@ namespace TIAM.Entities.Users
{
public class User : UserBase
{
public User() { }
public User(string email, string password) : this(Guid.NewGuid(), email, password) { }
public User(Guid id, string email, string password) : base(id, email, password)
{ }
}
}

View File

@ -6,13 +6,13 @@
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity Name="maui-package-name-placeholder" Publisher="CN=User Name" Version="0.0.0.0" />
<Identity Name="maui-package-name-placeholder" Publisher="CN=UserModel Name" Version="0.0.0.0" />
<mp:PhoneIdentity PhoneProductId="D715EEC2-0430-4284-94A2-9EC92B64BE9F" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>$placeholder$</DisplayName>
<PublisherDisplayName>User Name</PublisherDisplayName>
<PublisherDisplayName>UserModel Name</PublisherDisplayName>
<Logo>$placeholder$.png</Logo>
</Properties>

View File

@ -2,6 +2,7 @@
using Newtonsoft.Json;
using System.Net.Http.Json;
using System.Text;
using TIAM.Entities.Users;
using TIAMWebApp.Shared.Application.Interfaces;
using TIAMWebApp.Shared.Application.Models;
using TIAMWebApp.Shared.Application.Models.ClientSide;
@ -14,7 +15,7 @@ namespace TIAMMobilApp.Services
{
private readonly HttpClient http;
private readonly ISecureStorageHandler secureStorageHandler;
public User? User { get; set; } = new User("", "", "");
public UserModel? User { get; set; } = new UserModel("", "", "");
public Dictionary<int, string> userRoleTypes { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public UserDataService(HttpClient http, ISecureStorageHandler secureStorageHandler)
@ -39,11 +40,11 @@ namespace TIAMMobilApp.Services
};
public async Task<User> IsLoggedInAsync()
public async Task<UserModel> IsLoggedInAsync()
{
if (User == null)
{
User = new User("", "", "");
User = new UserModel("", "", "");
User.IsLoggedIn = false;
User.UserType = UserType.User;
return User;
@ -57,11 +58,11 @@ namespace TIAMMobilApp.Services
}
//Mock method for now
public async Task<User> AuthorizeUserAsync(int userType)
public async Task<UserModel> AuthorizeUserAsync(int userType)
{
if (User == null)
{
User = new User("", "", "");
User = new UserModel("", "", "");
}
//simply return true for now
User.IsLoggedIn = true;
@ -126,6 +127,16 @@ namespace TIAMMobilApp.Services
return (isSuccess, result);
}
public Task<IEnumerable<User>> GetUsersAsync()
{
throw new NotImplementedException();
}
public Task<User> GetUserByEmailAsync(string email)
{
throw new NotImplementedException();
}
public async Task<bool> RefreshToken()
{
bool isTokenRefreshed = false;
@ -169,10 +180,10 @@ namespace TIAMMobilApp.Services
}
public Task<Dictionary<int, string>> GetUserRolesAsync(User user)
public Task<Dictionary<int, string>> GetUserRolesAsync(UserModel userModel)
{
//get the user's roles
//get the userModel's roles
int role = User.UserRoles;
foreach (var roleType in roleTypes)

View File

@ -59,4 +59,16 @@
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" VersionOverride="7.0.1" Version="7.0.1" />
</ItemGroup>
<ItemGroup>
<Reference Include="AyCode.Core">
<HintPath>..\..\AyCode.Core\AyCode.Database\bin\Debug\net7.0\AyCode.Core.dll</HintPath>
</Reference>
<Reference Include="AyCode.Entities">
<HintPath>..\..\AyCode.Core\AyCode.Database\bin\Debug\net7.0\AyCode.Entities.dll</HintPath>
</Reference>
<Reference Include="AyCode.Interfaces">
<HintPath>..\..\AyCode.Core\AyCode.Database\bin\Debug\net7.0\AyCode.Interfaces.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@ -0,0 +1,20 @@
@if (Users == null)
{
<p>
<em>Loading ...</em>
</p>
}
else
{
<div class="form-field d-flex align-items-center">
@foreach (var dest in Users)
{
<p>@dest.Email</p>
}
</div>
}

View File

@ -0,0 +1,63 @@
using Microsoft.AspNetCore.Components;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TIAM.Entities.Users;
using TIAMWebApp.Shared.Application.Interfaces;
using TIAMWebApp.Shared.Application.Models;
namespace TIAMSharedUI.Pages
{
public partial class DbTestComponent: ComponentBase
{
[Parameter]
public string EmailAddress
{
get;
set;
}
public List<TIAM.Entities.Users.User>? Users
{
get;
set;
}
[Inject]
public IUserDataService UserDataService
{
get;
set;
}
[Parameter]
public string Value
{
get;
set;
}
[Parameter]
public EventCallback<string> ValueChanged
{
get;
set;
}
protected override async Task OnInitializedAsync()
{
Users = (await UserDataService.GetUsersAsync())?.ToList();
}
private Task OnValueChanged(ChangeEventArgs e)
{
Value = e.Value.ToString();
DisplayCard();
return ValueChanged.InvokeAsync(Value);
}
private void DisplayCard()
{
}
}
}

View File

@ -35,7 +35,7 @@
<option value="2" selected>Transfer</option>
<option value="3" selected>Guide</option>
<option value="4" selected>Admin</option>
<option value="5" selected>User</option>
<option value="5" selected>UserModel</option>
<option value="6" selected>Driver</option>
</select>
</div>

View File

@ -0,0 +1,11 @@
@page "/dbtest"
<h3>TestPage</h3>
<ChooseDestination></ChooseDestination>
<hr/>
<DbTestComponent></DbTestComponent>
@code {
}

View File

@ -1,5 +1,5 @@
@inherits LayoutComponentBase
@using TIAMSharedUI.Shared.User
@using TIAMSharedUI.Shared.Users
@using TIAMWebApp.Shared.Application.Interfaces
@using TIAMWebApp.Shared.Application.Models;
@inject NavigationManager NavigationManager

View File

@ -14,8 +14,6 @@
<main>
<article class="content">
@{
if(isUserLoggedIn)

View File

@ -20,4 +20,16 @@
<ProjectReference Include="..\TIAMWebApp\Shared\TIAMWebApp.Shared.Application.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="AyCode.Core">
<HintPath>..\..\AyCode.Core\AyCode.Database\bin\Debug\net7.0\AyCode.Core.dll</HintPath>
</Reference>
<Reference Include="AyCode.Entities">
<HintPath>..\..\AyCode.Core\AyCode.Database\bin\Debug\net7.0\AyCode.Entities.dll</HintPath>
</Reference>
<Reference Include="AyCode.Interfaces">
<HintPath>..\..\AyCode.Core\AyCode.Database\bin\Debug\net7.0\AyCode.Interfaces.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@ -2,6 +2,8 @@
using Newtonsoft.Json;
using System.Net.Http.Json;
using System.Text;
using TIAM.Entities.TransferDestinations;
using TIAM.Entities.Users;
using TIAMWebApp.Shared.Application.Interfaces;
using TIAMWebApp.Shared.Application.Models;
using TIAMWebApp.Shared.Application.Models.ClientSide;
@ -14,7 +16,7 @@ namespace TIAMWebApp.Client.Services
{
private readonly HttpClient http;
private readonly ISecureStorageHandler secureStorageHandler;
public User? User { get; set; } = new User("", "", "");
public UserModel? User { get; set; } = new UserModel("", "", "");
public Dictionary<int, string> userRoleTypes { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public UserDataService(HttpClient http, ISecureStorageHandler secureStorageHandler)
@ -39,11 +41,11 @@ namespace TIAMWebApp.Client.Services
};
public async Task<User> IsLoggedInAsync()
public async Task<UserModel> IsLoggedInAsync()
{
if (User == null)
{
User = new User("", "", "");
User = new UserModel("", "", "");
User.IsLoggedIn = false;
User.UserType = UserType.User;
return User;
@ -57,11 +59,11 @@ namespace TIAMWebApp.Client.Services
}
//Mock method for now
public async Task<User> AuthorizeUserAsync(int userType)
public async Task<UserModel> AuthorizeUserAsync(int userType)
{
if (User == null)
{
User = new User("", "", "");
User = new UserModel("", "", "");
}
//simply return true for now
User.IsLoggedIn = true;
@ -126,6 +128,16 @@ namespace TIAMWebApp.Client.Services
return (isSuccess, result);
}
public async Task<IEnumerable<User>?> GetUsersAsync()
{
return await http.GetFromJsonAsync<IEnumerable<User>>(APIUrls.GetUsers);
}
public async Task<User?> GetUserByEmailAsync(string email)
{
return await http.GetFromJsonAsync<User?>(APIUrls.GetUserByEmail);
}
public async Task<bool> RefreshToken()
{
bool isTokenRefreshed = false;
@ -169,10 +181,10 @@ namespace TIAMWebApp.Client.Services
}
public Task<Dictionary<int, string>> GetUserRolesAsync(User user)
public Task<Dictionary<int, string>> GetUserRolesAsync(UserModel userModel)
{
//get the user's roles
//get the userModel's roles
int role = User.UserRoles;
foreach (var roleType in roleTypes)

View File

@ -17,4 +17,16 @@
<ProjectReference Include="..\Shared\TIAMWebApp.Shared.Application.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="AyCode.Core">
<HintPath>..\..\..\AyCode.Core\AyCode.Database\bin\Debug\net7.0\AyCode.Core.dll</HintPath>
</Reference>
<Reference Include="AyCode.Entities">
<HintPath>..\..\..\AyCode.Core\AyCode.Database\bin\Debug\net7.0\AyCode.Entities.dll</HintPath>
</Reference>
<Reference Include="AyCode.Interfaces">
<HintPath>..\..\..\AyCode.Core\AyCode.Database\bin\Debug\net7.0\AyCode.Interfaces.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@ -27,22 +27,19 @@ namespace TIAMWebApp.Server.Controllers
//};
private readonly UserDal _userDal;
private readonly TransferDestinationDal _transferDestinationDal;
private readonly ILogger<TransferDataAPIController> _logger;
public TransferDataAPIController(ILogger<TransferDataAPIController> logger, UserDal userDal)
public TransferDataAPIController(ILogger<TransferDataAPIController> logger, TransferDestinationDal transferDestinationDal)
{
_logger = logger;
_userDal = userDal;
_transferDestinationDal = transferDestinationDal;
}
[HttpGet]
public async Task<IEnumerable<TransferDestination>> Get()
{
//return new JsonResult(await _transferDestinationDbContext.TransferDestinations.ToListAsync());
var result = await _userDal.Ctx.TransferDestinations.ToListAsync();
return result;
return await _transferDestinationDal.Ctx.TransferDestinations.ToListAsync();
}
}
}

View File

@ -15,34 +15,39 @@ using TIAMWebApp.Shared.Application.Models.PageModels;
using TIAMWebApp.Server.Models;
using System.Text;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using TIAM.Database.DataLayers.Users;
using TIAM.Entities.Users;
using TIAMWebApp.Server.ModelsTIAMWebApp.Shared.Application.Models;
namespace TIAMWebApp.Server.Controllers
{
[Authorize]
//[Authorize]
[ApiController]
[Route("api/[controller]")]
public class UserAPIController : ControllerBase
{
private UserDal _userDal;
private readonly IConfiguration _configuration;
private readonly IWebHostEnvironment _webHostEnvironment;
PasswordHasher hasher = new PasswordHasher();
private User[] users = new User[]
private UserModel[] users = new UserModel[]
{
new User(new Guid("540271f6-c604-4c16-8160-d5a7cafedf00"), "test@tiam.hu", "+36701234567", "Asdasd123456"),
new User(new Guid("4cbaed43-2465-4d99-84f1-c8bc6b7025f7"), "adam@tiam.hu", "+36701234567", "Asdasd987654")
new UserModel(new Guid("540271f6-c604-4c16-8160-d5a7cafedf00"), "test@tiam.hu", "+36701234567", "Asdasd123456"),
new UserModel(new Guid("4cbaed43-2465-4d99-84f1-c8bc6b7025f7"), "adam@tiam.hu", "+36701234567", "Asdasd987654")
};
private readonly ILogger<UserAPIController> _logger;
public UserAPIController(ILogger<UserAPIController> logger, IConfiguration configuration, IWebHostEnvironment webHostEnvironment)
public UserAPIController(ILogger<UserAPIController> logger, IConfiguration configuration, IWebHostEnvironment webHostEnvironment, UserDal userDal)
{
_logger = logger;
_configuration = configuration;
_webHostEnvironment = webHostEnvironment;
_userDal = userDal;
}
@ -58,19 +63,19 @@ namespace TIAMWebApp.Server.Controllers
}
else
{
var user = JObject.Parse(SerializedLoginModel.GetRawText()).ToObject<LoginModel>();
var userModel = JObject.Parse(SerializedLoginModel.GetRawText()).ToObject<LoginModel>();
Console.WriteLine(user.Email);
Console.WriteLine(user.Password);
Console.WriteLine(userModel.Email);
Console.WriteLine(userModel.Password);
if (user.Email == "test@tiam.hu" && user.Password == "Asdasd123456")
if (userModel.Email == "test@tiam.hu" && userModel.Password == "Asdasd123456")
{
Console.WriteLine("User authenticated");
Console.WriteLine("UserModel authenticated");
return Ok("yes");
}
else
{
Console.WriteLine("User NOT authenticated");
Console.WriteLine("UserModel NOT authenticated");
return Ok("no");
}
}
@ -84,15 +89,15 @@ namespace TIAMWebApp.Server.Controllers
var authenticateUser = JObject.Parse(SerializedLoginModel.GetRawText()).ToObject<LoginModel>();
//check if user exists
//var user = await _userManager.FindByNameAsync(authenticateUser.UserName);
//if (user == null) return Unauthorized();
//check if userModel exists
//var userModel = await _userManager.FindByNameAsync(authenticateUser.UserName);
//if (userModel == null) return Unauthorized();
//mocking
var user = users.FirstOrDefault(x => x.Email == authenticateUser.Email);
//check if password is valid
//bool isValidUser = await _userManager.CheckPasswordAsync(user, authenticateUser.Password);
//bool isValidUser = await _userManager.CheckPasswordAsync(userModel, authenticateUser.Password);
//mocking
bool isValidUser = false;
@ -105,13 +110,13 @@ namespace TIAMWebApp.Server.Controllers
if (isValidUser)
{
Console.WriteLine("User authenticated, let's start JWT");
Console.WriteLine("UserModel authenticated, let's start JWT");
string accessToken = GenerateAccessToken(user);
Console.WriteLine("Generate refresh token");
var refreshToken = GenerateRefreshToken();
user.RefreshToken = refreshToken;
//Update user with refreshToken!!
//await _userManager.UpdateAsync(user);
//Update userModel with refreshToken!!
//await _userManager.UpdateAsync(userModel);
var response = new MainResponse
{
@ -132,7 +137,7 @@ namespace TIAMWebApp.Server.Controllers
}
private string GenerateAccessToken(User user)
private string GenerateAccessToken(UserModel userModel)
{
var tokenHandler = new JwtSecurityTokenHandler();
var token = new JwtSecurityToken();
@ -142,8 +147,8 @@ namespace TIAMWebApp.Server.Controllers
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Email, user.Email)
new Claim(ClaimTypes.NameIdentifier, userModel.Id.ToString()),
new Claim(ClaimTypes.Email, userModel.Email)
};
var tokenDescriptor = new SecurityTokenDescriptor
@ -177,7 +182,7 @@ namespace TIAMWebApp.Server.Controllers
{
var email = principal.Claims.FirstOrDefault(f => f.Type == ClaimTypes.Email);
//var user = await _userManager.FindByEmailAsync(email?.Value);
//var userModel = await _userManager.FindByEmailAsync(email?.Value);
var user = users.FirstOrDefault(x => x.Email == email?.Value);
@ -190,9 +195,9 @@ namespace TIAMWebApp.Server.Controllers
string newAccessToken = GenerateAccessToken(user);
string refreshToken = GenerateRefreshToken();
//mocking - update user with new refreshToken
//mocking - update userModel with new refreshToken
user.RefreshToken = refreshToken;
//await _userManager.UpdateAsync(user);
//await _userManager.UpdateAsync(userModel);
response.IsSuccess = true;
response.Content = new AuthenticationResponse
@ -261,9 +266,9 @@ namespace TIAMWebApp.Server.Controllers
if (users != null)
{
//add user to users array
//add userModel to users array
Array.Resize(ref users, users.Length + 1);
users[users.Length - 1] = new User(user.Email, user.PhoneNumber, user.Password);
users[users.Length - 1] = new UserModel(user.Email, user.PhoneNumber, user.Password);
return Ok("yes");
}
else
@ -294,9 +299,18 @@ namespace TIAMWebApp.Server.Controllers
[HttpGet]
[Route("GetUsers")]
public IEnumerable<Supplier> GetUsers()
public Task<List<User?>> GetUsers()
{
throw new NotImplementedException();
//var users = await _userDal.Ctx.Users.ToListAsync();//.GetUsersAsync();
//return users;
return _userDal.GetUsersAsync();
}
[HttpGet]
[Route("GetUserByEmail")]
public Task<User?> GetUserByEmail(string email)
{
return _userDal.GetUserByEmailAsync(email);
}
private bool VerifyPassword(string password, string hashedPassword)

View File

@ -11,6 +11,8 @@ using System.Text;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using TIAMWebApp.Shared.Application.Models;
using TIAM.Database.DataLayers.Users;
using TIAM.Database.DataLayers.TransferDestinations;
var builder = WebApplication.CreateBuilder(args);
@ -18,7 +20,9 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
builder.Services.AddDbContext<TransferDestinationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DeveloperDbConnection")));;
//builder.Services.AddDbContext<TransferDestinationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DeveloperDbConnection")));;
builder.Services.AddScoped<UserDal>();
builder.Services.AddScoped<TransferDestinationDal>();
builder.Services.AddSwaggerGen(swagger =>
{

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TIAM.Entities.Users;
using TIAMWebApp.Shared.Application.Models;
using TIAMWebApp.Shared.Application.Models.PageModels;
@ -10,20 +11,22 @@ namespace TIAMWebApp.Shared.Application.Interfaces
{
public interface IUserDataService
{
public User? User { get; set; }
public UserModel? User { get; set; }
public Dictionary<int, string> userRoleTypes { get; set; }
public Task<User> IsLoggedInAsync();
public Task<UserModel> IsLoggedInAsync();
//mock method for now
public Task<User> AuthorizeUserAsync(int userType);
public Task<UserModel> AuthorizeUserAsync(int userType);
public Task<string> AuthenticateUser(LoginModel loginModel);
public Task<(bool isSuccess, string ErrorMessage)> CreateUser(RegistrationModel regModel);
public Task<string> TestUserApi(int Param);
public Task<Dictionary<int, string>> GetUserRolesAsync(User user);
public Task<Dictionary<int, string>> GetUserRolesAsync(UserModel userModel);
public Task<IEnumerable<User>?> GetUsersAsync();
public Task<User?> GetUserByEmailAsync(string email);
Task<bool> RefreshToken();
}
}

View File

@ -9,6 +9,8 @@ namespace TIAMWebApp.Shared.Application.Models
public class APIUrls
{
public const string UserTest = "api/UserAPI/test1";
public const string GetUserByEmail = "api/UserAPI/GetUserByEmail";
public const string GetUsers = "api/UserAPI/GetUsers";
public const string AuthenticateUser = "api/UserAPI/AuthenticateUser";
public const string CreateUser = "api/UserAPI/CreateUser";
public const string RefreshToken = "api/UserAPI/RefreshToken";

View File

@ -1,10 +1,9 @@
namespace TIAMWebApp.Shared.Application.Models
using TIAM.Entities.Users;
namespace TIAMWebApp.Shared.Application.Models
{
public class User
public class UserModel : User
{
public Guid Id { get; set; }
public string? Email { get; set; }
public string? Password { get; set; }
public string? PhoneNumber { get; set; }
public bool IsLoggedIn { get; set; }
public UserType UserType { get; set; }
@ -12,20 +11,12 @@
public string? RefreshToken { get; set; }
public Dictionary<int, string> UserRolesDictionary { get; set; }
public User(string email, string phonenumber, string password)
public UserModel(string email, string phonenumber, string password) : this(Guid.NewGuid(), email, phonenumber, password)
{
Id = new Guid();
Email = email;
Password = password;
PhoneNumber = phonenumber;
UserRolesDictionary = new Dictionary<int, string>();
}
public User(Guid id, string email, string phonenumber, string password)
public UserModel(Guid id, string email, string phonenumber, string password) : base(id, email, password)
{
Id = id;
Email = email;
Password = password;
PhoneNumber = phonenumber;
UserRolesDictionary = new Dictionary<int, string>();
}

View File

@ -21,7 +21,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TIAM.Entities", "TIAM.Entit
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TIAM.Entities.Server", "TIAM.Entities.Server\TIAM.Entities.Server.csproj", "{BDDF5F32-D275-4BBB-9C81-8DCB1025A935}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TIAM.Core", "TIAM.Core\TIAM.Core.csproj", "{4FDE0CD3-5914-4919-933B-6B0E04275313}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TIAM.Core", "TIAM.Core\TIAM.Core.csproj", "{4FDE0CD3-5914-4919-933B-6B0E04275313}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution