77 renameLocalList ,
88 renameRemoteList ,
99 SelectedDbItem ,
10+ SelectedDbItemKind ,
1011} from "./db-config" ;
1112import * as chokidar from "chokidar" ;
1213import { DisposableObject , DisposeHandler } from "../../pure/disposable-object" ;
@@ -22,7 +23,13 @@ import {
2223 LocalDatabaseDbItem ,
2324 LocalListDbItem ,
2425 RemoteUserDefinedListDbItem ,
26+ DbItem ,
27+ DbItemKind ,
2528} from "../db-item" ;
29+ import {
30+ compareSelectedKindIsEqual ,
31+ mapDbItemToSelectedDbItem ,
32+ } from "../db-item-selection" ;
2633
2734export class DbConfigStore extends DisposableObject {
2835 public readonly onDidChangeConfig : AppEvent < void > ;
@@ -88,6 +95,96 @@ export class DbConfigStore extends DisposableObject {
8895 await this . writeConfig ( config ) ;
8996 }
9097
98+ public async removeDbItem ( dbItem : DbItem ) : Promise < void > {
99+ if ( ! this . config ) {
100+ throw Error ( "Cannot remove item if config is not loaded" ) ;
101+ }
102+
103+ const config = cloneDbConfig ( this . config ) ;
104+ const selectedItem : SelectedDbItem | undefined = config . selected ;
105+
106+ // Remove item from databases
107+ switch ( dbItem . kind ) {
108+ case DbItemKind . LocalList :
109+ config . databases . local . lists = config . databases . local . lists . filter (
110+ ( list ) => list . name !== dbItem . listName ,
111+ ) ;
112+ break ;
113+ case DbItemKind . RemoteUserDefinedList :
114+ config . databases . remote . repositoryLists =
115+ config . databases . remote . repositoryLists . filter (
116+ ( list ) => list . name !== dbItem . listName ,
117+ ) ;
118+ break ;
119+ case DbItemKind . LocalDatabase :
120+ // 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+ ) ;
137+ break ;
138+ 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+ ) ;
155+ break ;
156+ case DbItemKind . RemoteOwner :
157+ config . databases . remote . owners = config . databases . remote . owners . filter (
158+ ( owner ) => owner !== dbItem . ownerName ,
159+ ) ;
160+ break ;
161+ default :
162+ throw Error ( `Type '${ dbItem . kind } ' cannot be removed` ) ;
163+ }
164+
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+ }
185+ await this . writeConfig ( config ) ;
186+ }
187+
91188 public async addRemoteRepo (
92189 repoNwo : string ,
93190 parentList ?: string ,
0 commit comments