private bool IsDuplicateBundle(PublicationBundle bundle, List <Publication> publications)
        {
            foreach (Publication pub in publications)
            {
                if (!bundle.PublicationIds.Contains(pub.Id))
                {
                    return(false);
                }
            }

            return(true);
        }
        public PublicationBundle CreatePublicationBundle(string[] publicationUrls, string[] publicationIds, string publicationUrl, bool open_access)
        {
            PublicationBundle publicationBundle = new PublicationBundle()
            {
                PublicationIds  = publicationIds,
                PublicationUrls = publicationUrls,
                PublicationUrl  = publicationUrl,
                Open_Access     = open_access
            };

            publicationBundles.InsertOne(publicationBundle);

            return(publicationBundle);
        }
        public async Task <ActionResult <List <PublishResponse> > > PublishRepositoryBundle([FromBody] PublishInfo[] publishInfos)
        {
            List <PublishInfo> publicationsToMake = new List <PublishInfo>();

            string[]           publicationIds  = new string[0];
            string[]           publicationUrls = new string[0];
            List <Publication> duplicates      = new List <Publication>();

            for (int i = 0; i < publishInfos.Length - 1; i++)
            {
                IVcsService vcsService;
                switch (publishInfos[i].versionControl)
                {
                case "git": vcsService = gitHubService; break;

                case "svn": vcsService = subversionService; break;

                default: vcsService = gitHubService; break;
                }

                Snapshot snapshot;
                try
                {
                    snapshot = vcsService.GetRepositorySnapshot(publishInfos[i].repoURL, publishInfos[i].repoName, publishInfos[i].snapshotId, HttpContext.TraceIdentifier.Replace(':', '.'));
                }
                catch
                {
                    return(BadRequest(new ErrorResponse()
                    {
                        message = $"An error occurred while accessing the repository at {publishInfos[i].repoURL}. Please make sure the repository is publicly accessible."
                    }));
                }

                Publication duplicate = publicationService.FindDuplicatePublication(snapshot.checksum);
                if (duplicate != null)
                {
                    duplicates.Add(duplicate);
                    publicationIds  = publicationIds.Append(duplicate.Id).ToArray();
                    publicationUrls = publicationUrls.Append(duplicate.PublicationUrl).ToArray();
                }
                else
                {
                    publishInfos[i].snapshot = snapshot;
                    publicationsToMake.Add(publishInfos[i]);
                }
            }

            // All repositories have been published already
            if (duplicates.Count == publishInfos.Length - 1)
            {
                PublicationBundle duplicateBundle = publicationService.FindDuplicatePublicationBundle(duplicates);

                if (duplicateBundle != null)
                {
                    return(BadRequest(new DuplicatePublicationResponse()
                    {
                        message = $"A similar bundle has already been published.",
                        duplicatePublicationUrl = duplicateBundle.PublicationUrl
                    }));
                }
            }

            PublishInfo bundlePublishInfo = publishInfos.Last();

            IPublishingService publishingService;

            switch (bundlePublishInfo.publishingSystem)
            {
            case "b2share": publishingService = b2ShareService; break;

            case "figshare": publishingService = figshareService; break;

            case "dataverse": publishingService = dataverseService; break;

            default: publishingService = b2ShareService; break;
            }

            Response response = await publishingService.PublishMultipleRepositories(publicationsToMake, duplicates, bundlePublishInfo);

            if (response is MultiplePublishResponse)
            {
                MultiplePublishResponse publishResponse = (MultiplePublishResponse)response;
                foreach (PublishingSystemPublication pubSystemPublication in publishResponse.bundlePublicationInfos)
                {
                    Publication publication = publicationService.CreatePublication(pubSystemPublication.publishInfo.repoURL, pubSystemPublication.publicationUrl, pubSystemPublication.publishInfo.metaData.open_access, pubSystemPublication.publishInfo.snapshot.checksum);
                    publicationIds  = publicationIds.Append(publication.Id).ToArray();
                    publicationUrls = publicationUrls.Append(publication.PublicationUrl).ToArray();
                }

                PublicationBundle publicationBundle = publicationService.CreatePublicationBundle(publicationUrls, publicationIds, publishResponse.bundlePublicationUrl, bundlePublishInfo.metaData.open_access);

                return(Ok(new PublishResponse
                {
                    message = "Bundle successfully published.",
                    publishUrl = publicationBundle.PublicationUrl
                }));
            }
            else if (response is PublishErrorResponse)
            {
                return(BadRequest(response));
            }

            return(BadRequest(new ErrorResponse()
            {
                message = "Unknown error occurred."
            }));
        }