Skip to content

Commit e8cb343

Browse files
committed
fix: some issues with artefact size management
1 parent 34bcca8 commit e8cb343

8 files changed

Lines changed: 60 additions & 6 deletions

File tree

api/src/artefacts/router.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ router.post('/:name/versions', async (req, res, next) => {
279279
category,
280280
...(manifest.processingConfigSchema ? { processingConfigSchema: manifest.processingConfigSchema } : {}),
281281
...(manifest.applicationConfigSchema ? { applicationConfigSchema: manifest.applicationConfigSchema } : {}),
282+
size,
282283
updatedAt: now,
283284
dataUpdatedAt: now
284285
},

api/src/remote-registries/sync.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ const syncNpmArtefact = async (ax: AxiosInstance, remoteUrl: string, artefactId:
6868
...(remoteArtefact.description ? { description: remoteArtefact.description } : {}),
6969
...(remoteArtefact.processingConfigSchema ? { processingConfigSchema: remoteArtefact.processingConfigSchema } : {}),
7070
...(remoteArtefact.applicationConfigSchema ? { applicationConfigSchema: remoteArtefact.applicationConfigSchema } : {}),
71+
...(typeof remoteArtefact.size === 'number' ? { size: remoteArtefact.size } : {}),
7172
origin: remoteUrl,
7273
updatedAt: now,
7374
dataUpdatedAt: remoteArtefact.dataUpdatedAt || remoteArtefact.updatedAt

api/src/upgrades/backfill-size.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,21 @@ export const backfillSize = async () => {
3131
internalError('backfill-size', `artefact ${artefact._id}: ${(err as Error).message || err}`)
3232
}
3333
}
34+
35+
const npmArtefacts = mongo.artefacts.find({ format: 'npm', size: { $exists: false } })
36+
for await (const artefact of npmArtefacts) {
37+
try {
38+
const latest = await mongo.versions.find({ artefactId: artefact._id })
39+
.sort({ semverMajor: -1, semverMinor: -1, semverPatch: -1 })
40+
.limit(1)
41+
.next()
42+
if (typeof latest?.size === 'number') {
43+
await mongo.artefacts.updateOne({ _id: artefact._id }, { $set: { size: latest.size } })
44+
}
45+
} catch (err) {
46+
internalError('backfill-size', `npm artefact ${artefact._id}: ${(err as Error).message || err}`)
47+
}
48+
}
3449
} finally {
3550
await locks.release('backfill-size')
3651
}

