Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
daffdee
feat: added github actions to deploy to s3 bucket
isaackps Sep 17, 2025
7031d2f
fix: syntax error
isaackps Sep 17, 2025
545fc44
fix: if error
isaackps Sep 17, 2025
5930377
fix: remove optional
isaackps Sep 17, 2025
4d683cc
fix: update deploy s3 dev actions
isaackps Sep 23, 2025
b45e3d2
fix: update deploy prod yml
isaackps Sep 23, 2025
60c6c1e
fix: indent
isaackps Sep 23, 2025
b4dc649
fix: secrets
isaackps Sep 23, 2025
5356993
fix: if statement
isaackps Sep 23, 2025
72c9ee6
fix: env
isaackps Sep 23, 2025
879b78f
fix: update actions name
isaackps Sep 23, 2025
b371486
fix: combine dev and prod
isaackps Sep 23, 2025
355485a
fix: update file
isaackps Sep 23, 2025
7a4afc2
fix: update different artifact for dev and prod
isaackps Sep 23, 2025
46ebfc0
chore: update wordings from GovTech -> IMDA (#823)
HJunyuan Sep 25, 2025
7b16e4a
fix: add maintenance notice (#824)
isaackps Sep 30, 2025
dfd1d86
fix: update readme (#825)
isaackps Sep 30, 2025
ad61676
fix: update recaptcha client key
isaackps Sep 30, 2025
72939c4
fix: update opencerts-verify package
isaackps Oct 1, 2025
cdb4447
fix: update code
isaackps Oct 1, 2025
4f976e0
fix: disable email (#826)
nghaninn Oct 2, 2025
a6a418c
fix: re-enable email
isaackps Oct 3, 2025
6b87cf2
fix: update CICD pipeline
isaackps Oct 9, 2025
9ea9442
fix: update readme
isaackps Oct 9, 2025
eb5ad89
fix: update ci to run lint and test first
isaackps Oct 9, 2025
3d16fc9
fix: update dev env actions
isaackps Oct 9, 2025
4855980
fix: update prod deployment script
isaackps Oct 9, 2025
7cc335c
fix: update dev api end point
isaackps Oct 9, 2025
0bcf758
fix: dev actions (#827)
isaackps Oct 21, 2025
3d5dd00
fix: update prod deployment script to be manually triggered (#828)
isaackps Oct 28, 2025
dc768d7
Fix/branch develop (#830)
isaackps Nov 4, 2025
08e9b00
Merge branch 'master' into develop
isaackps Nov 4, 2025
6567ca4
fix: update dev api endpoint (#832)
rongquan1 Nov 6, 2025
f057d29
fix: website update (#831)
RishabhS7 Nov 6, 2025
61fe15e
fix: add test cafe retries (#833)
RishabhS7 Nov 10, 2025
52f2476
fix: update demo files names (#834)
RishabhS7 Nov 10, 2025
601779e
Merge branch 'master' into develop (#835)
rongquan1 Nov 17, 2025
c1fa3fd
fix: website update
rongquan1 Nov 17, 2025
c3f5caf
fix: production workflow (#839)
RishabhS7 Nov 25, 2025
29de6e8
Merge branch 'develop' of https://github.com/OpenCerts/opencerts-website
RishabhS7 Nov 25, 2025
56b49d9
chore: update
rongquan1 Nov 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions .github/workflows/deploy-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
uses: lewagon/[email protected]
with:
ref: ${{ github.ref }}
check-name: 'Lint & Test'
check-name: "Lint & Test"
repo-token: ${{ secrets.GITHUB_TOKEN }}

build-prod:
Expand All @@ -46,7 +46,7 @@ jobs:
npm run postexport
env:
# Build-time envs used in next.config.js
NET: 'mainnet'
NET: "mainnet"
INFURA_API_KEY: ${{ secrets.INFURA_API_KEY }}
ALCHEMY_API_KEY: ${{ secrets.ALCHEMY_API_KEY }}
GA4_TAG_ID: ${{ secrets.GA4_TAG_ID }}
Expand Down Expand Up @@ -79,7 +79,7 @@ jobs:
- name: Select target bucket
id: bucket
run: |
echo "bucket=${S3_BUCKET_PROD}" >> $GITHUB_OUTPUT
echo "bucket=${S3_BUCKET_PROD}" >> $GITHUB_OUTPUT
env:
S3_BUCKET_PROD: ${{ secrets.S3_BUCKET_PROD }}

Expand All @@ -89,20 +89,22 @@ jobs:
--delete \
--exclude "*" \
--include "_next/*" \
--include "static/*" \
--cache-control "public, max-age=31536000, immutable"

- name: Sync HTML and other assets with no-cache
run: |
aws s3 sync $BUILD_DIR s3://${{ steps.bucket.outputs.bucket }} \
--delete \
--exclude "_next/*" \
--exclude "static/*" \
--cache-control "no-cache, no-store, must-revalidate"

- name: Invalidate CloudFront
env:
CLOUDFRONT_DISTRIBUTION_ID_PROD: ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID_PROD }}
if: ${{ env.CLOUDFRONT_DISTRIBUTION_ID_PROD != '' }}
CLOUDFRONT_DISTRIBUTION_ID: ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }}
if: ${{ env.CLOUDFRONT_DISTRIBUTION_ID != '' }}
run: |
aws cloudfront create-invalidation \
--distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID_PROD }} \
--distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} \
--paths "/*"
2 changes: 1 addition & 1 deletion src/components/tests/dns-registry-verified.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const StatusButton = Selector("#certificate-status");
test("Sample document is rendered correctly when dns and registry is verified", async (t) => {
await t.setFilesToUpload("input[type=file]", [Document]);

await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);

await t.switchToIframe(IframeBlock);

Expand Down
5 changes: 1 addition & 4 deletions src/components/tests/download-certificate.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,7 @@ test("Sample document with special characters is downloaded correctly", async (t
await enableDownloadForHeadlessChrome(t);
await t.setFilesToUpload("input[type=file]", [Document2]);

await validateTextContent(t, StatusButton, [
"DEMO-OPENCERTS.OPENATTESTATION.COM",
"SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)",
]);
await validateTextContent(t, StatusButton, ["DEMO-OPENCERTS.OPENATTESTATION.COM", "SEPOLIA: OPENCERTS"]);

// Simulate an OpenCert file download
const fileName = await DownloadLink.getAttribute("download");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ test("Load OA v2.0 document from action should work when action is valid (key fr
await t.navigateTo(
`http://localhost:3000/?q=${encodeURI(JSON.stringify(action))}#${encodeURI(JSON.stringify(anchor))}`
);
await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);

await t.switchToIframe(IframeBlock);

Expand Down Expand Up @@ -79,7 +79,7 @@ test("Load document from action should work when action is valid (key from query
};

await t.navigateTo(`http://localhost:3000/?q=${encodeURI(JSON.stringify(action))}`);
await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);

await t.switchToIframe(IframeBlock);

Expand Down
2 changes: 1 addition & 1 deletion src/components/tests/load-action-plain-certificate.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ test("Load document from action should work when url is valid (OA v2.0)", async
};

await t.navigateTo(`http://localhost:3000/?q=${encodeURI(JSON.stringify(action))}`);
await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);

await t.switchToIframe(IframeBlock);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const StatusButton = Selector("#certificate-status");
test("Sample document is rendered correctly when multiple dns is verified", async (t) => {
await t.setFilesToUpload("input[type=file]", [Document]);

await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);

await t.switchToIframe(IframeBlock);

Expand Down
2 changes: 1 addition & 1 deletion src/components/tests/multi-dns-verified.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const StatusButton = Selector("#certificate-status");
test("Sample document is rendered correctly when multiple dns is verified", async (t) => {
await t.setFilesToUpload("input[type=file]", [Document]);

await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);

await t.switchToIframe(IframeBlock);

Expand Down
2 changes: 1 addition & 1 deletion src/components/tests/multi-registry-verified.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ const StatusButton = Selector("#certificate-status");
test("Sample document is rendered correctly when multiple registry is verified", async (t) => {
await t.setFilesToUpload("input[type=file]", [Document]);

await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);
});
2 changes: 1 addition & 1 deletion src/components/tests/obfuscated-document-verified.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const ObfuscationNote = Selector("#obfuscation-note");
test("Sample document is rendered correctly when single registry is verified", async (t) => {
await t.setFilesToUpload("input[type=file]", [Document]);

await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);

await validateTextContent(t, ObfuscationNote, [
"The owner of this certificate have chosen not to share certain information in the certificate with you. Please note that this does not affect the authenticity of the certificate.",
Expand Down
2 changes: 1 addition & 1 deletion src/components/tests/registry-verified.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const SampleTemplate = Selector("#rendered-certificate");
test("Sample document is rendered correctly when single registry is verified", async (t) => {
await t.setFilesToUpload("input[type=file]", [Document]);

await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);

await t.switchToIframe(IframeBlock);

Expand Down
2 changes: 1 addition & 1 deletion src/components/tests/verified-unverified-issuer.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const StatusButton = Selector("#certificate-status");
test("Sample doc is rendered correctly when any one of dns or registry is verified and doc store mismatch in domain", async (t) => {
await t.setFilesToUpload("input[type=file]", [Document]);

await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);

await t.switchToIframe(IframeBlock);

Expand Down
2 changes: 1 addition & 1 deletion src/sagas/sagatests/integration-server-error.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ test.requestHooks(badGatewayMockInfuraOnly)(
async (t) => {
await t.setFilesToUpload("input[type=file]", [Certificate2]);

await validateTextContent(t, StatusButton, ["SEPOLIA: GOVERNMENT TECHNOLOGY AGENCY OF SINGAPORE (GOVTECH)"]);
await validateTextContent(t, StatusButton, ["SEPOLIA: OPENCERTS"]);

await t.switchToIframe(IframeBlock);

Expand Down