Skip to content

Latest commit

 

History

History
63 lines (54 loc) · 2.48 KB

File metadata and controls

63 lines (54 loc) · 2.48 KB
 
Jul 21, 2025
Jul 21, 2025
1
import * as z from 'zod';
Apr 22, 2025
Apr 22, 2025
2
Jan 29, 2026
Jan 29, 2026
3
import { connectionService, connectionTagsSchema } from '@nangohq/shared';
Aug 24, 2026
Aug 24, 2026
4
import { metrics, zodErrorToHTTP } from '@nangohq/utils';
Apr 22, 2025
Apr 22, 2025
5
Dec 19, 2024
Dec 19, 2024
6
import { connectionSimpleToPublicApi } from '../../formatters/connection.js';
Aug 7, 2026
Aug 7, 2026
7
import { asyncWrapperWithEnvironment } from '../../utils/asyncWrapper.js';
Dec 16, 2024
Dec 16, 2024
8
import { bodySchema } from '../connect/postSessions.js';
Oct 30, 2024
Oct 30, 2024
9
Apr 22, 2025
Apr 22, 2025
10
import type { GetPublicConnections } from '@nangohq/types';
11
Oct 30, 2024
Oct 30, 2024
12
const validationQuery = z
13
.object({
Oct 30, 2024
Oct 30, 2024
14
connectionId: z.string().min(1).max(255).optional(),
Dec 16, 2024
Dec 16, 2024
15
search: z.string().min(1).max(255).optional(),
16
endUserId: bodySchema.shape.end_user.shape.id.optional(),
Nov 4, 2025
Nov 4, 2025
17
integrationId: z.string().min(1).optional(),
Jan 13, 2026
Jan 13, 2026
18
endUserOrganizationId: bodySchema.shape.end_user.shape.id.optional(),
Jan 29, 2026
Jan 29, 2026
19
tags: connectionTagsSchema.optional(),
Jan 29, 2026
Jan 29, 2026
20
limit: z.coerce.number().min(1).max(2000).optional(),
Jan 13, 2026
Jan 13, 2026
21
page: z.coerce.number().min(0).optional()
Oct 30, 2024
Oct 30, 2024
22
})
23
.strict();
Aug 7, 2026
Aug 7, 2026
25
export const getPublicConnections = asyncWrapperWithEnvironment<GetPublicConnections>(async (req, res) => {
Oct 30, 2024
Oct 30, 2024
26
const queryParamValues = validationQuery.safeParse(req.query);
27
if (!queryParamValues.success) {
28
res.status(400).send({
29
error: { code: 'invalid_query_params', errors: zodErrorToHTTP(queryParamValues.error) }
30
});
Aug 24, 2026
Aug 24, 2026
34
const { account, environment } = res.locals;
Jan 29, 2026
Jan 29, 2026
35
const queryParam = queryParamValues.data;
Aug 24, 2026
Aug 24, 2026
37
if (queryParam.search) {
38
metrics.increment(metrics.Types.CONNECTIONS_SEARCH_PARAM_USED, 1, { accountId: account.id });
39
}
40
Oct 30, 2024
Oct 30, 2024
41
const connections = await connectionService.listConnections({
42
environmentId: environment.id,
43
connectionId: queryParam.connectionId,
44
search: queryParam.search,
Dec 16, 2024
Dec 16, 2024
45
endUserId: queryParam.endUserId,
Nov 4, 2025
Nov 4, 2025
46
integrationIds: queryParam.integrationId ? queryParam.integrationId.split(',').map((id) => id.trim()) : undefined,
Dec 16, 2024
Dec 16, 2024
47
endUserOrganizationId: queryParam.endUserOrganizationId,
Jan 29, 2026
Jan 29, 2026
48
tags: queryParam.tags,
Jan 13, 2026
Jan 13, 2026
49
page: queryParam.page,
Jan 13, 2026
Jan 13, 2026
50
limit: queryParam.limit || 10_000 // 10_000 to avoid breaking changes. TODO: set to more reasonable default like 1000 in the future
Oct 30, 2024
Oct 30, 2024
51
});
52
53
res.status(200).send({
54
connections: connections.map((data) => {
Dec 19, 2024
Dec 19, 2024
55
return connectionSimpleToPublicApi({
56
data: data.connection,
57
activeLog: data.active_logs,
Dec 16, 2024
Dec 16, 2024
58
provider: data.provider,
59
endUser: data.end_user
60
});
61
})
62
});
63
});