Skip to content

Commit 0b6f2c2

Browse files
authored
Refactor logic to remove db or list from config (#1946)
1 parent 9cf5088 commit 0b6f2c2

4 files changed

Lines changed: 586 additions & 133 deletions

File tree

extensions/ql-vscode/src/databases/config/db-config-store.ts

Lines changed: 20 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@ import { join } from "path";
33
import {
44
cloneDbConfig,
55
DbConfig,
6+
removeLocalDb,
7+
removeLocalList,
8+
removeRemoteList,
9+
removeRemoteOwner,
10+
removeRemoteRepo,
611
renameLocalDb,
712
renameLocalList,
813
renameRemoteList,
914
SelectedDbItem,
10-
SelectedDbItemKind,
1115
} from "./db-config";
1216
import * as chokidar from "chokidar";
1317
import { DisposableObject, DisposeHandler } from "../../pure/disposable-object";
@@ -26,10 +30,6 @@ import {
2630
DbItem,
2731
DbItemKind,
2832
} from "../db-item";
29-
import {
30-
compareSelectedKindIsEqual,
31-
mapDbItemToSelectedDbItem,
32-
} from "../db-item-selection";
3333

3434
export class DbConfigStore extends DisposableObject {
3535
public readonly onDidChangeConfig: AppEvent<void>;
@@ -87,7 +87,7 @@ export class DbConfigStore extends DisposableObject {
8787
throw Error("Cannot select database item if config is not loaded");
8888
}
8989

90-
const config: DbConfig = {
90+
const config = {
9191
...this.config,
9292
selected: dbItem,
9393
};
@@ -100,88 +100,37 @@ export class DbConfigStore extends DisposableObject {
100100
throw Error("Cannot remove item if config is not loaded");
101101
}
102102

103-
const config = cloneDbConfig(this.config);
104-
const selectedItem: SelectedDbItem | undefined = config.selected;
103+
let config: DbConfig;
105104

106-
// Remove item from databases
107105
switch (dbItem.kind) {
108106
case DbItemKind.LocalList:
109-
config.databases.local.lists = config.databases.local.lists.filter(
110-
(list) => list.name !== dbItem.listName,
111-
);
107+
config = removeLocalList(this.config, dbItem.listName);
112108
break;
113109
case DbItemKind.RemoteUserDefinedList:
114-
config.databases.remote.repositoryLists =
115-
config.databases.remote.repositoryLists.filter(
116-
(list) => list.name !== dbItem.listName,
117-
);
110+
config = removeRemoteList(this.config, dbItem.listName);
118111
break;
119112
case DbItemKind.LocalDatabase:
120113
// When we start using local databases these need to be removed from disk as well.
121-
if (dbItem.parentListName) {
122-
const parent = config.databases.local.lists.find(
123-
(list) => list.name === dbItem.parentListName,
124-
);
125-
if (!parent) {
126-
throw Error(`Cannot find parent list '${dbItem.parentListName}'`);
127-
} else {
128-
parent.databases = parent.databases.filter(
129-
(db) => db.name !== dbItem.databaseName,
130-
);
131-
}
132-
}
133-
config.databases.local.databases =
134-
config.databases.local.databases.filter(
135-
(db) => db.name !== dbItem.databaseName,
136-
);
114+
config = removeLocalDb(
115+
this.config,
116+
dbItem.databaseName,
117+
dbItem.parentListName,
118+
);
137119
break;
138120
case DbItemKind.RemoteRepo:
139-
if (dbItem.parentListName) {
140-
const parent = config.databases.remote.repositoryLists.find(
141-
(list) => list.name === dbItem.parentListName,
142-
);
143-
if (!parent) {
144-
throw Error(`Cannot find parent list '${dbItem.parentListName}'`);
145-
} else {
146-
parent.repositories = parent.repositories.filter(
147-
(repo) => repo !== dbItem.repoFullName,
148-
);
149-
}
150-
}
151-
config.databases.remote.repositories =
152-
config.databases.remote.repositories.filter(
153-
(repo) => repo !== dbItem.repoFullName,
154-
);
121+
config = removeRemoteRepo(
122+
this.config,
123+
dbItem.repoFullName,
124+
dbItem.parentListName,
125+
);
155126
break;
156127
case DbItemKind.RemoteOwner:
157-
config.databases.remote.owners = config.databases.remote.owners.filter(
158-
(owner) => owner !== dbItem.ownerName,
159-
);
128+
config = removeRemoteOwner(this.config, dbItem.ownerName);
160129
break;
161130
default:
162131
throw Error(`Type '${dbItem.kind}' cannot be removed`);
163132
}
164133

165-
// Remove item from selected
166-
const removedItem = mapDbItemToSelectedDbItem(dbItem);
167-
if (selectedItem && removedItem) {
168-
// if removedItem has a parentList, check if parentList is selectedItem
169-
if (
170-
removedItem.kind === SelectedDbItemKind.LocalUserDefinedList ||
171-
removedItem.kind === SelectedDbItemKind.RemoteUserDefinedList
172-
) {
173-
if (
174-
(selectedItem.kind === SelectedDbItemKind.LocalDatabase ||
175-
selectedItem.kind === SelectedDbItemKind.RemoteRepository) &&
176-
removedItem.listName === selectedItem.listName
177-
) {
178-
config.selected = undefined;
179-
}
180-
}
181-
if (compareSelectedKindIsEqual(removedItem, selectedItem)) {
182-
config.selected = undefined;
183-
}
184-
}
185134
await this.writeConfig(config);
186135
}
187136

extensions/ql-vscode/src/databases/config/db-config.ts

Lines changed: 154 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,7 @@ export function renameLocalList(
121121
): DbConfig {
122122
const config = cloneDbConfig(originalConfig);
123123

124-
const list = config.databases.local.lists.find(
125-
(l) => l.name === currentListName,
126-
);
127-
if (!list) {
128-
throw Error(`Cannot find list '${currentListName}' to rename`);
129-
}
124+
const list = getLocalList(config, currentListName);
130125
list.name = newListName;
131126

132127
if (
@@ -148,12 +143,7 @@ export function renameRemoteList(
148143
): DbConfig {
149144
const config = cloneDbConfig(originalConfig);
150145

151-
const list = config.databases.remote.repositoryLists.find(
152-
(l) => l.name === currentListName,
153-
);
154-
if (!list) {
155-
throw Error(`Cannot find list '${currentListName}' to rename`);
156-
}
146+
const list = getRemoteList(config, currentListName);
157147
list.name = newListName;
158148

159149
if (
@@ -177,12 +167,7 @@ export function renameLocalDb(
177167
const config = cloneDbConfig(originalConfig);
178168

179169
if (parentListName) {
180-
const list = config.databases.local.lists.find(
181-
(l) => l.name === parentListName,
182-
);
183-
if (!list) {
184-
throw Error(`Cannot find parent list '${parentListName}'`);
185-
}
170+
const list = getLocalList(config, parentListName);
186171
const dbIndex = list.databases.findIndex((db) => db.name === currentDbName);
187172
if (dbIndex === -1) {
188173
throw Error(
@@ -210,6 +195,132 @@ export function renameLocalDb(
210195
return config;
211196
}
212197

198+
export function removeLocalList(
199+
originalConfig: DbConfig,
200+
listName: string,
201+
): DbConfig {
202+
const config = cloneDbConfig(originalConfig);
203+
204+
config.databases.local.lists = config.databases.local.lists.filter(
205+
(list) => list.name !== listName,
206+
);
207+
208+
if (config.selected?.kind === SelectedDbItemKind.LocalUserDefinedList) {
209+
config.selected = undefined;
210+
}
211+
212+
if (
213+
config.selected?.kind === SelectedDbItemKind.LocalDatabase &&
214+
config.selected?.listName === listName
215+
) {
216+
config.selected = undefined;
217+
}
218+
219+
return config;
220+
}
221+
222+
export function removeRemoteList(
223+
originalConfig: DbConfig,
224+
listName: string,
225+
): DbConfig {
226+
const config = cloneDbConfig(originalConfig);
227+
228+
config.databases.remote.repositoryLists =
229+
config.databases.remote.repositoryLists.filter(
230+
(list) => list.name !== listName,
231+
);
232+
233+
if (config.selected?.kind === SelectedDbItemKind.RemoteUserDefinedList) {
234+
config.selected = undefined;
235+
}
236+
237+
if (
238+
config.selected?.kind === SelectedDbItemKind.RemoteRepository &&
239+
config.selected?.listName === listName
240+
) {
241+
config.selected = undefined;
242+
}
243+
244+
return config;
245+
}
246+
247+
export function removeLocalDb(
248+
originalConfig: DbConfig,
249+
databaseName: string,
250+
parentListName?: string,
251+
): DbConfig {
252+
const config = cloneDbConfig(originalConfig);
253+
254+
if (parentListName) {
255+
const parentList = getLocalList(config, parentListName);
256+
parentList.databases = parentList.databases.filter(
257+
(db) => db.name !== databaseName,
258+
);
259+
} else {
260+
config.databases.local.databases = config.databases.local.databases.filter(
261+
(db) => db.name !== databaseName,
262+
);
263+
}
264+
265+
if (
266+
config.selected?.kind === SelectedDbItemKind.LocalDatabase &&
267+
config.selected?.databaseName === databaseName &&
268+
config.selected?.listName === parentListName
269+
) {
270+
config.selected = undefined;
271+
}
272+
273+
return config;
274+
}
275+
276+
export function removeRemoteRepo(
277+
originalConfig: DbConfig,
278+
repoFullName: string,
279+
parentListName?: string,
280+
): DbConfig {
281+
const config = cloneDbConfig(originalConfig);
282+
283+
if (parentListName) {
284+
const parentList = getRemoteList(config, parentListName);
285+
parentList.repositories = parentList.repositories.filter(
286+
(r) => r !== repoFullName,
287+
);
288+
} else {
289+
config.databases.remote.repositories =
290+
config.databases.remote.repositories.filter((r) => r !== repoFullName);
291+
}
292+
293+
if (
294+
config.selected?.kind === SelectedDbItemKind.RemoteRepository &&
295+
config.selected?.repositoryName === repoFullName &&
296+
config.selected?.listName === parentListName
297+
) {
298+
config.selected = undefined;
299+
}
300+
301+
return config;
302+
}
303+
304+
export function removeRemoteOwner(
305+
originalConfig: DbConfig,
306+
ownerName: string,
307+
): DbConfig {
308+
const config = cloneDbConfig(originalConfig);
309+
310+
config.databases.remote.owners = config.databases.remote.owners.filter(
311+
(o) => o !== ownerName,
312+
);
313+
314+
if (
315+
config.selected?.kind === SelectedDbItemKind.RemoteOwner &&
316+
config.selected?.ownerName === ownerName
317+
) {
318+
config.selected = undefined;
319+
}
320+
321+
return config;
322+
}
323+
213324
function cloneDbConfigSelectedItem(selected: SelectedDbItem): SelectedDbItem {
214325
switch (selected.kind) {
215326
case SelectedDbItemKind.LocalUserDefinedList:
@@ -246,3 +357,28 @@ function cloneDbConfigSelectedItem(selected: SelectedDbItem): SelectedDbItem {
246357
};
247358
}
248359
}
360+
361+
function getLocalList(config: DbConfig, listName: string): LocalList {
362+
const list = config.databases.local.lists.find((l) => l.name === listName);
363+
364+
if (!list) {
365+
throw Error(`Cannot find local list '${listName}'`);
366+
}
367+
368+
return list;
369+
}
370+
371+
function getRemoteList(
372+
config: DbConfig,
373+
listName: string,
374+
): RemoteRepositoryList {
375+
const list = config.databases.remote.repositoryLists.find(
376+
(l) => l.name === listName,
377+
);
378+
379+
if (!list) {
380+
throw Error(`Cannot find remote list '${listName}'`);
381+
}
382+
383+
return list;
384+
}

extensions/ql-vscode/src/databases/db-item-selection.ts

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
import { DbItem, DbItemKind, LocalDbItem, RemoteDbItem } from "./db-item";
2-
import {
3-
SelectedDbItem,
4-
SelectedDbItemKind,
5-
SelectedLocalDatabase,
6-
SelectedLocalUserDefinedList,
7-
SelectedRemoteOwner,
8-
SelectedRemoteRepository,
9-
} from "./config/db-config";
2+
import { SelectedDbItem, SelectedDbItemKind } from "./config/db-config";
103

114
export function getSelectedDbItem(dbItems: DbItem[]): DbItem | undefined {
125
for (const dbItem of dbItems) {
@@ -99,39 +92,3 @@ export function mapDbItemToSelectedDbItem(
9992
};
10093
}
10194
}
102-
103-
export function compareSelectedKindIsEqual(
104-
item1: SelectedDbItem,
105-
item2: SelectedDbItem,
106-
): boolean {
107-
if (item1.kind === item2.kind) {
108-
switch (item1.kind) {
109-
case SelectedDbItemKind.LocalUserDefinedList:
110-
case SelectedDbItemKind.RemoteUserDefinedList:
111-
case SelectedDbItemKind.RemoteSystemDefinedList:
112-
return (
113-
item1.listName === (item2 as SelectedLocalUserDefinedList).listName
114-
);
115-
case SelectedDbItemKind.RemoteOwner:
116-
return item1.ownerName === (item2 as SelectedRemoteOwner).ownerName;
117-
case SelectedDbItemKind.LocalDatabase: {
118-
const selectedItem = item2 as SelectedLocalDatabase;
119-
return (
120-
item1.databaseName === selectedItem.databaseName &&
121-
item1.listName === selectedItem.listName
122-
);
123-
}
124-
case SelectedDbItemKind.RemoteRepository: {
125-
const selectedItem = item2 as SelectedRemoteRepository;
126-
return (
127-
item1.repositoryName === selectedItem.repositoryName &&
128-
item1.listName === selectedItem.listName
129-
);
130-
}
131-
default:
132-
return false;
133-
}
134-
} else {
135-
return false;
136-
}
137-
}

0 commit comments

Comments
 (0)