refactor(fase0): shared scaffold — crypto, file-url, schemas, test splits

- Add zod dep; new src/shared/validation/schemas.ts (BucketName,
  JsonUploadPayload, LoginBody, DeleteObjects, CompleteMultipart,
  clampMaxKeys, parseOrNull) + test/validation.test.ts
- Dedup timingSafeCompare -> src/shared/utils/crypto.ts (auth
  middleware, authenticate use-case, s3/auth now import it)
- Dedup AuthSession -> single type in dto/auth.ts
- Dedup telegram file URL builder + filename sanitizer to shared
  modules (file-controller now imports the canonical ones)
- Remove duplicate controllers/home.html (canonical: src/home.html)
- Fix stale bootstrap mocks to real module paths; bootstrap now
  asserts public GET vs guarded POST separately
- Fix health assertion to include version field
- package.json: test -> test:unit alias; new test:quarantine for
  network/live tests; register previously unlisted test files
This commit is contained in:
asepharyana
2026-09-14 17:09:52 +07:00
parent f4b30cef0c
commit 5d01a9405f
16 changed files with 511 additions and 473 deletions
+1 -19
View File
@@ -1,4 +1,4 @@
import { timingSafeEqual } from 'node:crypto';
import { timingSafeCompare } from '../../shared/utils/crypto';
import type {
AuthSession,
LoginInput,
@@ -23,24 +23,6 @@ export interface AuthenticateUseCaseDeps {
config: AuthUseCaseConfig;
}
/**
* Performs a constant-time string comparison to prevent timing attacks.
*
* @param left - The first string to compare.
* @param right - The second string to compare.
* @returns `true` if the strings are equal, `false` otherwise.
*/
const timingSafeCompare = (left: string, right: string): boolean => {
const leftBuffer = Buffer.from(left);
const rightBuffer = Buffer.from(right);
if (leftBuffer.length !== rightBuffer.length) {
return false;
}
return timingSafeEqual(leftBuffer, rightBuffer);
};
/**
* Checks whether authentication is enabled based on the configured token.
*