Skip to content

Commit 13ace2c

Browse files
authored
Revert "Background Work - Quiz pass status (#168)"
This reverts commit ddc19d8.
1 parent ddc19d8 commit 13ace2c

File tree

18 files changed

+80
-279
lines changed

18 files changed

+80
-279
lines changed

.devcontainer/devcontainer.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313
"customizations": {
1414
"vscode": {
1515
"extensions": [
16-
"dbaeumer.vscode-eslint",
17-
"Orta.vscode-jest"
16+
"dbaeumer.vscode-eslint"
1817
]
1918
}
2019
}

src/dependencies.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,6 @@ export type Dependencies = {
4646
sheetId: string,
4747
from: O.Option<Date>
4848
) => TE.TaskEither<string, SheetDataTable['rows']>;
49-
getSheetDataByMemberNumber: (
50-
memberNumber: number,
51-
) => TE.TaskEither<string, SheetDataTable['rows']>,
5249
getTroubleTicketData: (
5350
from: O.Option<Date>
5451
) => TE.TaskEither<string, O.Option<TroubleTicketDataTable['rows']>>;

src/init-dependencies/init-dependencies.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {Client} from '@libsql/client';
1212

1313
import {initSharedReadModel} from '../read-models/shared-state';
1414
import {lastSync} from '../sync-worker/db/last_sync';
15-
import {getSheetData, getSheetDataByMemberNumber} from '../sync-worker/db/get_sheet_data';
15+
import {getSheetData} from '../sync-worker/db/get_sheet_data';
1616
import {getTroubleTicketData} from '../sync-worker/db/get_trouble_ticket_data';
1717

1818
export const initLogger = (conf: Config) => {
@@ -79,7 +79,6 @@ export const initDependencies = (
7979
logger,
8080
lastQuizSync: lastSync(googleDB),
8181
getSheetData: getSheetData(googleDB),
82-
getSheetDataByMemberNumber: getSheetDataByMemberNumber(googleDB),
8382
getTroubleTicketData: getTroubleTicketData(
8483
googleDB,
8584
O.fromNullable(conf.TROUBLE_TICKET_SHEET)

src/queries/equipment/construct-view-model.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import {User} from '../../types';
1111
import {UUID} from 'io-ts-types';
1212
import {StatusCodes} from 'http-status-codes';
1313
import {
14-
FullQuizResultsForEquipment,
15-
getFullQuizResultsForEquipment,
14+
FullQuizResults,
15+
getFullQuizResults,
1616
} from '../../read-models/external-state/equipment-quiz';
1717

1818
export const constructViewModel =
@@ -63,8 +63,8 @@ export const constructViewModel =
6363
return TE.right(O.none);
6464
}
6565
return pipe(
66-
getFullQuizResultsForEquipment(deps, equipment.trainingSheetId.value, equipment),
67-
TE.map<FullQuizResultsForEquipment, O.Option<FullQuizResultsForEquipment>>(O.some),
66+
getFullQuizResults(deps, equipment.trainingSheetId.value, equipment),
67+
TE.map<FullQuizResults, O.Option<FullQuizResults>>(O.some),
6868
TE.mapLeft(err_str => {
6969
deps.logger.error(
7070
'Failed to read sheet sync metadata: %s',

src/queries/equipment/view-model.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {FullQuizResultsForEquipment} from '../../read-models/external-state/equipment-quiz';
1+
import {FullQuizResults} from '../../read-models/external-state/equipment-quiz';
22
import {Equipment} from '../../read-models/shared-state/return-types';
33
import {User} from '../../types';
44
import * as O from 'fp-ts/Option';
@@ -9,5 +9,5 @@ export type ViewModel = {
99
isSuperUserOrTrainerOfArea: boolean;
1010
isSuperUser: boolean;
1111
equipment: Equipment;
12-
quizResults: O.Option<FullQuizResultsForEquipment>;
12+
quizResults: O.Option<FullQuizResults>;
1313
};
Lines changed: 5 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import * as O from 'fp-ts/Option';
22
import * as TE from 'fp-ts/TaskEither';
33
import * as RA from 'fp-ts/ReadonlyArray';
4-
import * as RR from 'fp-ts/ReadonlyRecord';
54

65
import {Dependencies} from '../../dependencies';
76
import {SheetDataTable} from '../../sync-worker/google/sheet-data-table';
87
import {pipe} from 'fp-ts/lib/function';
98
import {Equipment, MemberCoreInfo} from '../shared-state/return-types';
109
import {DateTime, Duration} from 'luxon';
11-
import { ReadonlyRecord } from 'fp-ts/lib/ReadonlyRecord';
12-
import { EquipmentId } from '../../types/equipment-id';
1310

1411
export type EquipmentQuizResults = {
1512
passedQuizes: SheetDataTable['rows'];
@@ -30,23 +27,20 @@ export type MemberAwaitingTraining = Pick<
3027
waitingSince: Date;
3128
};
3229

33-
const isPassed = (row: SheetDataTable['rows'][0]) => row.percentage >= 100;
34-
const isFailed = (row: SheetDataTable['rows'][0]) => !isPassed(row);
35-
3630
const extractPassedQuizes = (
3731
sheetData: SheetDataTable['rows']
3832
): SheetDataTable['rows'] =>
3933
pipe(
4034
sheetData,
41-
RA.filter(isPassed)
35+
RA.filter(row => row.percentage === 100)
4236
);
4337

4438
const extractFailedQuizes = (
4539
sheetData: SheetDataTable['rows']
4640
): SheetDataTable['rows'] =>
4741
pipe(
4842
sheetData,
49-
RA.filter(isFailed)
43+
RA.filter(row => row.percentage < 100)
5044
);
5145

5246
const getQuizResults = (
@@ -76,18 +70,18 @@ const getQuizResults = (
7670
);
7771
};
7872

79-
export type FullQuizResultsForEquipment = {
73+
export type FullQuizResults = {
8074
lastQuizSync: O.Option<Date>;
8175
membersAwaitingTraining: ReadonlyArray<MemberAwaitingTraining>;
8276
unknownMembersAwaitingTraining: ReadonlyArray<OrphanedPassedQuiz>;
8377
failedQuizes: SheetDataTable['rows'];
8478
};
8579

86-
export const getFullQuizResultsForEquipment = (
80+
export const getFullQuizResults = (
8781
deps: Pick<Dependencies, 'sharedReadModel' | 'lastQuizSync' | 'getSheetData'>,
8882
sheetId: string,
8983
equipment: Equipment
90-
): TE.TaskEither<string, FullQuizResultsForEquipment> =>
84+
): TE.TaskEither<string, FullQuizResults> =>
9185
pipe(
9286
getQuizResults(deps, sheetId, equipment.trainedMembers),
9387
TE.map(qr => {
@@ -130,71 +124,3 @@ export const getFullQuizResultsForEquipment = (
130124
};
131125
})
132126
);
133-
134-
export type FullQuizResultsForMember = {
135-
equipmentQuizPassedAt: ReadonlyRecord<EquipmentId, ReadonlyArray<Date>>,
136-
equipmentQuizAttempted: ReadonlyRecord<EquipmentId, ReadonlyArray<{
137-
response_submitted: Date,
138-
sheet_id: string;
139-
score: number;
140-
max_score: number;
141-
percentage: number;
142-
}>>,
143-
orphanedQuizAttempts: ReadonlyArray<{
144-
response_submitted: Date,
145-
sheet_id: string;
146-
score: number;
147-
max_score: number;
148-
percentage: number;
149-
}>,
150-
};
151-
152-
export const getFullQuizResultsForMember = (
153-
deps: Pick<Dependencies, 'sharedReadModel' | 'getSheetDataByMemberNumber'>,
154-
memberNumber: number
155-
): TE.TaskEither<string, FullQuizResultsForMember> => pipe(
156-
deps.getSheetDataByMemberNumber(memberNumber),
157-
TE.map(
158-
qr => {
159-
const equipmentQuizPassedAt: Record<EquipmentId, Date[]> = {};
160-
const equipmentQuizAttempted: Record<EquipmentId, {
161-
response_submitted: Date,
162-
sheet_id: string;
163-
score: number;
164-
max_score: number;
165-
percentage: number;
166-
}[]> = {};
167-
const orphanedQuizAttempts: {
168-
response_submitted: Date,
169-
sheet_id: string;
170-
score: number;
171-
max_score: number;
172-
percentage: number;
173-
}[] = [];
174-
const trainingSheetMapping = deps.sharedReadModel.equipment.getTrainingSheetIdMapping();
175-
for (const row of qr) {
176-
const equipmentId = RR.lookup(row.sheet_id)(trainingSheetMapping);
177-
if (O.isNone(equipmentId)) {
178-
orphanedQuizAttempts.push(row);
179-
} else {
180-
if (isPassed(row)) {
181-
if (!equipmentQuizPassedAt[equipmentId.value]) {
182-
equipmentQuizPassedAt[equipmentId.value] = [];
183-
}
184-
equipmentQuizPassedAt[equipmentId.value].push(row.response_submitted);
185-
} else {
186-
if (!equipmentQuizAttempted[equipmentId.value]) {
187-
equipmentQuizAttempted[equipmentId.value] = [];
188-
}
189-
equipmentQuizAttempted[equipmentId.value].push(row);
190-
}
191-
}
192-
}
193-
return {
194-
equipmentQuizPassedAt,
195-
equipmentQuizAttempted,
196-
orphanedQuizAttempts,
197-
}
198-
}
199-
)
200-
);

src/read-models/shared-state/equipment/get.ts

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import {pipe} from 'fp-ts/lib/function';
22
import {BetterSQLite3Database} from 'drizzle-orm/better-sqlite3';
3-
import {eq, isNotNull} from 'drizzle-orm';
3+
import {eq} from 'drizzle-orm';
44
import * as O from 'fp-ts/Option';
55
import * as RA from 'fp-ts/ReadonlyArray';
6-
import * as RR from 'fp-ts/ReadonlyRecord';
76
import {equipmentTable} from '../state';
87
import {MinimalEquipment} from '../return-types';
98
import {UUID} from 'io-ts-types';
10-
import { ReadonlyRecord } from 'fp-ts/lib/ReadonlyRecord';
11-
import { TrainingSheetId } from '../../../types/training-sheet';
12-
import { EquipmentId } from '../../../types/equipment-id';
139

1410
const transformRow = <
1511
R extends {
@@ -51,18 +47,3 @@ export const getAllEquipmentMinimal = (
5147
db: BetterSQLite3Database
5248
): ReadonlyArray<MinimalEquipment> =>
5349
pipe(db.select().from(equipmentTable).all(), RA.map(transformRow));
54-
55-
export const getTrainingSheetIdMapping = (
56-
db: BetterSQLite3Database
57-
) => (): ReadonlyRecord<TrainingSheetId, EquipmentId> =>
58-
pipe(
59-
db.select({
60-
trainingSheetId: equipmentTable.trainingSheetId,
61-
id: equipmentTable.id,
62-
}).from(equipmentTable).where(isNotNull(equipmentTable.trainingSheetId)).all(),
63-
RA.map(
64-
row => ([row.trainingSheetId!, row.id as UUID])
65-
),
66-
(x: ReadonlyArray<[string, UUID]>) => x,
67-
RR.fromEntries
68-
)

src/read-models/shared-state/index.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ import {dumpCurrentState, SharedDatabaseDump} from './debug/dump';
2727
import {MemberLinking} from './member-linking';
2828
import {DateTime} from 'luxon';
2929
import {getLastSent} from './training-stat-notifications/get-last-sent';
30-
import { ReadonlyRecord } from 'fp-ts/lib/ReadonlyRecord';
31-
import { TrainingSheetId } from '../../types/training-sheet';
32-
import { EquipmentId } from '../../types/equipment-id';
33-
import { getTrainingSheetIdMapping } from './equipment/get';
3430

3531
export type SharedReadModel = {
3632
db: BetterSQLite3Database;
@@ -48,7 +44,6 @@ export type SharedReadModel = {
4844
equipment: {
4945
get: (id: UUID) => O.Option<Equipment>;
5046
getAll: () => ReadonlyArray<Equipment>;
51-
getTrainingSheetIdMapping: () => ReadonlyRecord<TrainingSheetId, EquipmentId>;
5247
};
5348
area: {
5449
get: (id: UUID) => O.Option<Area>;
@@ -99,7 +94,6 @@ export const initSharedReadModel = (
9994
equipment: {
10095
get: getEquipmentFull(readModelDb, linking),
10196
getAll: getAllEquipmentFull(readModelDb, linking),
102-
getTrainingSheetIdMapping: getTrainingSheetIdMapping(readModelDb),
10397
},
10498
area: {
10599
get: getAreaFull(readModelDb, linking),

src/read-models/shared-state/member-linking.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { MemberNumber } from "../../types/member-number";
1+
type MemberNumber = number;
22

33
export class MemberLinking {
44
// Stores the linking between member numbers.

src/sync-worker/db/get_sheet_data.ts

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -49,33 +49,3 @@ export const getSheetData =
4949
),
5050
TE.map(data => data.rows)
5151
);
52-
53-
export const getSheetDataByMemberNumber =
54-
(googleDB: Client) =>
55-
(
56-
memberNumber: number,
57-
): TE.TaskEither<string, SheetDataTable['rows']> =>
58-
pipe(
59-
TE.tryCatch<string, ResultSet>(
60-
() => googleDB.execute(
61-
` SELECT *
62-
FROM sheet_data
63-
WHERE member_number_provided = ?
64-
`, [memberNumber]
65-
),
66-
reason =>
67-
`Failed to get sheet data for memberNumber '${memberNumber}': ${(reason as Error).message}`
68-
),
69-
TE.flatMapEither<ResultSet, string, SheetDataTable>(data =>
70-
pipe(
71-
data,
72-
SheetDataTable.decode,
73-
E.mapLeft(
74-
e =>
75-
'Failed to pull sheet data due to malformed data: ' +
76-
formatValidationErrors(e).join(',')
77-
)
78-
)
79-
),
80-
TE.map(data => data.rows)
81-
);

0 commit comments

Comments
 (0)