From afc9bf4f3fe14ccb60851fc24e68922a6e4a85a9 Mon Sep 17 00:00:00 2001 From: Erez Rokah Date: Tue, 9 Jun 2020 20:33:16 +0300 Subject: [PATCH] feat(backend-gitgateway): improve deploy preview visibility (#3882) --- .../netlify-cms-backend-bitbucket/src/API.ts | 7 ++++ .../src/implementation.ts | 36 +++++++++++++++++-- .../netlify-cms-backend-github/src/API.ts | 7 ++++ .../netlify-cms-backend-gitlab/src/API.ts | 7 ++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/packages/netlify-cms-backend-bitbucket/src/API.ts b/packages/netlify-cms-backend-bitbucket/src/API.ts index 92cc996b..e83ed8ae 100644 --- a/packages/netlify-cms-backend-bitbucket/src/API.ts +++ b/packages/netlify-cms-backend-bitbucket/src/API.ts @@ -771,4 +771,11 @@ export default class API { target_url: url, })); } + + async getUnpublishedEntrySha(collection: string, slug: string) { + const contentKey = generateContentKey(collection, slug); + const branch = branchFromContentKey(contentKey); + const pullRequest = await this.getBranchPullRequest(branch); + return pullRequest.destination.commit.hash; + } } diff --git a/packages/netlify-cms-backend-git-gateway/src/implementation.ts b/packages/netlify-cms-backend-git-gateway/src/implementation.ts index c7be0c7d..7fbbdac8 100644 --- a/packages/netlify-cms-backend-git-gateway/src/implementation.ts +++ b/packages/netlify-cms-backend-git-gateway/src/implementation.ts @@ -25,6 +25,7 @@ import { getLargeMediaFilteredMediaFiles, DisplayURLObject, AccessTokenError, + PreviewState, } from 'netlify-cms-lib-util'; import { GitHubBackend } from 'netlify-cms-backend-github'; import { GitLabBackend } from 'netlify-cms-backend-gitlab'; @@ -112,6 +113,12 @@ interface NetlifyUser extends Credentials { user_metadata: { full_name: string; avatar_url: string }; } +const apiGet = async (path: string) => { + const apiRoot = 'https://api.netlify.com/api/v1/sites'; + const response = await fetch(`${apiRoot}/${path}`).then(res => res.json()); + return response; +}; + export default class GitGateway implements Implementation { config: Config; api?: GitHubAPI | GitLabAPI | BitBucketAPI; @@ -347,7 +354,7 @@ export default class GitGateway implements Implementation { return this.tokenPromise!(); } - entriesByFolder(folder: string, extension: string, depth: number) { + async entriesByFolder(folder: string, extension: string, depth: number) { return this.backend!.entriesByFolder(folder, extension, depth); } allEntriesByFolder(folder: string, extension: string, depth: number) { @@ -533,7 +540,32 @@ export default class GitGateway implements Implementation { return this.backend!.deleteFile(path, commitMessage); } async getDeployPreview(collection: string, slug: string) { - return this.backend!.getDeployPreview(collection, slug); + let preview = await this.backend!.getDeployPreview(collection, slug); + if (!preview) { + try { + // if the commit doesn't have a status, try to use Netlify API directly + // this is useful when builds are queue up in Netlify and don't have a commit status yet + // and only works with public logs at the moment + // TODO: get Netlify API Token and use it to access private logs + const siteId = new URL(localStorage.getItem('netlifySiteURL') || '').hostname; + const site = await apiGet(siteId); + const deploys: { state: string; commit_ref: string; deploy_url: string }[] = await apiGet( + `${site.id}/deploys?per_page=100`, + ); + if (deploys.length > 0) { + const ref = await this.api!.getUnpublishedEntrySha(collection, slug); + const deploy = deploys.find(d => d.commit_ref === ref); + if (deploy) { + preview = { + status: deploy.state === 'ready' ? PreviewState.Success : PreviewState.Other, + url: deploy.deploy_url, + }; + } + } + // eslint-disable-next-line no-empty + } catch (e) {} + } + return preview; } unpublishedEntries() { return this.backend!.unpublishedEntries(); diff --git a/packages/netlify-cms-backend-github/src/API.ts b/packages/netlify-cms-backend-github/src/API.ts index 6eebf40e..c9d4daae 100644 --- a/packages/netlify-cms-backend-github/src/API.ts +++ b/packages/netlify-cms-backend-github/src/API.ts @@ -1473,4 +1473,11 @@ export default class API { ); return result; } + + async getUnpublishedEntrySha(collection: string, slug: string) { + const contentKey = this.generateContentKey(collection, slug); + const branch = branchFromContentKey(contentKey); + const pullRequest = await this.getBranchPullRequest(branch); + return pullRequest.head.sha; + } } diff --git a/packages/netlify-cms-backend-gitlab/src/API.ts b/packages/netlify-cms-backend-gitlab/src/API.ts index 3b43cceb..780ea781 100644 --- a/packages/netlify-cms-backend-gitlab/src/API.ts +++ b/packages/netlify-cms-backend-gitlab/src/API.ts @@ -850,4 +850,11 @@ export default class API { target_url, })); } + + async getUnpublishedEntrySha(collection: string, slug: string) { + const contentKey = generateContentKey(collection, slug); + const branch = branchFromContentKey(contentKey); + const mergeRequest = await this.getBranchMergeRequest(branch); + return mergeRequest.sha; + } }