Add api docs
This commit is contained in:
3 files changed
+111
-17
No files matched your search
@@ -5,6 +5,7 @@
|
|||||||
"": {
|
"": {
|
||||||
"name": "gd-api",
|
"name": "gd-api",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@elysiajs/swagger": "^1.3.1",
|
||||||
"axios": "^1.13.5",
|
"axios": "^1.13.5",
|
||||||
"dotenv": "^17.3.1",
|
"dotenv": "^17.3.1",
|
||||||
"elysia": "1.4.25",
|
"elysia": "1.4.25",
|
||||||
@@ -17,6 +18,14 @@
|
|||||||
"packages": {
|
"packages": {
|
||||||
"@borewit/text-codec": ["@borewit/text-codec@0.2.1", "", {}, "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw=="],
|
"@borewit/text-codec": ["@borewit/text-codec@0.2.1", "", {}, "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw=="],
|
||||||
|
|
||||||
|
"@elysiajs/swagger": ["@elysiajs/swagger@1.3.1", "", { "dependencies": { "@scalar/themes": "^0.9.52", "@scalar/types": "^0.0.12", "openapi-types": "^12.1.3", "pathe": "^1.1.2" }, "peerDependencies": { "elysia": ">= 1.3.0" } }, "sha512-LcbLHa0zE6FJKWPWKsIC/f+62wbDv3aXydqcNPVPyqNcaUgwvCajIi+5kHEU6GO3oXUCpzKaMsb3gsjt8sLzFQ=="],
|
||||||
|
|
||||||
|
"@scalar/openapi-types": ["@scalar/openapi-types@0.1.1", "", {}, "sha512-NMy3QNk6ytcCoPUGJH0t4NNr36OWXgZhA3ormr3TvhX1NDgoF95wFyodGVH8xiHeUyn2/FxtETm8UBLbB5xEmg=="],
|
||||||
|
|
||||||
|
"@scalar/themes": ["@scalar/themes@0.9.86", "", { "dependencies": { "@scalar/types": "0.1.7" } }, "sha512-QUHo9g5oSWi+0Lm1vJY9TaMZRau8LHg+vte7q5BVTBnu6NuQfigCaN+ouQ73FqIVd96TwMO6Db+dilK1B+9row=="],
|
||||||
|
|
||||||
|
"@scalar/types": ["@scalar/types@0.0.12", "", { "dependencies": { "@scalar/openapi-types": "0.1.1", "@unhead/schema": "^1.9.5" } }, "sha512-XYZ36lSEx87i4gDqopQlGCOkdIITHHEvgkuJFrXFATQs9zHARop0PN0g4RZYWj+ZpCUclOcaOjbCt8JGe22mnQ=="],
|
||||||
|
|
||||||
"@sinclair/typebox": ["@sinclair/typebox@0.34.48", "", {}, "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA=="],
|
"@sinclair/typebox": ["@sinclair/typebox@0.34.48", "", {}, "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA=="],
|
||||||
|
|
||||||
"@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="],
|
"@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="],
|
||||||
@@ -25,6 +34,8 @@
|
|||||||
|
|
||||||
"@types/node": ["@types/node@25.3.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A=="],
|
"@types/node": ["@types/node@25.3.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A=="],
|
||||||
|
|
||||||
|
"@unhead/schema": ["@unhead/schema@1.11.20", "", { "dependencies": { "hookable": "^5.5.3", "zhead": "^2.2.4" } }, "sha512-0zWykKAaJdm+/Y7yi/Yds20PrUK7XabLe9c3IRcjnwYmSWY6z0Cr19VIs3ozCj8P+GhR+/TI2mwtGlueCEYouA=="],
|
||||||
|
|
||||||
"asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
|
"asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
|
||||||
|
|
||||||
"axios": ["axios@1.13.5", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q=="],
|
"axios": ["axios@1.13.5", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q=="],
|
||||||
@@ -79,6 +90,8 @@
|
|||||||
|
|
||||||
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
|
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
|
||||||
|
|
||||||
|
"hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="],
|
||||||
|
|
||||||
"ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
|
"ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
|
||||||
|
|
||||||
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
|
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
|
||||||
@@ -91,16 +104,30 @@
|
|||||||
|
|
||||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||||
|
|
||||||
|
"nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="],
|
||||||
|
|
||||||
"openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
|
"openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
|
||||||
|
|
||||||
|
"pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="],
|
||||||
|
|
||||||
"proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
|
"proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
|
||||||
|
|
||||||
"strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="],
|
"strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="],
|
||||||
|
|
||||||
"token-types": ["token-types@6.1.2", "", { "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww=="],
|
"token-types": ["token-types@6.1.2", "", { "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww=="],
|
||||||
|
|
||||||
|
"type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
|
||||||
|
|
||||||
"uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="],
|
"uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="],
|
||||||
|
|
||||||
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
|
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
|
||||||
|
|
||||||
|
"zhead": ["zhead@2.2.4", "", {}, "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag=="],
|
||||||
|
|
||||||
|
"zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
|
||||||
|
|
||||||
|
"@scalar/themes/@scalar/types": ["@scalar/types@0.1.7", "", { "dependencies": { "@scalar/openapi-types": "0.2.0", "@unhead/schema": "^1.11.11", "nanoid": "^5.1.5", "type-fest": "^4.20.0", "zod": "^3.23.8" } }, "sha512-irIDYzTQG2KLvFbuTI8k2Pz/R4JR+zUUSykVTbEMatkzMmVFnn1VzNSMlODbadycwZunbnL2tA27AXed9URVjw=="],
|
||||||
|
|
||||||
|
"@scalar/themes/@scalar/types/@scalar/openapi-types": ["@scalar/openapi-types@0.2.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-waiKk12cRCqyUCWTOX0K1WEVX46+hVUK+zRPzAahDJ7G0TApvbNkuy5wx7aoUyEk++HHde0XuQnshXnt8jsddA=="],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
"build": "rm -rf dist; bun build src/index.ts --target=bun --outdir=dist"
|
"build": "rm -rf dist; bun build src/index.ts --target=bun --outdir=dist"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@elysiajs/swagger": "^1.3.1",
|
||||||
"axios": "^1.13.5",
|
"axios": "^1.13.5",
|
||||||
"dotenv": "^17.3.1",
|
"dotenv": "^17.3.1",
|
||||||
"elysia": "1.4.25"
|
"elysia": "1.4.25"
|
||||||
|
|||||||
+83
-17
@@ -1,6 +1,7 @@
|
|||||||
import { Elysia, t } from 'elysia'
|
import { Elysia, t } from 'elysia'
|
||||||
import { jsonResponse } from './lib/util'
|
import { jsonResponse } from './lib/util'
|
||||||
import dotenv from 'dotenv'
|
import dotenv from 'dotenv'
|
||||||
|
import swagger from '@elysiajs/swagger'
|
||||||
|
|
||||||
import { handler as gauntletsGetHandler } from './routes/gauntlets/get'
|
import { handler as gauntletsGetHandler } from './routes/gauntlets/get'
|
||||||
|
|
||||||
@@ -11,18 +12,53 @@ import { handler as mapPacksGetHandler } from './routes/map-packs/get'
|
|||||||
|
|
||||||
dotenv.config()
|
dotenv.config()
|
||||||
|
|
||||||
const app = new Elysia()
|
const app = new Elysia().use(
|
||||||
|
swagger({
|
||||||
|
path: '/docs',
|
||||||
|
documentation: {
|
||||||
|
info: {
|
||||||
|
title: 'Lncvrt Games API',
|
||||||
|
description:
|
||||||
|
'This is the official documentation for the Lncvrt Games API!',
|
||||||
|
version: '1.0.0'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
app.listen(3692)
|
app.get('/gauntlets', gauntletsGetHandler, {
|
||||||
|
detail: {
|
||||||
app.get('/gauntlets', gauntletsGetHandler)
|
description: 'The endpoint for getting all gauntlets',
|
||||||
app.get('/map-packs', mapPacksGetHandler)
|
tags: ['Levels']
|
||||||
app.get('/leaderboards/top', () => leaderboardsGetHandler('top'))
|
}
|
||||||
app.get('/leaderboards/creators', () => leaderboardsGetHandler('creators'))
|
})
|
||||||
|
app.get('/map-packs', mapPacksGetHandler, {
|
||||||
|
detail: {
|
||||||
|
description: 'The endpoint for getting all map packs',
|
||||||
|
tags: ['Levels']
|
||||||
|
}
|
||||||
|
})
|
||||||
|
app.get('/leaderboards/top', () => leaderboardsGetHandler('top'), {
|
||||||
|
detail: {
|
||||||
|
description: 'The endpoint for getting the top players leaderboard',
|
||||||
|
tags: ['Leaderboards']
|
||||||
|
}
|
||||||
|
})
|
||||||
|
app.get('/leaderboards/creators', () => leaderboardsGetHandler('creators'), {
|
||||||
|
detail: {
|
||||||
|
description: 'The endpoint for getting the top creators leaderboard',
|
||||||
|
tags: ['Leaderboards']
|
||||||
|
}
|
||||||
|
})
|
||||||
app.get(
|
app.get(
|
||||||
'/leaderboards/level/classic/top',
|
'/leaderboards/level/classic/top',
|
||||||
handler => leaderboardsLevelGetHandler(handler, '1', true),
|
handler => leaderboardsLevelGetHandler(handler, '1', true),
|
||||||
{
|
{
|
||||||
|
detail: {
|
||||||
|
description:
|
||||||
|
'The endpoint for getting the classic level top players leaderboard',
|
||||||
|
tags: ['Leaderboards', 'Levels']
|
||||||
|
},
|
||||||
query: t.Object({
|
query: t.Object({
|
||||||
id: t.String()
|
id: t.String()
|
||||||
})
|
})
|
||||||
@@ -32,6 +68,11 @@ app.get(
|
|||||||
'/leaderboards/level/platformer/top',
|
'/leaderboards/level/platformer/top',
|
||||||
handler => leaderboardsLevelGetHandler(handler, '2', false),
|
handler => leaderboardsLevelGetHandler(handler, '2', false),
|
||||||
{
|
{
|
||||||
|
detail: {
|
||||||
|
description:
|
||||||
|
'The endpoint for getting the platformer level top players leaderboard',
|
||||||
|
tags: ['Leaderboards', 'Levels']
|
||||||
|
},
|
||||||
query: t.Object({
|
query: t.Object({
|
||||||
id: t.String()
|
id: t.String()
|
||||||
})
|
})
|
||||||
@@ -41,6 +82,11 @@ app.get(
|
|||||||
'/leaderboards/level/classic/week',
|
'/leaderboards/level/classic/week',
|
||||||
handler => leaderboardsLevelGetHandler(handler, '2', true),
|
handler => leaderboardsLevelGetHandler(handler, '2', true),
|
||||||
{
|
{
|
||||||
|
detail: {
|
||||||
|
description:
|
||||||
|
'The endpoint for getting the classic level week players leaderboard',
|
||||||
|
tags: ['Leaderboards', 'Levels']
|
||||||
|
},
|
||||||
query: t.Object({
|
query: t.Object({
|
||||||
id: t.String()
|
id: t.String()
|
||||||
})
|
})
|
||||||
@@ -50,6 +96,11 @@ app.get(
|
|||||||
'/leaderboards/level/platformer/week',
|
'/leaderboards/level/platformer/week',
|
||||||
handler => leaderboardsLevelGetHandler(handler, '1', false),
|
handler => leaderboardsLevelGetHandler(handler, '1', false),
|
||||||
{
|
{
|
||||||
|
detail: {
|
||||||
|
description:
|
||||||
|
'The endpoint for getting the classic level week players leaderboard',
|
||||||
|
tags: ['Leaderboards', 'Levels']
|
||||||
|
},
|
||||||
query: t.Object({
|
query: t.Object({
|
||||||
id: t.String()
|
id: t.String()
|
||||||
})
|
})
|
||||||
@@ -60,19 +111,34 @@ app.get(
|
|||||||
() =>
|
() =>
|
||||||
new Response(null, {
|
new Response(null, {
|
||||||
status: 301,
|
status: 301,
|
||||||
headers: { Location: 'https://git.lncvrt.xyz/Geometry-Dash-RE/gd-api' }
|
headers: { Location: '/docs' }
|
||||||
})
|
}),
|
||||||
|
{
|
||||||
|
detail: {
|
||||||
|
hide: true
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
app.all('*', () =>
|
app.all(
|
||||||
jsonResponse(
|
'*',
|
||||||
{
|
() =>
|
||||||
success: false,
|
jsonResponse(
|
||||||
message: 'Endpoint not found (are you using the correct request method?)'
|
{
|
||||||
},
|
success: false,
|
||||||
404
|
message:
|
||||||
)
|
'Endpoint not found (are you using the correct request method?)'
|
||||||
|
},
|
||||||
|
404
|
||||||
|
),
|
||||||
|
{
|
||||||
|
detail: {
|
||||||
|
hide: true
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
app.listen(3692)
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
`Geometry Dash API Server started on http://${app.server?.hostname}:${app.server?.port}/`
|
`Geometry Dash API Server started on http://${app.server?.hostname}:${app.server?.port}/`
|
||||||
)
|
)
|
||||||
Reference in new issue
Block a user