Changes
11 changed files (+213/-2)
-
-
@@ -23,7 +23,7 @@ }} export async function idbBackend(): Promise<IDBBackend> { const db = await openDB<YamoriDB>("yamori", 11, { const db = await openDB<YamoriDB>("yamori", 12, { // TODO: マイグレーションを個別のファイルに切り分ける async upgrade(db, oldVersion, _newVersion, transaction, _event) { // v1
-
@@ -370,6 +370,48 @@ },}); break; } } } // v12 if (oldVersion < 12) { const store = transaction.objectStore("workspaces"); for await (const ws of store.iterate()) { await store.put({ ...ws.value, leaveDefinitions: ws.value.leaveDefinitions.map((def) => { if (def.createdBy !== "system") { return def; } switch (def.displayName) { case "育児休業": return { ...def, abbrName: "育休", }; case "介護休業": return { ...def, abbrName: "介護", }; case "産前産後休業": return { ...def, abbrName: "産休", }; default: return def; } }), abbreviations: { dayoff: "休日", worked: "出勤", skippedWork: "欠勤", paidLeave: "年休", }, }); } } },
-
-
-
@@ -17,9 +17,16 @@ updateKey: Uint8Array;workerAddKey: Uint8Array; createLeaveDefinitionKey: Uint8Array; }; abbreviations: { dayoff: string; worked: string; skippedWork: string; paidLeave: string; }; leaveDefinitions: { id: string; displayName: string; abbrName?: string; updateKey: Uint8Array | null; deletionKey?: Uint8Array; createdBy: "user" | "system";
-
-
-
@@ -69,6 +69,9 @@ break;case LeaveSchema.field.displayName.number: init.displayName = entry.displayName; break; case LeaveSchema.field.abbreviationName.number: init.abbreviationName = entry.abbrName || entry.displayName.slice(0, 2); break; case LeaveSchema.field.isWorkerDeemedToBeWorked.number: init.isWorkerDeemedToBeWorked = currentRevision?.snapshot?.isWorkerDeemedToBeWorked;
-
-
-
@@ -39,6 +39,12 @@ deletionKey: new Uint8Array([]),workerAddKey: new Uint8Array([]), createLeaveDefinitionKey: new Uint8Array([]), }, abbreviations: { dayoff: "", worked: "", skippedWork: "", paidLeave: "", }, leaveDefinitions: [], updatedAt: Date.now(), },
-
-
-
@@ -31,6 +31,12 @@ deletionKey: new Uint8Array([]),workerAddKey: new Uint8Array([]), createLeaveDefinitionKey: new Uint8Array([]), }, abbreviations: { dayoff: "", worked: "", skippedWork: "", paidLeave: "", }, leaveDefinitions: [], updatedAt: Date.now(), },
-
-
-
@@ -72,6 +72,14 @@ mask: leaveDefinitionsMask,}), ); break; case WorkspaceSchema.field.abbreviations.number: init.abbreviations = { dayoff: entry.abbreviations.dayoff, worked: entry.abbreviations.worked, skipWork: entry.abbreviations.skippedWork, paidLeave: entry.abbreviations.paidLeave, }; break; case WorkspaceSchema.field.paidLeaveProvisionTables.number: init.paidLeaveProvisionTables = await Promise.all( (await getPaidLeaveProvisionTables(entry.id)).map(async (table) => {
-
-
-
@@ -74,6 +74,12 @@ try {addedKey = await tx.objectStore("workspaces").add({ id, displayName: req.displayName, abbreviations: { dayoff: "休日", worked: "出勤", skippedWork: "欠勤", paidLeave: "年休", }, capabilities: { deletionKey, updateKey,
-
@@ -86,6 +92,7 @@ leaveDefinitions: [{ id: `lv-${self.crypto.randomUUID()}`, displayName: "育児休業", abbrName: "育休", updateKey: createRandomBytes(16), createdBy: "system", revisions: [
-
@@ -106,6 +113,7 @@ },{ id: `lv-${self.crypto.randomUUID()}`, displayName: "介護休業", abbrName: "介護", updateKey: createRandomBytes(16), createdBy: "system", revisions: [
-
@@ -126,6 +134,7 @@ },{ id: `lv-${self.crypto.randomUUID()}`, displayName: "産前産後休業", abbrName: "産休", updateKey: createRandomBytes(16), createdBy: "system", revisions: [
-
-
-
@@ -143,6 +143,7 @@const entry: YamoriDB["workspaces"]["value"]["leaveDefinitions"][number] = { id: `lv-${self.crypto.randomUUID()}`, displayName: req.leaveDefinition.displayName, abbrName: req.leaveDefinition.abbreviationName, updateKey, deletionKey: createRandomBytes(16), createdBy: "user",
-
-
-
@@ -99,6 +99,7 @@ expect(resp.result.value.displayName).toBe("Foo");expect(resp.result.value.updateKey?.key).toBeInstanceOf(Uint8Array); expect(resp.result.value.deletionKey?.key).toBeInstanceOf(Uint8Array); expect(resp.result.value.workerAddKey?.key).toBeInstanceOf(Uint8Array); expect(resp.result.value.abbreviations).not.toBeEmpty(); }); test("Should mask response", async () => {
-
-
-
@@ -466,3 +466,49 @@expect(updated.result.value.workspace?.displayName).toBe("Bar"); expect(updated.result.value.workspace?.id).toBeEmpty(); }); test("Should update abbreviations", async () => { const { [CONTEXT]: ctx } = await idbBackend(); const workspace = await createWorkspace( { displayName: "Foo", }, ctx, ); if (workspace.result.case !== "ok") { expect.unreachable(); } if (!workspace.result.value.workspace?.id?.value) { expect.unreachable("Create handler assigned an empty ID"); } if (!workspace.result.value.workspace.updateKey?.key) { expect.unreachable("Create handler did not set update_key"); } const updated = await updateWorkspace( { id: { value: workspace.result.value.workspace.id.value, }, updateKey: workspace.result.value.workspace.updateKey, abbreviations: { dayoff: "D1", paidLeave: "D2", worked: "D3", }, fieldMask: { paths: ["abbreviations.dayoff", "abbreviations.paid_leave"], }, }, ctx, ); if (updated.result.case !== "ok") { expect.unreachable(`Expected "ok", found "${updated.result.case}"`); } expect(updated.result.value.workspace?.abbreviations?.dayoff).toBe("D1"); expect(updated.result.value.workspace?.abbreviations?.paidLeave).toBe("D2"); expect(updated.result.value.workspace?.abbreviations?.worked).not.toBe("D3"); });
-
-
-
@@ -58,7 +58,9 @@ },}); } const changes: ((prev: any) => any)[] = []; const changes: (( prev: YamoriDB["workspaces"]["value"], ) => YamoriDB["workspaces"]["value"])[] = []; for (const path of req.fieldMask?.paths ?? []) { switch (path) {
-
@@ -75,6 +77,86 @@ });} changes.push((prev) => ({ ...prev, displayName: req.displayName })); break; } case "abbreviations.dayoff": { const value = req.abbreviations?.dayoff; if (!value) { return respond({ result: { case: "missingField", value: { path: "abbreviations.dayoff", }, }, }); } changes.push((prev) => ({ ...prev, abbreviations: { ...prev.abbreviations, dayoff: value }, })); break; } case "abbreviations.worked": { const value = req.abbreviations?.worked; if (!value) { return respond({ result: { case: "missingField", value: { path: "abbreviations.worked", }, }, }); } changes.push((prev) => ({ ...prev, abbreviations: { ...prev.abbreviations, worked: value }, })); break; } case "abbreviations.skip_work": { const value = req.abbreviations?.skipWork; if (!value) { return respond({ result: { case: "missingField", value: { path: "abbreviations.skip_work", }, }, }); } changes.push((prev) => ({ ...prev, abbreviations: { ...prev.abbreviations, skippedWork: value }, })); break; } case "abbreviations.paid_leave": { const value = req.abbreviations?.paidLeave; if (!value) { return respond({ result: { case: "missingField", value: { path: "abbreviations.paid_leave", }, }, }); } changes.push((prev) => ({ ...prev, abbreviations: { ...prev.abbreviations, paidLeave: value }, })); break; } default:
-