1
1
import { UUID , EJSON } from 'bson' ;
2
2
import { UserData , type z } from '@mongodb-js/compass-user-data' ;
3
- import { RecentQuerySchema , FavoriteQuerySchema } from './query-storage-schema' ;
3
+ import {
4
+ RecentQuerySchema ,
5
+ FavoriteQuerySchema ,
6
+ type RecentQuery ,
7
+ type FavoriteQuery ,
8
+ } from './query-storage-schema' ;
4
9
import type { FavoriteQueryStorage , RecentQueryStorage } from './query-storage' ;
5
10
6
11
export type QueryStorageOptions = {
7
12
basepath ?: string ;
8
13
} ;
9
14
10
- export abstract class CompassQueryStorage < T extends typeof RecentQuerySchema > {
11
- protected readonly userData : UserData < T > ;
15
+ export interface QueryStorageBackend < TData > {
16
+ loadAll ( namespace ?: string ) : Promise < TData [ ] > ;
17
+ updateAttributes ( id : string , data : Partial < TData > ) : Promise < TData > ;
18
+ delete ( id : string ) : Promise < boolean > ;
19
+ saveQuery ( data : Omit < TData , '_id' | '_lastExecuted' > ) : Promise < void > ;
20
+ }
21
+
22
+ export abstract class CompassQueryStorage <
23
+ TSchema extends z . Schema ,
24
+ TData extends z . output < TSchema > = z . output < TSchema >
25
+ > implements QueryStorageBackend < TData >
26
+ {
27
+ protected readonly userData : UserData < TSchema > ;
12
28
constructor (
13
- schemaValidator : T ,
29
+ schemaValidator : TSchema ,
14
30
protected readonly folder : string ,
15
31
protected readonly options : QueryStorageOptions
16
32
) {
@@ -22,7 +38,7 @@ export abstract class CompassQueryStorage<T extends typeof RecentQuerySchema> {
22
38
} ) ;
23
39
}
24
40
25
- async loadAll ( namespace ?: string ) : Promise < z . output < T > [ ] > {
41
+ async loadAll ( namespace ?: string ) : Promise < TData [ ] > {
26
42
try {
27
43
const { data } = await this . userData . readAll ( ) ;
28
44
const sortedData = data
@@ -36,10 +52,7 @@ export abstract class CompassQueryStorage<T extends typeof RecentQuerySchema> {
36
52
}
37
53
}
38
54
39
- async updateAttributes (
40
- id : string ,
41
- data : Partial < z . input < T > >
42
- ) : Promise < z . output < T > > {
55
+ async updateAttributes ( id : string , data : Partial < TData > ) : Promise < TData > {
43
56
await this . userData . write ( id , {
44
57
...( ( await this . userData . readOne ( id ) ) ?? { } ) ,
45
58
...data ,
@@ -50,10 +63,12 @@ export abstract class CompassQueryStorage<T extends typeof RecentQuerySchema> {
50
63
async delete ( id : string ) {
51
64
return await this . userData . delete ( id ) ;
52
65
}
66
+
67
+ abstract saveQuery ( data : any ) : Promise < void > ;
53
68
}
54
69
55
70
export class CompassRecentQueryStorage
56
- extends CompassQueryStorage < typeof RecentQuerySchema >
71
+ extends CompassQueryStorage < typeof RecentQuerySchema , RecentQuery >
57
72
implements RecentQueryStorage
58
73
{
59
74
private readonly maxAllowedQueries = 30 ;
@@ -83,7 +98,7 @@ export class CompassRecentQueryStorage
83
98
}
84
99
85
100
export class CompassFavoriteQueryStorage
86
- extends CompassQueryStorage < typeof FavoriteQuerySchema >
101
+ extends CompassQueryStorage < typeof FavoriteQuerySchema , FavoriteQuery >
87
102
implements FavoriteQueryStorage
88
103
{
89
104
constructor ( options : QueryStorageOptions = { } ) {
0 commit comments