File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -6,18 +6,11 @@ import type { MiddlewareHandler } from "hono"
66 * Policy:
77 * GET, POST → public (no token required)
88 * PUT, DELETE, PATCH → require Bearer token
9- *
10- * BUG: The allow-list check uses `'post'` (lowercase) instead of `'POST'`.
11- * HTTP methods are always uppercase per RFC 7231, so POST is never matched
12- * as a public method — POST requests incorrectly require a token.
13- *
14- * Fix: change `'post'` to `'POST'` in the public methods array.
159 */
1610export const authMiddleware : MiddlewareHandler = async ( c , next ) => {
17- // BUG: 'post' should be 'POST' — POST is never treated as public
18- const publicMethods = [ "GET" , "post" ]
11+ const publicMethods = [ "GET" , "POST" ]
1912
20- if ( publicMethods . includes ( c . req . method ) ) {
13+ if ( publicMethods . includes ( c . req . method . toUpperCase ( ) ) ) {
2114 return next ( )
2215 }
2316
Original file line number Diff line number Diff line change 11import { Hono } from "hono"
22import { db } from "../lib/db"
3- import { notFound } from "../lib/errors"
4- // BUG: missing import — `badRequest` is used below but not imported here.
5- // This causes a ReferenceError at runtime when POST /users is called with invalid data.
6- // Fix: add `badRequest` to the import from "../lib/errors"
3+ import { badRequest , notFound } from "../lib/errors"
74
85const router = new Hono ( )
96
@@ -20,7 +17,6 @@ router.get("/:id", (c) => {
2017router . post ( "/" , async ( c ) => {
2118 const body = await c . req . json ( ) . catch ( ( ) => null )
2219 if ( ! body || ! body . username || ! body . email ) {
23- // BUG: badRequest is not imported — this will throw ReferenceError
2420 return badRequest ( c , "username and email are required" )
2521 }
2622 const user = db . users . create ( { username : body . username , email : body . email } )
Original file line number Diff line number Diff line change 11/**
22 * Shared types used by both the API and any consumers.
3- *
4- * BUG: The field is named `userName` here but the API routes reference `username`
5- * (lowercase n). This causes a type error in routes/users.ts and a runtime
6- * mismatch when serialising responses.
73 */
84
95export type User = {
106 id : string
11- userName : string // BUG: should be `username` to match API usage
7+ username : string
128 email : string
139 createdAt : string
1410}
Original file line number Diff line number Diff line change 11import type { PaginatedResponse } from "../types"
22
3+ const DEFAULT_PAGE_SIZE = 10
4+
35/**
46 * Paginate an array of items.
57 *
8+ * Non-finite inputs (NaN, Infinity) are rejected rather than clamped, since
9+ * Math.max(1, NaN) is NaN and Math.floor(Infinity) is Infinity — either would
10+ * break the numeric contract or return the whole dataset in one page.
11+ *
612 * @param items Full array of items
713 * @param page 1-indexed page number
814 * @param size Number of items per page
9- *
10- * TODO: implement this function — it is currently a stub.
11- * The test in packages/shared/test/pagination.test.ts exercises the full contract.
1215 */
1316export function paginate < T > ( items : T [ ] , page : number , size : number ) : PaginatedResponse < T > {
14- throw new Error ( "not implemented" )
17+ const total = items . length
18+ const pageSize = Number . isFinite ( size ) ? Math . max ( 1 , Math . floor ( size ) ) : DEFAULT_PAGE_SIZE
19+ const currentPage = Number . isFinite ( page ) ? Math . max ( 1 , Math . floor ( page ) ) : 1
20+ const totalPages = Math . ceil ( total / pageSize )
21+ const start = ( currentPage - 1 ) * pageSize
22+
23+ return {
24+ data : items . slice ( start , start + pageSize ) ,
25+ total,
26+ page : currentPage ,
27+ pageSize,
28+ totalPages,
29+ }
1530}
Original file line number Diff line number Diff line change 55 "moduleResolution" : " bundler" ,
66 "strict" : true ,
77 "skipLibCheck" : true ,
8+ "types" : [" bun-types" ],
89 "paths" : {
910 "@e2e/shared" : [" ./packages/shared/src/index.ts" ]
1011 }
You can’t perform that action at this time.
0 commit comments