public async Task <string> CreateTokenAsync(long githubRepositoryId)
        {
            Repository repository = await _gitHubUserModelService.GetRepositoryAsync(githubRepositoryId);

            if (repository == null)
            {
                throw new ArgumentException("Repository does not exist or no permission to access given repository.");
            }

            var accessTokens = await _tokenRepository.GetByRepositoryIdsAsync(new[] { githubRepositoryId });

            if (accessTokens.Any())
            {
                throw new ArgumentException("Repository already has a token.");
            }

            var tokenHandler       = new JsonWebTokenHandler();
            var signingCredentials = new SigningCredentials(SecurityKey, SecurityAlgorithms.HmacSha256Signature);

            var user = _contextAccessor.HttpContext.User;

            var accessToken = new AccessToken()
            {
                Id = Guid.NewGuid(),
                GitHubRepositoryId = repository.Id,
                IssuedAt           = DateTimeOffset.UtcNow,
                IssuedTo           = user.Claims.First(c => c.Type.Equals(ClaimTypes.NameIdentifier)).Value
            };

            await _tokenRepository.AddAsync(accessToken);

            var payload = new JObject()
            {
                { JwtRegisteredClaimNames.Aud, "MSBLOC.Api" },
                { JwtRegisteredClaimNames.Jti, accessToken.Id },
                { JwtRegisteredClaimNames.Iat, accessToken.IssuedAt.ToUnixTimeSeconds() },
                { "urn:msbloc:repositoryId", repository.Id },
                { "urn:msbloc:repositoryName", repository.Name },
                { "urn:msbloc:repositoryOwner", repository.Owner },
                { "urn:msbloc:repositoryOwnerId", repository.OwnerId },
                { JwtRegisteredClaimNames.Sub, accessToken.IssuedTo },
            };

            var accessTokenString = tokenHandler.CreateToken(payload, signingCredentials);

            return(accessTokenString);
        }