• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

bpatrik / pigallery2 / 21266958860

22 Jan 2026 10:20PM UTC coverage: 68.57% (+0.3%) from 68.274%
21266958860

Pull #1119

github

web-flow
Merge 0c804745f into d688f007b
Pull Request #1119: Adding file upload option

1500 of 2456 branches covered (61.07%)

Branch coverage included in aggregate %.

82 of 86 new or added lines in 11 files covered. (95.35%)

1 existing line in 1 file now uncovered.

5442 of 7668 relevant lines covered (70.97%)

4221.91 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.14
/src/backend/model/ObjectManagers.ts
1
/* eslint-disable @typescript-eslint/no-var-requires */
2
import {SQLConnection} from './database/SQLConnection';
1✔
3
import {Logger} from '../Logger';
1✔
4
import {LocationManager} from './database/LocationManager';
1✔
5
import {JobManager} from './jobs/JobManager';
1✔
6
import {DirectoryPathDTO, ParentDirectoryDTO} from '../../common/entities/DirectoryDTO';
7
import {GalleryManager} from './database/GalleryManager';
1✔
8
import {UserManager} from './database/UserManager';
1✔
9
import {IndexingManager} from './database/IndexingManager';
1✔
10
import {SearchManager} from './database/SearchManager';
1✔
11
import {VersionManager} from './database/VersionManager';
1✔
12
import {CoverManager} from './database/CoverManager';
1✔
13
import {AlbumManager} from './database/AlbumManager';
1✔
14
import {PersonManager} from './database/PersonManager';
1✔
15
import {SharingManager} from './database/SharingManager';
1✔
16
import {IObjectManager} from './database/IObjectManager';
17
import {ExtensionManager} from './extension/ExtensionManager';
1✔
18
import {ProjectedCacheManager} from './database/ProjectedCacheManager';
1✔
19
import {SessionManager} from './database/SessionManager';
1✔
20
import { UploadManager } from './UploadManager';
1✔
21

22
const LOG_TAG = '[ObjectManagers]';
1✔
23

