public async Task <RenewTokenModel> Handle(RenewAccountSessionCommand request, CancellationToken cancellationToken) { var accIdFromContext = _httpContextService.GetAccountIdFromContext(); if (accIdFromContext != request.AccountId) { throw new RenewAccountSessionException(request.AccountId, "operation not allowed"); } var session = _repo.AccountSessions.SingleOrDefault(s => s.AccountId == request.AccountId); if (session == null) { throw new RenewAccountSessionException(request.AccountId, "session not found"); } if (session.RenewToken != request.RenewToken) { throw new RenewAccountSessionException(request.AccountId, $"renew token not equal current:{session.RenewToken} requested:{request.RenewToken}"); } if (session.RenewExpired < DateTime.Now) { _repo.Remove(session); await _repo.SaveChangesAsync(cancellationToken); throw new RenewAccountSessionException(request.AccountId, $"renew token expired"); } session.RenewExpired = DateTime.Now.AddSeconds(_authConfig.renewExpiredInSec); session.SessionExpired = DateTime.Now.AddSeconds(_authConfig.sessionExpiredInSec); session.RenewToken = _token.IssueToken(); var acc = await _repo.Accounts.SingleAsync(x => x.Id == accIdFromContext, cancellationToken); _repo.AccountSessions.Update(session); await _repo.SaveChangesAsync(cancellationToken); await _mediator.Publish(new RenewAccountSessionSuccessDomainEvent(request.AccountId, session.IssuedOn, session.RenewToken, session.SessionExpired, acc.Role), cancellationToken); return(RenewTokenModel.Create(session)); }