From 628dc35deaf7249e69df917dd3d379d2e33309f6 Mon Sep 17 00:00:00 2001 From: Jackson Roberts Date: Fri, 13 Feb 2026 17:02:03 -0600 Subject: [PATCH] Companies are now listing properly --- bruno/ttscm/Fetch Company Pages.bru | 15 +++++++++++++ src/.DS_Store | Bin 0 -> 6148 bytes src/api/companies/fetchAll.ts | 32 ++++++++++++++++----------- src/api/companies/index.ts | 2 ++ src/api/routers/companyRouter.ts | 7 ++++++ src/api/routers/user.ts | 7 ++++++ src/api/server.ts | 2 ++ src/api/user/@me/fetch.ts | 18 +++++++++++++++ src/api/user/@me/index.ts | 2 ++ src/api/user/@me/update.ts | 19 ++++++++++++++++ src/index.ts | 4 +++- src/managers/companies.ts | 27 ++++++++++++++++++++++ src/modules/api-utils/apiResponse.ts | 3 ++- 13 files changed, 123 insertions(+), 15 deletions(-) create mode 100644 bruno/ttscm/Fetch Company Pages.bru create mode 100644 src/.DS_Store create mode 100644 src/api/companies/index.ts create mode 100644 src/api/routers/companyRouter.ts create mode 100644 src/api/routers/user.ts create mode 100644 src/api/user/@me/fetch.ts create mode 100644 src/api/user/@me/index.ts create mode 100644 src/api/user/@me/update.ts diff --git a/bruno/ttscm/Fetch Company Pages.bru b/bruno/ttscm/Fetch Company Pages.bru new file mode 100644 index 0000000..3fea809 --- /dev/null +++ b/bruno/ttscm/Fetch Company Pages.bru @@ -0,0 +1,15 @@ +meta { + name: Fetch Company Pages. + type: http + seq: 2 +} + +get { + url: + body: none + auth: inherit +} + +settings { + encodeUrl: true +} diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..941feefd24bf5da2c753d1819aa501371792b4ad GIT binary patch literal 6148 zcmeH~O=`nH427SXECStlndNMHfZkvT$q90S1_~h%(o$&GbM!v_Y~prZOnCz7jWiav zzlFyFV7t%PXJ7)bp}XSA!_18N3Mahd@^$>UUEgkJR=f&4M9hqp3A6p$mWY4|h=2%) zfCwyzK%U~*JTB;&^e7@A0?Q!a--kwb?WH3%J{=4(0#Mg1hjAUV1hsjA+Dk_&D>SR= z!K&3_4DoujQ(IlvOGj$9!)o}jy0iHdL$hp$H6}FcAqpZO0y6@u%qKtp5A@&W|5=Mt z5fFiYM!?ql<9^4Nsv{d9s=gj{YFy56_Y=UxkK!#ojQhk literal 0 HcmV?d00001 diff --git a/src/api/companies/fetchAll.ts b/src/api/companies/fetchAll.ts index 0eaa44b..7920844 100644 --- a/src/api/companies/fetchAll.ts +++ b/src/api/companies/fetchAll.ts @@ -10,22 +10,28 @@ export default createRoute( "get", ["/companies"], async (c) => { - /** - * - * - * @TODO MAKE THIS WORK - * - * - * - */ + const page = new Number(c.req.query("page") ?? 1) as number; + const rpp = new Number(c.req.query("rpp") ?? 30) as number; // Records Per Page + const companyQty = await companies.count(); - const company = await companies.fetch(c.req.param("identifier")); + const data = await companies.fetchPages(page, rpp); - const response = apiResponse.successful( - "Company Fetched Successfully!", - company, + let response = apiResponse.successful( + "Companies Fetched Successfully!", + data, + { + pagination: { + previousPage: page == 1 ? null : page - 1, // Previous Page + currentPage: page, // Current Page + nextPage: page >= companyQty / rpp ? null : page + 1, // Next Page + totalPages: Math.ceil(companyQty / rpp), // Total Number of Pages + totalRecords: companyQty, // Total Number of Records + listedRecords: rpp, // Total Number of Records being recieved at time of request. + }, + }, ); + return c.json(response, response.status as ContentfulStatusCode); }, - authMiddleware({ permissions: ["company.fetch"] }), + authMiddleware({ permissions: ["company.fetch.many"] }), ); diff --git a/src/api/companies/index.ts b/src/api/companies/index.ts new file mode 100644 index 0000000..2e25161 --- /dev/null +++ b/src/api/companies/index.ts @@ -0,0 +1,2 @@ +export { default as fetchAll } from "./fetchAll"; +//export { default as fetch } from "./fetch"; diff --git a/src/api/routers/companyRouter.ts b/src/api/routers/companyRouter.ts new file mode 100644 index 0000000..273764c --- /dev/null +++ b/src/api/routers/companyRouter.ts @@ -0,0 +1,7 @@ +import { Hono } from "hono"; +import * as companyRoutes from "../companies"; + +const companyRouter = new Hono(); +Object.values(companyRoutes).map((r) => companyRouter.route("/", r)); + +export default companyRouter; diff --git a/src/api/routers/user.ts b/src/api/routers/user.ts new file mode 100644 index 0000000..1e5f3b3 --- /dev/null +++ b/src/api/routers/user.ts @@ -0,0 +1,7 @@ +import { Hono } from "hono"; +import * as userRoutes from "../user/@me"; + +const authRouter = new Hono(); +Object.values(userRoutes).map((r) => authRouter.route("/", r)); + +export default authRouter; diff --git a/src/api/server.ts b/src/api/server.ts index 95d6982..c236d34 100644 --- a/src/api/server.ts +++ b/src/api/server.ts @@ -48,6 +48,8 @@ app.notFound((c) => { v1.route("/teapot", teapot); v1.route("/auth", require("./routers/authRouter").default); +v1.route("/user", require("./routers/user").default); +v1.route("/company", require("./routers/companyRouter").default); app.route("/v1", v1); export default app; diff --git a/src/api/user/@me/fetch.ts b/src/api/user/@me/fetch.ts new file mode 100644 index 0000000..68b872f --- /dev/null +++ b/src/api/user/@me/fetch.ts @@ -0,0 +1,18 @@ +import { ContentfulStatusCode } from "hono/utils/http-status"; +import { apiResponse } from "../../../modules/api-utils/apiResponse"; +import { createRoute } from "../../../modules/api-utils/createRoute"; +import { authMiddleware } from "../../middleware/authorization"; + +// /v1/user/@me +export default createRoute( + "get", + ["/@me"], + (c) => { + const response = apiResponse.successful( + "Fetched user.", + c.get("user")?.toJson(), + ); + return c.json(response, response.status as ContentfulStatusCode); + }, + authMiddleware({ scopes: ["user.read"] }), +); diff --git a/src/api/user/@me/index.ts b/src/api/user/@me/index.ts new file mode 100644 index 0000000..492e227 --- /dev/null +++ b/src/api/user/@me/index.ts @@ -0,0 +1,2 @@ +export { default as fetch } from "./fetch"; +export { default as update } from "./update"; diff --git a/src/api/user/@me/update.ts b/src/api/user/@me/update.ts new file mode 100644 index 0000000..8c698c0 --- /dev/null +++ b/src/api/user/@me/update.ts @@ -0,0 +1,19 @@ +import { ContentfulStatusCode } from "hono/utils/http-status"; +import { apiResponse } from "../../../modules/api-utils/apiResponse"; +import { createRoute } from "../../../modules/api-utils/createRoute"; +import { authMiddleware } from "../../middleware/authorization"; + +export default createRoute( + "patch", + ["/@me"], + async (c) => { + const updatedUser = await c.get("user")?.update(await c.req.json()); + const response = apiResponse.successful( + "Successfully updated user.", + updatedUser?.toJson(), + ); + + return c.json(response, response.status as ContentfulStatusCode); + }, + authMiddleware({ scopes: ["user.write"] }), +); diff --git a/src/index.ts b/src/index.ts index c0e35a1..ed19a55 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,7 +9,9 @@ if (Bun.env.NODE_ENV == "development") setupEventDebugger(); // Refresh the internal list of companies every minute await refreshCompanies(); -setInterval(() => refreshCompanies, 60 * 1000); +setInterval(() => { + return refreshCompanies(); +}, 60 * 1000); Bun.serve({ port: PORT, diff --git a/src/managers/companies.ts b/src/managers/companies.ts index 434aae8..a6055d7 100644 --- a/src/managers/companies.ts +++ b/src/managers/companies.ts @@ -17,4 +17,31 @@ export const companies = { return new CompanyController(search); }, + + async count() { + return await prisma.company.count(); + }, + + /** + * Fetch Company Pages + * + * This is a method to be used to fetch pages of companies used for pagination. + * + * @param page - Page number + * @param rpp - Records Per Page + */ + async fetchPages(page: number, rpp: number) { + page = page.valueOf(); + rpp = rpp.valueOf(); + + const skip = (page > 1 ? page : 0) * rpp; + const take = rpp ?? 30; + + const data = prisma.company.findMany({ + skip, + take, + }); + + return data; + }, }; diff --git a/src/modules/api-utils/apiResponse.ts b/src/modules/api-utils/apiResponse.ts index 47072c2..5a3859d 100644 --- a/src/modules/api-utils/apiResponse.ts +++ b/src/modules/api-utils/apiResponse.ts @@ -4,13 +4,14 @@ import { ZodError } from "zod"; * @ignore */ export const apiResponse = { - successful: (message: string, data?: any) => ({ + successful: (message: string, data?: any, meta?: {}) => ({ status: 200, message, data, successful: true, meta: { timestamp: Date.now(), + ...meta, }, }), created: (message: string, data?: any) => ({