| | | 1 | | using Microsoft.AspNetCore.Authorization; |
| | | 2 | | using Microsoft.AspNetCore.Mvc; |
| | | 3 | | using Microsoft.Extensions.Logging; |
| | | 4 | | using SVETA.Api.Data.DTO; |
| | | 5 | | using SVETA.Api.Helpers.Authorize; |
| | | 6 | | using Swashbuckle.AspNetCore.Annotations; |
| | | 7 | | using System; |
| | | 8 | | using SVETA.Api.Data.Domain; |
| | | 9 | | using System.Collections.Generic; |
| | | 10 | | using System.Linq; |
| | | 11 | | using SVETA.Api.Services.Interfaces; |
| | | 12 | | using Microsoft.Extensions.Options; |
| | | 13 | | using System.Threading.Tasks; |
| | | 14 | | using WinSolutions.Sveta.Common; |
| | | 15 | | using WinSolutions.Sveta.Server.Data.DataModel.Entities; |
| | | 16 | | using WinSolutions.Sveta.Server.Data.DataModel.Kinds; |
| | | 17 | | using WinSolutions.Sveta.Server.Domain; |
| | | 18 | | using WinSolutions.Sveta.Server.Services.Interfaces; |
| | | 19 | | using Microsoft.Extensions.Configuration; |
| | | 20 | | using Microsoft.AspNetCore.Hosting; |
| | | 21 | | using WinSolutions.Sveta.Common.Extensions; |
| | | 22 | | |
| | | 23 | | namespace SVETA.Api.Controllers |
| | | 24 | | { |
| | | 25 | | [Authorize] |
| | | 26 | | [Route("api/v1/Users")] |
| | | 27 | | [ApiController] |
| | | 28 | | public class UsersController : SvetaController |
| | | 29 | | { |
| | | 30 | | const string _routeUrl = "api/v1/Users"; |
| | | 31 | | readonly IUserService _service; |
| | | 32 | | readonly IContragentService _contrService; |
| | | 33 | | readonly IAuthenticationService _authService; |
| | | 34 | | private readonly ICrmSyncWorker _crmSyncWorker; |
| | | 35 | | readonly IControlsAccessService _accessService; |
| | | 36 | | readonly IDirectoriesService _dirService; |
| | | 37 | | private readonly CrmSettings _crmSettings; |
| | | 38 | | readonly ILogger<UsersController> _logger; |
| | | 39 | | readonly IConfiguration _config; |
| | | 40 | | private readonly IWebHostEnvironment _env; |
| | | 41 | | |
| | | 42 | | public UsersController(IUserService service, IContragentService contrService, ICrmSyncWorker crmSyncWorker, IOpt |
| | 0 | 43 | | IAuthenticationService authService, IConfiguration config, ILogger<UsersController> logger, IWebHostEnvironm |
| | 0 | 44 | | { |
| | 0 | 45 | | _accessService = accessService; |
| | 0 | 46 | | _authService = authService; |
| | 0 | 47 | | _dirService = dirService; |
| | 0 | 48 | | _contrService = contrService; |
| | 0 | 49 | | _crmSettings = optionsCrm.Value; |
| | 0 | 50 | | _crmSyncWorker = crmSyncWorker; |
| | 0 | 51 | | _config=config; |
| | 0 | 52 | | _service = service; |
| | 0 | 53 | | _logger = logger; |
| | 0 | 54 | | _env = env; |
| | 0 | 55 | | } |
| | | 56 | | |
| | | 57 | | /// <summary> |
| | | 58 | | /// Возвращает текущего пользователя с атрибутами и контр агентом |
| | | 59 | | /// </summary> |
| | | 60 | | /// <remarks>author nko</remarks> |
| | | 61 | | [HttpGet("WhoAmI")] |
| | | 62 | | [SwaggerResponse(200, "Успешно", typeof(WhoAmIDTO))] |
| | | 63 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 64 | | [AllowAnonymous] |
| | | 65 | | public async Task<IActionResult> WhoAmI() |
| | | 66 | | { |
| | | 67 | | var user = await _service.WhoAmI(_authService.UserId); |
| | 0 | 68 | | var accesses = (await _accessService.GetAvailableAccesses()).Where(x => _authService.Roles.Any(p => p.ToLowe |
| | | 69 | | var result = new WhoAmIDTO(user); |
| | 0 | 70 | | result.Can.AddRange(accesses.Select(x => x.Action.Name)); |
| | | 71 | | result.Roles = _authService.Roles; |
| | | 72 | | result.Version = _config.GetValue("API_VERSION","0.0");// Environment.GetEnvironmentVariable("svetaConnectio |
| | | 73 | | result.Confirmed = _authService.Confirmed(); |
| | | 74 | | result.Registered = _authService.Register(); |
| | | 75 | | result.CompanyAssigned = _authService.CompanyAssigned(); |
| | | 76 | | result.Environment = _env.EnvironmentName; |
| | | 77 | | return Ok(result); |
| | | 78 | | } |
| | | 79 | | |
| | | 80 | | /// <summary> |
| | | 81 | | /// Возвращает всех пользователей на основе id контрагента, роли с фильтром по значимым полям и сортировкой |
| | | 82 | | /// </summary> |
| | | 83 | | /// <remarks>author i.rebenok</remarks> |
| | | 84 | | /// <param name="page">Любое значение ниже нуля изменится на 1, пагинация: номер страницы</param> |
| | | 85 | | /// <param name="limit">Любое значение ниже нуля изменится на 10, пагинация: размер страницы</param> |
| | | 86 | | /// <param name="filter">фильтр по значимым полям: email, номер телефона, фамилия</param> |
| | | 87 | | /// <param name="sort">сортировать по firstName,firstName|desc, lastName,lastName|desc, login,login|desc, По ум |
| | | 88 | | /// <param name="contragentId">id контрагента. Если 0, то всех юзеров выводить, если >0,то только по этому контр |
| | | 89 | | /// <param name="roleId">НЕ ИСПОЛЬЗОВАТЬ. id роли. если 0 (по умолчанию), то возвращать по всем ролям</param> |
| | | 90 | | /// <param name="blocked">НЕ ИСПОЛЬЗОВАТЬ. Выводить заблокированных - true or false</param> |
| | | 91 | | [HttpGet("")] |
| | | 92 | | [SwaggerResponse(200, "Успешно", typeof(BaseResponseDTO<UsersResponseDTO>))] |
| | | 93 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(string))] |
| | | 94 | | [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))] |
| | | 95 | | [Authorize (Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," +Role.SupplierOwner + "," +Role.SupplierO |
| | | 96 | | public async Task<IActionResult> GetUsers(int page = 1, int limit = 10, string filter = null, string sort = "", |
| | 0 | 97 | | { |
| | 0 | 98 | | filter = filter.NormalizeName(); |
| | 0 | 99 | | page = page < 1 ? 1 : page; |
| | 0 | 100 | | limit = limit < 1 ? 10 : limit; |
| | 0 | 101 | | contragentId = _authService.IsUserPlatform() ? contragentId : _authService.ContragentId; |
| | | 102 | | //делаем отдельный трай на это, так как в случае эксепшена нам не надо прерывать выполнение метода. Мы прост |
| | | 103 | | try |
| | 0 | 104 | | { |
| | 0 | 105 | | await _crmSyncWorker.SyncAllUsersByContragent(contragentId); |
| | 0 | 106 | | } |
| | 0 | 107 | | catch (Exception ex) |
| | 0 | 108 | | { |
| | 0 | 109 | | _logger.LogError("Ошибка синхронизации с CRM. " + ex.Message); |
| | 0 | 110 | | } |
| | 0 | 111 | | var result = await _service.GetUsers(page - 1, limit, filter, sort, contragentId); |
| | 0 | 112 | | var param = $"contragentId={contragentId}&roleId={roleId}&blocked={blocked}"; |
| | 0 | 113 | | var response = new BaseResponseDTO<UsersResponseDTO>(_routeUrl, page, limit, result.TotalFilteredCount, resu |
| | 0 | 114 | | { |
| | 0 | 115 | | Data = result.Result.Select(x => new UsersResponseDTO(x)).ToList() |
| | 0 | 116 | | }; |
| | 0 | 117 | | return Ok(response); |
| | 0 | 118 | | } |
| | | 119 | | |
| | | 120 | | /// <summary> |
| | | 121 | | /// Возвращает количество всех пользоватлей на основе id контрагента, роли с фильтром по значимым полям |
| | | 122 | | /// </summary> |
| | | 123 | | /// <remarks>author i.rebenok</remarks> |
| | | 124 | | /// <param name="filter">фильтр по значимым полям: email, номер телефона, фамилия</param> |
| | | 125 | | /// <param name="contragentId"> id контрагента. Если 0, то всех юзеров выводить, если >0,то только по этому конт |
| | | 126 | | /// <param name="roleId">НЕ ИСПОЛЬЗОВАТЬ.id роли. если 0(по умолчанию), то возвращать по всем ролям</param>[Http |
| | | 127 | | /// <param name="blocked">НЕ ИСПОЛЬЗОВАТЬ.Выводить заблокированных - true (по умолчанию) or false</param>[Swagge |
| | | 128 | | [HttpGet("Count")] |
| | | 129 | | [SwaggerResponse(200, "Успешно", typeof(CountDTO))] |
| | | 130 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 131 | | [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))] |
| | | 132 | | [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.SupplierOwner + "," + Role.Supplier |
| | | 133 | | public async Task<IActionResult> GetUsersCount(string filter = null, long contragentId = 0, long roleId = 0, boo |
| | 0 | 134 | | { |
| | 0 | 135 | | filter = filter.NormalizeName(); |
| | 0 | 136 | | contragentId = _authService.IsUserPlatform() ? contragentId : _authService.ContragentId; |
| | 0 | 137 | | int result = await Task.FromResult(_service.GetUsers(1, 1, filter, "login", contragentId).Result.TotalFilter |
| | 0 | 138 | | return Ok(new CountDTO(result)); |
| | 0 | 139 | | } |
| | | 140 | | |
| | | 141 | | /// <summary> |
| | | 142 | | /// Получить юзера по ID |
| | | 143 | | /// </summary> |
| | | 144 | | /// <remarks>author i.rebenok</remarks> |
| | | 145 | | /// <param name="id">id юзера</param> |
| | | 146 | | //[MethodAuthorize("GetUser")] |
| | | 147 | | [HttpGet("{id}")] |
| | | 148 | | [SwaggerResponse(200, "Успешно", typeof(UserResponseDTO))] |
| | | 149 | | [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))] |
| | | 150 | | [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))] |
| | | 151 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 152 | | // [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.SupplierOwner + "," + Role.Suppl |
| | | 153 | | public async Task<IActionResult> GetUser([SwaggerParameter(Required = true)] long id) |
| | 0 | 154 | | { |
| | 0 | 155 | | if (!_authService.IsUserPlatform() && _authService.UserId != id) |
| | 0 | 156 | | return NotFoundResult($"Пользователь с id={id} не найден"); |
| | 0 | 157 | | var result = await _service.GetUser(id); |
| | 0 | 158 | | if (result == null) |
| | 0 | 159 | | return NotFoundResult($"Пользователь с id={id} не найден"); |
| | 0 | 160 | | return Ok(new UserResponseDTO(result)); |
| | 0 | 161 | | } |
| | | 162 | | } |
| | | 163 | | } |