Skip to content

Commit f1c65ec

Browse files
authored
Merge pull request #1585 from jetstreamapp/chore/improve-route-typing
chore: improve route typing
2 parents 22384d6 + 866fd6e commit f1c65ec

39 files changed

Lines changed: 271 additions & 273 deletions

apps/api/src/app/controllers/auth.controller.ts

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -69,28 +69,28 @@ import { parseCookie } from 'cookie';
6969
import { addMinutes } from 'date-fns/addMinutes';
7070
import { z } from 'zod';
7171
import { redirect, sendJson, setCsrfCookie } from '../utils/response.handlers';
72-
import { createRoute } from '../utils/route.utils';
72+
import { createRoute, RouteValidator } from '../utils/route.utils';
7373

7474
export const routeDefinition = {
7575
logout: {
7676
controllerFn: () => logout,
7777
validators: {
7878
hasSourceOrg: false,
79-
},
79+
} satisfies RouteValidator,
8080
},
8181
getProviders: {
8282
controllerFn: () => getProviders,
8383
responseType: ProvidersSchema,
8484
validators: {
8585
hasSourceOrg: false,
86-
},
86+
} satisfies RouteValidator,
8787
},
8888
getCsrfToken: {
8989
controllerFn: () => getCsrfToken,
9090
responseType: z.object({ csrfToken: z.string() }),
9191
validators: {
9292
hasSourceOrg: false,
93-
},
93+
} satisfies RouteValidator,
9494
},
9595
getSession: {
9696
controllerFn: () => getSession,
@@ -105,7 +105,7 @@ export const routeDefinition = {
105105
}),
106106
validators: {
107107
hasSourceOrg: false,
108-
},
108+
} satisfies RouteValidator,
109109
},
110110
signin: {
111111
controllerFn: () => signin,
@@ -114,7 +114,7 @@ export const routeDefinition = {
114114
query: z.object({ returnUrl: z.string().nullish(), isAccountLink: z.literal('true').nullish() }),
115115
body: z.object({ csrfToken: z.string(), callbackUrl: z.string().url() }),
116116
hasSourceOrg: false,
117-
},
117+
} satisfies RouteValidator,
118118
},
119119
callback: {
120120
controllerFn: () => callback,
@@ -143,7 +143,7 @@ export const routeDefinition = {
143143
z.object({}).nullish(),
144144
]),
145145
hasSourceOrg: false,
146-
},
146+
} satisfies RouteValidator,
147147
},
148148
verification: {
149149
controllerFn: () => verification,
@@ -160,7 +160,7 @@ export const routeDefinition = {
160160
type: z.enum(['email', '2fa-otp', '2fa-email']),
161161
}),
162162
hasSourceOrg: false,
163-
},
163+
} satisfies RouteValidator,
164164
},
165165
verifyEmailViaLink: {
166166
controllerFn: () => verifyEmailViaLink,
@@ -170,23 +170,23 @@ export const routeDefinition = {
170170
code: z.string(),
171171
}),
172172
hasSourceOrg: false,
173-
},
173+
} satisfies RouteValidator,
174174
},
175175
resendVerification: {
176176
controllerFn: () => resendVerification,
177177
responseType: z.object({ error: z.boolean() }).nullable(),
178178
validators: {
179179
body: z.object({ captchaToken: z.string().nullish(), csrfToken: z.string(), type: z.enum(['email', '2fa-email']) }),
180180
hasSourceOrg: false,
181-
},
181+
} satisfies RouteValidator,
182182
},
183183
requestPasswordReset: {
184184
controllerFn: () => requestPasswordReset,
185185
responseType: z.object({ error: z.boolean() }).nullable(),
186186
validators: {
187187
body: z.object({ captchaToken: z.string().nullish(), email: z.string().toLowerCase(), csrfToken: z.string() }),
188188
hasSourceOrg: false,
189-
},
189+
} satisfies RouteValidator,
190190
},
191191
validatePasswordReset: {
192192
controllerFn: () => validatePasswordReset,
@@ -200,14 +200,14 @@ export const routeDefinition = {
200200
captchaToken: z.string().nullish(),
201201
}),
202202
hasSourceOrg: false,
203-
},
203+
} satisfies RouteValidator,
204204
},
205205
getOtpEnrollmentData: {
206206
controllerFn: () => getOtpEnrollmentData,
207207
responseType: z.object({ secret: z.string(), secretToken: z.string(), imageUri: z.string(), uri: z.string() }),
208208
validators: {
209209
hasSourceOrg: false,
210-
},
210+
} satisfies RouteValidator,
211211
},
212212
enrollOtpFactor: {
213213
controllerFn: () => enrollOtpFactor,
@@ -219,46 +219,46 @@ export const routeDefinition = {
219219
csrfToken: z.string(),
220220
}),
221221
hasSourceOrg: false,
222-
},
222+
} satisfies RouteValidator,
223223
},
224224
// SSO Routes
225225
discoverSso: {
226226
controllerFn: () => discoverSso,
227227
validators: {
228228
body: z.object({ csrfToken: z.string(), email: z.email().toLowerCase() }),
229229
hasSourceOrg: false,
230-
},
230+
} satisfies RouteValidator,
231231
},
232232
startSso: {
233233
controllerFn: () => startSso,
234234
validators: {
235235
body: z.object({ csrfToken: z.string(), email: z.email().toLowerCase() }),
236236
query: z.object({ returnUrl: z.string().optional() }),
237237
hasSourceOrg: false,
238-
},
238+
} satisfies RouteValidator,
239239
},
240240
handleSamlCallback: {
241241
controllerFn: () => handleSamlCallback,
242242
validators: {
243243
params: z.object({ teamId: z.uuid() }),
244244
body: z.object({ SAMLResponse: z.string() }),
245245
hasSourceOrg: false,
246-
},
246+
} satisfies RouteValidator,
247247
},
248248
getSamlMetadata: {
249249
controllerFn: () => getSamlMetadata,
250250
validators: {
251251
params: z.object({ teamId: z.uuid() }),
252252
hasSourceOrg: false,
253-
},
253+
} satisfies RouteValidator,
254254
},
255255
handleOidcCallback: {
256256
controllerFn: () => handleOidcCallback,
257257
validators: {
258258
params: z.object({ teamId: z.uuid() }),
259259
query: z.object({}).loose(),
260260
hasSourceOrg: false,
261-
},
261+
} satisfies RouteValidator,
262262
},
263263
};
264264

