В системе, которую я создаю, есть сложная и постоянно меняющаяся авторизация на основе ресурсов.Всего на данный момент шесть ролей.
Система обрабатывает участников, где все участники могут редактировать основную информацию в своем профиле, другой человек в другой роли может редактировать еще больше информации в своем профиле и так далее.
Я не могу понять, какой лучший способ создать это с помощью конечных точек / действий для сообщений, таких как действие редактирования члена.То, что я в итоге сделал, но мне не понравилось, это то, что у каждой роли есть одно действие контроллера, представление и модель представления.Основная причина сделать это вместо того, чтобы иметь одну модель представления, состоит в том, что я чувствовал, что не имеет смысла иметь все свойства, которые кто-то даже не может редактировать, это чрезмерная публикация, верно?
Я не совсем доволенрезультат.6 представлений моделей, 6 представлений, 6 безумно похожих действий контроллера, 6 валидаторов и т. Д.
Теперь моя идея состоит в том, что у меня будет только одно действие редактирования, а затем будет набор операторов if при сопоставлении с объектом домена, в представлении и на классах валидатора.Передозировка все еще там, но справилась с заявлениями if.Я тоже так думаю - что если система станет API?api/members/1/edit/
имеет больше смысла, чем api/members/1/editAsTreasurer
?
Что вы думаете?У кого-нибудь есть другое решение, о котором я не задумывался?
Некоторые части кода, например дублированный код, конечно, есть больше в классах валидаторов, представлениях и сопоставлениях, не уверен, сколько их включить:
[HttpPost]
public IActionResult EditAsSecretary(EditMemberAsSecretaryViewModel viewModel)
{
if (!ModelState.IsValid)
{
viewModel.Init(_basicDataProvider, _authorizationProvider.GetAuthorizedLogesForManageMember());
return View("EditAsSecretary", viewModel);
}
var member = _unitOfWork.Members.GetByMemberNumber(viewModel.MemberNumber, true);
if (member == null) return NotFound();
// Authorize
if (!_authorizationProvider.Authorize(viewModel.MemberInfo.LogeId, AdminType.Sekreterare))
return Forbid();
var user = _unitOfWork.Members.GetByUserName(User.Identity.Name);
var finallyEmail = viewModel.MemberContactInfo.Email != null && member.Email == null &&
!member.HasBeenSentResetPasswordMail && member.MemberNumber != user.MemberNumber;
_domainLogger.UpdateLog(viewModel, member, user);
UpdateMember(viewModel, member, user.Id);
_unitOfWork.Complete();
if (finallyEmail) SendUserResetPasswordMail(member).Wait();
TempData["Message"] = "Member has been updated.";
return RedirectToAction("Details", "Members", new { memberNumber = member.MemberNumber });
}
[HttpPost]
public IActionResult EditAsManager(EditMemberAsManagerViewModel viewModel)
{
if (!ModelState.IsValid)
{
viewModel.Init(_basicDataProvider, _authorizationProvider.GetAuthorizedLogesForManageMember());
return View("EditAsManager", viewModel);
}
var member = _unitOfWork.Members.GetByMemberNumber(viewModel.MemberNumber, true);
if (member == null) return NotFound();
// Authorize
if (!_authorizationProvider.Authorize(member.LogeId, AdminType.Manager))
return Forbid();
var user = _unitOfWork.Members.GetByUserName(User.Identity.Name);
var finallyEmail = viewModel.MemberContactInfo.Email != null && member.Email == null &&
!member.HasBeenSentResetPasswordMail && member.MemberNumber != user.MemberNumber;
_domainLogger.UpdateLog(viewModel, member, user);
UpdateMember(viewModel, member, user.Id);
_unitOfWork.Complete();
if (finallyEmail) SendUserResetPasswordMail(member).Wait();
TempData["Message"] = "Member has been updated.";
return RedirectToAction("Details", "Members", new { memberNumber = member.MemberNumber });
}
private void UpdateMember(EditMemberAsSecretaryViewModel viewModel, Member member, string userId)
{
_mapper.Map(viewModel, member);
MapGodfathers(viewModel.MemberInfo, member);
AfterUpdateMember(member, userId);
_userManager.UpdateNormalizedEmailAsync(member).Wait();
}
private void UpdateMember(EditMemberAsManagerViewModel viewModel, Member member, string userId)
{
_mapper.Map(viewModel, member);
MapGodfathers(viewModel.MemberInfo, member);
AfterUpdateMember(member, userId);
_userManager.UpdateNormalizedEmailAsync(member).Wait();
}