Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
217 changes: 159 additions & 58 deletions Context/FoodeeDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,75 +7,176 @@

namespace FOODEE.Context
{
public class FoodeeDbContext : DbContext
public class FOODEEDbContext : DbContext
{
public FoodeeDbContext(DbContextOptions options) : base(options)
public FOODEEDbContext(DbContextOptions options) : base(options)
{

}

public DbSet<Cart> Carts { get; set; }
public DbSet<CartItem> CartItems { get; set; }
public DbSet<Admin> Admins { get; set; }
public DbSet<SuperAdmin> SuperAdmins { get; set; }
public DbSet<Customer> Customers { get; set; }
public DbSet<Menu> Menus { get; set; }
public DbSet<MenuItem> MenuItems { get; set; }
public DbSet<MenuMenuItem> MenuMenuItems { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<OrderItem> OrderItems { get; set; }
public DbSet<Payment> Payments { get; set; }
//public DbSet<Payment> Payments { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<UserRole> UserRoles { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<OrderItem>(o =>
{
o.HasIndex(o => new { o.MenuId, o.OrderId }).IsUnique();

modelBuilder.Entity<User>().Property(u => u.Id).IsRequired();
modelBuilder.Entity<Role>().HasIndex(u => u.Id).IsUnique();
modelBuilder.Entity<User>().HasIndex(u => u.Email).IsUnique();
modelBuilder.Entity<MenuItem>().HasKey(s => s.Id);
modelBuilder.Entity<Order>().HasKey(s => s.Id);
modelBuilder.Entity<OrderItem>().HasKey(s => s.Id);
modelBuilder.Entity<User>().Property(u => u.Email)
.IsRequired();
modelBuilder.Entity<UserRole>().HasKey(ur => ur.Id);
modelBuilder.Entity<UserRole>().HasIndex(U => U.UserId);
modelBuilder.Entity<UserRole>().HasIndex(u => u.RoleId);
modelBuilder.Entity<User>().HasMany(u => u.UserRoles)
.WithOne(ur => ur.User)
.HasForeignKey(ur => ur.UserId);
modelBuilder.Entity<Role>().HasMany(r => r.UserRoles)
.WithOne(r => r.Role)
.HasForeignKey(r => r.RoleId);
modelBuilder.Entity<User>().HasData(
new User
{
Id = 1,
FirstName = "Habeebah",
LastName = "Olowonmi",
CreatedAt = DateTime.Now,
Gender = "Female",
Email = "olowonmiadejoke@gmail.com",
PhoneNumber = "09039513977",
Address = "Asero,Abk",
PasswordHash = "6prgwCkzdfZ/oANfSVHfdcE7vzXvVhWSA5WXj8AhHxs=",
HashSalt = "oRG1o9cidyVnRFgsWQN7AA=="
}
);
modelBuilder.Entity<Role>().HasData(
new Role { Id = 1, Name = "SuperAdmin", CreatedAt = DateTime.Now }, new Role { Id = 2, Name = "Admin", CreatedAt = DateTime.Now }, new Role { Id = 3, Name = "Customer", CreatedAt = DateTime.Now }
);

modelBuilder.Entity<UserRole>().HasData(new UserRole { Id = 1, UserId = 1, RoleId = 1, CreatedAt = DateTime.Now });

base.OnModelCreating(modelBuilder);

modelBuilder.Entity<Menu>().HasMany(m => m.MenuItems)
.WithOne(m => m.Menu)
.HasForeignKey(m => m.MenuId).OnDelete(DeleteBehavior.Restrict);

modelBuilder.Entity<MenuItem>().HasMany(m => m.MenuMenuItems)
.WithOne(m => m.MenuItem)
.HasForeignKey(m => m.MenuItemId).OnDelete(DeleteBehavior.Restrict);
});

modelBuilder.Entity<Cart>()
.HasMany(c => c.CartItems)
.WithOne(c => c.Cart)
.HasForeignKey(ci => ci.CartId);

modelBuilder.Entity<Cart>()
.HasKey(c => c.Id);

modelBuilder.Entity<Menu>()
.HasMany(m => m.MenuMenuItems)
.WithOne(mmi => mmi.Menu)
.HasForeignKey(mmi => mmi.MenuId);

modelBuilder.Entity<MenuItem>()
.HasMany(m => m.MenuMenuItems)
.WithOne(mmi => mmi.MenuItem)
.HasForeignKey(mmi => mmi.MenuItemId);

//modelBuilder.Entity<Order>()
// .HasOne(o => o.Payment)
// .WithOne(p => p.Order)
// .HasForeignKey<Order>(o => o.PaymentId);


// Configure One To One Between User And Customer, Admin and SuperAdmin

modelBuilder.Entity<User>()
.HasOne(u => u.Admin)
.WithOne(a => a.User);

modelBuilder.Entity<User>()
.HasOne(u => u.SuperAdmin)
.WithOne(sa => sa.User);

modelBuilder.Entity<User>()
.HasOne(u => u.Customer)
.WithOne(c => c.User);

// configuring one to many between customer and cart
modelBuilder.Entity<Customer>()
.HasMany(c => c.Carts)
.WithOne(cr => cr.Customer)
.HasForeignKey(cr => cr.userId);

// configuring one to many between customer and Payment
//modelBuilder.Entity<Customer>()
// .HasMany(c => c.Payments)
// .WithOne(p => p.Customer)
// .HasForeignKey(p => p.userId);

// configuring one to many between customer and Order
modelBuilder.Entity<Customer>()
.HasMany(c => c.Orders)
.WithOne(o => o.Customer)
.HasForeignKey(o => o.userId);


// Configuring Customer Primary Key
modelBuilder.Entity<Customer>()
.HasKey(c => c.UserId);

// Configuring Admin Primary Key
modelBuilder.Entity<Admin>()
.HasKey(a => a.UserId);

// Configuring Super Admin Primary Key
modelBuilder.Entity<SuperAdmin>()
.HasKey(sa => sa.UserId);
modelBuilder.Entity<User>().HasData(
new User
{
Id = 1,
FirstName = "Habeebah",
LastName = "Olowonmi",
CreatedAt = DateTime.Now,
Gender = "Female",
Email = "olowonmiadejoke@gmail.com",
PhoneNumber = "09039513977",
Address = "Asero,Abk",
PasswordHash = "6prgwCkzdfZ/oANfSVHfdcE7vzXvVhWSA5WXj8AhHxs=",
HashSalt = "oRG1o9cidyVnRFgsWQN7AA=="
},
new User
{
Id = 2,
FirstName = "Risqah",
LastName = "Olowonmi",
CreatedAt = DateTime.Now,
Gender = "Female",
Email = "risqah@gmail.com",
PhoneNumber = "08054593619",
Address = "Asero,Abk",
PasswordHash = "6prgwCkzdfZ/oANfSVHfdcE7vzXvVhWSA5WXj8AhHxs=",
HashSalt = "oRG1o9cidyVnRFgsWQN7AA=="
}
);
modelBuilder.Entity<Role>().HasData(
new Role
{
Id = 1,
Name = "superadmin",
CreatedAt = DateTime.Now
},
new Role
{
Id = 2,
Name = "admin",
CreatedAt = DateTime.Now
}, new Role
{
Id = 3,
Name = "customer",
CreatedAt = DateTime.Now
}

);

modelBuilder.Entity<UserRole>().HasData(
new UserRole
{
Id = 1,
UserId = 1,
RoleId = 1,
CreatedAt = DateTime.Now
},
new UserRole
{
Id = 2,
UserId = 2,
RoleId = 2,
CreatedAt = DateTime.Now
}
);

modelBuilder.Entity<SuperAdmin>().HasData(
new SuperAdmin
{
UserId = 1
}
);
modelBuilder.Entity<Admin>().HasData(
new Admin
{
UserId = 1
}
);
}
}
}
}
}
16 changes: 0 additions & 16 deletions Controllers/AdminController.cs

