placementt-core 1.400.1041 → 1.400.1043
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/firebase/firebaseQuery.d.ts +2 -2
- package/lib/firebase/firebaseQuery.js +27 -2
- package/lib/firebase/firebaseQuery.js.map +1 -1
- package/lib/firebase/readDatabase.d.ts +2 -2
- package/lib/reduxHooks.d.ts +4 -4
- package/lib/typeDefinitions.d.ts +2 -0
- package/package.json +1 -1
- package/src/firebase/firebaseQuery.tsx +36 -2
- package/src/typeDefinitions.ts +2 -0
|
@@ -20,9 +20,9 @@ export default class FirebaseQuery {
|
|
|
20
20
|
}): Promise<DocumentReference<DocumentData>>;
|
|
21
21
|
getUniqueDocName(path: string[] | string, name: string, oId: string, product: Products): Promise<string>;
|
|
22
22
|
getDocData(path: string[] | string): Promise<DocumentData>;
|
|
23
|
-
getDocsWhere(path: string[] | string, constraints?: QueryConstraint[] | QueryConstraint, rawDocs?: boolean): Promise<
|
|
23
|
+
getDocsWhere(path: string[] | string, constraints?: QueryConstraint[] | QueryConstraint, rawDocs?: boolean): Promise<import("@firebase/firestore").QuerySnapshot<DocumentData> | {
|
|
24
24
|
[k: string]: any;
|
|
25
|
-
}>;
|
|
25
|
+
} | undefined>;
|
|
26
26
|
collectionUpdate(data: {
|
|
27
27
|
[key: string]: unknown;
|
|
28
28
|
}, path: string[] | string, constraints?: QueryConstraint[] | QueryConstraint): Promise<void>;
|
|
@@ -3,6 +3,31 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const firestore_1 = require("firebase/firestore");
|
|
4
4
|
const firebaseConfig_1 = require("./firebaseConfig");
|
|
5
5
|
const util_1 = require("./util");
|
|
6
|
+
/**
|
|
7
|
+
* Report a read that failed, and carry on with an empty result.
|
|
8
|
+
*
|
|
9
|
+
* Both readers below answer a failure with 0 or {} so that one bad query cannot blank
|
|
10
|
+
* a page. That is worth keeping — but it used to report the failure with `console.log`,
|
|
11
|
+
* which put it in the same undifferentiated stream as the "GET COUNT" line above it
|
|
12
|
+
* and left it out of the console's error filter entirely. A missing composite index is
|
|
13
|
+
* the error that costs most to miss: Firestore answers `failed-precondition` with the
|
|
14
|
+
* URL that creates the index, and the empty result it turns into is indistinguishable
|
|
15
|
+
* from a collection that genuinely has nothing in it.
|
|
16
|
+
*
|
|
17
|
+
* So: still not fatal, but no longer quiet, and carrying the query that failed rather
|
|
18
|
+
* than the error alone — a bare index error names a collection and nothing about which
|
|
19
|
+
* of the dozen reads against it went wrong.
|
|
20
|
+
*
|
|
21
|
+
* @param {string} kind which reader failed.
|
|
22
|
+
* @param {string[]|string} path the collection it was reading.
|
|
23
|
+
* @param {*} constraints the query's constraints.
|
|
24
|
+
* @param {*} error what Firestore threw.
|
|
25
|
+
* @return {undefined} nothing, so the caller falls back to its empty result.
|
|
26
|
+
*/
|
|
27
|
+
const queryFailed = (kind, path, constraints, error) => {
|
|
28
|
+
console.error(`GET ${kind} FAILED — ${typeof path === "string" ? path : path.join("/")}`, { constraints, error });
|
|
29
|
+
return undefined;
|
|
30
|
+
};
|
|
6
31
|
class FirebaseQuery {
|
|
7
32
|
createQuery(queryType, path, constraints) {
|
|
8
33
|
switch (queryType) {
|
|
@@ -14,7 +39,7 @@ class FirebaseQuery {
|
|
|
14
39
|
}
|
|
15
40
|
async getCount(path, constraints) {
|
|
16
41
|
console.log("GET COUNT", path, constraints);
|
|
17
|
-
const countObject = await (0, firestore_1.getCountFromServer)(this.createQuery("collection", path, constraints)).catch((e) =>
|
|
42
|
+
const countObject = await (0, firestore_1.getCountFromServer)(this.createQuery("collection", path, constraints)).catch((e) => queryFailed("COUNT", path, constraints, e));
|
|
18
43
|
if (!countObject)
|
|
19
44
|
return 0;
|
|
20
45
|
return (countObject).data().count;
|
|
@@ -79,7 +104,7 @@ class FirebaseQuery {
|
|
|
79
104
|
}
|
|
80
105
|
async getDocsWhere(path, constraints, rawDocs = false) {
|
|
81
106
|
const q = this.createQuery("collection", path, constraints);
|
|
82
|
-
const docs = await (0, firestore_1.getDocs)(q).catch((e) =>
|
|
107
|
+
const docs = await (0, firestore_1.getDocs)(q).catch((e) => queryFailed("DOCS", path, constraints, e));
|
|
83
108
|
if (rawDocs)
|
|
84
109
|
return docs;
|
|
85
110
|
if (!docs)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebaseQuery.js","sourceRoot":"","sources":["../../src/firebase/firebaseQuery.tsx"],"names":[],"mappings":";;AAAA,kDAEmI;AAEnI,qDAAoC;AACpC,iCAAiC;AAIjC,MAAqB,aAAa;IACtB,WAAW,CAAC,SAA4B,EAAE,IAAoB,EAAE,WAA8C;QAClH,QAAQ,SAAS,EAAE,CAAC;YACpB,KAAK,YAAY;gBACb,OAAO,IAAA,iBAAK,EAAC,IAAA,sBAAU,EAAC,mBAAE,EAAE,GAAI,IAAA,gBAAS,EAAC,IAAI,CAAW,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvJ,KAAK,KAAK;gBACN,OAAO,IAAA,eAAG,EAAC,mBAAE,EAAE,GAAI,IAAA,gBAAS,EAAC,IAAI,CAAW,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAoB,EAAE,WAA8C;QAC/E,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,IAAA,8BAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,CAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"firebaseQuery.js","sourceRoot":"","sources":["../../src/firebase/firebaseQuery.tsx"],"names":[],"mappings":"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"}
|
|
@@ -28,8 +28,8 @@ export declare const getPlacementsWhere: ({ w, oId, uid, raw }: {
|
|
|
28
28
|
oId?: string;
|
|
29
29
|
uid?: string;
|
|
30
30
|
raw?: boolean;
|
|
31
|
-
}) => Promise<
|
|
31
|
+
}) => Promise<import("@firebase/firestore").QuerySnapshot<import("@firebase/firestore").DocumentData> | {
|
|
32
32
|
[k: string]: any;
|
|
33
|
-
}>;
|
|
33
|
+
} | undefined>;
|
|
34
34
|
export declare const checkPlacementConflicts: (instituteId: string, userGroupId: string) => Promise<number>;
|
|
35
35
|
export declare const getPlacementListingsById: (placementListings: string[]) => Promise<[string, PlacementListing][]>;
|
package/lib/reduxHooks.d.ts
CHANGED
|
@@ -118,9 +118,9 @@ export declare function useStudent({ user }: {
|
|
|
118
118
|
add: (formData: StudentPlacementData) => Promise<void>;
|
|
119
119
|
update: (placementId: string, attributes: Partial<StudentPlacementData>) => Promise<void>;
|
|
120
120
|
delete: (id: string) => Promise<void>;
|
|
121
|
-
getUserPlacements: () => Promise<
|
|
121
|
+
getUserPlacements: () => Promise<import("@firebase/firestore").QuerySnapshot<DocumentData> | {
|
|
122
122
|
[k: string]: any;
|
|
123
|
-
}>;
|
|
123
|
+
} | undefined>;
|
|
124
124
|
getPlacementsStart: (start: Date, end: Date) => Promise<{
|
|
125
125
|
[key: string]: StudentPlacementData;
|
|
126
126
|
}>;
|
|
@@ -334,9 +334,9 @@ export declare function useInstituteStudent({ user }: {
|
|
|
334
334
|
add: (formData: StudentPlacementData) => Promise<void>;
|
|
335
335
|
update: (placementId: string, attributes: Partial<StudentPlacementData>) => Promise<void>;
|
|
336
336
|
delete: (id: string) => Promise<void>;
|
|
337
|
-
getUserPlacements: () => Promise<
|
|
337
|
+
getUserPlacements: () => Promise<import("@firebase/firestore").QuerySnapshot<DocumentData> | {
|
|
338
338
|
[k: string]: any;
|
|
339
|
-
}>;
|
|
339
|
+
} | undefined>;
|
|
340
340
|
getPlacementsStart: (start: Date, end: Date) => Promise<{
|
|
341
341
|
[key: string]: StudentPlacementData;
|
|
342
342
|
}>;
|
package/lib/typeDefinitions.d.ts
CHANGED
|
@@ -1184,6 +1184,7 @@ export type InstituteData = {
|
|
|
1184
1184
|
}[];
|
|
1185
1185
|
feedback?: CohortData["feedback"];
|
|
1186
1186
|
feedbackText?: CohortData["feedbackText"];
|
|
1187
|
+
emailParentOnStatusChange?: boolean;
|
|
1187
1188
|
};
|
|
1188
1189
|
};
|
|
1189
1190
|
cs?: CustomerSuccessData;
|
|
@@ -1368,6 +1369,7 @@ export type CohortData = {
|
|
|
1368
1369
|
trackAttendance?: boolean;
|
|
1369
1370
|
attendanceReportingEmail?: string;
|
|
1370
1371
|
hardLimitOnSubmissions?: boolean;
|
|
1372
|
+
emailParentOnStatusChange?: boolean;
|
|
1371
1373
|
targetHours?: number;
|
|
1372
1374
|
manuallySendFeedback?: boolean;
|
|
1373
1375
|
};
|
package/package.json
CHANGED
|
@@ -7,6 +7,40 @@ import {pathToArr} from "./util";
|
|
|
7
7
|
import {Products} from "../typeDefinitions";
|
|
8
8
|
import { AppDispatch } from "../config";
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Report a read that failed, and carry on with an empty result.
|
|
12
|
+
*
|
|
13
|
+
* Both readers below answer a failure with 0 or {} so that one bad query cannot blank
|
|
14
|
+
* a page. That is worth keeping — but it used to report the failure with `console.log`,
|
|
15
|
+
* which put it in the same undifferentiated stream as the "GET COUNT" line above it
|
|
16
|
+
* and left it out of the console's error filter entirely. A missing composite index is
|
|
17
|
+
* the error that costs most to miss: Firestore answers `failed-precondition` with the
|
|
18
|
+
* URL that creates the index, and the empty result it turns into is indistinguishable
|
|
19
|
+
* from a collection that genuinely has nothing in it.
|
|
20
|
+
*
|
|
21
|
+
* So: still not fatal, but no longer quiet, and carrying the query that failed rather
|
|
22
|
+
* than the error alone — a bare index error names a collection and nothing about which
|
|
23
|
+
* of the dozen reads against it went wrong.
|
|
24
|
+
*
|
|
25
|
+
* @param {string} kind which reader failed.
|
|
26
|
+
* @param {string[]|string} path the collection it was reading.
|
|
27
|
+
* @param {*} constraints the query's constraints.
|
|
28
|
+
* @param {*} error what Firestore threw.
|
|
29
|
+
* @return {undefined} nothing, so the caller falls back to its empty result.
|
|
30
|
+
*/
|
|
31
|
+
const queryFailed = (
|
|
32
|
+
kind: "COUNT"|"DOCS",
|
|
33
|
+
path: string[]|string,
|
|
34
|
+
constraints: QueryConstraint[]|QueryConstraint|undefined,
|
|
35
|
+
error: unknown,
|
|
36
|
+
): undefined => {
|
|
37
|
+
console.error(
|
|
38
|
+
`GET ${kind} FAILED — ${typeof path === "string" ? path : path.join("/")}`,
|
|
39
|
+
{constraints, error},
|
|
40
|
+
);
|
|
41
|
+
return undefined;
|
|
42
|
+
};
|
|
43
|
+
|
|
10
44
|
export default class FirebaseQuery {
|
|
11
45
|
private createQuery(queryType:"collection"|"doc", path:string[]|string, constraints?:QueryConstraint[]|QueryConstraint) {
|
|
12
46
|
switch (queryType) {
|
|
@@ -19,7 +53,7 @@ export default class FirebaseQuery {
|
|
|
19
53
|
|
|
20
54
|
async getCount(path:string[]|string, constraints?:QueryConstraint[]|QueryConstraint):Promise<number> {
|
|
21
55
|
console.log("GET COUNT", path, constraints);
|
|
22
|
-
const countObject = await getCountFromServer(this.createQuery("collection", path, constraints) as Query).catch((e) =>
|
|
56
|
+
const countObject = await getCountFromServer(this.createQuery("collection", path, constraints) as Query).catch((e) => queryFailed("COUNT", path, constraints, e));
|
|
23
57
|
if (!countObject) return 0;
|
|
24
58
|
return (countObject).data().count;
|
|
25
59
|
}
|
|
@@ -93,7 +127,7 @@ export default class FirebaseQuery {
|
|
|
93
127
|
async getDocsWhere(path: string[]|string, constraints?:QueryConstraint[]|QueryConstraint, rawDocs=false) {
|
|
94
128
|
const q = this.createQuery("collection", path, constraints);
|
|
95
129
|
|
|
96
|
-
const docs = await getDocs(q as Query).catch((e) =>
|
|
130
|
+
const docs = await getDocs(q as Query).catch((e) => queryFailed("DOCS", path, constraints, e));
|
|
97
131
|
if (rawDocs) return docs;
|
|
98
132
|
if (!docs) return {};
|
|
99
133
|
console.log("GET DOCS WHERE", docs.size, path, constraints);
|
package/src/typeDefinitions.ts
CHANGED
|
@@ -1215,6 +1215,7 @@ export type InstituteData = {
|
|
|
1215
1215
|
}[],
|
|
1216
1216
|
feedback?: CohortData["feedback"], // promoted feedback form config
|
|
1217
1217
|
feedbackText?: CohortData["feedbackText"],
|
|
1218
|
+
emailParentOnStatusChange?: boolean,
|
|
1218
1219
|
}
|
|
1219
1220
|
},
|
|
1220
1221
|
cs?: CustomerSuccessData,
|
|
@@ -1410,6 +1411,7 @@ export type CohortData = {
|
|
|
1410
1411
|
trackAttendance?: boolean,
|
|
1411
1412
|
attendanceReportingEmail?: string, // Optionally set email address
|
|
1412
1413
|
hardLimitOnSubmissions?: boolean,
|
|
1414
|
+
emailParentOnStatusChange?: boolean
|
|
1413
1415
|
targetHours?: number,
|
|
1414
1416
|
manuallySendFeedback?: boolean,
|
|
1415
1417
|
}
|