public async Task <Response> PublishMultipleRepositories(List <PublishInfo> publishInfos, List <Publication> duplicates, PublishInfo bundlePublishInfo)
        {
            List <PublishingSystemPublication> publications = new List <PublishingSystemPublication>();
            List <Response> responses = new List <Response>();

            for (int i = 0; i < publishInfos.Count; i++)
            {
                FigshareMetaData    figshareMetaData = publishInfos[i].metaData.ToFigshareMetaData();
                HttpResponseMessage response         = await CreateArticle(figshareMetaData, publishInfos[i].token);

                if (!response.IsSuccessStatusCode)
                {
                    for (int j = 0; j < i; j++)
                    {
                        // Delete all drafts to ensure transactional nature of request
                        await DeleteArticle(int.Parse(publications[j].publicationId), publishInfos[j].token);
                    }
                    return(await PublishErrorResponse(response));
                }

                FigshareCreateResponse figshareCreateResponse = await response.ToFigshareCreateResponse();

                int articleId = int.Parse(figshareCreateResponse.location.Split('/').Last());

                response = await CreateFile(publishInfos[i].repoName, publishInfos[i].snapshot.zippedBytes.Length, articleId, publishInfos[i].token);

                if (!response.IsSuccessStatusCode)
                {
                    for (int j = 0; j < i; j++)
                    {
                        // Delete all drafts to ensure transactional nature of request
                        await DeleteArticle(int.Parse(publications[j].publicationId), publishInfos[j].token);
                    }
                    return(await PublishErrorResponse(response));
                }

                figshareCreateResponse = await response.ToFigshareCreateResponse();

                int fileId = int.Parse(figshareCreateResponse.location.Split('/').Last());

                response = await GetFileInfo(articleId, fileId, publishInfos[i].token);

                if (!response.IsSuccessStatusCode)
                {
                    for (int j = 0; j < i; j++)
                    {
                        // Delete all drafts to ensure transactional nature of request
                        await DeleteArticle(int.Parse(publications[j].publicationId), publishInfos[j].token);
                    }
                    return(await PublishErrorResponse(response));
                }

                FigshareFile file = await response.ToFigshareFile();

                response = await UploadBytesToFile(publishInfos[i].snapshot.zippedBytes, file.upload_url, publishInfos[i].token);

                if (!response.IsSuccessStatusCode)
                {
                    for (int j = 0; j < i; j++)
                    {
                        // Delete all drafts to ensure transactional nature of request
                        await DeleteArticle(int.Parse(publications[j].publicationId), publishInfos[j].token);
                    }
                    return(await PublishErrorResponse(response));
                }

                response = await CompleteFileUpload(articleId, fileId, publishInfos[i].token);

                if (!response.IsSuccessStatusCode)
                {
                    for (int j = 0; j < i; j++)
                    {
                        // Delete all drafts to ensure transactional nature of request
                        await DeleteArticle(int.Parse(publications[j].publicationId), publishInfos[j].token);
                    }
                    return(await PublishErrorResponse(response));
                }

                if (!publishInfos[i].metaData.open_access)
                {
                    response = await MakeArticleConfidential(articleId, publishInfos[i].token);

                    if (!response.IsSuccessStatusCode)
                    {
                        for (int j = 0; j < i; j++)
                        {
                            // Delete all drafts to ensure transactional nature of request
                            await DeleteArticle(int.Parse(publications[j].publicationId), publishInfos[j].token);
                        }
                        return(await PublishErrorResponse(response));
                    }
                }

                publications.Add(new PublishingSystemPublication()
                {
                    publicationId = articleId.ToString(),
                    publishInfo   = publishInfos[i]
                });
            }

            for (int i = 0; i < publications.Count; i++)
            {
                HttpResponseMessage response = await PublishArticle(int.Parse(publications[i].publicationId), publications[i].publishInfo.token);

                if (!response.IsSuccessStatusCode)
                {
                    for (int j = 0; j < i; j++)
                    {
                        // Delete all drafts to ensure transactional nature of request
                        await DeleteArticle(int.Parse(publications[j].publicationId), publishInfos[j].token);
                    }
                    return(await PublishErrorResponse(response));
                }
                else
                {
                    FigshareCreateResponse figshareCreateResponse = await response.ToFigshareCreateResponse();

                    publications[i].publicationUrl = figshareCreateResponse.location;
                }
            }

            FigshareMetaData bundleFigshareMetaData = bundlePublishInfo.metaData.ToFigshareMetaData();

            bundleFigshareMetaData.references = publications.Select(x => x.publicationUrl)
                                                .Union(duplicates.Select(x => x.PublicationUrl))
                                                .ToArray();

            HttpResponseMessage bundleResponse = await CreateArticle(bundleFigshareMetaData, bundlePublishInfo.token);

            if (!bundleResponse.IsSuccessStatusCode)
            {
                return(await PublishErrorResponse(bundleResponse));
            }

            FigshareCreateResponse figshareBundleCreateResponse = await bundleResponse.ToFigshareCreateResponse();

            int bundleArticleId = int.Parse(figshareBundleCreateResponse.location.Split('/').Last());

            bundleResponse = await PublishArticle(bundleArticleId, bundlePublishInfo.token);

            if (!bundleResponse.IsSuccessStatusCode)
            {
                await DeleteArticle(bundleArticleId, bundlePublishInfo.token);

                return(await PublishErrorResponse(bundleResponse));
            }

            return(await bundleResponse.ToMultiplePublishResponse(publications, figshareBundleCreateResponse.location));
        }
        public async Task <Response> PublishRepository(byte[] repoBytes, PublishInfo publishInfo)
        {
            FigshareMetaData    figshareMetaData = publishInfo.metaData.ToFigshareMetaData();
            HttpResponseMessage response         = await CreateArticle(figshareMetaData, publishInfo.token);

            if (!response.IsSuccessStatusCode)
            {
                return(await PublishErrorResponse(response));
            }

            FigshareCreateResponse figshareCreateResponse = await response.ToFigshareCreateResponse();

            int articleId = int.Parse(figshareCreateResponse.location.Split('/').Last());

            response = await CreateFile(publishInfo.repoName, repoBytes.Length, articleId, publishInfo.token);

            if (!response.IsSuccessStatusCode)
            {
                await DeleteArticle(articleId, publishInfo.token);

                return(await PublishErrorResponse(response));
            }

            figshareCreateResponse = await response.ToFigshareCreateResponse();

            int fileId = int.Parse(figshareCreateResponse.location.Split('/').Last());

            response = await GetFileInfo(articleId, fileId, publishInfo.token);

            if (!response.IsSuccessStatusCode)
            {
                await DeleteArticle(articleId, publishInfo.token);

                return(await PublishErrorResponse(response));
            }

            FigshareFile file = await response.ToFigshareFile();

            response = await UploadBytesToFile(repoBytes, file.upload_url, publishInfo.token);

            if (!response.IsSuccessStatusCode)
            {
                await DeleteArticle(articleId, publishInfo.token);

                return(await PublishErrorResponse(response));
            }

            response = await CompleteFileUpload(articleId, fileId, publishInfo.token);

            if (!response.IsSuccessStatusCode)
            {
                await DeleteArticle(articleId, publishInfo.token);

                return(await PublishErrorResponse(response));
            }

            if (!publishInfo.metaData.open_access)
            {
                response = await MakeArticleConfidential(articleId, publishInfo.token);

                if (!response.IsSuccessStatusCode)
                {
                    await DeleteArticle(articleId, publishInfo.token);

                    return(await PublishErrorResponse(response));
                }
            }

            response = await PublishArticle(articleId, publishInfo.token);

            if (!response.IsSuccessStatusCode)
            {
                await DeleteArticle(articleId, publishInfo.token);

                return(await PublishErrorResponse(response));
            }

            figshareCreateResponse = await response.ToFigshareCreateResponse();

            return(new PublishResponse()
            {
                message = "Repository succesfully published.",
                publishUrl = figshareCreateResponse.location
            });
        }