| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- using Dapper;
- using Diligent.WebAPI.Business.Services.Interfaces;
- using Diligent.WebAPI.Contracts.DTOs.Categories;
- using Microsoft.Extensions.Configuration;
- using System;
- using System.Collections.Generic;
- using System.Data.SqlClient;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace Diligent.WebAPI.Business.Services
- {
- public class CategoryService : ICategoryService
- {
- private readonly DatabaseContext _context;
- private readonly IMapper _mapper;
- private readonly UserManager<User> _userManager;
- private readonly IUserService _userService;
-
- public CategoryService(DatabaseContext context, IMapper mapper, UserManager<User> userManager, IUserService userService)
- {
- _context = context;
- _mapper = mapper;
- _userManager = userManager;
- _userService = userService;
- }
-
- public async Task<CategoriesParentChild> GetRootCategories(int userId,int parentCategoryId)
- {
- var user = await _userManager.FindByIdAsync(userId.ToString());
- var role = (await _userManager.GetRolesAsync(user))[0];
-
- if (role == "SuperAdmin")
- if (parentCategoryId == -1)
- {
- return new CategoriesParentChild
- {
- Categories = _mapper.Map<List<CategoriesNamesResponse>>
- (await _context.Categories.Where(k => k.ParentCategory == null).ToListAsync()),
- ChildParentRelations = await GetByParentChild(parentCategoryId)
- };
- }
- else
- {
- return new CategoriesParentChild
- {
- Categories = await GetChildCategories(parentCategoryId, userId, role),
- ChildParentRelations = await GetByParentChild(parentCategoryId)
- };
- }
-
- var userCategories = new List<UserCategories>();
-
- if(parentCategoryId == -1)
- userCategories = await _context.UserCategories
- .Where(k => k.UserId == userId && k.Category.ParentCategory == null)
- .Include(t => t.Category)
- .ToListAsync();
- else
- return new CategoriesParentChild
- {
- Categories = await GetChildCategories(parentCategoryId, userId, role),
- ChildParentRelations = await GetByParentChild(parentCategoryId)
- };
-
- return new CategoriesParentChild
- {
- Categories = GetCategoriesFromUserCategories(userCategories),
- ChildParentRelations = await GetByParentChild(parentCategoryId)
- };
- }
- public async Task<Category> GetCategoryEntityById(int? id) =>
- await _context.Categories.Where(x => x.Id == id).FirstOrDefaultAsync();
-
- public async Task<List<IsGrantedCategory>> GetCategories(int userId)
- {
- var grantedCategories = await _context.UserCategories.Where(k => k.UserId == userId).ToListAsync();
- var allCategories = await _context.Categories.ToListAsync();
- var result = new List<IsGrantedCategory>();
- for (int i = 0; i < allCategories.Count; i++)
- {
- var newCategory = new IsGrantedCategory
- {
- Id = allCategories[i].Id,
- Name = allCategories[i].Name,
- };
- bool isGranted = false;
- for (int j = 0; j < grantedCategories.Count; j++)
- {
- if(grantedCategories[j].CategoryId == allCategories[i].Id && userId == grantedCategories[j].UserId)
- {
- isGranted = true;
- break;
- }
- }
- newCategory.IsChecked = isGranted;
- result.Add(newCategory);
- isGranted = false;
- }
-
- return result;
- }
- public async Task<List<TreeViewCategoryResponse>> GetAllCategories(int userId)
- {
- var user = await _userManager.FindByIdAsync(userId.ToString());
- var role = (await _userManager.GetRolesAsync(user))[0];
- List<Category> categories = new();
- if(role == "SuperAdmin")
- {
- categories = await _context.Categories.Include(k => k.ParentCategory).ToListAsync();
- }
- else
- {
- categories = await getCategoriesUserCanSee(user.Id);
- }
-
- List<TreeViewCategoryResponse> response = new();
-
- foreach (var category in categories)
- {
- TreeViewCategoryResponse treeViewCategory = new();
- if(category.ParentCategory == null)
- {
- treeViewCategory.Id = category.Id;
- treeViewCategory.Name = category.Name;
- treeViewCategory.TreeViewCategories = GetTreeCategoryItem(categories, category.Id);
- response.Add(treeViewCategory);
- }
-
- }
-
- return response;
- }
- private List<CategoriesNamesResponse> GetCategoriesFromUserCategories(List<UserCategories> userCategories)
- {
- var res = new List<CategoriesNamesResponse>();
-
- for (int i = 0; i < userCategories.Count; i++)
- {
- res.Add(_mapper.Map<CategoriesNamesResponse>(userCategories[i].Category));
- }
-
- return res;
- }
- private async Task<List<CategoriesNamesResponse>> GetByParentChild(int categoryId)
- {
- var categories = await _context.Categories.Include(x => x.ParentCategory).ToListAsync();
- var categoryById = categories.Where(x => x.Id == categoryId).FirstOrDefault();
-
- List<CategoriesNamesResponse> dto = new();
- while (true)
- {
- if (categoryById == null) break;
- dto.Add(new CategoriesNamesResponse
- {
- Id = categoryById.Id,
- Name = categoryById.Name
- });
- categoryById = categoryById.ParentCategory;
- }
-
- dto.Reverse();
-
- return dto;
- }
- private async Task<List<CategoriesNamesResponse>> GetChildCategories(int parentCategoryId, int userId, string role)
- {
- if (role == "SuperAdmin")
- return _mapper.Map<List<CategoriesNamesResponse>>(
- await _context.Categories
- .Where(k => k.ParentCategory != null && k.ParentCategory.Id == parentCategoryId)
- .ToListAsync());
-
- var userCategories = await _context.UserCategories
- .Where(k => k.UserId == userId && k.Category != null && k.Category.ParentCategory != null && k.Category.ParentCategory.Id == parentCategoryId)
- .Include(t => t.Category)
- .ToListAsync();
-
- return GetCategoriesFromUserCategories(userCategories);
- }
-
- private async Task<List<Category>> getCategoriesUserCanSee(int userId)
- {
- var k = await _context.UserCategories.Include(c => c.Category).ToListAsync();
- List<Category> t = new();
- foreach (var m in k)
- {
- if(m.UserId == userId)
- {
- t.Add(m.Category);
- }
- }
- return t;
- }
-
- private List<TreeViewCategoryResponse> GetTreeCategoryItem(List<Category> items, int id)
- {
- List<TreeViewCategoryResponse> response = new();
-
- foreach (var item in items)
- {
- if(item.ParentCategory != null && item.ParentCategory.Id == id)
- {
- TreeViewCategoryResponse treeViewCategory = new();
- treeViewCategory.Id = item.Id;
- treeViewCategory.Name = item.Name;
- treeViewCategory.TreeViewCategories = GetTreeCategoryItem(items, item.Id);
- response.Add(treeViewCategory);
- }
- }
-
- return response;
- }
-
- public async Task CreateAsync(CreateCategoryDto createCategoryDto, int userId)
- {
- Category category = null;
- if(createCategoryDto.ParentId != null)
- {
- category = await _context.Categories.Where(x => x.Id == createCategoryDto.ParentId).FirstOrDefaultAsync();
- }
-
- var newCategory = new Category { Name = createCategoryDto.Name, ParentCategory = category };
-
- await _context.Categories.AddAsync(newCategory);
-
- await _context.SaveChangesAsync();
-
- await _userService.GrantCategoryToUserAsync(new GrantUserCategoryRequestDto { UserId = userId, Categories = new List<GrantCategoryToUserRequestDto> { new GrantCategoryToUserRequestDto { Id = newCategory.Id, IsChecked = true } } });
- }
- }
- }
|