Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

CategoryService.cs 9.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. using Dapper;
  2. using Diligent.WebAPI.Business.Services.Interfaces;
  3. using Diligent.WebAPI.Contracts.DTOs.Categories;
  4. using Microsoft.Extensions.Configuration;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Data.SqlClient;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace Diligent.WebAPI.Business.Services
  12. {
  13. public class CategoryService : ICategoryService
  14. {
  15. private readonly DatabaseContext _context;
  16. private readonly IMapper _mapper;
  17. private readonly UserManager<User> _userManager;
  18. private readonly IUserService _userService;
  19. public CategoryService(DatabaseContext context, IMapper mapper, UserManager<User> userManager, IUserService userService)
  20. {
  21. _context = context;
  22. _mapper = mapper;
  23. _userManager = userManager;
  24. _userService = userService;
  25. }
  26. public async Task<CategoriesParentChild> GetRootCategories(int userId,int parentCategoryId)
  27. {
  28. var user = await _userManager.FindByIdAsync(userId.ToString());
  29. var role = (await _userManager.GetRolesAsync(user))[0];
  30. if (role == "SuperAdmin")
  31. if (parentCategoryId == -1)
  32. {
  33. return new CategoriesParentChild
  34. {
  35. Categories = _mapper.Map<List<CategoriesNamesResponse>>
  36. (await _context.Categories.Where(k => k.ParentCategory == null).ToListAsync()),
  37. ChildParentRelations = await GetByParentChild(parentCategoryId)
  38. };
  39. }
  40. else
  41. {
  42. return new CategoriesParentChild
  43. {
  44. Categories = await GetChildCategories(parentCategoryId, userId, role),
  45. ChildParentRelations = await GetByParentChild(parentCategoryId)
  46. };
  47. }
  48. var userCategories = new List<UserCategories>();
  49. if(parentCategoryId == -1)
  50. userCategories = await _context.UserCategories
  51. .Where(k => k.UserId == userId && k.Category.ParentCategory == null)
  52. .Include(t => t.Category)
  53. .ToListAsync();
  54. else
  55. return new CategoriesParentChild
  56. {
  57. Categories = await GetChildCategories(parentCategoryId, userId, role),
  58. ChildParentRelations = await GetByParentChild(parentCategoryId)
  59. };
  60. return new CategoriesParentChild
  61. {
  62. Categories = GetCategoriesFromUserCategories(userCategories),
  63. ChildParentRelations = await GetByParentChild(parentCategoryId)
  64. };
  65. }
  66. public async Task<Category> GetCategoryEntityById(int? id) =>
  67. await _context.Categories.Where(x => x.Id == id).FirstOrDefaultAsync();
  68. public async Task<List<IsGrantedCategory>> GetCategories(int userId)
  69. {
  70. var grantedCategories = await _context.UserCategories.Where(k => k.UserId == userId).ToListAsync();
  71. var allCategories = await _context.Categories.ToListAsync();
  72. var result = new List<IsGrantedCategory>();
  73. for (int i = 0; i < allCategories.Count; i++)
  74. {
  75. var newCategory = new IsGrantedCategory
  76. {
  77. Id = allCategories[i].Id,
  78. Name = allCategories[i].Name,
  79. };
  80. bool isGranted = false;
  81. for (int j = 0; j < grantedCategories.Count; j++)
  82. {
  83. if(grantedCategories[j].CategoryId == allCategories[i].Id && userId == grantedCategories[j].UserId)
  84. {
  85. isGranted = true;
  86. break;
  87. }
  88. }
  89. newCategory.IsChecked = isGranted;
  90. result.Add(newCategory);
  91. isGranted = false;
  92. }
  93. return result;
  94. }
  95. public async Task<List<TreeViewCategoryResponse>> GetAllCategories(int userId)
  96. {
  97. var user = await _userManager.FindByIdAsync(userId.ToString());
  98. var role = (await _userManager.GetRolesAsync(user))[0];
  99. List<Category> categories = new();
  100. if(role == "SuperAdmin")
  101. {
  102. categories = await _context.Categories.Include(k => k.ParentCategory).ToListAsync();
  103. }
  104. else
  105. {
  106. categories = await getCategoriesUserCanSee(user.Id);
  107. }
  108. List<TreeViewCategoryResponse> response = new();
  109. foreach (var category in categories)
  110. {
  111. TreeViewCategoryResponse treeViewCategory = new();
  112. if(category.ParentCategory == null)
  113. {
  114. treeViewCategory.Id = category.Id;
  115. treeViewCategory.Name = category.Name;
  116. treeViewCategory.TreeViewCategories = GetTreeCategoryItem(categories, category.Id);
  117. response.Add(treeViewCategory);
  118. }
  119. }
  120. return response;
  121. }
  122. private List<CategoriesNamesResponse> GetCategoriesFromUserCategories(List<UserCategories> userCategories)
  123. {
  124. var res = new List<CategoriesNamesResponse>();
  125. for (int i = 0; i < userCategories.Count; i++)
  126. {
  127. res.Add(_mapper.Map<CategoriesNamesResponse>(userCategories[i].Category));
  128. }
  129. return res;
  130. }
  131. private async Task<List<CategoriesNamesResponse>> GetByParentChild(int categoryId)
  132. {
  133. var categories = await _context.Categories.Include(x => x.ParentCategory).ToListAsync();
  134. var categoryById = categories.Where(x => x.Id == categoryId).FirstOrDefault();
  135. List<CategoriesNamesResponse> dto = new();
  136. while (true)
  137. {
  138. if (categoryById == null) break;
  139. dto.Add(new CategoriesNamesResponse
  140. {
  141. Id = categoryById.Id,
  142. Name = categoryById.Name
  143. });
  144. categoryById = categoryById.ParentCategory;
  145. }
  146. dto.Reverse();
  147. return dto;
  148. }
  149. private async Task<List<CategoriesNamesResponse>> GetChildCategories(int parentCategoryId, int userId, string role)
  150. {
  151. if (role == "SuperAdmin")
  152. return _mapper.Map<List<CategoriesNamesResponse>>(
  153. await _context.Categories
  154. .Where(k => k.ParentCategory != null && k.ParentCategory.Id == parentCategoryId)
  155. .ToListAsync());
  156. var userCategories = await _context.UserCategories
  157. .Where(k => k.UserId == userId && k.Category != null && k.Category.ParentCategory != null && k.Category.ParentCategory.Id == parentCategoryId)
  158. .Include(t => t.Category)
  159. .ToListAsync();
  160. return GetCategoriesFromUserCategories(userCategories);
  161. }
  162. private async Task<List<Category>> getCategoriesUserCanSee(int userId)
  163. {
  164. var k = await _context.UserCategories.Include(c => c.Category).ToListAsync();
  165. List<Category> t = new();
  166. foreach (var m in k)
  167. {
  168. if(m.UserId == userId)
  169. {
  170. t.Add(m.Category);
  171. }
  172. }
  173. return t;
  174. }
  175. private List<TreeViewCategoryResponse> GetTreeCategoryItem(List<Category> items, int id)
  176. {
  177. List<TreeViewCategoryResponse> response = new();
  178. foreach (var item in items)
  179. {
  180. if(item.ParentCategory != null && item.ParentCategory.Id == id)
  181. {
  182. TreeViewCategoryResponse treeViewCategory = new();
  183. treeViewCategory.Id = item.Id;
  184. treeViewCategory.Name = item.Name;
  185. treeViewCategory.TreeViewCategories = GetTreeCategoryItem(items, item.Id);
  186. response.Add(treeViewCategory);
  187. }
  188. }
  189. return response;
  190. }
  191. public async Task CreateAsync(CreateCategoryDto createCategoryDto, int userId)
  192. {
  193. Category category = null;
  194. if(createCategoryDto.ParentId != null)
  195. {
  196. category = await _context.Categories.Where(x => x.Id == createCategoryDto.ParentId).FirstOrDefaultAsync();
  197. }
  198. var newCategory = new Category { Name = createCategoryDto.Name, ParentCategory = category };
  199. await _context.Categories.AddAsync(newCategory);
  200. await _context.SaveChangesAsync();
  201. await _userService.GrantCategoryToUserAsync(new GrantUserCategoryRequestDto { UserId = userId, Categories = new List<GrantCategoryToUserRequestDto> { new GrantCategoryToUserRequestDto { Id = newCategory.Id, IsChecked = true } } });
  202. }
  203. }
  204. }