24
export class ObjectManagers {
1✔
25

26
  private static instance: ObjectManagers = null;
1✔
27

28
  private readonly managers: IObjectManager[];
29
  private galleryManager: GalleryManager;
30
  private userManager: UserManager;
31
  private searchManager: SearchManager;
32
  private sharingManager: SharingManager;
33
  private indexingManager: IndexingManager;
34
  private personManager: PersonManager;
35
  private coverManager: CoverManager;
36
  private versionManager: VersionManager;
37
  private jobManager: JobManager;
38
  private locationManager: LocationManager;
39
  private albumManager: AlbumManager;
40
  private extensionManager: ExtensionManager;
41
  private projectedCacheManager: ProjectedCacheManager;
42
  private uploadManager: UploadManager;
43
  private sessionManager: SessionManager;
44
  private initDone = false;
259✔
45

46
  constructor() {
47
    this.managers = [];
259✔
48
  }
49

50
  public static getInstance(): ObjectManagers {
51
    if (!this.instance) {
11,441✔
52
      this.instance = new ObjectManagers();
259✔
53
    }
54
    return this.instance;
11,441✔
55
  }
56

57
  public static async reset(): Promise<void> {
58
    Logger.silly(LOG_TAG, 'Object manager reset begin');
367✔
59
    if (ObjectManagers.isReady()) {
367✔
60
      if (
259✔
61
        ObjectManagers.getInstance().IndexingManager &&
518✔
62
        ObjectManagers.getInstance().IndexingManager.IsSavingInProgress
63
      ) {
64
        await ObjectManagers.getInstance().IndexingManager.SavingReady;
6✔
65
      }
66
      for (const manager of ObjectManagers.getInstance().managers) {
259✔
67
        if (manager === ObjectManagers.getInstance().versionManager) {
3,885✔
68
          continue;
259✔
69
        }
70
        if (manager.cleanUp) {
3,626✔
71
          await manager.cleanUp();
518✔
72
        }
73
      }
74
    }
75

76
    await SQLConnection.close();
367✔
77
    this.instance = null;
367✔
78
    Logger.debug(LOG_TAG, 'Object manager reset done');
367✔
79
  }
80

81
  public static isReady(): boolean {
82
    return this.instance && this.instance.initDone;
367✔
83
  }
84

85

86
  public async init(): Promise<void> {
87
    if (this.initDone) {
382✔
88
      return;
123✔
89
    }
90
    await SQLConnection.init();
259✔
91
    await this.initManagers();
259✔
92
    Logger.debug(LOG_TAG, 'SQL DB inited');
259✔
93
    this.initDone = true;
259✔
94
  }
95

96
  private async initManagers(): Promise<void> {
97
    this.AlbumManager = new AlbumManager();
259✔
98
    this.GalleryManager = new GalleryManager();
259✔
99
    this.IndexingManager = new IndexingManager();
259✔
100
    this.PersonManager = new PersonManager();
259✔
101
    this.CoverManager = new CoverManager();
259✔
102
    this.SearchManager = new SearchManager();
259✔
103
    this.SharingManager = new SharingManager();
259✔
104
    this.UserManager = new UserManager();
259✔
105
    this.VersionManager = new VersionManager();
259✔
106
    this.JobManager = new JobManager();
259✔
107
    this.LocationManager = new LocationManager();
259✔
108
    this.ExtensionManager = new ExtensionManager();
259✔
109
    this.ProjectedCacheManager = new ProjectedCacheManager();
259✔
110
    this.SessionManager = new SessionManager();
259✔
111
    this.UploadManager = new UploadManager();
259✔
112

113
    for (const manager of ObjectManagers.getInstance().managers) {
259✔
114
      if (manager === ObjectManagers.getInstance().versionManager) {
3,885✔
115
        continue;
259✔
116
      }
117
      if (manager.init) {
3,626✔
118
        await manager.init();
777✔
119
      }
120
    }
121
  }
122

123
  public async onDataChange(
124
    changedDir: DirectoryPathDTO = null
×
125
  ): Promise<void> {
126
    await this.VersionManager.onNewDataVersion();
114✔
127

128
    for (const manager of this.managers) {
114✔
129
      if (manager === this.versionManager) {
1,710✔
130
        continue;
114✔
131
      }
132
      if (manager.onNewDataVersion) {
1,596✔
133
        await manager.onNewDataVersion(changedDir);
342✔
134
      }
135
    }
136
  }
137

138

139
  get VersionManager(): VersionManager {
140
    return this.versionManager;
131✔
141
  }
142

143
  set VersionManager(value: VersionManager) {
144
    if (this.versionManager) {
260✔
145
      this.managers.splice(this.managers.indexOf(this.versionManager), 1);
1✔
146
    }
147
    this.versionManager = value;
260✔
148
    this.managers.push(this.versionManager);
260✔
149
  }
150

151
  get LocationManager(): LocationManager {
152
    return this.locationManager;
4✔
153
  }
154

155
  set LocationManager(value: LocationManager) {
156
    if (this.locationManager) {
261✔
157
      this.managers.splice(this.managers.indexOf(this.locationManager), 1);
2✔
158
    }
159
    this.locationManager = value;
261✔
160
    this.managers.push(this.locationManager);
261✔
161
  }
162

163
  get AlbumManager(): AlbumManager {
164
    return this.albumManager;
36✔
165
  }
166

167
  set AlbumManager(value: AlbumManager) {
168
    if (this.albumManager) {
259!
169
      this.managers.splice(this.managers.indexOf(this.albumManager), 1);
×
170
    }
171
    this.albumManager = value;
259✔
172
    this.managers.push(this.albumManager);
259✔
173
  }
174

175
  get PersonManager(): PersonManager {
176
    return this.personManager;
334✔
177
  }
178

179
  set PersonManager(value: PersonManager) {
180
    if (this.personManager) {
259!
181
      this.managers.splice(this.managers.indexOf(this.personManager), 1);
×
182
    }
183
    this.personManager = value;
259✔
184
    this.managers.push(this.personManager);
259✔
185
  }
186

187
  get CoverManager(): CoverManager {
188
    return this.coverManager;
330✔
189
  }
190

191
  set CoverManager(value: CoverManager) {
192
    if (this.coverManager) {
259!
193
      this.managers.splice(this.managers.indexOf(this.coverManager as IObjectManager), 1);
×
194
    }
195
    this.coverManager = value;
259✔
196
    this.managers.push(this.coverManager as IObjectManager);
259✔
197
  }
198

199
  get IndexingManager(): IndexingManager {
200
    return this.indexingManager;
750✔
201
  }
202

203
  set IndexingManager(value: IndexingManager) {
204
    if (this.indexingManager) {
287✔
205
      this.managers.splice(this.managers.indexOf(this.indexingManager as IObjectManager), 1);
28✔
206
    }
207
    this.indexingManager = value;
287✔
208
    this.managers.push(this.indexingManager as IObjectManager);
287✔
209
  }
210

211
  get GalleryManager(): GalleryManager {
212
    return this.galleryManager;
52✔
213
  }
214

215
  set GalleryManager(value: GalleryManager) {
216
    if (this.galleryManager) {
271✔
217
      this.managers.splice(this.managers.indexOf(this.galleryManager as IObjectManager), 1);
12✔
218
    }
219
    this.galleryManager = value;
271✔
220
    this.managers.push(this.galleryManager as IObjectManager);
271✔
221
  }
222

223
  get UserManager(): UserManager {
224
    return this.userManager;
95✔
225
  }
226

227
  set UserManager(value: UserManager) {
228
    if (this.userManager) {
269✔
229
      this.managers.splice(this.managers.indexOf(this.userManager as IObjectManager), 1);
10✔
230
    }
231
    this.userManager = value;
269✔
232
    this.managers.push(this.userManager as IObjectManager);
269✔
233
  }
234

235
  get SearchManager(): SearchManager {
236
    return this.searchManager;
263✔
237
  }
238

239
  set SearchManager(value: SearchManager) {
240
    if (this.searchManager) {
271✔
241
      this.managers.splice(this.managers.indexOf(this.searchManager as IObjectManager), 1);
12✔
242
    }
243
    this.searchManager = value;
271✔
244
    this.managers.push(this.searchManager as IObjectManager);
271✔
245
  }
246

247
  get SharingManager(): SharingManager {
248
    return this.sharingManager;
21✔
249
  }
250

251
  set SharingManager(value: SharingManager) {
252
    if (this.sharingManager) {
259!
253
      this.managers.splice(this.managers.indexOf(this.sharingManager as IObjectManager), 1);
×
254
    }
255
    this.sharingManager = value;
259✔
256
    this.managers.push(this.sharingManager as IObjectManager);
259✔
257
  }
258

259
  get UploadManager(): UploadManager {
260
    return this.uploadManager;
3✔
261
  }
262

263
  set UploadManager(value: UploadManager) {
264
    if (this.uploadManager) {
259!
NEW
265
      this.managers.splice(this.managers.indexOf(this.uploadManager as IObjectManager), 1);
×
266
    }
267
    this.uploadManager = value;
259✔
268
    this.managers.push(this.uploadManager as IObjectManager);
259✔
269
  }
270

271
  get JobManager(): JobManager {
272
    return this.jobManager;
12✔
273
  }
274

275
  set JobManager(value: JobManager) {
276
    if (this.jobManager) {
259!
277
      this.managers.splice(this.managers.indexOf(this.jobManager as IObjectManager), 1);
×
278
    }
279
    this.jobManager = value;
259✔
280
    this.managers.push(this.jobManager as IObjectManager);
259✔
281
  }
282

283
  get ExtensionManager(): ExtensionManager {
284
    return this.extensionManager;
62✔
285
  }
286

287
  set ExtensionManager(value: ExtensionManager) {
288
    if (this.extensionManager) {
259!
289
      this.managers.splice(this.managers.indexOf(this.extensionManager as IObjectManager), 1);
×
290
    }
291
    this.extensionManager = value;
259✔
292
    this.managers.push(this.extensionManager as IObjectManager);
259✔
293
  }
294

295
  get ProjectedCacheManager(): ProjectedCacheManager {
296
    return this.projectedCacheManager;
314✔
297
  }
298

299
  set ProjectedCacheManager(value: ProjectedCacheManager) {
300
    if (this.projectedCacheManager) {
259!
301
      this.managers.splice(this.managers.indexOf(this.projectedCacheManager as IObjectManager), 1);
×
302
    }
303
    this.projectedCacheManager = value;
259✔
304
    this.managers.push(this.projectedCacheManager as IObjectManager);
259✔
305
  }
306
  get SessionManager(): SessionManager {
307
    return this.sessionManager;
313✔
308
  }
309

310
  set SessionManager(value: SessionManager) {
311
    if (this.sessionManager) {
259!
312
      this.managers.splice(this.managers.indexOf(this.sessionManager as IObjectManager), 1);
×
313
    }
314
    this.sessionManager = value;
259✔
315
    this.managers.push(this.sessionManager as IObjectManager);
259✔
316
  }
317

318
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc