|
1 | 1 | import {pipe} from 'fp-ts/lib/function'; |
2 | 2 | import {BetterSQLite3Database} from 'drizzle-orm/better-sqlite3'; |
3 | | -import {inArray, desc} from 'drizzle-orm'; |
| 3 | +import {inArray, desc, eq} from 'drizzle-orm'; |
4 | 4 | import * as O from 'fp-ts/Option'; |
5 | 5 | import * as RA from 'fp-ts/ReadonlyArray'; |
6 | 6 | import * as RAE from 'fp-ts/ReadonlyNonEmptyArray'; |
7 | 7 | import {MemberCoreInfo} from '../return-types'; |
8 | 8 | import {membersTable} from '../state'; |
9 | 9 | import {MemberCoreInfoPreMerge, mergeMemberCore} from './merge'; |
10 | 10 | import {MemberLinking} from '../member-linking'; |
| 11 | +import { EmailAddress } from '../../../types'; |
| 12 | +import { normaliseEmailAddress } from '../normalise-email-address'; |
11 | 13 |
|
12 | 14 | const getMergedMember = |
13 | 15 | (db: BetterSQLite3Database) => |
@@ -52,3 +54,29 @@ export const getAllMemberCore = ( |
52 | 54 | linking: MemberLinking |
53 | 55 | ): ReadonlyArray<MemberCoreInfo> => |
54 | 56 | pipe(linking.all(), RA.filterMap(getMergedMemberSet(db))); |
| 57 | + |
| 58 | +export const findByEmail = ( |
| 59 | + db: BetterSQLite3Database, |
| 60 | + linking: MemberLinking |
| 61 | +) => (email: EmailAddress): ReadonlyArray<MemberCoreInfo> => { |
| 62 | + // This is a bit grim because member numbers were initially assumed to be uniquely |
| 63 | + // identify a single member but actually a member can have multiple member numbers. |
| 64 | + // This means we need to find all the member numbers then group them then |
| 65 | + // finally use those to actually grab the merged members. |
| 66 | + // A potential solution would be to introduce a proper primary key that represents a single user |
| 67 | + // and then have member numbers map to the primary key 1:M. |
| 68 | + const foundMemberNumbers = db.select({ |
| 69 | + memberNumber: membersTable.memberNumber, |
| 70 | + }) |
| 71 | + .from(membersTable) |
| 72 | + .where(eq(membersTable.emailAddress, normaliseEmailAddress(email))) |
| 73 | + .orderBy(desc(membersTable.memberNumber)) |
| 74 | + .all() |
| 75 | + .map(row => row.memberNumber); |
| 76 | + const groupedMemberNumbers = linking.mapAll(foundMemberNumbers); |
| 77 | + return groupedMemberNumbers.map( |
| 78 | + getMergedMemberSet(db) |
| 79 | + ).flatMap( |
| 80 | + m => O.isSome(m) ? [m.value] : [] |
| 81 | + ); |
| 82 | +} |
0 commit comments