Skip to content

Commit bfc1bae

Browse files
authored
feat: single lookup (CM-1060) (#3964)
Signed-off-by: Umberto Sgueglia <usgueglia@contractor.linuxfoundation.org>
1 parent bd60722 commit bfc1bae

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import type { Request, Response } from 'express'
2+
3+
import { NotFoundError } from '@crowd/common'
4+
import {
5+
findMembersByGithubHandles,
6+
findVerifiedEmailsByMemberIds,
7+
optionsQx,
8+
resolveAffiliationsByMemberIds,
9+
} from '@crowd/data-access-layer'
10+
11+
import { ok } from '@/utils/api'
12+
13+
export async function getAffiliationByHandle(req: Request, res: Response): Promise<void> {
14+
const handle = req.params.githubHandle.toLowerCase()
15+
const qx = optionsQx(req)
16+
17+
const members = await findMembersByGithubHandles(qx, [handle])
18+
if (members.length === 0) {
19+
throw new NotFoundError(`No LFX profile found for GitHub login '${req.params.githubHandle}'.`)
20+
}
21+
22+
const member = members[0]
23+
const memberIds = [member.memberId]
24+
25+
const [emailRows, affiliationsByMember] = await Promise.all([
26+
findVerifiedEmailsByMemberIds(qx, memberIds),
27+
resolveAffiliationsByMemberIds(qx, memberIds),
28+
])
29+
30+
ok(res, {
31+
githubHandle: member.githubHandle,
32+
name: member.displayName,
33+
emails: emailRows.map((r) => r.email),
34+
affiliations: affiliationsByMember.get(member.memberId) ?? [],
35+
})
36+
}

backend/src/api/public/v1/affiliations/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { requireScopes } from '@/api/public/middlewares/requireScopes'
55
import { safeWrap } from '@/middlewares/errorMiddleware'
66
import { SCOPES } from '@/security/scopes'
77

8+
import { getAffiliationByHandle } from './getAffiliationByHandle'
89
import { getAffiliations } from './getAffiliations'
910

1011
const rateLimiter = createRateLimiter({ max: 60, windowMs: 60 * 1000 })
@@ -15,6 +16,11 @@ export function memberOrganizationAffiliationsRouter(): Router {
1516
router.use(rateLimiter)
1617

1718
router.post('/', requireScopes([SCOPES.READ_AFFILIATIONS]), safeWrap(getAffiliations))
19+
router.get(
20+
'/:githubHandle',
21+
requireScopes([SCOPES.READ_AFFILIATIONS]),
22+
safeWrap(getAffiliationByHandle),
23+
)
1824

1925
return router
2026
}

0 commit comments

Comments
 (0)