apps/api/src/app/controllers/billing.controller.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,23 @@ import * as userDbService from '../db/user.db';
99
import * as stripeService from '../services/stripe.service';
1010
import { NotFoundError, UserFacingError } from '../utils/error-handler';
1111
import { redirect, sendJson } from '../utils/response.handlers';
12-
import { createRoute } from '../utils/route.utils';
12+
import { createRoute, RouteValidator } from '../utils/route.utils';
1313

1414
export const routeDefinition = {
1515
webhook: {
1616
controllerFn: () => stripeWebhookHandler,
1717
validators: {
1818
hasSourceOrg: false,
1919
logErrorToBugTracker: true,
20-
},
20+
} satisfies RouteValidator,
2121
},
2222
fetchPrices: {
2323
controllerFn: () => fetchPrices,
2424
responseType: z.record(z.string(), z.any()), // FIXME: improve this
2525
validators: {
2626
hasSourceOrg: false,
2727
logErrorToBugTracker: true,
28-
},
28+
} satisfies RouteValidator,
2929
},
3030
createCheckoutSession: {
3131
controllerFn: () => createCheckoutSessionHandler,
@@ -36,7 +36,7 @@ export const routeDefinition = {
3636
body: z.object({
3737
priceLookupKey: z.enum(STRIPE_PRICE_KEYS),
3838
}),
39-
},
39+
} satisfies RouteValidator,
4040
},
4141
processCheckoutSuccess: {
4242
controllerFn: () => processCheckoutSuccessHandler,
@@ -53,7 +53,7 @@ export const routeDefinition = {
5353
userId: z.string(),
5454
teamId: z.string().optional(),
5555
}),
56-
},
56+
} satisfies RouteValidator,
5757
},
5858
getSubscriptions: {
5959
controllerFn: () => getSubscriptionsHandler,
@@ -67,14 +67,14 @@ export const routeDefinition = {
6767
validators: {
6868
hasSourceOrg: false,
6969
logErrorToBugTracker: true,
70-
},
70+
} satisfies RouteValidator,
7171
},
7272
createBillingPortalSession: {
7373
controllerFn: () => createBillingPortalSession,
7474
validators: {
7575
hasSourceOrg: false,
7676
logErrorToBugTracker: true,
77-
},
77+
} satisfies RouteValidator,
7878
},
7979
};
8080

apps/api/src/app/controllers/data-sync.controller.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { z } from 'zod';
77
import * as userSyncDbService from '../db/data-sync.db';
88
import { emitRecordSyncEventsToOtherClients, SyncEvent } from '../services/data-sync-broadcast.service';
99
import { sendJson } from '../utils/response.handlers';
10-
import { createRoute } from '../utils/route.utils';
10+
import { createRoute, RouteValidator } from '../utils/route.utils';
1111

1212
// FIXME: TEMPORARY UNTIL ALL CLIENTS HAVE BEEN BACKFILLED
1313
export const SyncRecordOperationSchemaFillHashedKey = z
@@ -61,7 +61,7 @@ export const routeDefinition = {
6161
lastKey: z.string().nullish(),
6262
}),
6363
hasSourceOrg: false,
64-
},
64+
} satisfies RouteValidator,
6565
},
6666
push: {
6767
controllerFn: () => push,
@@ -88,7 +88,7 @@ export const routeDefinition = {
8888
// Original code:
8989
// body: SyncRecordOperationSchema.array().max(userSyncDbService.MAX_SYNC),
9090
hasSourceOrg: false,
91-
},
91+
} satisfies RouteValidator,
9292
},
9393
};
9494

