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

CategoryService.cs 8.5KB

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