Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 20 additions & 71 deletions extensions/ql-vscode/src/databases/config/db-config-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@ import { join } from "path";
import {
cloneDbConfig,
DbConfig,
removeLocalDb,
removeLocalList,
removeRemoteList,
removeRemoteOwner,
removeRemoteRepo,
renameLocalDb,
renameLocalList,
renameRemoteList,
SelectedDbItem,
SelectedDbItemKind,
} from "./db-config";
import * as chokidar from "chokidar";
import { DisposableObject, DisposeHandler } from "../../pure/disposable-object";
Expand All @@ -26,10 +30,6 @@ import {
DbItem,
DbItemKind,
} from "../db-item";
import {
compareSelectedKindIsEqual,
mapDbItemToSelectedDbItem,
} from "../db-item-selection";

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

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

const config = cloneDbConfig(this.config);
const selectedItem: SelectedDbItem | undefined = config.selected;
let config: DbConfig;

// Remove item from databases
switch (dbItem.kind) {
case DbItemKind.LocalList:
config.databases.local.lists = config.databases.local.lists.filter(
(list) => list.name !== dbItem.listName,
);
config = removeLocalList(this.config, dbItem.listName);
break;
case DbItemKind.RemoteUserDefinedList:
config.databases.remote.repositoryLists =
config.databases.remote.repositoryLists.filter(
(list) => list.name !== dbItem.listName,
);
config = removeRemoteList(this.config, dbItem.listName);
break;
case DbItemKind.LocalDatabase:
// When we start using local databases these need to be removed from disk as well.
if (dbItem.parentListName) {
const parent = config.databases.local.lists.find(
(list) => list.name === dbItem.parentListName,
);
if (!parent) {
throw Error(`Cannot find parent list '${dbItem.parentListName}'`);
} else {
parent.databases = parent.databases.filter(
(db) => db.name !== dbItem.databaseName,
);
}
}
config.databases.local.databases =
config.databases.local.databases.filter(
(db) => db.name !== dbItem.databaseName,
);
config = removeLocalDb(
this.config,
dbItem.databaseName,
dbItem.parentListName,
);
break;
case DbItemKind.RemoteRepo:
if (dbItem.parentListName) {
const parent = config.databases.remote.repositoryLists.find(
(list) => list.name === dbItem.parentListName,
);
if (!parent) {
throw Error(`Cannot find parent list '${dbItem.parentListName}'`);
} else {
parent.repositories = parent.repositories.filter(
(repo) => repo !== dbItem.repoFullName,
);
}
}
config.databases.remote.repositories =
config.databases.remote.repositories.filter(
(repo) => repo !== dbItem.repoFullName,
);
config = removeRemoteRepo(
this.config,
dbItem.repoFullName,
dbItem.parentListName,
);
break;
case DbItemKind.RemoteOwner:
config.databases.remote.owners = config.databases.remote.owners.filter(
(owner) => owner !== dbItem.ownerName,
);
config = removeRemoteOwner(this.config, dbItem.ownerName);
break;
default:
throw Error(`Type '${dbItem.kind}' cannot be removed`);
}

// Remove item from selected
const removedItem = mapDbItemToSelectedDbItem(dbItem);
if (selectedItem && removedItem) {
// if removedItem has a parentList, check if parentList is selectedItem
if (
removedItem.kind === SelectedDbItemKind.LocalUserDefinedList ||
removedItem.kind === SelectedDbItemKind.RemoteUserDefinedList
) {
if (
(selectedItem.kind === SelectedDbItemKind.LocalDatabase ||
selectedItem.kind === SelectedDbItemKind.RemoteRepository) &&
removedItem.listName === selectedItem.listName
) {
config.selected = undefined;
}
}
if (compareSelectedKindIsEqual(removedItem, selectedItem)) {
config.selected = undefined;
}
}
await this.writeConfig(config);
}

