diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2021-04-16 21:16:29 +0200 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2021-04-16 21:16:29 +0200 |
| commit | 0a8c0885cb6751df116adaaa80c431c7c8e8941c (patch) | |
| tree | 1d22cdad6d4deba5385537110e01110ff178a9af | |
| download | srht-git-feed-0a8c0885cb6751df116adaaa80c431c7c8e8941c.tar.xz srht-git-feed-0a8c0885cb6751df116adaaa80c431c7c8e8941c.zip | |
Initial commit
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | .vscode/settings.json | 5 | ||||
| -rw-r--r-- | Dockerfile | 5 | ||||
| -rw-r--r-- | LICENSE | 23 | ||||
| -rw-r--r-- | index.ts | 70 |
5 files changed, 104 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2c7ddc5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "deno.enable": true, + "deno.lint": true, + "deno.unstable": true +}
\ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8e29e19 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM hayd/alpine-deno:1.5.2 +USER deno +COPY index.ts . +ENTRYPOINT ["deno"] +CMD ["run", "--allow-net", "--allow-env", "--allow-read", "index.ts"] @@ -0,0 +1,23 @@ +Copyright (c) Ivar Løvlie. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..a3bb69c --- /dev/null +++ b/index.ts @@ -0,0 +1,70 @@ +import { serve } from "https://deno.land/std@0.93.0/http/server.ts"; +import "https://deno.land/x/dotenv/load.ts"; +const SERVER_PORT = Deno.env.get("SERVER_PORT") ?? "8080"; +const SERVER_HOST = Deno.env.get("SERVER_HOST") ?? "localhost"; +const API_URL = Deno.env.get("API_URL") ?? "https://git.sr.ht/query"; +const API_KEY = Deno.env.get("API_KEY"); + +interface QueryResponse { + data: { + repositories: { + results: Repository[]; + }; + }; +} + +interface Repository { + id: string, + name: string, + description: string, + updated: string, + visibility: "PUBLIC" | "UNLISTED" | "PRIVATE" +} + +window.onload = function() { + if(!API_KEY) { + throw new Error("API_KEY is empty"); + } +} + +async function getRepositories(): Promise<Repository[] | undefined> { + const response = await fetch(API_URL, { + method: "POST", + headers: { + "Authorization": "Bearer " + API_KEY, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + query: ` +{ + repositories { + results { + id, + name, + description, + updated, + visibility + } + } +} + ` + }) + }) + + if (response.ok) { + const json = await response.json() as QueryResponse; + return json?.data.repositories.results?.filter(repo => repo.visibility === "PUBLIC") ?? []; + } else { + throw response; + } +} + +const s = serve({ port: parseInt(SERVER_PORT), hostname: SERVER_HOST }); +console.log("http://"+SERVER_HOST+":" + SERVER_PORT); +for await (const req of s) { + try { + req.respond({ body: JSON.stringify(await getRepositories()) }); + } catch(err) { + req.respond({ body: JSON.stringify(err) }); + } +} |
