Skip to content

Commit ed4c781

Browse files
authored
feat: AssetUploadReadyV1 event (#19858)
1 parent 39c95f1 commit ed4c781

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

server/src/repositories/event.repository.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { AssetResponseDto } from 'src/dtos/asset-response.dto';
1616
import { AuthDto } from 'src/dtos/auth.dto';
1717
import { NotificationDto } from 'src/dtos/notification.dto';
1818
import { ReleaseNotification, ServerVersionResponseDto } from 'src/dtos/server.dto';
19+
import { SyncAssetExifV1, SyncAssetV1 } from 'src/dtos/sync.dto';
1920
import { ImmichWorker, MetadataKey, QueueName } from 'src/enum';
2021
import { ConfigRepository } from 'src/repositories/config.repository';
2122
import { LoggingRepository } from 'src/repositories/logging.repository';
@@ -109,6 +110,8 @@ export interface ClientEventMap {
109110
on_new_release: [ReleaseNotification];
110111
on_notification: [NotificationDto];
111112
on_session_delete: [string];
113+
114+
AssetUploadReadyV1: [{ asset: SyncAssetV1; exif: SyncAssetExifV1 }];
112115
}
113116

114117
export type EventItem<T extends EmitEvent> = {

server/src/services/job.service.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
import { ArgOf, ArgsOf } from 'src/repositories/event.repository';
2020
import { BaseService } from 'src/services/base.service';
2121
import { ConcurrentQueueName, JobItem } from 'src/types';
22+
import { hexOrBufferToBase64 } from 'src/utils/bytes';
2223

2324
const asJobItem = (dto: JobCreateDto): JobItem => {
2425
switch (dto.name) {
@@ -304,6 +305,54 @@ export class JobService extends BaseService {
304305
await this.jobRepository.queueAll(jobs);
305306
if (asset.visibility === AssetVisibility.TIMELINE || asset.visibility === AssetVisibility.ARCHIVE) {
306307
this.eventRepository.clientSend('on_upload_success', asset.ownerId, mapAsset(asset));
308+
if (asset.exifInfo) {
309+
const exif = asset.exifInfo;
310+
this.eventRepository.clientSend('AssetUploadReadyV1', asset.ownerId, {
311+
// TODO remove `on_upload_success` and then modify the query to select only the required fields)
312+
asset: {
313+
id: asset.id,
314+
ownerId: asset.ownerId,
315+
originalFileName: asset.originalFileName,
316+
thumbhash: asset.thumbhash ? hexOrBufferToBase64(asset.thumbhash) : null,
317+
checksum: hexOrBufferToBase64(asset.checksum),
318+
fileCreatedAt: asset.fileCreatedAt,
319+
fileModifiedAt: asset.fileModifiedAt,
320+
localDateTime: asset.localDateTime,
321+
duration: asset.duration,
322+
type: asset.type,
323+
deletedAt: asset.deletedAt,
324+
isFavorite: asset.isFavorite,
325+
visibility: asset.visibility,
326+
},
327+
exif: {
328+
assetId: exif.assetId,
329+
description: exif.description,
330+
exifImageWidth: exif.exifImageWidth,
331+
exifImageHeight: exif.exifImageHeight,
332+
fileSizeInByte: exif.fileSizeInByte,
333+
orientation: exif.orientation,
334+
dateTimeOriginal: exif.dateTimeOriginal,
335+
modifyDate: exif.modifyDate,
336+
timeZone: exif.timeZone,
337+
latitude: exif.latitude,
338+
longitude: exif.longitude,
339+
projectionType: exif.projectionType,
340+
city: exif.city,
341+
state: exif.state,
342+
country: exif.country,
343+
make: exif.make,
344+
model: exif.model,
345+
lensModel: exif.lensModel,
346+
fNumber: exif.fNumber,
347+
focalLength: exif.focalLength,
348+
iso: exif.iso,
349+
exposureTime: exif.exposureTime,
350+
profileDescription: exif.profileDescription,
351+
rating: exif.rating,
352+
fps: exif.fps,
353+
},
354+
});
355+
}
307356
}
308357

309358
break;

0 commit comments

Comments
 (0)