public async Task <Response> PublishRepository(byte[] repoBytes, PublishInfo publishInfo)
        {
            B2ShareMetaData     b2ShareMetaData = publishInfo.metaData.ToB2ShareMetaData();
            HttpResponseMessage response        = await CreateDraftRecord(b2ShareMetaData, publishInfo.token);

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

            B2ShareDraftResponse draftResponse = await response.ToB2ShareDraftResponse();

            response = await UploadBytesToDraftRecord(repoBytes, $"{publishInfo.repoName}.zip", draftResponse.fileBucketId, publishInfo.token);

            if (!response.IsSuccessStatusCode)
            {
                // Delete draft to ensure transactional nature of request
                await DeleteDraftRecord(draftResponse.recordId, publishInfo.token);

                return(await PublishErrorResponse(response));
            }

            response = await PublishDraftRecord(draftResponse.recordId, publishInfo.token);

            if (!response.IsSuccessStatusCode)
            {
                // Delete draft to ensure transactional nature of request
                await DeleteDraftRecord(draftResponse.recordId, publishInfo.token);

                return(await PublishErrorResponse(response));
            }

            B2SharePublishResponse b2SharePublishResponse = await response.ToB2SharePublishResponse();

            return(new PublishResponse()
            {
                message = "Repository succesfully published.",
                publishUrl = b2SharePublishResponse.publicationUrl
            });
        }
        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++)
            {
                B2ShareMetaData     b2ShareMetaData = publishInfos[i].metaData.ToB2ShareMetaData();
                HttpResponseMessage response        = await CreateDraftRecord(b2ShareMetaData, publishInfos[i].token);

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

                B2ShareDraftResponse draftResponse = await response.ToB2ShareDraftResponse();

                response = await UploadBytesToDraftRecord(publishInfos[i].snapshot.zippedBytes, $"{publishInfos[i].repoName}.zip", draftResponse.fileBucketId, publishInfos[i].token);

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

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

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

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

                    publications[i].publicationUrl = publicationResponse.publicationUrl;
                }
            }

            B2ShareMetaData bundleB2ShareMetaData = bundlePublishInfo.metaData.ToB2ShareMetaData();

            bundleB2ShareMetaData.resource_types = publications
                                                   .Select(p => new B2ShareResourceType()
            {
                resource_type = p.publicationUrl, resource_type_general = "Software"
            })
                                                   .Union(duplicates.Select(d => new B2ShareResourceType()
            {
                resource_type = d.PublicationUrl, resource_type_general = "Software"
            }))
                                                   .ToArray();

            HttpResponseMessage bundleResponse = await CreateDraftRecord(bundleB2ShareMetaData, bundlePublishInfo.token);

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

            B2ShareDraftResponse bundleDraftResponse = await bundleResponse.ToB2ShareDraftResponse();

            bundleResponse = await PublishDraftRecord(bundleDraftResponse.recordId, bundlePublishInfo.token);

            if (!bundleResponse.IsSuccessStatusCode)
            {
                // Delete all drafts to ensure transactional nature of request
                await DeleteDraftRecord(bundleDraftResponse.recordId, bundlePublishInfo.token);

                return(await PublishErrorResponse(bundleResponse));
            }

            return(await bundleResponse.ToMultiplePublishResponse(publications));
        }