Skip to content

Commit 258d926

Browse files
committed
feat: release status and retry page
1 parent a55cd28 commit 258d926

File tree

5 files changed

+113
-17
lines changed

5 files changed

+113
-17
lines changed

src/api/getGithubReleaseStatus.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ const schema = {
2929
required: ['status', 'errors'],
3030
properties: {
3131
status: {type: 'string'},
32+
publishedExtensionName: {type: 'string'},
33+
publishedVersion: {type: 'string'},
3234
errors: {type: 'array', "items": {"type": "string"}},
3335
published: {type: 'boolean'},
3436
githubIssue: {type: 'string'},
@@ -67,6 +69,12 @@ export async function getGithubReleaseStatus(request, _reply) {
6769
response.errors = existingRelease.errors;
6870
response.githubIssue = "" + existingRelease.githubIssue;
6971
response.lastUpdatedDateUTC = existingRelease.lastUpdatedDateUTC;
72+
if(existingRelease.publishedExtensionName){
73+
response.publishedExtensionName = existingRelease.publishedExtensionName;
74+
}
75+
if(existingRelease.publishedVersion){
76+
response.publishedVersion = existingRelease.publishedVersion;
77+
}
7078
}
7179
return response;
7280
}

src/api/publishGithubRelease.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,15 +201,15 @@ async function _validateExtensionPackageJson(githubReleaseTag, packageJSON, repo
201201
if(registryPKGJSON) {
202202
for(let versionInfo of registryPKGJSON.versions){
203203
if(versionInfo.version === packageJSON.version){
204-
let errorMsg = `Package version "${packageJSON.version}" already published on ${versionInfo.published}. Please update version number to above ${registryPKGJSON.metadata.version}.`;
204+
let errorMsg = `Extension: ${packageJSON.name}, Package version "${packageJSON.version}" already published on ${versionInfo.published}. Please update version number to above ${registryPKGJSON.metadata.version}.`;
205205
error = error + `\n${errorMsg}`;
206206
issueMessages.push(errorMsg);
207207
break;
208208
}
209209
}
210210
existingRegistryPKGVersion = registryPKGJSON.metadata.version;
211211
if(lte(packageJSON.version, existingRegistryPKGVersion)){
212-
let errorMsg = `Package version should be greater than ${existingRegistryPKGVersion}, but received "${packageJSON.version}".`;
212+
let errorMsg = `Extension: ${packageJSON.name}, Package version should be greater than ${existingRegistryPKGVersion}, but received "${packageJSON.version}".`;
213213
error = error + `\n${errorMsg}`;
214214
issueMessages.push(errorMsg);
215215
}
@@ -263,7 +263,7 @@ async function _downloadAndValidateExtensionZip(githubReleaseTag, extensionZipAs
263263
}
264264
}
265265
if(!packageJSON?.engines?.brackets){
266-
missingParams.push(`"engines":{"brackets":<version Eg. ">=0.34.0"}>`);
266+
missingParams.push(`Eg.: "engines":{"brackets": ">=0.34.0" }>`);
267267
}
268268
if(missingParams.length){
269269
error = "Required parameters missing in package.json: " + missingParams;
@@ -346,7 +346,7 @@ async function _UpdateReleaseInfo(release, existingReleaseInfo) {
346346
}
347347
}
348348

349-
async function _UpdateReleaseSuccess(release, existingReleaseInfo) {
349+
async function _UpdateReleaseSuccess(release, existingReleaseInfo, registryPKGJSON) {
350350
if(!existingReleaseInfo || !existingReleaseInfo.documentId) {
351351
console.error("_UpdateReleaseSuccess called without an existing release entry.");
352352
throw new Error("Internal error. this shouldn't have happened. Please raise an issue in https://github.com/phcode-dev/phoenix/issues");
@@ -355,6 +355,8 @@ async function _UpdateReleaseSuccess(release, existingReleaseInfo) {
355355
existingReleaseInfo.published = true;
356356
existingReleaseInfo.status = RELEASE_STATUS_PUBLISHED;
357357
existingReleaseInfo.lastUpdatedDateUTC = Date.now();
358+
existingReleaseInfo.publishedExtensionName = registryPKGJSON.metadata.name;
359+
existingReleaseInfo.publishedVersion = registryPKGJSON.metadata.version;
358360
console.log("Update release table success: ", await db.update(RELEASE_DETAILS_TABLE, existingReleaseInfo.documentId,
359361
existingReleaseInfo));
360362
if(existingReleaseInfo.githubIssue){
@@ -426,7 +428,7 @@ export async function publishGithubRelease(request, reply) {
426428

427429
await syncRegistryDBToS3JSON();
428430

429-
await _UpdateReleaseSuccess(githubReleaseTag, existingReleaseInfo);
431+
await _UpdateReleaseSuccess(githubReleaseTag, existingReleaseInfo, registryPKGJSON);
430432

431433
const response = {
432434
message: "done"

src/www/publish/index.html

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313
if (!url.endsWith("/") && !url.endsWith("index.html")) {
1414
location.href = url + "/?" + queryParams;
1515
}
16-
const urlParams = new URLSearchParams(window.location.search);
17-
document.title = `${urlParams.get('tag')} Release Publish status`;
1816
</script>
17+
<script src="script.js"></script>
1918

2019
<link href="../bootstrap/css/bootstrap.min.css" rel="stylesheet" />
2120

@@ -86,7 +85,7 @@
8685
}
8786
</style>
8887
</head>
89-
<body>
88+
<body onload="showStatus();">
9089
<main>
9190
<div class="container py-4">
9291
<header class="pb-3 mb-4 border-bottom">
@@ -107,14 +106,14 @@ <h2 id="releaseCheckStatus">Please wait...</h2>
107106
class="p-5 mb-4 bg-light rounded-3 hidden">
108107
<div class="container-fluid py-5">
109108
<h1 class="display-4 fw-bold status-fail">
110-
<a
109+
<a id="successReleaseLink"
111110
class="status-success"
112111
href="https://github.com/user/repo/releases/tag/githubReleaseTag"
113112
target="_blank"
114113
>extension, githubReleaseTag Published</a
115114
>
116115
</h1>
117-
<h2>version: 3.2.5</h2>
116+
<h2 id="successVersion">version: 3.2.5</h2>
118117
<p class="col-md-8 fs-4">Release details</p>
119118
<div
120119
class="alert alert-success alert-dismissible fade show"
@@ -130,7 +129,7 @@ <h2>version: 3.2.5</h2>
130129
class="p-5 mb-4 bg-light rounded-3 hidden">
131130
<div class="container-fluid py-5">
132131
<h1 class="display-4 fw-bold status-fail">
133-
<a
132+
<a id="failedReleaseLink"
134133
class="status-fail"
135134
href="https://github.com/user/repo/releases/tag/dfg"
136135
target="_blank"
@@ -147,13 +146,8 @@ <h1 class="display-4 fw-bold status-fail">
147146
<span id="processedDate">1/Jan/2023 UTC</span>
148147
</div>
149148
<div id="publishErrorList">
150-
<div
151-
class="alert alert-danger alert-dismissible fade show"
152-
role="alert">
153-
Fix this and that.
154-
</div>
155149
</div>
156-
<button class="btn btn-primary btn-lg" type="button">
150+
<button id="retryRelease" onclick="retryRelease()" class="btn btn-primary btn-lg" type="button">
157151
Retry release
158152
</button>
159153
</div>

src/www/publish/script.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*globals window, document, location*/
2+
const urlParams = new URLSearchParams(window.location.search);
3+
document.title = `${urlParams.get('tag')} Release Publish status`;
4+
const owner = urlParams.get('owner'),
5+
repo = urlParams.get('repo'),
6+
tag = urlParams.get('tag');
7+
function _addError(errorMessage) {
8+
let errorNode = document.getElementById("publishErrorList");
9+
errorNode.innerHTML = errorNode.innerHTML + `<div
10+
class="alert alert-danger alert-dismissible fade show"
11+
role="alert">
12+
${errorMessage}
13+
</div>`;
14+
}
15+
16+
function retryRelease() {
17+
document.getElementById("retryRelease").setAttribute('disabled', '');
18+
document.getElementById("retryRelease").textContent = "Publishing....";
19+
fetch(`../../publishGithubRelease?releaseRef=${owner}/${repo}:refs/tags/${tag}`)
20+
.finally(()=>{
21+
location.reload();
22+
});
23+
}
24+
25+
function showStatus() {
26+
fetch(`../../getGithubReleaseStatus?owner=${owner}&repo=${repo}&tag=${tag}`).then(async result=>{
27+
let releaseDetail = await result.json();
28+
console.log(releaseDetail);
29+
if(releaseDetail.published) {
30+
document.getElementById("releaseCheckingSection").classList.add("hidden");
31+
document.getElementById("releaseSuccessSection").classList.remove("hidden");
32+
document.getElementById("successReleaseLink").textContent =
33+
`${releaseDetail.publishedExtensionName} Published`;
34+
document.getElementById("successReleaseLink").setAttribute("href",
35+
`https://github.com/${owner}/${repo}/releases/tag/${tag}`);
36+
document.getElementById("successVersion").textContent =
37+
`Version: ${releaseDetail.publishedVersion}`;
38+
document.getElementById("publishedDate").textContent =
39+
`${new Date(releaseDetail.lastUpdatedDateUTC)}`;
40+
} else {
41+
document.getElementById("releaseCheckingSection").classList.add("hidden");
42+
document.getElementById("releaseFailedSection").classList.remove("hidden");
43+
document.getElementById("failedReleaseLink").textContent =
44+
`${tag} Failed to Publish`;
45+
document.getElementById("failedReleaseLink").setAttribute("href",
46+
`https://github.com/${owner}/${repo}/releases/tag/${tag}`);
47+
document.getElementById("processedDate").textContent =
48+
`${new Date(releaseDetail.lastUpdatedDateUTC)}`;
49+
for(let error of releaseDetail.errors){
50+
_addError(error);
51+
}
52+
let timeSinceRelease = (Date.now() - releaseDetail.lastUpdatedDateUTC) / 1000;
53+
if(releaseDetail.status === "processing" && timeSinceRelease < 60){
54+
// if release is in processing state, we dont allow retry for 60 seconds.
55+
// There is a check in server too, so it will fail anyway.
56+
document.getElementById("retryRelease").setAttribute('disabled', '');
57+
_addError(`Release is in progress. You can Retry release in ${60 - timeSinceRelease} Seconds.`);
58+
}
59+
}
60+
}).catch((err)=>{
61+
console.error("Error while fetching release status", err);
62+
document.getElementById("releaseCheckStatus").textContent = "Could not retrieve release status.";
63+
});
64+
}

test/unit/api/getGithubReleaseStatus.spec.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,34 @@ describe('unit Tests for getGithubReleaseStatus api', function () {
5454
});
5555
});
5656

57+
it('should getGithubReleaseStatus return existing release with optional details', async function () {
58+
db.getFromIndex = function (_tableName) {
59+
return {
60+
isSuccess: true,
61+
documents: [{
62+
published: false,
63+
status: "PROCESSING",
64+
errors: ["oops"],
65+
githubIssue: "5",
66+
lastUpdatedDateUTC: 1234,
67+
publishedExtensionName: "a.x",
68+
publishedVersion: "1.0.0"
69+
}]};
70+
};
71+
let helloResponse = await getGithubReleaseStatus(_getRequest(), getSimpleGetReply());
72+
expect(helloResponse).eql({
73+
"errors": [
74+
"oops"
75+
],
76+
"githubIssue": "5",
77+
"lastUpdatedDateUTC": 1234,
78+
"published": false,
79+
"status": "PROCESSING",
80+
publishedExtensionName: "a.x",
81+
publishedVersion: "1.0.0"
82+
});
83+
});
84+
5785
it('should validate schemas for sample request/responses', async function () {
5886
let request = _getRequest();
5987
// request

0 commit comments

Comments
 (0)