tests/artefacts.api.spec.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ test.describe('Artefacts', () => {
3434
expect(res.data.artefact.name).toBe('@test/processing-hello')
3535
expect(res.data.artefact.category).toBe('processing')
3636
expect(res.data.version.version).toBe('1.0.0')
37+
// npm artefact mirrors the latest version's tarball size for prominent display
38+
expect(typeof res.data.artefact.size).toBe('number')
39+
expect(res.data.artefact.size).toBeGreaterThan(0)
3740

3841
// Audit trail: version detail carries uploadedBy
3942
const admin = await superAdmin
@@ -43,6 +46,7 @@ test.describe('Artefacts', () => {
4346
expect(detail.data.uploadedBy.apiKeyName).toBe('test-upload')
4447
expect(typeof detail.data.size).toBe('number')
4548
expect(detail.data.size).toBeGreaterThan(0)
49+
expect(detail.data.size).toBe(res.data.artefact.size)
4650
})
4751

4852
test('upload without API key returns 401', async () => {
@@ -697,15 +701,19 @@ test.describe('File artefacts', () => {
697701

698702
// Simulate pre-existing rows: drop size, then run upgrade
699703
await resetSize()
700-
const beforeNpm = await admin.get('/api/v1/artefacts/%40test%2Fsized-pkg%401/versions/1.0.0')
701-
expect(beforeNpm.data.size).toBeUndefined()
704+
const beforeNpmVer = await admin.get('/api/v1/artefacts/%40test%2Fsized-pkg%401/versions/1.0.0')
705+
expect(beforeNpmVer.data.size).toBeUndefined()
706+
const beforeNpmArtefact = await admin.get('/api/v1/artefacts/%40test%2Fsized-pkg%401')
707+
expect(beforeNpmArtefact.data.size).toBeUndefined()
702708
const beforeFile = await admin.get('/api/v1/artefacts/sized-file')
703709
expect(beforeFile.data.size).toBeUndefined()
704710

705711
await runBackfillSize()
706712

707-
const afterNpm = await admin.get('/api/v1/artefacts/%40test%2Fsized-pkg%401/versions/1.0.0')
708-
expect(afterNpm.data.size).toBe(tarballSize)
713+
const afterNpmVer = await admin.get('/api/v1/artefacts/%40test%2Fsized-pkg%401/versions/1.0.0')
714+
expect(afterNpmVer.data.size).toBe(tarballSize)
715+
const afterNpmArtefact = await admin.get('/api/v1/artefacts/%40test%2Fsized-pkg%401')
716+
expect(afterNpmArtefact.data.size).toBe(tarballSize)
709717
const afterFile = await admin.get('/api/v1/artefacts/sized-file')
710718
expect(afterFile.data.size).toBe(Buffer.byteLength('hello-world-bytes'))
711719
})

ui/src/pages/admin/artefacts/[id].vue

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,14 @@
7878
</v-chip>
7979
</v-col>
8080
<v-col
81-
v-if="artefact.format === 'file'"
8281
cols="12"
8382
sm="6"
8483
md="4"
8584
>
8685
<div class="text-medium-emphasis text-body-2">
8786
{{ t('size') }}
8887
</div>
89-
<div>{{ artefact.size != null ? formatBytes(artefact.size, locale) : '-' }}</div>
88+
<div>{{ typeof artefact.size === 'number' ? formatBytes(artefact.size, locale) : '-' }}</div>
9089
</v-col>
9190
<v-col
9291
cols="12"

ui/src/pages/admin/artefacts/index.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
<th>{{ t('name') }}</th>
6666
<th>{{ t('category') }}</th>
6767
<th>{{ t('version') }}</th>
68+
<th>{{ t('size') }}</th>
6869
<th>{{ t('visibility') }}</th>
6970
<th>{{ t('dataUpdatedAt') }}</th>
7071
</tr>
@@ -98,6 +99,7 @@
9899
</v-chip>
99100
</td>
100101
<td>{{ artefact.version }}</td>
102+
<td>{{ typeof artefact.size === 'number' ? formatBytes(artefact.size, locale) : '-' }}</td>
101103
<td>
102104
<v-icon
103105
:icon="artefact.public ? mdiEye : mdiEyeOff"
@@ -133,6 +135,7 @@ fr:
133135
recent: Récents
134136
name: Nom
135137
version: Version
138+
size: Taille
136139
visibility: Visibilité
137140
dataUpdatedAt: Données mises à jour
138141
total: artefact(s)
@@ -145,6 +148,7 @@ en:
145148
recent: Recent
146149
name: Name
147150
version: Version
151+
size: Size
148152
visibility: Visibility
149153
dataUpdatedAt: Data updated
150154
total: artefact(s)

ui/src/pages/artefacts/[id].vue

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,26 @@
126126
{{ categoryLabel(artefact.category, locale) }}
127127
</v-chip>
128128
</v-col>
129+
<v-col
130+
cols="12"
131+
sm="6"
132+
md="4"
133+
>
134+
<div class="text-medium-emphasis text-body-2">
135+
{{ t('size') }}
136+
</div>
137+
<div>{{ typeof artefact.size === 'number' ? formatBytes(artefact.size, locale) : '-' }}</div>
138+
</v-col>
139+
<v-col
140+
cols="12"
141+
sm="6"
142+
md="4"
143+
>
144+
<div class="text-medium-emphasis text-body-2">
145+
{{ t('dataUpdatedAt') }}
146+
</div>
147+
<div>{{ artefact.dataUpdatedAt ? dayjs(artefact.dataUpdatedAt).format('L LT') : '-' }}</div>
148+
</v-col>
129149
<v-col
130150
v-if="description"
131151
cols="12"
@@ -212,6 +232,7 @@ fr:
212232
version: Version
213233
architecture: Architecture
214234
size: Taille
235+
dataUpdatedAt: "Donn\xE9es mises \xE0 jour le"
215236
uploadedAt: "T\xE9l\xE9vers\xE9 le"
216237
downloadLatest: "T\xE9l\xE9charger la derni\xE8re version"
217238
download: "T\xE9l\xE9charger"
@@ -229,6 +250,7 @@ en:
229250
version: Version
230251
architecture: Architecture
231252
size: Size
253+
dataUpdatedAt: Data updated
232254
uploadedAt: Uploaded
233255
downloadLatest: Download Latest
234256
download: Download

ui/src/pages/artefacts/index.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
<th>{{ t('name') }}</th>
7777
<th>{{ t('category') }}</th>
7878
<th>{{ t('version') }}</th>
79+
<th>{{ t('size') }}</th>
7980
<th>{{ t('dataUpdatedAt') }}</th>
8081
</tr>
8182
</thead>
@@ -100,6 +101,7 @@
100101
</v-chip>
101102
</td>
102103
<td>{{ artefact.version || '-' }}</td>
104+
<td>{{ typeof artefact.size === 'number' ? formatBytes(artefact.size, locale) : '-' }}</td>
103105
<td>{{ artefact.dataUpdatedAt ? dayjs(artefact.dataUpdatedAt).format('L LT') : '-' }}</td>
104106
</tr>
105107
</tbody>
@@ -243,6 +245,7 @@ fr:
243245
recent: "R\xE9cents"
244246
name: Nom
245247
version: Version
248+
size: Taille
246249
dataUpdatedAt: "Donn\xE9es mises \xE0 jour"
247250
total: artefact(s)
248251
createKey: "Cr\xE9er une cl\xE9 de lecture"
@@ -262,6 +265,7 @@ en:
262265
recent: Recent
263266
name: Name
264267
version: Version
268+
size: Size
265269
dataUpdatedAt: Data updated
266270
total: artefact(s)
267271
createKey: Create read key

0 commit comments

Comments
 (0)