From 14d978289fe2aaa4debcb22e5cf54d2cb4edd76b Mon Sep 17 00:00:00 2001 From: lakshit verma Date: Wed, 19 Aug 2026 19:24:55 +0530 Subject: [PATCH] feat(backend): wire PATCH /admin/users/:id/ai endpoint for the AI opt-out toggle --- backend/src/controllers/admin.controller.ts | 11 ++++++++++- backend/src/routes/admin.routes.ts | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/backend/src/controllers/admin.controller.ts b/backend/src/controllers/admin.controller.ts index 9fa6f09..2b167a2 100644 --- a/backend/src/controllers/admin.controller.ts +++ b/backend/src/controllers/admin.controller.ts @@ -1,5 +1,5 @@ import type { NextFunction, Request, Response } from 'express'; -import type { CursorQuery, OffsetQuery, UpdateRoleInput, UpdateStatusInput } from '@workorders/shared'; +import type { CursorQuery, OffsetQuery, UpdateAiInput, UpdateRoleInput, UpdateStatusInput } from '@workorders/shared'; import { adminService, type UserListQuery } from '../services/admin.service.js'; import { actorOf, paramOf } from '../utils/request.js'; @@ -32,6 +32,15 @@ export const adminController = { } }, + async updateAi(req: Request, res: Response, next: NextFunction): Promise { + try { + const data = await adminService.updateAiEnabled(actorOf(req).id, paramOf(req, 'id'), (req.body as UpdateAiInput).aiEnabled); + res.status(200).json({ success: true, data }); + } catch (err) { + next(err); + } + }, + async listWorkOrders(req: Request, res: Response, next: NextFunction): Promise { try { const data = await adminService.listWorkOrders(req.query as unknown as CursorQuery); diff --git a/backend/src/routes/admin.routes.ts b/backend/src/routes/admin.routes.ts index dd39f9c..d3c2784 100644 --- a/backend/src/routes/admin.routes.ts +++ b/backend/src/routes/admin.routes.ts @@ -1,5 +1,5 @@ import { Router } from 'express'; -import { cursorQuerySchema, offsetQuerySchema, updateRoleSchema, updateStatusSchema } from '@workorders/shared'; +import { cursorQuerySchema, offsetQuerySchema, updateAiSchema, updateRoleSchema, updateStatusSchema } from '@workorders/shared'; import { adminController } from '../controllers/admin.controller.js'; import { authenticate, requireAdmin, requireAdminOrViewer } from '../middleware/auth.middleware.js'; import { validate, validateQuery } from '../middleware/validate.middleware.js'; @@ -15,4 +15,5 @@ adminRoutes.use(requireAdmin); adminRoutes.get('/users', validateQuery(offsetQuerySchema), adminController.listUsers); adminRoutes.patch('/users/:id/role', validate(updateRoleSchema), adminController.updateRole); adminRoutes.patch('/users/:id/status', validate(updateStatusSchema), adminController.updateStatus); +adminRoutes.patch('/users/:id/ai', validate(updateAiSchema), adminController.updateAi); adminRoutes.get('/metrics', adminController.metrics); \ No newline at end of file