feat(server): calculate sha1 checksum (#525)
* feat(server): override multer storage * feat(server): calc sha1 of uploaded file * feat(server): add checksum into asset * chore(server): add package-lock for mkdirp package * fix(server): free hash stream * chore(server): rollback this changes, not refactor here * refactor(server): re-arrange import statement * fix(server): make sure hash done before callback * refactor(server): replace varchar to char for checksum, reserve pixelChecksum for future * refactor(server): remove pixelChecksum * refactor(server): convert checksum from string to bytea * feat(server): add index to checksum * refactor(): rollback package.json changes * feat(server): remove uploaded file when progress fail * feat(server): calculate hash in sequence
This commit is contained in:
@@ -9,6 +9,7 @@ import {
|
||||
StreamableFile,
|
||||
} from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { createHash } from 'node:crypto';
|
||||
import { Repository } from 'typeorm';
|
||||
import { AuthUserDto } from '../../decorators/auth-user.decorator';
|
||||
import { AssetEntity, AssetType } from '@app/database/entities/asset.entity';
|
||||
@@ -53,7 +54,8 @@ export class AssetService {
|
||||
originalPath: string,
|
||||
mimeType: string,
|
||||
): Promise<AssetEntity> {
|
||||
const assetEntity = await this._assetRepository.create(createAssetDto, authUser.id, originalPath, mimeType);
|
||||
const checksum = await this.calculateChecksum(originalPath);
|
||||
const assetEntity = await this._assetRepository.create(createAssetDto, authUser.id, originalPath, mimeType, checksum);
|
||||
|
||||
return assetEntity;
|
||||
}
|
||||
@@ -444,4 +446,16 @@ export class AssetService {
|
||||
|
||||
return mapAssetCountByTimeGroupResponse(result);
|
||||
}
|
||||
|
||||
private calculateChecksum(filePath: string): Promise<Buffer> {
|
||||
const fileReadStream = createReadStream(filePath);
|
||||
const sha1Hash = createHash('sha1');
|
||||
const deferred = new Promise<Buffer>((resolve, reject) => {
|
||||
sha1Hash.once('error', (err) => reject(err));
|
||||
sha1Hash.once('finish', () => resolve(sha1Hash.read()));
|
||||
});
|
||||
|
||||
fileReadStream.pipe(sha1Hash);
|
||||
return deferred;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user