From a1bf4495229f1fbfbcd92f7e3f2d18f03fe47a8b Mon Sep 17 00:00:00 2001 From: Chizzy Robinson Date: Mon, 22 Jun 2026 18:30:28 +0100 Subject: [PATCH 1/3] Refactor: add API versioning prefix, adjust test DB, update scripts --- Backend/package.json | 16 ++++++++-------- Backend/src/database/database.module.ts | 6 ++++-- Backend/test/gists.e2e.spec.ts | 18 +++++++++--------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Backend/package.json b/Backend/package.json index 044ff98..0a8c0d8 100644 --- a/Backend/package.json +++ b/Backend/package.json @@ -17,7 +17,7 @@ "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json", + "test:e2e": "set NODE_ENV=test && jest --config ./test/jest-e2e.json", "migration:run": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js -d src/database/data-source.ts migration:run", "migration:revert": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js -d src/database/data-source.ts migration:revert", "migration:generate": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js -d src/database/data-source.ts migration:generate" @@ -28,18 +28,18 @@ "@nestjs/core": "^11.0.1", "@nestjs/mapped-types": "^2.1.0", "@nestjs/platform-express": "^11.0.1", + "@nestjs/swagger": "^11.2.6", + "@nestjs/throttler": "^6.4.0", "@nestjs/typeorm": "^11.0.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.2", + "cookie-parser": "^1.4.7", + "csrf": "^3.1.0", "ethers": "^6.15.0", "pg": "^8.13.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", - "typeorm": "^0.3.28", - "@nestjs/throttler": "^6.4.0", - "@nestjs/swagger": "^11.2.6", - "cookie-parser": "^1.4.7", - "csrf": "^3.1.0" + "typeorm": "^0.3.28" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", @@ -62,7 +62,7 @@ "prettier": "^3.4.2", "source-map-support": "^0.5.21", "supertest": "^7.0.0", - "ts-jest": "^29.2.5", + "ts-jest": "^29.4.11", "ts-loader": "^9.5.2", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", @@ -86,4 +86,4 @@ "coverageDirectory": "../coverage", "testEnvironment": "node" } -} \ No newline at end of file +} diff --git a/Backend/src/database/database.module.ts b/Backend/src/database/database.module.ts index f95834d..29bc90d 100644 --- a/Backend/src/database/database.module.ts +++ b/Backend/src/database/database.module.ts @@ -9,16 +9,18 @@ import { Gist } from '../gists/entities/gist.entity'; imports: [ConfigModule], inject: [ConfigService], useFactory: (config: ConfigService) => ({ - type: 'postgres', + type: config.get('NODE_ENV') === 'test' ? 'sqlite' : 'postgres', host: config.get('DATABASE_HOST', 'localhost'), port: config.get('DATABASE_PORT', 5432), username: config.get('DATABASE_USER', 'gist'), password: config.get('DATABASE_PASSWORD', 'gist'), database: config.get('DATABASE_NAME', 'gist'), + // Use SQLite in-memory DB for tests + ...(config.get('NODE_ENV') === 'test' ? { database: ':memory:' } : {}), entities: [Gist], migrations: [__dirname + '/migrations/*{.ts,.js}'], migrationsRun: false, - synchronize: false, + synchronize: config.get('NODE_ENV') === 'test', logging: config.get('NODE_ENV') !== 'production', extra: { max: config.get('DB_POOL_MAX', 10), diff --git a/Backend/test/gists.e2e.spec.ts b/Backend/test/gists.e2e.spec.ts index a4d1927..32b9808 100644 --- a/Backend/test/gists.e2e.spec.ts +++ b/Backend/test/gists.e2e.spec.ts @@ -46,7 +46,7 @@ describe('Gists (e2e)', () => { describe('POST /gists', () => { it('should reject POST /gists without CSRF token', async () => { await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .send({ content: 'e2e test gist', lat: 9.0579, lon: 7.4951 }) .expect(403); }); @@ -55,7 +55,7 @@ describe('Gists (e2e)', () => { const csrf = await getCsrfToken(app.getHttpServer()); const res = await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .set('Cookie', csrf.cookie) .set('x-csrf-token', csrf.token) .send({ content: 'e2e test gist', lat: 9.0579, lon: 7.4951 }) @@ -78,7 +78,7 @@ describe('Gists (e2e)', () => { const csrf = await getCsrfToken(app.getHttpServer()); const res = await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .set('Cookie', csrf.cookie) .set('x-csrf-token', csrf.token) .send({ content: 'bad lat', lat: 999, lon: 7.4951 }) @@ -92,7 +92,7 @@ describe('Gists (e2e)', () => { const csrf = await getCsrfToken(app.getHttpServer()); const res = await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .set('Cookie', csrf.cookie) .set('x-csrf-token', csrf.token) .send({ content: 'x'.repeat(281), lat: 9.0579, lon: 7.4951 }) @@ -105,7 +105,7 @@ describe('Gists (e2e)', () => { const csrf = await getCsrfToken(app.getHttpServer()); await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .set('Cookie', csrf.cookie) .set('x-csrf-token', csrf.token) .send({ content: 'missing coords' }) @@ -116,7 +116,7 @@ describe('Gists (e2e)', () => { const csrf = await getCsrfToken(app.getHttpServer()); await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .set('Cookie', csrf.cookie) .set('x-csrf-token', csrf.token) .send({ content: 'whitelist test', lat: 9.0579, lon: 7.4951, hack: 'injected' }) @@ -134,7 +134,7 @@ describe('Gists (e2e)', () => { }); it('should return paginated response with data and pagination', async () => { const res = await request(app.getHttpServer()) - .get('/gists') + .get('/v1/gists') .query({ lat: 9.0579, lon: 7.4951, radius: 1000 }) .expect(200); @@ -148,12 +148,12 @@ describe('Gists (e2e)', () => { }); it('should return 400 when lat/lon are missing', async () => { - await request(app.getHttpServer()).get('/gists').expect(400); + await request(app.getHttpServer()).get('/v1/gists').expect(400); }); it('should respect the limit parameter', async () => { const res = await request(app.getHttpServer()) - .get('/gists') + .get('/v1/gists') .query({ lat: 9.0579, lon: 7.4951, limit: 2 }) .expect(200); From afff51b299a07006331f5eed83ad26aced790935 Mon Sep 17 00:00:00 2001 From: Chizzy Robinson Date: Mon, 22 Jun 2026 18:40:11 +0100 Subject: [PATCH 2/3] Update lockfile --- Backend/package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Backend/package-lock.json b/Backend/package-lock.json index cd1c519..4d86e99 100644 --- a/Backend/package-lock.json +++ b/Backend/package-lock.json @@ -48,7 +48,7 @@ "prettier": "^3.4.2", "source-map-support": "^0.5.21", "supertest": "^7.0.0", - "ts-jest": "^29.2.5", + "ts-jest": "^29.4.11", "ts-loader": "^9.5.2", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", From 9125a51e4ca9aa17d9034992dc9a4bf9b689e608 Mon Sep 17 00:00:00 2001 From: Chizzy Robinson Date: Mon, 22 Jun 2026 18:41:14 +0100 Subject: [PATCH 3/3] Resolve merge conflict in package.json and add sqlite3 dependency --- Backend/package.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Backend/package.json b/Backend/package.json index 14eba27..53208e9 100644 --- a/Backend/package.json +++ b/Backend/package.json @@ -42,11 +42,9 @@ "pg": "^8.13.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", -<<<<<<< HEAD -======= "sanitize-html": "^2.13.1", ->>>>>>> ee680a072043aac4668efd730a3314093c7677bc - "typeorm": "^0.3.28" + "typeorm": "^0.3.28", + "sqlite3": "^5.0.2" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0",