public async Task <IUpdateUserResult> Handle(UpdateUser request, CancellationToken cancellationToken) { var existingUser = await _mediator.Send(new GetUserById(request.UserId), cancellationToken); return(existingUser switch { UserNotFound _ => UserNotFound.Instance, UserFound userFound when IsNotMatchingETags(userFound.Etag, request.Etag) => new NewerVersionOfUserRecordFound(userFound.Etag), UserFound userFound => await UpdateUser(request, userFound, cancellationToken), _ => throw new ArgumentOutOfRangeException(nameof(existingUser)) });
public async Task <IActionResult> GetUser(Guid userId, [FromHeader(Name = "If-None-Match")] string etag) { var userResult = await _mediator.Send(new GetUserById(userId, etag)); var response = userResult switch { UserFound userFound => GetUserFoundResult(userFound), UserNotModified _ => new StatusCodeResult((int)HttpStatusCode.NotModified), UserNotFound _ => NotFound(), _ => throw new ArgumentOutOfRangeException(nameof(userResult)) }; return(response); IActionResult GetUserFoundResult(UserFound userFound) { var(errorMessage, userDto) = _mapper.MapTo <UserDto>(userFound.User); if (!string.IsNullOrWhiteSpace(errorMessage)) { throw new Exception(errorMessage); } return(new ObjectResult(ForExistingUser(userDto, userFound.Etag))); } }