Skip to content
This repository has been archived by the owner on Sep 19, 2024. It is now read-only.

Commit

Permalink
fix: merge development to db_check_duplicates
Browse files Browse the repository at this point in the history
  • Loading branch information
ByteBallet committed Aug 26, 2023
2 parents 2ccb237 + 0f9f3d6 commit d2ae901
Show file tree
Hide file tree
Showing 19 changed files with 1,089 additions and 20 deletions.
37 changes: 37 additions & 0 deletions .github/workflows/deploy-logger-page.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Deploy Log Web App to Cloudflare Worker

on:
workflow_run:
workflows: ["Conventional Commits"]
types:
- completed

jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
deployments: write
name: Deploy to Cloudflare Worker

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: "20.3.0"

- name: Build TypeScript
run: cd ./log-app && npm install && npm run build

- name: Publish to Cloudflare Pages
uses: cloudflare/pages-action@v1
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: ${{ secrets.CLOUDFLARE_PROJECT_NAME }}
directory: ${{ secrets.LOGGER_WEB_APP_DIRECTORY }}
# Enable Wrangler v3
wranglerVersion: "3"
1 change: 1 addition & 0 deletions .github/workflows/kebab-case.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ jobs:
"\.sql$"
"\.md$"
"\.d.ts$"
"^\.\/\log-app"
)
while read -r file; do
basefile=$(basename "$file")
Expand Down
2 changes: 2 additions & 0 deletions log-app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Ignore JavaScript files
*.js
9 changes: 9 additions & 0 deletions log-app/_worker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Env } from "./types/global";

export default {
async fetch(request: Request, env: Env) {
// Otherwise, serve the static assets.
// Without this, the Worker will error and no assets will be served.
return env.ASSETS.fetch(request);
},
};
44 changes: 44 additions & 0 deletions log-app/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Log Viewer</title>
<link rel="stylesheet" href="./styles/index.css">
</head>

<body>
<div class="log-container">
<select id="filter">
<option value="all">All</option>
<option value="error">Error</option>
<option value="warn">Warning</option>
<option value="info">Info</option>
<option value="verbose">Verbose</option>
<option value="debug">Debug</option>
</select>
<button id="clear">Clear</button>
</div>
<table id="log-table">
<thead>
<tr>
<th>Message</th>
<th>Level</th>
<th>Timestamp</th>
<th>Comment URL</th>
</tr>
</thead>
<tbody id="log-body"></tbody>
</table>
<div id="json-modal" class="modal">
<div class="modal-content">
<span id="close-modal" class="close">&times;</span>
<pre id="json-content" class="json-content"></pre>
</div>
</div>
<script>var exports = {};</script>
<script type="application/javascript" src="./scripts/index.js"></script>
</body>

</html>
16 changes: 16 additions & 0 deletions log-app/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "cf-pages-functions",
"version": "0.0.0",
"scripts": {
"build": "tsc && tsx ./scripts/esbuild.ts"
},
"devDependencies": {
"@cloudflare/workers-types": "^3.2.0",
"@supabase/supabase-js": "^2.32.0",
"typescript": "^4.3.2"
},
"dependencies": {
"esbuild": "^0.19.2",
"tsx": "^3.12.7"
}
}
3 changes: 3 additions & 0 deletions log-app/scripts/constants/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const SUPABASE_URL = "https://qzfjblxdroqrmlheoajw.supabase.co";
export const SUPABASE_KEY =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InF6ZmpibHhkcm9xcm1saGVvYWp3Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODA4NTMwMzMsImV4cCI6MTk5NjQyOTAzM30.BM_qkpX-egNdiMc0PDO_34bIaXHB7ewnr2k4U2hGFMM";
19 changes: 19 additions & 0 deletions log-app/scripts/esbuild-config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import esbuild from "esbuild";
const typescriptEntries = ["scripts/helpers/utils.ts", "scripts/index.ts", "scripts/constants/index.ts"];
export const entries = [...typescriptEntries];

export let esBuildContext = {
sourcemap: false,
entryPoints: entries,
bundle: true,
minify: false,
loader: {
".png": "dataurl",
".woff": "dataurl",
".woff2": "dataurl",
".eot": "dataurl",
".ttf": "dataurl",
".svg": "dataurl",
},
outdir: "scripts",
} as esbuild.BuildOptions;
3 changes: 3 additions & 0 deletions log-app/scripts/esbuild.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import esbuild from "esbuild";
import { esBuildContext } from "./esbuild-config";
esbuild.build(esBuildContext);
66 changes: 66 additions & 0 deletions log-app/scripts/helpers/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
export enum Level {
ERROR = "error",
WARN = "warn",
INFO = "info",
HTTP = "http",
VERBOSE = "verbose",
DEBUG = "debug",
SILLY = "silly",
}

export const createGitHubCommentURL = (orgName: string, repoName: string, issueNumber: number, commentId: number) => {
return `https://github.com/${orgName}/${repoName}/issues/${issueNumber}#issuecomment-${commentId}`;
};

export const isValidJson = (jsonString) => {
try {
JSON.parse(jsonString);
return true;
} catch (error) {
return false;
}
};

