using Microsoft.EntityFrameworkCore; using ProRestaurant.DBContexts; using ProRestaurant.Models.Accounts; using ProRestaurant.Models.Restaurants; using System.Collections.Generic; using System.Linq; namespace ProRestaurant.Repository.Restaurants { public interface IRestaurantRoleRepository { List GetRoles(int restaurantId); RestaurantRole GetRole(int id); RestaurantRolePremission GetPremission(int id); void Insert(RestaurantRole Role); void Update(RestaurantRole Role); void Delete(RestaurantRole Role); void Save(); } public class RestaurantRoleRepository : IRestaurantRoleRepository { private readonly DBContext dBContext; public RestaurantRoleRepository(DBContext db) { dBContext = db; } public void Delete(RestaurantRole Role) { dBContext.Remove(Role); Save(); } public RestaurantRolePremission GetPremission(int id) { var prem = dBContext.RestaurantRolePremissions.Where(p => p.Id == id).FirstOrDefault(); if (prem == null) { prem = new RestaurantRolePremission(); } return prem; } public RestaurantRole GetRole(int id) { var role = dBContext.RestaurantRoles.Include("Permissions").Where(r => r.Id == id).FirstOrDefault(); if (role == null) { role = new RestaurantRole { Permissions = new List(), Users = new List() }; } else { var userIDs = dBContext.RestaurantUserRestaurantRoles.Where(r => r.RestaurantRoleId == role.Id).Select(r => r.UserId).ToList(); role.Users = dBContext.Users.Where(u => userIDs.Contains(u.Id)).ToList(); } return role; } public List GetRoles(int restaurantId) { return dBContext.RestaurantRoles.Where(r => r.RestaurantId == restaurantId).ToList(); } public void Insert(RestaurantRole Role) { var users = Role.Users; Role.Users = null; dBContext.Add(Role); Save(); foreach (var user in users) { var userRole = new RestaurantUserRestaurantRole { UserId = user.Id, RestaurantRoleId = Role.Id }; dBContext.Add(userRole); } Save(); } public void Save() { dBContext.SaveChanges(); } public void Update(RestaurantRole Role) { var prems = Role.Permissions; Role.Permissions = null; var users = Role.Users; Role.Users = null; var usersList = dBContext.RestaurantUserRestaurantRoles.Where(r => r.RestaurantRoleId == Role.Id).Select(r => r.UserId).ToList(); var userObjectList = users.Select(u => u.Id).ToList(); foreach(var user in users) { if (!usersList.Contains(user.Id)) { var userRole = new RestaurantUserRestaurantRole { UserId = user.Id, RestaurantRoleId = Role.Id }; dBContext.Add(userRole); } } var remove = dBContext.RestaurantUserRestaurantRoles.Where(r => r.RestaurantRoleId == Role.Id && !userObjectList.Contains(r.UserId.Value)).ToList(); foreach (var rem in remove) { dBContext.Remove(rem); } foreach (var prem in prems) { if (prem.Id == 0) { prem.RoleId = Role.Id; dBContext.Add(prem); } else { dBContext.Entry(prem).State = EntityState.Modified; } } dBContext.Entry(Role).State = EntityState.Modified; Save(); } } }