This file was deleted.

118 changes: 118 additions & 0 deletions Controllers/AuthController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using FOODEE.DTO;
using FOODEE.Interface;
using FOODEE.Models;
using FOODEE.Models.ViewModel;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;

namespace FOODEE.Controllers
{
public class AuthController : Controller
{
private readonly IRoleService _roleService;
private readonly IUserService _userService;
private readonly IUserRoleService _userRoleService;

// GET
public AuthController(IRoleService roleService, IUserService userService, IUserRoleService userRoleService)
{
_roleService = roleService;
_userService = userService;
_userRoleService = userRoleService;
}

public IActionResult Index()
{
return RedirectToAction(nameof(Login));
}

[HttpGet]
public IActionResult Register()
{
return View();
}

[HttpPost]
public IActionResult Register(AuthVM.CreateUser model)
{
var createuserDto = new CreateUserDto
{
CreatedAt = model.CreatedAt,
LastName = model.LastName,
FirstName = model.FirstName,
PhoneNumber = model.PhoneNumber,
Email = model.Email,
Address = model.Address,
Gender = model.Gender,
Password = model.Password,
RoleId = _roleService.FindByName("Customer").Id,
};
_userService.RegisterUser(createuserDto);
return RedirectToAction(nameof(Login));
}

[HttpGet]
public IActionResult Login()
{
return View();
}

[HttpPost]
public async Task<IActionResult> Login(AuthVM.LoginUser vm, string returnUrl)
{
var createuserDto = new CreateUserDto
{
Email = vm.Email,
Password = vm.Password,
};

User user = _userService.LoginUser(createuserDto);

if (user == null)
{
ViewBag.Message = "error";
return View();
}

var role = _userRoleService.FindRole(user.Id);
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Email, user.Email),
new Claim(ClaimTypes.Role, role)
};

var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

var principal = new ClaimsPrincipal(identity);

var props = new AuthenticationProperties();

await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, props);

if (returnUrl != null) return Redirect(returnUrl);

return role switch
{
"superadmin" => RedirectToAction("IndexAdmin", "Menu"),
"admin" => RedirectToAction("Index", "Admin"),
"customer" => RedirectToAction("Index", "Customer"),
_ => Unauthorized()
};
}

public async Task<IActionResult> Logout()
{
int userId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier));
User userlogin = _userService.FindById(userId);
ViewBag.UserName = $"{userlogin.FirstName} .{userlogin.LastName[0]}";

await HttpContext.SignOutAsync();
return RedirectToAction("Login");
}
}
}
Loading