export const generateRandomId = (length) => {
return [...Array(length)].map(() => Math.random().toString(36)[2]).join("");
};

export const containsValidJson = (message: string): [boolean, string, string] => {
const jsonMatches = message.match(/\{.*\}/g); // Find JSON-like substrings
if (!jsonMatches) {
return [false, "", ""];
}

for (const match of jsonMatches) {
if (isValidJson(match)) {
const braceIndex = message.indexOf("{");
if (braceIndex !== -1) {
return [true, match, message.substring(0, braceIndex)];
}
return [true, match, ""];
}
}

return [false, "", ""];
};

export const getLevelString = (level: number) => {
switch (level) {
case 0:
return Level.ERROR;
case 1:
return Level.WARN;
case 2:
return Level.INFO;
case 3:
return Level.HTTP;
case 4:
return Level.VERBOSE;
case 5:
return Level.DEBUG;
case 6:
return Level.SILLY;
default:
return -1; // Invalid level
}
};
99 changes: 99 additions & 0 deletions log-app/scripts/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import { containsValidJson, createGitHubCommentURL, generateRandomId, getLevelString } from "./helpers/utils";
import { Logs } from "./types/log";
import { createClient } from "@supabase/supabase-js";
import { SUPABASE_URL, SUPABASE_KEY } from "./constants/index";

const filterSelect = document.getElementById("filter") as unknown as HTMLSelectElement;
const clearButton = document.getElementById("clear") as HTMLButtonElement;
const logBody = document.getElementById("log-body") as HTMLDivElement;

const jsonModal = document.getElementById("json-modal") as HTMLDivElement;
const closeModalButton = document.getElementById("close-modal") as HTMLButtonElement;
const jsonContent = document.getElementById("json-content") as HTMLDivElement;

const openJsonModal = (validJson) => {
jsonContent.textContent = validJson;

jsonModal.style.display = "flex";
};

const updateLogTable = () => {
const selectedFilter = filterSelect.value;
const filteredLogs = selectedFilter === "all" ? logs : logs.filter((log) => getLevelString(log.level) === selectedFilter);

logBody.innerHTML = "";
filteredLogs.forEach((log) => {
const classId = generateRandomId(10);
const commentUrl = createGitHubCommentURL(log.org_name, log.repo_name, log.issue_number, log.comment_id);
const row = document.createElement("tr");
const [validJson, match, beforeText] = containsValidJson(log.log_message);
row.innerHTML = `
${
validJson
? `<td class="log-cell">${beforeText} - <button id="button_${classId}">Show JSON</button></td>`
: `<td class="log-cell">${log.log_message}</td>`
}
<td>${getLevelString(log.level)}</td>
<td>${log.timestamp}</td>
<td><a href="${commentUrl}">Comment - ${log.comment_id}</a></td>
`;
logBody.appendChild(row);
let logCell = document.getElementsByClassName("log-cell");
if (validJson) {
// show modal button for valid json row
const showMoreButton = document.getElementById(`button_${classId}`) as HTMLButtonElement;
showMoreButton.addEventListener("click", () => {
if (validJson) {
openJsonModal(JSON.stringify(JSON.parse(match), null, 2)); // properly formatted json
}
});
}
// scroll to last added data
logCell[logCell.length - 1].scrollIntoView();
});
};

let logs: Logs[] = [];

const supabaseClient = createClient(SUPABASE_URL, SUPABASE_KEY);

const channel = supabaseClient
.channel("table-db-changes")
.on(
"postgres_changes",
{
event: "INSERT",
schema: "public",
table: "logs",
},
(payload) => handlePayload(payload)
)
.subscribe();

const handlePayload = (logEntry) => {
if (logEntry?.eventType !== "INSERT") return;
logs.push(logEntry.new);
updateLogTable();
};

filterSelect.addEventListener("change", () => {
updateLogTable();
});

clearButton.addEventListener("click", () => {
logs = [];
updateLogTable();
});

closeModalButton.addEventListener("click", () => {
jsonModal.style.display = "none";
});

window.addEventListener("click", (event) => {
if (event.target === jsonModal) {
jsonModal.style.display = "none";
}
});

// Initial update
updateLogTable();
15 changes: 15 additions & 0 deletions log-app/scripts/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"compilerOptions": {
"useDefineForClassFields": true,
"allowJs": false,
"esModuleInterop": true,
"module": "CommonJS",
"allowSyntheticDefaultImports": true,
"strict": false,
"forceConsistentCasingInFileNames": true,
"target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
"lib": ["esnext", "dom", "dom.iterable"] /* Specify a set of bundled library declaration files that describe the target runtime environment. */
},
"include": ["./helpers", "./constants", "./index.ts"],
"exclude": ["./esbuild.ts", "./esbuild-config.ts"]
}
9 changes: 9 additions & 0 deletions log-app/scripts/types/log.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export type Logs = {
timestamp: string;
log_message: string;
level: number;
repo_name: string;
org_name: string;
comment_id: number;
issue_number: number;
};
Loading

0 comments on commit d2ae901

Please sign in to comment.