Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
89a585e
feat: add static api key middleware for dev stats
ulemons Mar 19, 2026
0f4e5ca
fix: lint
ulemons Mar 19, 2026
14dcd89
fix: remove local secret
ulemons Mar 19, 2026
f952c77
fix: use db oriented api keys
ulemons Mar 19, 2026
16507d9
fix: remove useless env var
ulemons Mar 19, 2026
7581772
fix: lint
ulemons Mar 19, 2026
c696a00
fix: review
ulemons Mar 20, 2026
ee921b8
feat: add query layer
ulemons Mar 19, 2026
dd59ec7
feat: add filtering on query layer
ulemons Mar 19, 2026
a7d9a51
feat: refactor in dal
ulemons Mar 19, 2026
866cee2
feat: add affiliations
ulemons Mar 20, 2026
97c0e11
feat: adding logs
ulemons Mar 20, 2026
fe34c2d
fix: lint
ulemons Mar 20, 2026
4463354
fix: lint
ulemons Mar 20, 2026
6267224
fix: created at error
ulemons Mar 20, 2026
c90150c
fix: createdAt as date
ulemons Mar 20, 2026
af22bdd
feat: adding logs
ulemons Mar 23, 2026
335387e
refactor: simplify buildTimeline
ulemons Mar 23, 2026
856b001
fix: lint
ulemons Mar 23, 2026
9d0aee8
fix: remove comments
ulemons Mar 23, 2026
1d11072
fix: change logging
ulemons Mar 23, 2026
47de513
refactor: create dal for affiliations
ulemons Mar 23, 2026
a764ba2
fix: lint
ulemons Mar 23, 2026
b18ccb0
refactor: export affiliation on dal
ulemons Mar 23, 2026
fc4e99c
fix: test not joining for member count
ulemons Mar 24, 2026
42eee93
fix: refactor v1Router
ulemons Mar 25, 2026
468467b
fix: add 404 error
ulemons Mar 25, 2026
ab79811
fix: add 404 error in public router
ulemons Mar 25, 2026
82a1b56
fix: revert not found inside the routher
ulemons Mar 25, 2026
c3660f2
feat: use join instead of in
ulemons Mar 25, 2026
3911bdb
feat: revert to memberOrganizations
ulemons Mar 25, 2026
1ded750
feat: remove useless logs
ulemons Mar 25, 2026
480a8b5
fix: use common blacklist variable
ulemons Mar 26, 2026
ac9ed84
feat: merge
ulemons Mar 26, 2026
90a1fd0
feat: add single lookup
ulemons Mar 26, 2026
4977ae7
fix: remove useless dal
ulemons Mar 27, 2026
35168c4
fix: remove duplicated not found
ulemons Mar 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions backend/src/api/public/v1/affiliations/getAffiliationByHandle.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import type { Request, Response } from 'express'

import { NotFoundError } from '@crowd/common'
import {
findMembersByGithubHandles,
findVerifiedEmailsByMemberIds,
optionsQx,
resolveAffiliationsByMemberIds,
} from '@crowd/data-access-layer'

import { ok } from '@/utils/api'

export async function getAffiliationByHandle(req: Request, res: Response): Promise<void> {
const handle = req.params.githubHandle.toLowerCase()
const qx = optionsQx(req)

const members = await findMembersByGithubHandles(qx, [handle])
if (members.length === 0) {
throw new NotFoundError(`No LFX profile found for GitHub login '${req.params.githubHandle}'.`)
}

const member = members[0]
const memberIds = [member.memberId]

const [emailRows, affiliationsByMember] = await Promise.all([
findVerifiedEmailsByMemberIds(qx, memberIds),
resolveAffiliationsByMemberIds(qx, memberIds),
])

ok(res, {
githubHandle: member.githubHandle,
name: member.displayName,
emails: emailRows.map((r) => r.email),
affiliations: affiliationsByMember.get(member.memberId) ?? [],
})
}
6 changes: 6 additions & 0 deletions backend/src/api/public/v1/affiliations/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { requireScopes } from '@/api/public/middlewares/requireScopes'
import { safeWrap } from '@/middlewares/errorMiddleware'
import { SCOPES } from '@/security/scopes'

import { getAffiliationByHandle } from './getAffiliationByHandle'
import { getAffiliations } from './getAffiliations'

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

router.post('/', requireScopes([SCOPES.READ_AFFILIATIONS]), safeWrap(getAffiliations))
router.get(
'/:githubHandle',
requireScopes([SCOPES.READ_AFFILIATIONS]),
safeWrap(getAffiliationByHandle),
)

return router
}
Loading