Skip to content

Commit 4c97b63

Browse files
authored
Merge pull request #641 from correctexam/637-update-to-angular-20
637 update to angular 20
2 parents e7e1bda + 40ba599 commit 4c97b63

14 files changed

Lines changed: 209 additions & 18 deletions

File tree

src/main/webapp/app/dbsqlite.worker.ts

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ addEventListener('message', e => {
128128
db1.addNonAligneImage(_sqlite3, e.data);
129129
break;
130130
}
131+
case 'cleanOutDatedCached': {
132+
cleanOutdatedCache(e.data);
133+
134+
break;
135+
}
131136

132137
case 'resetDatabase': {
133138
let db1 = dbs.get(e.data.payload.examId);
@@ -395,6 +400,18 @@ addEventListener('message', e => {
395400
db1.addTemplate(_sqlite3, e.data);
396401
break;
397402
}
403+
404+
case 'getExamTimestamp': {
405+
let db1 = dbs.get(e.data.payload.examId);
406+
if (db1 === undefined) {
407+
db1 = new DB(e.data.payload.examId);
408+
db1.initemptyDb(_sqlite3);
409+
dbs.set(e.data.payload.examId, db1);
410+
}
411+
db1.getExamTimestamp(_sqlite3, e.data);
412+
break;
413+
}
414+
398415
case 'countNonAlignWithPageNumber': {
399416
let db1 = dbs.get(e.data.payload.examId);
400417
if (db1 === undefined) {
@@ -480,6 +497,32 @@ addEventListener('message', e => {
480497
}
481498
});
482499

500+
async function cleanOutdatedCache(data: any) {
501+
try {
502+
console.error('cleanOutdatedCache for ', data);
503+
504+
const examIds = data.payload.examIds;
505+
const cacheNames: string[] = examIds.map((id: number) => '' + id + '.sqlite3');
506+
const cacheJournalNames = examIds.map((id: number) => '' + id + '.sqlite3-journal');
507+
cacheNames.push(...cacheJournalNames);
508+
if (navigator.storage.getDirectory !== undefined) {
509+
const root = await navigator.storage.getDirectory();
510+
const keys = (root as any).keys();
511+
let next = await keys.next();
512+
while (next.value) {
513+
if (next.value.endsWith('.sqlite3') || (next.value.endsWith('.sqlite3-journal') && !cacheNames.includes(next.value))) {
514+
await root.removeEntry(next.value);
515+
}
516+
next = await keys.next();
517+
}
518+
}
519+
} finally {
520+
postMessage({
521+
msg: data.msg,
522+
uid: data.uid,
523+
});
524+
}
525+
}
483526
/*
484527
addTemplate(elt: AlignImage ): Promise<number>;
485528
countNonAlignWithPageNumber(examId:number, pageInscan:number): Promise<number>;
@@ -520,6 +563,12 @@ class DB {
520563
this.db.exec('CREATE TABLE IF NOT EXISTS template(page INTEGER NOT NULL PRIMARY KEY,imageData CLOB NOT NULL)');
521564
this.db.exec('CREATE TABLE IF NOT EXISTS align(page INTEGER NOT NULL PRIMARY KEY,imageData CLOB NOT NULL)');
522565
this.db.exec('CREATE TABLE IF NOT EXISTS nonalign(page INTEGER NOT NULL PRIMARY KEY,imageData CLOB NOT NULL)');
566+
this.db.exec('create table IF NOT EXISTS exam(id INTEGER NOT NULL PRIMARY KEY, DT datetime default current_timestamp)');
567+
this.db.exec({
568+
sql: 'INSERT OR IGNORE INTO exam(id) VALUES (?)',
569+
bind: [1],
570+
});
571+
523572
// this.db.exec('CREATE UNIQUE INDEX templatepage ON template(page)');
524573
// this.db.exec('CREATE UNIQUE INDEX alignpage ON align(page)');
525574
// this.db.exec('CREATE UNIQUE INDEX nonalignpage ON nonalign(page)');
@@ -623,9 +672,9 @@ class DB {
623672
const keys = (root as any).keys();
624673
let next = await keys.next();
625674
while (next.value !== undefined) {
626-
if (next.value.endsWith('.sqlite3')) {
675+
if (next.value === this.examName + '.sqlite3') {
627676
await root.removeEntry(next.value);
628-
} else if (next.value.endsWith('sqlite3-journal')) {
677+
} else if (next.value === this.examName + 'sqlite3-journal') {
629678
await root.removeEntry(next.value);
630679
}
631680
next = await keys.next();
@@ -1304,7 +1353,7 @@ class DB {
13041353
}
13051354
}
13061355

1307-
// addExam(examId:number): Promise<number>;
1356+
// addExam(examId:number): initemptyDbPromise<number>;
13081357

13091358
addExam(sqlite3: any, data: any) {
13101359
try {
@@ -1317,6 +1366,21 @@ class DB {
13171366
}
13181367
}
13191368

1369+
getExamTimestamp(sqlite3: any, data: any) {
1370+
// const payload = data.payload;
1371+
this.initDb(sqlite3);
1372+
try {
1373+
const timestamp = this.db.selectValue('select DT from exam where id=1');
1374+
postMessage({
1375+
msg: data.msg,
1376+
uid: data.uid,
1377+
payload: new Date(timestamp).getTime(),
1378+
});
1379+
} finally {
1380+
this.close();
1381+
}
1382+
}
1383+
13201384
// countNonAlignWithPageNumber(examId:number, pageInscan:number): Promise<number>;
13211385

13221386
countNonAlignWithPageNumber(sqlite3: any, data: any) {

src/main/webapp/app/entities/exam/service/exam.service.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ export class ExamService {
7575
});
7676
}
7777

78+
getExamTimestamp(id: number): Observable<HttpResponse<any>> {
79+
return this.http.get(this.applicationConfigService.getEndpointFor('api') + '/getCacheTimeStamp' + `/${id}`, {
80+
observe: 'response',
81+
});
82+
}
83+
7884
addExamToCollectionIfMissing(examCollection: IExam[], ...examsToCheck: (IExam | null | undefined)[]): IExam[] {
7985
const exams: IExam[] = examsToCheck.filter(isPresent);
8086
if (exams.length > 0) {

src/main/webapp/app/home/home.component.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ import { DrawerModule } from 'primeng/drawer';
2626
import { HasAnyAuthorityDirective } from '../shared/auth/has-any-authority.directive';
2727

2828
import { ButtonModule } from 'primeng/button';
29+
import { ExamService } from 'app/entities/exam/service/exam.service';
30+
import { CacheService } from '../scanexam/db/db';
31+
import { CacheServiceImpl } from 'app/scanexam/db/CacheServiceImpl';
2932

3033
interface Upload {
3134
progress: number;
@@ -117,6 +120,8 @@ export class HomeComponent implements OnInit, OnDestroy {
117120
private loginService: LoginService,
118121
private zone: NgZone,
119122
private http: HttpClient,
123+
private examService: ExamService,
124+
private db: CacheServiceImpl,
120125
) {}
121126

122127
ngOnInit(): void {
@@ -153,7 +158,19 @@ export class HomeComponent implements OnInit, OnDestroy {
153158
this.accountService
154159
.getAuthenticationState()
155160
.pipe(takeUntil(this.destroy$))
156-
.subscribe(account => (this.account = account));
161+
.subscribe(account => {
162+
this.account = account;
163+
if (account) {
164+
this.examService.query().subscribe(res => {
165+
if (res.body) {
166+
const examIds = res.body.map(exam => (exam.id ? exam.id : 0));
167+
this.db.cleanOutDatedCached(examIds).then(() => {
168+
console.log('cleanOutDatedCached done');
169+
});
170+
}
171+
});
172+
}
173+
});
157174

158175
this.translateService.get('home.creercours').subscribe(() => {
159176
this.initCmpt();

src/main/webapp/app/scanexam/alignscan/alignscan.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ export class AlignScanComponent implements OnInit, CacheUploadNotification {
329329
private async saveData(): Promise<any> {
330330
// Change if partial update
331331
if (!this.partialAlign) {
332-
await this.db.addExam(+this.examId);
332+
await this.db.addExam(+this.examId, new Date());
333333
}
334334

335335
this.translateService.get('scanexam.exportcacheencours').subscribe(res => (this.message = '' + res));

src/main/webapp/app/scanexam/coursdetail/coursdetails.component.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,10 @@ export class CoursdetailsComponent implements OnInit {
302302
message: data,
303303
accept: () => {
304304
if (this.course !== undefined) {
305+
this.blocked = true;
305306
this.courseService.delete(this.course.id!).subscribe(e => {
307+
this.blocked = false;
308+
306309
this.router.navigateByUrl('/');
307310
});
308311
}

src/main/webapp/app/scanexam/creerexamnbgrader/creerexamnbgrader.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ export class CreerexamComponentNbGrader implements OnInit, AfterViewInit, CacheU
374374
templateId: template1.body?.id,
375375
};
376376
const exam1 = await firstValueFrom(this.examService.create(exam));
377-
await this.cacheServiceImpl.addExam(exam1.body!.id!);
377+
await this.cacheServiceImpl.addExam(exam1.body!.id!, new Date());
378378
// template.content = this.editForm.get(['content'])!.value;
379379
// const t = await firstValueFrom( this.templateService.create(template))
380380
const htmlfilesToProcess: string[] = [];

src/main/webapp/app/scanexam/db/CacheServiceImpl.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ export class CacheServiceImpl implements CacheService {
1717
(this.service as SqliteCacheService).load();
1818
}
1919
}
20+
21+
cleanOutDatedCached(examIds: number[]): Promise<void> {
22+
return this.service.cleanOutDatedCached(examIds);
23+
}
24+
2025
getNonAlignImagesForPageNumbers(examId: number, pages: number[]): Promise<ImageDB[]> {
2126
return this.service.getNonAlignImagesForPageNumbers(examId, pages);
2227
}
@@ -104,9 +109,14 @@ export class CacheServiceImpl implements CacheService {
104109
getAlignSortByPageNumber(examId: number): Promise<ImageDB[]> {
105110
return this.service.getAlignSortByPageNumber(examId);
106111
}
107-
addExam(examId: number): Promise<number> {
108-
return this.service.addExam(examId);
112+
addExam(examId: number, d: Date): Promise<number> {
113+
return this.service.addExam(examId, d);
109114
}
115+
116+
getExamTimestamp(examId: number): Promise<number> {
117+
return this.service.getExamTimestamp(examId);
118+
}
119+
110120
addTemplate(elt: AlignImage): Promise<number> {
111121
return this.service.addTemplate(elt);
112122
}

src/main/webapp/app/scanexam/db/db.ts

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ExportOptions, ImportOptions } from 'dexie-export-import';
55

66
export interface Exam {
77
id?: number;
8+
creationDate?: number;
89
}
910

1011
export interface Template {
@@ -34,15 +35,30 @@ export interface NonAlignImage {
3435
value: string;
3536
}
3637

38+
export async function cleanOutDatedCached(examIds: number[]) {
39+
const databasesNamedToKeep = examIds.map(id => 'correctExam' + id);
40+
const databases = await Dexie.getDatabaseNames();
41+
const databasesToRemove = databases.filter(dbname => dbname.startsWith('correctExam') && !databasesNamedToKeep.includes(dbname));
42+
for (let i = 0; i < databasesToRemove.length; i++) {
43+
try {
44+
await Dexie.delete(databasesToRemove[i]);
45+
// eslint-disable-next-line no-console
46+
console.log('remove old database', databasesToRemove[i]);
47+
} catch (e) {
48+
console.error('unable to remove old database', databasesToRemove[i], e);
49+
}
50+
}
51+
}
52+
3753
export class ExamIndexDB extends Dexie {
3854
private exams!: Table<Exam, number>;
3955
private templates!: Table<Template, number>;
4056
private alignImages!: Table<AlignImage, number>;
4157
private nonAlignImages!: Table<NonAlignImage, number>;
4258

4359
constructor(private examId: number) {
44-
// super('ngdexieliveQuery');
4560
super('correctExam' + examId);
61+
// console.error('create database correctExam' + examId);
4662
this.version(3).stores({
4763
exams: '++id',
4864
templates: '++id, examId, [examId+pageNumber]',
@@ -364,12 +380,22 @@ export class ExamIndexDB extends Dexie {
364380
async getAlignSortByPageNumber() {
365381
return await this.alignImages.where({ examId: this.examId }).sortBy('pageNumber');
366382
}
367-
async addExam() {
383+
async addExam(d: Date) {
368384
return await this.exams.add({
369385
id: this.examId,
386+
creationDate: d ? d.getTime() : new Date().getTime(),
370387
});
371388
}
372389

390+
async getExamTimestamp(): Promise<number> {
391+
const e = await this.exams
392+
.where({
393+
id: this.examId,
394+
})
395+
.first();
396+
return e?.creationDate ?? 0;
397+
}
398+
373399
async addTemplate(elt: AlignImage) {
374400
return await this.templates.add({
375401
examId: this.examId,
@@ -393,6 +419,10 @@ export class AppDB implements CacheService {
393419
/* async populate() {
394420
} */
395421

422+
cleanOutDatedCached(examIds: number[]): Promise<void> {
423+
return cleanOutDatedCached(examIds);
424+
}
425+
396426
async resetDatabase(examId: number): Promise<void> {
397427
let db1 = this.dbs.get(examId);
398428
if (db1 === undefined) {
@@ -640,13 +670,22 @@ export class AppDB implements CacheService {
640670
}
641671
return db1.getAlignSortByPageNumber();
642672
}
643-
async addExam(examId: number): Promise<number> {
673+
async addExam(examId: number, d: Date): Promise<number> {
674+
let db1 = this.dbs.get(examId);
675+
if (db1 === undefined) {
676+
db1 = new ExamIndexDB(examId);
677+
this.dbs.set(examId, db1);
678+
}
679+
return db1.addExam(d);
680+
}
681+
682+
async getExamTimestamp(examId: number): Promise<number> {
644683
let db1 = this.dbs.get(examId);
645684
if (db1 === undefined) {
646685
db1 = new ExamIndexDB(examId);
647686
this.dbs.set(examId, db1);
648687
}
649-
return db1.addExam();
688+
return db1.getExamTimestamp();
650689
}
651690

652691
async addTemplate(elt: AlignImage): Promise<number> {
@@ -730,6 +769,7 @@ export class AppDB implements CacheService {
730769
}
731770

732771
export interface CacheService {
772+
cleanOutDatedCached(examIds: number[]): Promise<void>;
733773
resetDatabase(examId: number): Promise<void>;
734774
removeExam(examId: number): Promise<void>;
735775
removeElementForExam(examId: number): Promise<void>;
@@ -759,7 +799,7 @@ export interface CacheService {
759799

760800
getNonAlignSortByPageNumber(examId: number): Promise<ImageDB[]>;
761801
getAlignSortByPageNumber(examId: number): Promise<ImageDB[]>;
762-
addExam(examId: number): Promise<number>;
802+
addExam(examId: number, d: Date): Promise<number>;
763803
addTemplate(elt: AlignImage): Promise<number>;
764804
countNonAlignWithPageNumber(examId: number, pageInscan: number): Promise<number>;
765805
countAlignWithPageNumber(examId: number, pageInscan: number): Promise<number>;
@@ -770,6 +810,7 @@ export interface CacheService {
770810
removePageNonAlignForExamForPagesAndReorder(examId: number, pages: number[]): Promise<void>;
771811
moveTemplatePages(examId: number, pageNumber: number, lastPage: number): Promise<void>;
772812
removePageTemplateForExamForPage(examId: number, lastPage: number): Promise<void>;
813+
getExamTimestamp(examId: number): Promise<number>;
773814
}
774815

775816
export const db = new AppDB();

src/main/webapp/app/scanexam/db/dbsqlite.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,13 @@ export class SqliteCacheService implements CacheService {
201201
workersqllite.postMessage({ msg: 'load', uid: '0' });
202202
}
203203

204+
async cleanOutDatedCached(examIds: number[]) {
205+
const el1 = {
206+
examIds: examIds,
207+
};
208+
return this._dispatch<void>('cleanOutDatedCached', el1).toPromise();
209+
}
210+
204211
async addAligneImage(elt: ImageDB) {
205212
const enc = new TextEncoder(); // always utf-8
206213
const el1 = {
@@ -334,11 +341,19 @@ export class SqliteCacheService implements CacheService {
334341
examId: examId,
335342
}).toPromise();
336343
}
337-
addExam(examId: number): Promise<any> {
344+
addExam(examId: number, d: Date): Promise<any> {
338345
return this._dispatch('addExam', {
339346
examId: examId,
347+
d: d,
340348
}).toPromise();
341349
}
350+
351+
getExamTimestamp(examId: number): Promise<any> {
352+
return this._dispatch('getExamTimestamp', {
353+
examId: examId,
354+
}).toPromise();
355+
}
356+
342357
addTemplate(elt: AlignImage): Promise<any> {
343358
const enc = new TextEncoder(); // always utf-8
344359

src/main/webapp/app/scanexam/exam-detail/cacheUpload.service.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,6 @@ export class CacheUploadService {
316316
let data: Blob = (await firstValueFrom(this.getCache(examId + 'indexdb.json'))) as Blob;
317317
if (data.size === 0) {
318318
data = await firstValueFrom(this.getCache(examId + '_exam_template_indexdb.json'));
319-
320319
if (data.size === 0) {
321320
if (showFailMessage) {
322321
messageService.add({

0 commit comments

Comments
 (0)