private async Task <int?> GetProjectIdInternal(string httpUrlToRepo)
        {
            var page    = 1;
            var url     = $"{_settings.Url}/v4/projects";
            var headers = new { PRIVATE_TOKEN = _settings.Token };

            while (true)
            {
                var data     = new { page, per_page = 100, simple = true };
                var projects = await FlurlHelper.GetJsonAsync <IEnumerable <Project> >(url, data, headers);

                if (!projects.Any())
                {
                    return(null);
                }

                var project = projects.FirstOrDefault(f => f.http_url_to_repo.StartsWith(httpUrlToRepo, StringComparison.CurrentCultureIgnoreCase));
                if (project != null)
                {
                    return(project.id);
                }

                page++;
            }
        }
        public async Task <Stream> GetFileStream(string httpUrlToRepo, string refName, string path)
        {
            var projectId = await GetProjectId(httpUrlToRepo);

            if (!projectId.HasValue)
            {
                throw new Exception($"Project id was not found for {httpUrlToRepo}");
            }

            var url     = $"{_settings.Url}/v4/projects/{projectId}/repository/files/{HttpUtility.UrlEncode(path)}/raw?ref={refName}";
            var headers = new { PRIVATE_TOKEN = _settings.Token };

            return(await FlurlHelper.GetFileStream(url, headers));
        }
        public async Task AddTag(string httpUrlToRepo, string refName, string tagName, string message, string releaseDescription)
        {
            var projectId = await GetProjectId(httpUrlToRepo);

            if (!projectId.HasValue)
            {
                throw new Exception($"Project id was not found for {httpUrlToRepo}");
            }

            var url     = $"{_settings.Url}/v4/projects/{projectId}/repository/tags";
            var headers = new { PRIVATE_TOKEN = _settings.Token };
            var data    = new Dictionary <string, object>
            {
                { "ref", refName },
                { "tag_name", tagName },
                { "message", message },
                { "release_description", releaseDescription }
            };

            await FlurlHelper.PostJsonAsync(url, data, headers);
        }
        private async Task <Project> GetProject(int?projectId)
        {
            if (!projectId.HasValue)
            {
                return(null);
            }

            var url     = $"{_settings.Url}/v4/projects/{projectId}";
            var headers = new { PRIVATE_TOKEN = _settings.Token };
            var data    = new { simple = true };

            try
            {
                return(await FlurlHelper.GetJsonAsync <Project>(url, data, headers));
            }
            catch
            {
                Console.WriteLine($"{url} not found");
            }

            return(null);
        }