-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathreleaseFactory.ts
More file actions
92 lines (84 loc) · 2.44 KB
/
releaseFactory.ts
File metadata and controls
92 lines (84 loc) · 2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { Collection, Db } from 'mongodb';
import { ReleaseDBScheme, SourceMapFileChunk } from '@hawk.so/types';
import DataLoaders from '../dataLoaders';
interface ReleaseWithFileDetails extends ReleaseDBScheme {
fileDetails?: SourceMapFileChunk[];
}
export default class ReleasesFactory {
/**
* Releases collection
*/
private collection: Collection<ReleaseDBScheme>;
/**
* DataLoader for releases
*/
private dataLoaders: DataLoaders;
/**
* Creates an instance of the releases factory
* @param dbConnection - database connection
* @param dataLoaders - DataLoaders instance for request batching
*/
constructor(dbConnection: Db, dataLoaders: DataLoaders) {
this.collection = dbConnection.collection('releases');
this.dataLoaders = dataLoaders;
}
/**
* Get releases by project identifier with file sizes
* @param projectId - project identifier
*/
public async findManyByProjectId(projectId: string): Promise<ReleaseDBScheme[]> {
try {
const releases = await this.collection.aggregate<ReleaseWithFileDetails>([
{
$match: {
projectId: projectId,
},
},
{
$lookup: {
from: 'releases.files',
let: { fileIds: '$files._id' },
pipeline: [
{
$match: {
$expr: {
$in: ['$_id', '$$fileIds'],
},
},
},
{
$project: {
_id: 1,
length: 1,
chunkSize: 1,
},
},
],
as: 'fileDetails',
},
},
]).toArray();
return releases.map(release => this.enrichReleaseWithFileSizes(release));
} catch (error) {
console.error(`[ReleasesFactory] Error in findManyByProjectId:`, error);
throw error;
}
}
/**
* Enriches release with file sizes from file details
* @param release - release with file details
* @returns enriched release
*/
private enrichReleaseWithFileSizes(release: ReleaseWithFileDetails): ReleaseDBScheme {
const fileDetailsMap = new Map(
release.fileDetails?.map(detail => [detail._id.toString(), detail.length]) || []
);
return {
...release,
files: release.files?.map(file => ({
...file,
size: fileDetailsMap.get(file._id?.toString() || '') || 0,
})),
};
}
}