Expand Down
172 changes: 154 additions & 18 deletions extensions/ql-vscode/src/databases/config/db-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,7 @@ export function renameLocalList(
): DbConfig {
const config = cloneDbConfig(originalConfig);

const list = config.databases.local.lists.find(
(l) => l.name === currentListName,
);
if (!list) {
throw Error(`Cannot find list '${currentListName}' to rename`);
}
const list = getLocalList(config, currentListName);
list.name = newListName;

if (
Expand All @@ -148,12 +143,7 @@ export function renameRemoteList(
): DbConfig {
const config = cloneDbConfig(originalConfig);

const list = config.databases.remote.repositoryLists.find(
(l) => l.name === currentListName,
);
if (!list) {
throw Error(`Cannot find list '${currentListName}' to rename`);
}
const list = getRemoteList(config, currentListName);
list.name = newListName;

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

if (parentListName) {
const list = config.databases.local.lists.find(
(l) => l.name === parentListName,
);
if (!list) {
throw Error(`Cannot find parent list '${parentListName}'`);
}
const list = getLocalList(config, parentListName);
const dbIndex = list.databases.findIndex((db) => db.name === currentDbName);
if (dbIndex === -1) {
throw Error(
Expand Down Expand Up @@ -210,6 +195,132 @@ export function renameLocalDb(
return config;
}

export function removeLocalList(
originalConfig: DbConfig,
listName: string,
): DbConfig {
const config = cloneDbConfig(originalConfig);

config.databases.local.lists = config.databases.local.lists.filter(
(list) => list.name !== listName,
);

if (config.selected?.kind === SelectedDbItemKind.LocalUserDefinedList) {
config.selected = undefined;
}

if (
config.selected?.kind === SelectedDbItemKind.LocalDatabase &&
config.selected?.listName === listName
) {
config.selected = undefined;
}

return config;
}

export function removeRemoteList(
originalConfig: DbConfig,
listName: string,
): DbConfig {
const config = cloneDbConfig(originalConfig);

config.databases.remote.repositoryLists =
config.databases.remote.repositoryLists.filter(
(list) => list.name !== listName,
);

if (config.selected?.kind === SelectedDbItemKind.RemoteUserDefinedList) {
config.selected = undefined;
}

if (
config.selected?.kind === SelectedDbItemKind.RemoteRepository &&
config.selected?.listName === listName
) {
config.selected = undefined;
}

return config;
}

export function removeLocalDb(
originalConfig: DbConfig,
databaseName: string,
parentListName?: string,
): DbConfig {
const config = cloneDbConfig(originalConfig);

if (parentListName) {
const parentList = getLocalList(config, parentListName);
parentList.databases = parentList.databases.filter(
(db) => db.name !== databaseName,
);
} else {
config.databases.local.databases = config.databases.local.databases.filter(
(db) => db.name !== databaseName,
);
}

if (
config.selected?.kind === SelectedDbItemKind.LocalDatabase &&
config.selected?.databaseName === databaseName &&
config.selected?.listName === parentListName
) {
config.selected = undefined;
}

return config;
}

export function removeRemoteRepo(
originalConfig: DbConfig,
repoFullName: string,
parentListName?: string,
): DbConfig {
const config = cloneDbConfig(originalConfig);

if (parentListName) {
const parentList = getRemoteList(config, parentListName);
parentList.repositories = parentList.repositories.filter(
(r) => r !== repoFullName,
);
} else {
config.databases.remote.repositories =
config.databases.remote.repositories.filter((r) => r !== repoFullName);
}

if (
config.selected?.kind === SelectedDbItemKind.RemoteRepository &&
config.selected?.repositoryName === repoFullName &&
config.selected?.listName === parentListName
) {
config.selected = undefined;
}

return config;
}

export function removeRemoteOwner(
originalConfig: DbConfig,
ownerName: string,
): DbConfig {
const config = cloneDbConfig(originalConfig);

config.databases.remote.owners = config.databases.remote.owners.filter(
(o) => o !== ownerName,
);

if (
config.selected?.kind === SelectedDbItemKind.RemoteOwner &&
config.selected?.ownerName === ownerName
) {
config.selected = undefined;
}

return config;
}

function cloneDbConfigSelectedItem(selected: SelectedDbItem): SelectedDbItem {
switch (selected.kind) {
case SelectedDbItemKind.LocalUserDefinedList:
Expand Down Expand Up @@ -246,3 +357,28 @@ function cloneDbConfigSelectedItem(selected: SelectedDbItem): SelectedDbItem {
};
}
}

function getLocalList(config: DbConfig, listName: string): LocalList {
const list = config.databases.local.lists.find((l) => l.name === listName);

if (!list) {
throw Error(`Cannot find local list '${listName}'`);
}

return list;
}

function getRemoteList(
config: DbConfig,
listName: string,
): RemoteRepositoryList {
const list = config.databases.remote.repositoryLists.find(
(l) => l.name === listName,
);

if (!list) {
throw Error(`Cannot find remote list '${listName}'`);
}

return list;
}
45 changes: 1 addition & 44 deletions extensions/ql-vscode/src/databases/db-item-selection.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
import { DbItem, DbItemKind, LocalDbItem, RemoteDbItem } from "./db-item";
import {
SelectedDbItem,
SelectedDbItemKind,
SelectedLocalDatabase,
SelectedLocalUserDefinedList,
SelectedRemoteOwner,
SelectedRemoteRepository,
} from "./config/db-config";
import { SelectedDbItem, SelectedDbItemKind } from "./config/db-config";

export function getSelectedDbItem(dbItems: DbItem[]): DbItem | undefined {
for (const dbItem of dbItems) {
Expand Down Expand Up @@ -99,39 +92,3 @@ export function mapDbItemToSelectedDbItem(
};
}
}

export function compareSelectedKindIsEqual(
item1: SelectedDbItem,
item2: SelectedDbItem,
): boolean {
if (item1.kind === item2.kind) {
switch (item1.kind) {
case SelectedDbItemKind.LocalUserDefinedList:
case SelectedDbItemKind.RemoteUserDefinedList:
case SelectedDbItemKind.RemoteSystemDefinedList:
return (
item1.listName === (item2 as SelectedLocalUserDefinedList).listName
);
case SelectedDbItemKind.RemoteOwner:
return item1.ownerName === (item2 as SelectedRemoteOwner).ownerName;
case SelectedDbItemKind.LocalDatabase: {
const selectedItem = item2 as SelectedLocalDatabase;
return (
item1.databaseName === selectedItem.databaseName &&
item1.listName === selectedItem.listName
);
}
case SelectedDbItemKind.RemoteRepository: {
const selectedItem = item2 as SelectedRemoteRepository;
return (
item1.repositoryName === selectedItem.repositoryName &&
item1.listName === selectedItem.listName
);
}
default:
return false;
}
} else {
return false;
}
}
Loading