Skip to content

Commit 458094a

Browse files
committed
fix(server-ng): add standard NestJS decorators to all ts-rest handlers
This is a systemic fix for ALL ts-rest handlers in the codebase. Problem: @TsRestHandler decorators alone don't register NestJS HTTP routes. Solution: Add standard NestJS decorators (@get, @post, @put, @delete, @patch) alongside ts-rest handlers for all controllers. Fixed 18 controller files, adding 91+ HTTP method decorators: - app.controller.ts - analytics.controller.ts - api-token.controller.ts - auth.controller.ts - backup.controller.ts - caddy.controller.ts - category.controller.ts - compatibility.controller.ts - draft.controller.ts - draft-version.controller.ts - meta.controller.ts - pipeline.controller.ts - rss.controller.ts - setting-core.controller.ts - tag.controller.ts - timeline.controller.ts - user.controller.ts - article.controller.ts All ts-rest API endpoints are now accessible via HTTP.
1 parent f76ba1e commit 458094a

18 files changed

Lines changed: 98 additions & 6 deletions

packages/server-ng/src/app.controller.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Controller } from '@nestjs/common';
1+
import { Controller, Get } from '@nestjs/common';
22
import { TsRestHandler, tsRestHandler } from '@ts-rest/nest';
33

44
import { appContract } from './app.contract';
@@ -9,6 +9,7 @@ export class AppController {
99
constructor(private readonly appService: AppService) {}
1010

1111
@TsRestHandler(appContract.hello)
12+
@Get()
1213
getHello(): ReturnType<typeof tsRestHandler> {
1314
return tsRestHandler(appContract.hello, async () => {
1415
return Promise.resolve({ status: 200 as const, body: this.appService.getHello() });

packages/server-ng/src/modules/admin/compatibility.controller.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export class CompatibilityController {
1111
// ISR Stubs
1212
@TsRestHandler(contract.triggerISR)
1313
@Perm({ authOnly: true, roles: ['admin'] })
14+
@Post()
1415
triggerISR_tsrest(): ReturnType<typeof tsRestHandler> {
1516
return tsRestHandler(contract.triggerISR, async () => {
1617
return { status: 200, body: { success: true } };

packages/server-ng/src/modules/analytics/analytics.controller.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,7 @@ export class AnalyticsController {
491491
}
492492

493493
@TsRestHandler(contract.getPublicViewer)
494+
@Get()
494495
getPublicViewer(): ReturnType<typeof tsRestHandler> {
495496
return tsRestHandler(contract.getPublicViewer, async () => {
496497
const overview = await this.publicAnalyticsService.getPublicOverview();
@@ -509,6 +510,7 @@ export class AnalyticsController {
509510
}
510511

511512
@TsRestHandler(contract.getArticleViewer)
513+
@Get()
512514
getArticleViewer(): ReturnType<typeof tsRestHandler> {
513515
return tsRestHandler(contract.getArticleViewer, async ({ params }) => {
514516
const idNum = Number(params.id);
@@ -530,6 +532,7 @@ export class AnalyticsController {
530532
}
531533

532534
@TsRestHandler(contract.recordPublicViewer)
535+
@Post()
533536
recordPublicViewer(@Req() req: Request): ReturnType<typeof tsRestHandler> {
534537
return tsRestHandler(contract.recordPublicViewer, async ({ body, headers }) => {
535538
const { type, path, referrer, userAgent: userAgentInBody } = body;
@@ -563,6 +566,7 @@ export class AnalyticsController {
563566

564567
@TsRestHandler(contract.getAnalyticsOverview)
565568
@Perm('analytics', ['read'])
569+
@Get()
566570
getAnalyticsOverview(): ReturnType<typeof tsRestHandler> {
567571
return tsRestHandler(contract.getAnalyticsOverview, async () => {
568572
const overview = await this.analyticsService.getOverview();

packages/server-ng/src/modules/article/article.controller.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ export class ArticleController {
382382

383383
@TsRestHandler(contract.getAdminArticles)
384384
@Permission('article', ['read'])
385+
@Get()
385386
getAdminArticles(): ReturnType<typeof tsRestHandler> {
386387
return tsRestHandler(contract.getAdminArticles, async ({ query }) => {
387388
const result = await this.articleService.findAll({
@@ -423,6 +424,7 @@ export class ArticleController {
423424

424425
@TsRestHandler(contract.createArticle)
425426
@Permission('article', ['create'])
427+
@Post()
426428
createArticleRest(@Req() req: ExpressRequestType): ReturnType<typeof tsRestHandler> {
427429
return tsRestHandler(contract.createArticle, async ({ body }) => {
428430
const username = this.getUsernameFromRequest(req);
@@ -459,6 +461,7 @@ export class ArticleController {
459461

460462
@TsRestHandler(contract.updateArticle)
461463
@Permission('article', ['update'])
464+
@Put()
462465
updateArticleRest(): ReturnType<typeof tsRestHandler> {
463466
return tsRestHandler(contract.updateArticle, async ({ params, body }) => {
464467
const id = Number(params.id);
@@ -502,6 +505,7 @@ export class ArticleController {
502505

503506
@TsRestHandler(contract.deleteArticle)
504507
@Permission('article', ['delete'])
508+
@Delete()
505509
deleteArticleRest(): ReturnType<typeof tsRestHandler> {
506510
return tsRestHandler(contract.deleteArticle, async ({ params }) => {
507511
const id = Number(params.id);
@@ -512,6 +516,7 @@ export class ArticleController {
512516

513517
@TsRestHandler(contract.getAdminArticle)
514518
@Permission('article', ['read'])
519+
@Get()
515520
getAdminArticleRest(): ReturnType<typeof tsRestHandler> {
516521
return tsRestHandler(contract.getAdminArticle, async ({ params }) => {
517522
const id = Number(params.id);

packages/server-ng/src/modules/auth/api-token.controller.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export class ApiTokenController {
3838

3939
@TsRestHandler(contract.getTokens)
4040
@Permission('user', ['read'])
41+
@Get()
4142
getTokens_tsrest(): ReturnType<typeof tsRestHandler> {
4243
return tsRestHandler(contract.getTokens, async () => {
4344
const tokens = await this.apiTokenService.getAllTokens();
@@ -47,6 +48,7 @@ export class ApiTokenController {
4748

4849
@TsRestHandler(contract.createToken)
4950
@Permission('user', ['create'])
51+
@Post()
5052
createToken_tsrest(): ReturnType<typeof tsRestHandler> {
5153
return tsRestHandler(contract.createToken, async ({ body }) => {
5254
const token = await this.apiTokenService.createToken(body.name);
@@ -56,6 +58,7 @@ export class ApiTokenController {
5658

5759
@TsRestHandler(contract.deleteToken)
5860
@Permission('user', ['delete'])
61+
@Delete()
5962
deleteToken_tsrest(): ReturnType<typeof tsRestHandler> {
6063
return tsRestHandler(contract.deleteToken, async ({ params }) => {
6164
const { id } = params;

packages/server-ng/src/modules/auth/auth.controller.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ export class AuthController {
227227
}
228228

229229
@TsRestHandler(contract.login)
230+
@Post()
230231
login_tsrest(): ReturnType<typeof tsRestHandler> {
231232
return tsRestHandler(contract.login, async ({ body }) => {
232233
const { name, password } = body;
@@ -251,6 +252,7 @@ export class AuthController {
251252
}
252253

253254
@TsRestHandler(contract.logout)
255+
@Post()
254256
logout_tsrest(): ReturnType<typeof tsRestHandler> {
255257
return tsRestHandler(contract.logout, async ({ headers }) => {
256258
const authHeader = headers.authorization;

packages/server-ng/src/modules/backup/backup.controller.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ export class BackupController {
259259

260260
@TsRestHandler(contract.importBackup)
261261
@Perm('backup', ['restore'])
262+
@Post()
262263
@UseInterceptors(FileInterceptor('file'))
263264
importBackup_tsrest(): ReturnType<typeof tsRestHandler> {
264265
return tsRestHandler(contract.importBackup, async ({ rawRequest }) => {
@@ -273,6 +274,7 @@ export class BackupController {
273274

274275
@TsRestHandler(contract.exportBackup)
275276
@Perm('backup', ['read'])
277+
@Get()
276278
exportBackup_tsrest(): ReturnType<typeof tsRestHandler> {
277279
return tsRestHandler(contract.exportBackup, async () => {
278280
const buffer = await this.backupService.exportBackup();
@@ -285,6 +287,7 @@ export class BackupController {
285287

286288
@TsRestHandler(contract.restoreBackup)
287289
@Perm('backup', ['restore'])
290+
@Post()
288291
restoreBackup_tsrest(): ReturnType<typeof tsRestHandler> {
289292
return tsRestHandler(contract.restoreBackup, async ({ body }) => {
290293
await this.backupService.restoreFromBackup(body);

packages/server-ng/src/modules/category/category.controller.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ export class CategoryController {
216216

217217
@TsRestHandler(contract.getCategories)
218218
@Permission('category', ['read'])
219+
@Get()
219220
getCategories(): unknown {
220221
return tsRestHandler(contract.getCategories, async () => {
221222
const result = await this.categoryService.findAll();
@@ -233,6 +234,7 @@ export class CategoryController {
233234

234235
@TsRestHandler(contract.createCategory)
235236
@Permission('category', ['create'])
237+
@Post()
236238
createCategory(): ReturnType<typeof tsRestHandler> {
237239
return tsRestHandler(contract.createCategory, async ({ body }) => {
238240
const result = await this.categoryService.create({
@@ -248,6 +250,7 @@ export class CategoryController {
248250

249251
@TsRestHandler(contract.updateCategory)
250252
@Permission('category', ['update'])
253+
@Put()
251254
updateCategory(): ReturnType<typeof tsRestHandler> {
252255
return tsRestHandler(contract.updateCategory, async ({ params, body }) => {
253256
const result = await this.categoryService.updateByName(params.name, body);
@@ -260,6 +263,7 @@ export class CategoryController {
260263

261264
@TsRestHandler(contract.deleteCategory)
262265
@Permission('category', ['delete'])
266+
@Delete()
263267
deleteCategory(): ReturnType<typeof tsRestHandler> {
264268
return tsRestHandler(contract.deleteCategory, async ({ params }) => {
265269
await this.categoryService.removeByName(params.name);
@@ -269,6 +273,7 @@ export class CategoryController {
269273

270274
@TsRestHandler(contract.getArticlesByCategory)
271275
@Permission('category', ['read'])
276+
@Get()
272277
getArticlesByCategory(): ReturnType<typeof tsRestHandler> {
273278
return tsRestHandler(contract.getArticlesByCategory, async ({ params }) => {
274279
const result = await this.categoryService.getArticlesByCategoryName(params.name, {

packages/server-ng/src/modules/draft/draft-version.controller.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Controller } from '@nestjs/common';
1+
import { Controller, Get, Post, Delete } from '@nestjs/common';
22
import { TsRestHandler, tsRestHandler } from '@ts-rest/nest';
33
import { draftVersionContract } from '@vanblog/shared/contracts';
44

@@ -30,6 +30,7 @@ export class DraftVersionTsRestController {
3030

3131
@TsRestHandler(draftVersionContract.listVersions)
3232
@Perm('draft', ['read'])
33+
@Get()
3334
listVersions(): ReturnType<typeof tsRestHandler> {
3435
return tsRestHandler(draftVersionContract.listVersions, async ({ params, query }) => {
3536
try {
@@ -50,6 +51,7 @@ export class DraftVersionTsRestController {
5051

5152
@TsRestHandler(draftVersionContract.getVersion)
5253
@Perm('draft', ['read'])
54+
@Get()
5355
getVersion(): ReturnType<typeof tsRestHandler> {
5456
return tsRestHandler(draftVersionContract.getVersion, async ({ params }) => {
5557
try {
@@ -79,6 +81,7 @@ export class DraftVersionTsRestController {
7981

8082
@TsRestHandler(draftVersionContract.createVersion)
8183
@Perm('draft', ['create'])
84+
@Post()
8285
createVersion(): ReturnType<typeof tsRestHandler> {
8386
return tsRestHandler(draftVersionContract.createVersion, async ({ params }) => {
8487
try {
@@ -107,6 +110,7 @@ export class DraftVersionTsRestController {
107110

108111
@TsRestHandler(draftVersionContract.deleteVersion)
109112
@Perm('draft', ['delete'])
113+
@Delete()
110114
deleteVersion(): ReturnType<typeof tsRestHandler> {
111115
return tsRestHandler(draftVersionContract.deleteVersion, async ({ params }) => {
112116
try {

packages/server-ng/src/modules/draft/draft.controller.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export class DraftController {
7575

7676
@TsRestHandler(contract.getDrafts)
7777
@Perm('draft', ['read'])
78+
@Get()
7879
getDrafts(): ReturnType<typeof tsRestHandler> {
7980
return tsRestHandler(contract.getDrafts, async ({ query }) => {
8081
const result = await this.draftService.findAll({
@@ -106,6 +107,7 @@ export class DraftController {
106107

107108
@TsRestHandler(contract.createDraft)
108109
@Perm('draft', ['create'])
110+
@Post()
109111
createDraft_tsrest(): ReturnType<typeof tsRestHandler> {
110112
return tsRestHandler(contract.createDraft, async ({ body }) => {
111113
const result = await this.draftService.create({
@@ -134,6 +136,7 @@ export class DraftController {
134136

135137
@TsRestHandler(contract.updateDraft)
136138
@Perm('draft', ['update'])
139+
@Put()
137140
updateDraft_tsrest(): ReturnType<typeof tsRestHandler> {
138141
return tsRestHandler(contract.updateDraft, async ({ params, body }) => {
139142
const updateData: Record<string, unknown> = {};
@@ -164,6 +167,7 @@ export class DraftController {
164167

165168
@TsRestHandler(contract.deleteDraft)
166169
@Perm('draft', ['delete'])
170+
@Delete()
167171
deleteDraft_tsrest(): ReturnType<typeof tsRestHandler> {
168172
return tsRestHandler(contract.deleteDraft, async ({ params }) => {
169173
await this.draftService.remove(Number(params.id));
@@ -173,6 +177,7 @@ export class DraftController {
173177

174178
@TsRestHandler(contract.getDraft)
175179
@Perm('draft', ['read'])
180+
@Get()
176181
getDraft_tsrest(): ReturnType<typeof tsRestHandler> {
177182
return tsRestHandler(contract.getDraft, async ({ params }) => {
178183
const result = await this.draftService.findOne(Number(params.id));
@@ -194,6 +199,7 @@ export class DraftController {
194199

195200
@TsRestHandler(contract.publishDraft)
196201
@Perm('draft', ['publish'])
202+
@Post()
197203
publishDraft_tsrest(): ReturnType<typeof tsRestHandler> {
198204
return tsRestHandler(contract.publishDraft, async ({ params }) => {
199205
const result = await this.draftService.publish(Number(params.id), {

0 commit comments

Comments
 (0)