From 74a33500b041f2d86eacde40fc2d0463e2cf3f0a Mon Sep 17 00:00:00 2001 From: Thomas Bonnin <233326+TBonnin@users.noreply.github.com> Date: Thu, 26 Sep 2024 14:49:55 -0400 Subject: [PATCH] feat: add DELETE /connect/session endpoint --- .../lib/controllers/connect/deleteSession.ts | 41 +++++++++++++++++++ packages/server/lib/routes.ts | 4 +- packages/types/lib/connect/api.ts | 11 ++++- 3 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 packages/server/lib/controllers/connect/deleteSession.ts diff --git a/packages/server/lib/controllers/connect/deleteSession.ts b/packages/server/lib/controllers/connect/deleteSession.ts new file mode 100644 index 00000000000..c70ecbfa956 --- /dev/null +++ b/packages/server/lib/controllers/connect/deleteSession.ts @@ -0,0 +1,41 @@ +import type { DeleteConnectSession } from '@nangohq/types'; +import db from '@nangohq/database'; +import { asyncWrapper } from '../../utils/asyncWrapper.js'; +import * as connectSessionService from '../../services/connectSession.service.js'; +import { requireEmptyQuery, requireEmptyBody, zodErrorToHTTP } from '@nangohq/utils'; + +export const deleteConnectSession = asyncWrapper(async (req, res) => { + const emptyQuery = requireEmptyQuery(req); + if (emptyQuery) { + res.status(400).send({ error: { code: 'invalid_query_params', errors: zodErrorToHTTP(emptyQuery.error) } }); + return; + } + + const emptyBody = requireEmptyBody(req); + if (emptyBody) { + res.status(400).send({ error: { code: 'invalid_body', errors: zodErrorToHTTP(emptyBody.error) } }); + return; + } + + const deleteSession = await connectSessionService.deleteConnectSession(db.knex, { + id: res.locals.connectSession.id, + accountId: res.locals.account.id, + environmentId: res.locals.environment.id + }); + + if (deleteSession.isErr()) { + res.status(400).send({ + error: { + code: 'internal_error', + message: 'Failed to delete connect session', + payload: { + id: res.locals.connectSession.id, + accountId: res.locals.account.id, + environmentId: res.locals.environment.id + } + } + }); + return; + } + res.status(204).send(); +}); diff --git a/packages/server/lib/routes.ts b/packages/server/lib/routes.ts index dd583e10db2..754bdd3e024 100644 --- a/packages/server/lib/routes.ts +++ b/packages/server/lib/routes.ts @@ -93,6 +93,7 @@ import { getPublicIntegration } from './controllers/integrations/uniqueKey/getIn import { getPublicListIntegrations } from './controllers/integrations/getListIntegrations.js'; import { postConnectSessions } from './controllers/connect/postSessions.js'; import { getConnectSession } from './controllers/connect/getSession.js'; +import { deleteConnectSession } from './controllers/connect/deleteSession.js'; export const router = express.Router(); @@ -215,7 +216,8 @@ publicAPI.route('/scripts/config').get(apiAuth, flowController.getFlowConfig.bin publicAPI.route('/action/trigger').post(apiAuth, syncController.triggerAction.bind(syncController)); //TODO: to deprecate publicAPI.route('/connect/sessions').post(apiAuth, postConnectSessions); -publicAPI.route('/connect/session').post(connectSessionAuth, getConnectSession); +publicAPI.route('/connect/session').get(connectSessionAuth, getConnectSession); +publicAPI.route('/connect/session').delete(connectSessionAuth, deleteConnectSession); publicAPI.route('/v1/*').all(apiAuth, syncController.actionOrModel.bind(syncController)); diff --git a/packages/types/lib/connect/api.ts b/packages/types/lib/connect/api.ts index 2e5a9708635..2ba17a76768 100644 --- a/packages/types/lib/connect/api.ts +++ b/packages/types/lib/connect/api.ts @@ -20,7 +20,7 @@ export type PostConnectSessions = Endpoint<{ allowedIntegrations?: string[] | undefined; integrationsConfigDefaults?: Record }> | undefined; }; - Error: ApiError<'forbidden' | 'invalid_body' | 'invalid_query_params' | 'internal_error'>; + Error: ApiError<'forbidden' | 'internal_error'>; Success: { data: ConnectSessionToken; }; @@ -29,7 +29,7 @@ export type PostConnectSessions = Endpoint<{ export type GetConnectSession = Endpoint<{ Method: 'GET'; Path: '/connect/session'; - Error: ApiError<'forbidden' | 'invalid_body' | 'invalid_query_params' | 'internal_error'>; + Error: ApiError<'forbidden'>; Success: { data: { allowedIntegrations: ConnectSession['allowedIntegrations']; @@ -43,3 +43,10 @@ export type GetConnectSession = Endpoint<{ }; }; }>; + +export type DeleteConnectSession = Endpoint<{ + Method: 'DELETE'; + Path: '/connect/session'; + Error: ApiError<'forbidden' | 'internal_error'>; + Success: never; +}>;