chore(server): save original file name with extension (#7679)

* chore(server): save original file name with extension

* extract extension

* update e2e test

* update e2e test

* download archive

* fix download archive appending name

* pr feedback

* remove unused code

* test

* unit test

* remove unused code

* migration

* noops

* pr feedback

* Update server/src/domain/download/download.service.ts

Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>

---------

Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
This commit is contained in:
Alex 2024-03-06 20:34:55 -06:00 committed by GitHub
parent f88343019d
commit 3da2b05428
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 72 additions and 17 deletions

View file

@ -1,6 +1,6 @@
import { AssetEntity } from '@app/infra/entities';
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
import { extname } from 'node:path';
import { parse } from 'node:path';
import { AccessCore, Permission } from '../access';
import { AssetIdsDto } from '../asset';
import { AuthDto } from '../auth';
@ -91,12 +91,13 @@ export class DownloadService {
}
const { originalPath, originalFileName } = asset;
const extension = extname(originalPath);
let filename = `${originalFileName}${extension}`;
let filename = originalFileName;
const count = paths[filename] || 0;
paths[filename] = count + 1;
if (count !== 0) {
filename = `${originalFileName}+${count}${extension}`;
const parsedFilename = parse(originalFileName);
filename = `${parsedFilename.name}+${count}${parsedFilename.ext}`;
}
zip.addFile(originalPath, filename);

View file

@ -26,7 +26,6 @@ import {
InternalServerErrorException,
NotFoundException,
} from '@nestjs/common';
import { parse } from 'node:path';
import { QueryFailedError } from 'typeorm';
import { IAssetRepositoryV1 } from './asset-repository';
import { AssetBulkUploadCheckDto } from './dto/asset-check.dto';
@ -356,7 +355,7 @@ export class AssetService {
duration: dto.duration || null,
isVisible: dto.isVisible ?? true,
livePhotoVideo: livePhotoAssetId === null ? null : ({ id: livePhotoAssetId } as AssetEntity),
originalFileName: parse(file.originalName).name,
originalFileName: file.originalName,
sidecarPath: sidecarPath || null,
isReadOnly: dto.isReadOnly ?? false,
isOffline: dto.isOffline ?? false,

View file

@ -0,0 +1,20 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
export class AddExtensionToOriginalFileName1709763765506 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
WITH extension AS (WITH cte AS (SELECT a.id, STRING_TO_ARRAY(a."originalPath", '.')::TEXT[] AS arr
FROM assets a)
SELECT cte.id, cte.arr[ARRAY_UPPER(cte.arr, 1)] AS "ext"
FROM cte)
UPDATE assets
SET "originalFileName" = assets."originalFileName" || '.' || extension."ext"
FROM extension
INNER JOIN assets a ON a.id = extension.id;
`);
}
public async down(): Promise<void> {
// noop
}
}