Skip to content

Commit 1b53f53

Browse files
authored
refactor(storage): create an abstract QueryStorageBackend interface COMPASS-9480 (#7051)
* create an abstract QueryStorageBackend interface * more specific data type * type import * comment
1 parent de8dd33 commit 1b53f53

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed

packages/my-queries-storage/src/compass-query-storage.ts

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,32 @@
11
import { UUID, EJSON } from 'bson';
22
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';
49
import type { FavoriteQueryStorage, RecentQueryStorage } from './query-storage';
510

611
export type QueryStorageOptions = {
712
basepath?: string;
813
};
914

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>;
1228
constructor(
13-
schemaValidator: T,
29+
schemaValidator: TSchema,
1430
protected readonly folder: string,
1531
protected readonly options: QueryStorageOptions
1632
) {
@@ -22,7 +38,7 @@ export abstract class CompassQueryStorage<T extends typeof RecentQuerySchema> {
2238
});
2339
}
2440

25-
async loadAll(namespace?: string): Promise<z.output<T>[]> {
41+
async loadAll(namespace?: string): Promise<TData[]> {
2642
try {
2743
const { data } = await this.userData.readAll();
2844
const sortedData = data
@@ -36,10 +52,7 @@ export abstract class CompassQueryStorage<T extends typeof RecentQuerySchema> {
3652
}
3753
}
3854

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> {
4356
await this.userData.write(id, {
4457
...((await this.userData.readOne(id)) ?? {}),
4558
...data,
@@ -50,10 +63,12 @@ export abstract class CompassQueryStorage<T extends typeof RecentQuerySchema> {
5063
async delete(id: string) {
5164
return await this.userData.delete(id);
5265
}
66+
67+
abstract saveQuery(data: any): Promise<void>;
5368
}
5469

5570
export class CompassRecentQueryStorage
56-
extends CompassQueryStorage<typeof RecentQuerySchema>
71+
extends CompassQueryStorage<typeof RecentQuerySchema, RecentQuery>
5772
implements RecentQueryStorage
5873
{
5974
private readonly maxAllowedQueries = 30;
@@ -83,7 +98,7 @@ export class CompassRecentQueryStorage
8398
}
8499

85100
export class CompassFavoriteQueryStorage
86-
extends CompassQueryStorage<typeof FavoriteQuerySchema>
101+
extends CompassQueryStorage<typeof FavoriteQuerySchema, FavoriteQuery>
87102
implements FavoriteQueryStorage
88103
{
89104
constructor(options: QueryStorageOptions = {}) {

0 commit comments

Comments
 (0)