From 3cb981be7eb71151b24b9abf4493854fa6f82067 Mon Sep 17 00:00:00 2001 From: Timothy-Gonzalez <105177619+Timothy-Gonzalez@users.noreply.github.com> Date: Fri, 13 Sep 2024 02:26:54 -0500 Subject: [PATCH] Add specification to version service --- src/app.test.ts | 12 +++-- src/services/version/version-router.ts | 74 ++++++++++++++------------ src/services/version/version-schema.ts | 7 +++ 3 files changed, 55 insertions(+), 38 deletions(-) create mode 100644 src/services/version/version-schema.ts diff --git a/src/app.test.ts b/src/app.test.ts index b3af805..5ce0e7c 100644 --- a/src/app.test.ts +++ b/src/app.test.ts @@ -23,12 +23,16 @@ describe("sanity tests for app", () => { it("should generate valid API specification", async () => { await get("/docs/").expect(StatusCode.SuccessOK); const response = await get("/docs/json/").expect(StatusCode.SuccessOK); + const parsed = JSON.parse(response.text); - expect(JSON.parse(response.text)).toHaveProperty( - "info", - expect.objectContaining({ + expect(parsed).toMatchObject({ + info: expect.objectContaining({ title: "adonix", }), - ); + paths: expect.objectContaining({}), + components: expect.objectContaining({}), + }); + expect(Object.keys((parsed as { paths: Record }).paths)).not.toHaveLength(0); + expect(Object.keys((parsed as { components: Record }).components)).not.toHaveLength(0); }); }); diff --git a/src/services/version/version-router.ts b/src/services/version/version-router.ts index 90367c5..1bf2e3f 100644 --- a/src/services/version/version-router.ts +++ b/src/services/version/version-router.ts @@ -1,43 +1,49 @@ import { Router } from "express"; -import { Request, Response } from "express-serve-static-core"; import Metadata from "../../metadata"; import { StatusCode } from "status-code-enum"; +import specification, { Tag } from "../../middleware/specification"; +import { versionResponseSchema } from "./version-schema"; const versionRouter = Router(); -/** - * @api {get} /version/android/ GET /version/android/ - * @apiGroup Version - * @apiDescription Get the latest Android app version. - * - * @apiSuccess (200: Success) {Json} version The latest Android app version. - * @apiSuccessExample Example Success Response - * HTTP/1.1 200 OK - * { - * "version": "2024.1.1" - * } - */ +versionRouter.get( + "/android/", + specification({ + method: "get", + path: "/version/android/", + tag: Tag.VERSION, + summary: "Gets the current android version", + responses: { + [StatusCode.SuccessOK]: { + description: "The current version", + schema: versionResponseSchema, + }, + }, + }), + async (_, res) => { + const androidVersion = await Metadata.load("androidVersion"); + res.status(StatusCode.SuccessOK).send({ version: androidVersion }); + }, +); -versionRouter.get("/android/", async (_: Request, res: Response) => { - const androidVersion = await Metadata.load("androidVersion"); - res.status(StatusCode.SuccessOK).send({ version: androidVersion }); -}); - -/** - * @api {get} /version/ios/ GET /version/ios/ - * @apiGroup Version - * @apiDescription Get the latest iOS app version. - * - * @apiSuccess (200: Success) {Json} version The latest iOS app version. - * @apiSuccessExample Example Success Response - * HTTP/1.1 200 OK - * { - * "version": "2024.1.1" - * } - */ -versionRouter.get("/ios/", async (_: Request, res: Response) => { - const iosVersion = await Metadata.load("iosVersion"); - res.status(StatusCode.SuccessOK).send({ version: iosVersion }); -}); +versionRouter.get( + "/ios/", + specification({ + method: "get", + path: "/version/ios/", + tag: Tag.VERSION, + summary: "Gets the current ios version", + responses: { + [StatusCode.SuccessOK]: { + description: "The current version", + schema: versionResponseSchema, + }, + }, + }), + async (_, res) => { + const iosVersion = await Metadata.load("iosVersion"); + res.status(StatusCode.SuccessOK).send({ version: iosVersion }); + }, +); export default versionRouter; diff --git a/src/services/version/version-schema.ts b/src/services/version/version-schema.ts new file mode 100644 index 0000000..405eba8 --- /dev/null +++ b/src/services/version/version-schema.ts @@ -0,0 +1,7 @@ +import { z } from "zod"; + +export const versionResponseSchema = z + .object({ + version: z.string().openapi({ description: "The version", example: "2024.2.4" }), + }) + .openapi("VersionResponse");