apps/api/src/app/controllers/desktop-app.controller.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ import { emitRecordSyncEventsToOtherClients, SyncEvent } from '../services/data-
2020
import * as externalAuthService from '../services/external-auth.service';
2121
import { decryptJwtTokenOrPlaintext } from '../services/jwt-token-encryption.service';
2222
import { redirect, sendJson } from '../utils/response.handlers';
23-
import { createRoute } from '../utils/route.utils';
23+
import { createRoute, RouteValidator } from '../utils/route.utils';
2424
import { routeDefinition as dataSyncController } from './data-sync.controller';
2525

2626
export const routeDefinition = {
2727
initAuthMiddleware: {
2828
controllerFn: () => initAuthMiddleware,
2929
validators: {
3030
hasSourceOrg: false,
31-
},
31+
} satisfies RouteValidator,
3232
},
3333
logout: {
3434
controllerFn: () => logout,
@@ -45,14 +45,14 @@ export const routeDefinition = {
4545
})
4646
.optional(),
4747
hasSourceOrg: false,
48-
},
48+
} satisfies RouteValidator,
4949
},
5050
initSession: {
5151
controllerFn: () => initSession,
5252
responseType: z.object({ accessToken: z.string() }),
5353
validators: {
5454
hasSourceOrg: false,
55-
},
55+
} satisfies RouteValidator,
5656
},
5757
verifyToken: {
5858
controllerFn: () => verifyToken,
@@ -69,29 +69,29 @@ export const routeDefinition = {
6969
})
7070
.optional(),
7171
hasSourceOrg: false,
72-
},
72+
} satisfies RouteValidator,
7373
},
7474
dataSyncPull: {
7575
controllerFn: () => dataSyncPull,
7676
responseType: z.any(),
7777
validators: {
7878
...dataSyncController.pull.validators,
79-
},
79+
} satisfies RouteValidator,
8080
},
8181
dataSyncPush: {
8282
controllerFn: () => dataSyncPush,
8383
responseType: z.any(),
8484
validators: {
8585
...dataSyncController.push.validators,
86-
},
86+
} satisfies RouteValidator,
8787
},
8888
notifications: {
8989
controllerFn: () => notifications,
9090
responseType: z.any(),
9191
validators: {
9292
query: z.object({ os: z.string(), version: z.string(), isPackaged: z.union([z.string(), z.boolean()]).optional().default(true) }),
9393
hasSourceOrg: false,
94-
},
94+
} satisfies RouteValidator,
9595
},
9696
};
9797

apps/api/src/app/controllers/desktop-assets.controller.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { logger } from '@jetstream/api-config';
22
import z from 'zod';
33
import { getLatestDesktopVersion, PlatformArch, PlatformArchSchema } from '../services/desktop-asset.service';
4-
import { createRoute } from '../utils/route.utils';
4+
import { createRoute, RouteValidator } from '../utils/route.utils';
55

66
export const routeDefinition = {
77
getDownloadLink: {
@@ -14,7 +14,7 @@ export const routeDefinition = {
1414
validators: {
1515
params: PlatformArchSchema,
1616
hasSourceOrg: false,
17-
},
17+
} satisfies RouteValidator,
1818
},
1919
getAllDownloadLinks: {
2020
controllerFn: () => getAllDownloadLinks,
@@ -49,7 +49,7 @@ export const routeDefinition = {
4949
}),
5050
validators: {
5151
hasSourceOrg: false,
52-
},
52+
} satisfies RouteValidator,
5353
},
5454
};
5555

apps/api/src/app/controllers/oauth.controller.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import { ApiConnection, ApiRequestError, getApiRequestFactoryFn } from '@jetstre
33
import * as oauthService from '@jetstream/salesforce-oauth';
44
import { ERROR_MESSAGES } from '@jetstream/shared/constants';
55
import { getErrorMessage } from '@jetstream/shared/utils';
6-
import { Maybe, SObjectOrganization, SalesforceOrgUi } from '@jetstream/types';
6+
import { Maybe, SalesforceOrgUi, SObjectOrganization } from '@jetstream/types';
77
import { ResponseBodyError } from 'oauth4webapi';
88
import { z } from 'zod';
99
import * as jetstreamOrganizationsDb from '../db/organization.db';
1010
import * as salesforceOrgsDb from '../db/salesforce-org.db';
1111
import * as sfdcEncService from '../services/salesforce-org-encryption.service';
12-
import { createRoute } from '../utils/route.utils';
12+
import { createRoute, RouteValidator } from '../utils/route.utils';
1313

1414
export interface OauthLinkParams {
1515
type: 'auth' | 'salesforce';
@@ -41,14 +41,14 @@ export const routeDefinition = {
4141
jetstreamOrganizationId: z.string().optional(),
4242
}),
4343
hasSourceOrg: false,
44-
},
44+
} satisfies RouteValidator,
4545
},
4646
salesforceOauthCallback: {
4747
controllerFn: () => salesforceOauthCallback,
4848
validators: {
4949
query: z.record(z.string(), z.string()),
5050
hasSourceOrg: false,
51-
},
51+
} satisfies RouteValidator,
5252
},
5353
};
5454

0 commit comments

Comments
 (0)