//Suggested changes
1. Create Separate ViewModels: Define different ViewModels for each user type (Member, Employee, Owner) with the specific fields required for each.
2. Determine User Type First: Create a step in your registration process to first capture the user type.
3. Use Specific ViewModel Based on User Type: Use the captured user type to select and validate the appropriate ViewModel.
//Viewmodels
public class UserViewModel
{
public string Email { get; set; }
public string Password { get; set; }
public int User_Type_ID { get; set; }
// Common fields...
}
public class MemberViewModel : UserViewModel
{
public int Contract_ID { get; set; }
public bool Is_Active { get; set; }
// Other member-specific fields...
}
public class EmployeeViewModel : UserViewModel
{
public int Employee_Type_ID { get; set; }
public int Shift_ID { get; set; }
public int Hours_Worked { get; set; }
// Other employee-specific fields...
}
public class OwnerViewModel : UserViewModel
{
// Owner-specific fields...
}
//UserTypeVM
public class UserTypeVM
{
public int User_Type_ID { get; set; }
}
//Controller
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Identity;
using System.Text.RegularExpressions;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase
{
private readonly UserManager<User> _userManager;
private readonly AppDbContext _appDbContext;
private readonly ILogger<UserController> _logger;
public UserController(UserManager<User> userManager, AppDbContext appDbContext, ILogger<UserController> logger)
{
_userManager = userManager;
_appDbContext = appDbContext;
_logger = logger;
}
[HttpPost]
[Route("DetermineUserType")]
public async Task<IActionResult> DetermineUserType([FromForm] UserTypeViewModel userTypeViewModel)
{
if (userTypeViewModel == null || userTypeViewModel.User_Type_ID <= 0)
{
return BadRequest("Invalid user type.");
}
// Determine user type based on the provided information
int userTypeID = userTypeViewModel.User_Type_ID;
// Redirect to the appropriate registration method
switch (userTypeID)
{
case 1:
return await RegisterMember(userTypeViewModel);
case 2:
return await RegisterEmployee(userTypeViewModel);
case 3:
return await RegisterOwner(userTypeViewModel);
default:
return BadRequest("Invalid user type.");
}
}
private async Task<IActionResult> RegisterMember(UserTypeViewModel userTypeViewModel)
{
// Map UserTypeViewModel to MemberViewModel
var memberViewModel = new MemberViewModel
{
Email = userTypeViewModel.Email,
Password = userTypeViewModel.Password,
User_Type_ID = userTypeViewModel.User_Type_ID,
// Initialize other member-specific fields
};
return await Register(memberViewModel);
}
private async Task<IActionResult> RegisterEmployee(UserTypeViewModel userTypeViewModel)
{
// Map UserTypeViewModel to EmployeeViewModel
var employeeViewModel = new EmployeeViewModel
{
Email = userTypeViewModel.Email,
Password = userTypeViewModel.Password,
User_Type_ID = userTypeViewModel.User_Type_ID,
// Initialize other employee-specific fields
};
return await Register(employeeViewModel);
}
private async Task<IActionResult> RegisterOwner(UserTypeViewModel userTypeViewModel)
{
// Map UserTypeViewModel to OwnerViewModel
var ownerViewModel = new OwnerViewModel
{
Email = userTypeViewModel.Email,
Password = userTypeViewModel.Password,
User_Type_ID = userTypeViewModel.User_Type_ID,
// Initialize other owner-specific fields
};
return await Register(ownerViewModel);
}
private async Task<IActionResult> Register(UserViewModel uvm)
{
try
{
var formCollection = await Request.ReadFormAsync();
var photo = formCollection.Files.FirstOrDefault();
// Validate Phone Number Pattern
var phoneNumberPattern = @"^\d{10}$";
bool isValidPhoneNumber = Regex.IsMatch(uvm.PhoneNumber, phoneNumberPattern);
if (!isValidPhoneNumber) return BadRequest("Enter valid 10-digit phone number.");
// Validate South African ID number
if (!IsValidSouthAfricanIDNumber(uvm.Id_Number, uvm.Date_of_Birth))
{
return BadRequest("Enter a valid South African ID number.");
}
var user = await _userManager.FindByEmailAsync(uvm.Email);
int lastUserID = _appDbContext.Users
.OrderByDescending(u => u.User_ID)
.Select(u => u.User_ID)
.FirstOrDefault();
if (user == null)
{
if (photo != null && photo.Length > 0)
{
using (var memoryStream = new MemoryStream())
{
await photo.CopyToAsync(memoryStream);
var fileBytes = memoryStream.ToArray();
string base64Image = Convert.ToBase64String(fileBytes);
user = new User
{
User_ID = lastUserID + 1,
Name = uvm.Name,
Surname = uvm.Surname,
UserName = uvm.Email,
Email = uvm.Email,
PasswordHash = _userManager.PasswordHasher.HashPassword(null, uvm.Password),
User_Status_ID = uvm.User_Status_ID,
User_Type_ID = uvm.User_Type_ID,
PhoneNumber = uvm.PhoneNumber,
Date_of_Birth = uvm.Date_of_Birth,
ID_Number = uvm.Id_Number,
Physical_Address = uvm.Physical_Address,
Photo = base64Image // Store the base64 string of the photo
};
IdentityResult result = await _userManager.CreateAsync(user);
if (result.Succeeded)
{
// Assign role based on User_Type_ID
string roleName = GetRoleNameByUserType(uvm.User_Type_ID);
if (!string.IsNullOrEmpty(roleName))
{
var roleResult = await _userManager.AddToRoleAsync(user, roleName);
if (!roleResult.Succeeded)
{
return BadRequest(new { Status = "Error", Errors = roleResult.Errors });
}
}
if (uvm.User_Type_ID == 1) // Member
{
var memberViewModel = uvm as MemberViewModel;
int lastMemberID = _appDbContext.Members
.OrderByDescending(m => m.Member_ID)
.Select(m => m.Member_ID)
.FirstOrDefault();
var newMember = new Member
{
Member_ID = lastMemberID + 1,
User_ID = user.User_ID,
Contract_ID = memberViewModel.Contract_ID,
Is_Active = memberViewModel.Is_Active // Use the value from the view model
};
_appDbContext.Members.Add(newMember);
_logger.LogInformation("Adding new member with User_ID: {User_ID}, Member_ID: {Member_ID}", user.User_ID, newMember.Member_ID);
await _appDbContext.SaveChangesAsync();
_logger.LogInformation("Member added successfully with User_ID: {User_ID}, Member_ID: {Member_ID}", user.User_ID, newMember.Member_ID);
}
else if (uvm.User_Type_ID == 2) // Employee
{
var employeeViewModel = uvm as EmployeeViewModel;
int lastEmployeeID = _appDbContext.Employees
.OrderByDescending(e => e.Employee_ID)
.Select(e => e.Employee_ID)
.FirstOrDefault();
var newEmployee = new Employee
{
Employee_ID = lastEmployeeID == 0 ? 1 : lastEmployeeID + 1,
User_ID = user.User_ID,
Employment_Date = DateTime.UtcNow,
Hours_Worked = employeeViewModel.Hours_Worked, // Use the value from the view model (initialized to zero)
Employee_Type_ID = employeeViewModel.Employee_Type_ID,
Shift_ID = employeeViewModel.Shift_ID
};
_appDbContext.Employees.Add(newEmployee);
_logger.LogInformation("Adding new employee with User_ID: {User_ID}, Employee_ID: {Employee_ID}", user.User_ID, newEmployee.Employee_ID);
await _appDbContext.SaveChangesAsync();
_logger.LogInformation("Employee added successfully with User_ID: {User_ID}, Employee_ID: {Employee_ID}", user.User_ID, newEmployee.Employee_ID);
}
else if (uvm.User_Type_ID == 3) // Owner
{
var ownerViewModel = uvm as OwnerViewModel;
int lastOwnerID = _appDbContext.Owners
.OrderByDescending(o => o.Owner_ID)
.Select(o => o.Owner_ID)
.FirstOrDefault();
var newOwner = new Owner
{
Owner_ID = lastOwnerID == 0 ? 1 : lastOwnerID + 1,
User_ID = user.User_ID
};
_appDbContext.Owners.Add(newOwner);
_logger.LogInformation("Adding new owner with User_ID: {User_ID}, Owner_ID: {Owner_ID}", user.User_ID, newOwner.Owner_ID);
await _appDbContext.SaveChangesAsync();
_logger.LogInformation("Owner added successfully with User_ID: {User_ID}, Owner_ID: {Owner_ID}", user.User_ID, newOwner.Owner_ID);
}
return Ok(new { Status = "Success", Message = "Your profile has been created successfully!" });
}
else
{
return StatusCode(StatusCodes.Status500InternalServerError, result.Errors.FirstOrDefault()?.Description);
}
}
}
else
{
return BadRequest("Photo is required.");
}
}
else
{
return Forbid("User already exists.");
}
}
catch (DbUpdateException dbEx)
{
return StatusCode(StatusCodes.Status500InternalServerError, dbEx.InnerException?.Message ?? "An error occurred while processing your request.");
}
catch (Exception ex)
{
return StatusCode(StatusCodes.Status500InternalServerError, "An error occurred while processing your request.");
}
}
private bool IsValidSouthAfricanIDNumber(string idNumber, DateTime dateOfBirth)
{
// Implement South African ID number validation logic here
return true;
}
private string GetRoleNameByUserType(int userTypeID)
{
// Implement logic to get role name by user type ID
return "RoleName";
}
}
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter