Skip to content

Commit cf29dd0

Browse files
fix: related users on fap SQL statement join (#1604)
1 parent 82dd091 commit cf29dd0

1 file changed

Lines changed: 36 additions & 33 deletions

File tree

apps/backend/src/datasources/postgres/FapDataSource.ts

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,44 +1207,47 @@ export default class PostgresFapDataSource implements FapDataSource {
12071207
}
12081208

12091209
async getRelatedUsersOnFap(id: number): Promise<number[]> {
1210-
const relatedFapMembers = await database
1211-
.select('fr.user_id')
1210+
const relatedFaps = await database
1211+
.select('f.fap_id')
12121212
.distinct()
1213-
.from('faps as s')
1214-
.leftJoin('fap_secretaries as fs', 'fs.fap_id', 's.fap_id')
1215-
.leftJoin('fap_chairs as fc', 'fc.fap_id', 's.fap_id')
1216-
.leftJoin('fap_reviewers as r', function () {
1217-
this.on('s.fap_id', 'r.fap_id');
1218-
this.andOn(function () {
1219-
this.onVal('r.user_id', id); // where the user is part of the visit
1220-
this.orOnVal('fc.user_id', id); // where the user is a chair
1221-
this.orOnVal('fs.user_id', id); // where the user is the secretary
1222-
});
1223-
}) // this gives a list of proposals that a user is related to
1224-
.join('fap_reviewers as fr', { 'fr.fap_id': 's.fap_id' }); // this gives us all of the associated reviewers
1213+
.from('faps as f')
1214+
.leftJoin('fap_secretaries as fs', 'fs.fap_id', 'f.fap_id')
1215+
.leftJoin('fap_chairs as fc', 'fc.fap_id', 'f.fap_id')
1216+
.leftJoin('fap_reviewers as fr', 'fr.fap_id', 'f.fap_id')
1217+
.where(function () {
1218+
this.where('fs.user_id', id)
1219+
.orWhere('fc.user_id', id)
1220+
.orWhere('fr.user_id', id);
1221+
});
12251222

1226-
const relatedFapChairsAndSecs = await database
1227-
.select(
1228-
'fc.user_id as fap_chair_user_id',
1229-
'fs.user_id as fap_secretary_user_id'
1230-
)
1223+
if (relatedFaps.length === 0) {
1224+
return [];
1225+
}
1226+
1227+
const relatedFapIds = relatedFaps.map((fap) => fap.fap_id);
1228+
1229+
const secretaries = await database
1230+
.select('user_id')
12311231
.distinct()
1232-
.from('faps as s')
1233-
.leftJoin('fap_secretaries as fs', 'fs.fap_id', 's.fap_id')
1234-
.leftJoin('fap_chairs as fc', 'fc.fap_id', 's.fap_id')
1235-
.leftJoin('fap_reviewers as r', function () {
1236-
this.on('s.fap_id', 'r.fap_id');
1237-
this.andOn(function () {
1238-
this.onVal('r.user_id', id); // where the user is part of the visit
1239-
this.orOnVal('fc.user_id', id); // where the user is a chair
1240-
this.orOnVal('fs.user_id', id); // where the user is the secretary
1241-
});
1242-
});
1232+
.from('fap_secretaries')
1233+
.whereIn('fap_id', relatedFapIds);
1234+
1235+
const chairs = await database
1236+
.select('user_id')
1237+
.distinct()
1238+
.from('fap_chairs')
1239+
.whereIn('fap_id', relatedFapIds);
1240+
1241+
const reviewers = await database
1242+
.select('user_id')
1243+
.distinct()
1244+
.from('fap_reviewers')
1245+
.whereIn('fap_id', relatedFapIds);
12431246

12441247
const relatedUsers = [
1245-
...relatedFapMembers.map((r) => r.user_id),
1246-
...relatedFapChairsAndSecs.map((r) => r.fap_chair_user_id),
1247-
...relatedFapChairsAndSecs.map((r) => r.fap_secretary_user_id),
1248+
...chairs.map((r) => r.user_id),
1249+
...secretaries.map((r) => r.user_id),
1250+
...reviewers.map((r) => r.user_id),
12481251
];
12491252

12501253
return relatedUsers;

0 commit comments

Comments
 (0)