From cf32daebdc631ac9a0186f3012096096db0d760d Mon Sep 17 00:00:00 2001 From: Alper Alkan Date: Tue, 12 Sep 2023 22:00:14 +0200 Subject: [PATCH 1/9] test bugfix --- CHANGELOG.md | 12 ++++++++++-- src/modules/providers/rawg/mapper.service.ts | 7 +++++-- src/modules/providers/rawg/rawg.controller.ts | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c122126..98eba56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,17 @@ - TODO: Removed Deprecated Utility APIs +## 5.0.1 + +Recommended Gamevault App Version: `v1.5.0` + +### Changes + +- Fixed Error when mapping RAWG Games that have no background_image. + ## 5.0.0 -💫 Recommended Gamevault App Version: `v1.5.0` +Recommended Gamevault App Version: `v1.5.0` ### Breaking Changes & Migration @@ -25,7 +33,7 @@ ### Changes -### Runtime +#### Runtime - Updated to Node 20.6 diff --git a/src/modules/providers/rawg/mapper.service.ts b/src/modules/providers/rawg/mapper.service.ts index c0d0f0e..97452c5 100644 --- a/src/modules/providers/rawg/mapper.service.ts +++ b/src/modules/providers/rawg/mapper.service.ts @@ -193,8 +193,11 @@ export class RawgMapperService { ): Promise { try { if ( - !entity.background_image?.id || - !(await this.imagesService.isImageAvailable(entity.background_image.id)) + game.background_image && + (!entity.background_image?.id || + !(await this.imagesService.isImageAvailable( + entity.background_image.id, + ))) ) { entity.background_image = await this.imagesService.downloadImageByUrl( game.background_image, diff --git a/src/modules/providers/rawg/rawg.controller.ts b/src/modules/providers/rawg/rawg.controller.ts index c341174..3d849d9 100644 --- a/src/modules/providers/rawg/rawg.controller.ts +++ b/src/modules/providers/rawg/rawg.controller.ts @@ -46,7 +46,7 @@ export class RawgController { }) @MinimumRole(Role.EDITOR) async searchRawg(@Query("query") query: string): Promise { - const rawggames = await this.rawgService.getRawgGames(query, undefined); + const rawggames = await this.rawgService.getRawgGames(query); // for each rawggames entry use mapper to map rawg-games to a new game-model and return it as an array const games: Game[] = []; for (const rawggame of rawggames) { From ac5ad663fba3976664bda7db5432c551c9b4ab5a Mon Sep 17 00:00:00 2001 From: Alper Alkan Date: Tue, 12 Sep 2023 22:09:53 +0200 Subject: [PATCH 2/9] update packages --- package.json | 14 ++-- pnpm-lock.yaml | 211 ++++++++++++++++++++++++------------------------- 2 files changed, 112 insertions(+), 113 deletions(-) diff --git a/package.json b/package.json index 2847d13..5086d3a 100644 --- a/package.json +++ b/package.json @@ -21,10 +21,10 @@ }, "dependencies": { "@nestjs/axios": "3.0.0", - "@nestjs/common": "10.2.4", - "@nestjs/core": "10.2.4", + "@nestjs/common": "10.2.5", + "@nestjs/core": "10.2.5", "@nestjs/passport": "10.0.2", - "@nestjs/platform-express": "10.2.4", + "@nestjs/platform-express": "10.2.5", "@nestjs/schedule": "3.0.3", "@nestjs/swagger": "7.1.11", "@nestjs/typeorm": "10.0.0", @@ -38,7 +38,7 @@ "cookie-parser": "1.4.6", "dotenv": "16.3.1", "express": "4.18.2", - "fastify": "4.22.2", + "fastify": "4.23.0", "file-type-checker": "^1.0.8", "helmet": "7.0.0", "mime": "3.0.0", @@ -75,9 +75,9 @@ "@types/node-7z": "2.1.5", "@types/passport-http": "0.3.9", "@types/string-similarity": "4.0.0", - "@types/throttle": "^1.0.1", - "@typescript-eslint/eslint-plugin": "6.6.0", - "@typescript-eslint/parser": "6.6.0", + "@types/throttle": "^1.0.2", + "@typescript-eslint/eslint-plugin": "6.7.0", + "@typescript-eslint/parser": "6.7.0", "eslint": "8.49.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-import": "2.28.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba5b3d0..5cced11 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,28 +7,28 @@ settings: dependencies: '@nestjs/axios': specifier: 3.0.0 - version: 3.0.0(@nestjs/common@10.2.4)(axios@1.5.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + version: 3.0.0(@nestjs/common@10.2.5)(axios@1.5.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/common': - specifier: 10.2.4 - version: 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: 10.2.5 + version: 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': - specifier: 10.2.4 - version: 10.2.4(@nestjs/common@10.2.4)(@nestjs/platform-express@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: 10.2.5 + version: 10.2.5(@nestjs/common@10.2.5)(@nestjs/platform-express@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/passport': specifier: 10.0.2 - version: 10.0.2(@nestjs/common@10.2.4)(passport@0.6.0) + version: 10.0.2(@nestjs/common@10.2.5)(passport@0.6.0) '@nestjs/platform-express': - specifier: 10.2.4 - version: 10.2.4(@nestjs/common@10.2.4)(@nestjs/core@10.2.4) + specifier: 10.2.5 + version: 10.2.5(@nestjs/common@10.2.5)(@nestjs/core@10.2.5) '@nestjs/schedule': specifier: 3.0.3 - version: 3.0.3(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13) + version: 3.0.3(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(reflect-metadata@0.1.13) '@nestjs/swagger': specifier: 7.1.11 - version: 7.1.11(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + version: 7.1.11(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) '@nestjs/typeorm': specifier: 10.0.0 - version: 10.0.0(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1)(typeorm@0.3.17) + version: 10.0.0(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1)(typeorm@0.3.17) async-g-i-s: specifier: 1.5.0 version: 1.5.0 @@ -60,8 +60,8 @@ dependencies: specifier: 4.18.2 version: 4.18.2 fastify: - specifier: 4.22.2 - version: 4.22.2 + specifier: 4.23.0 + version: 4.23.0 file-type-checker: specifier: ^1.0.8 version: 1.0.8 @@ -76,10 +76,10 @@ dependencies: version: 1.10.0 nest-winston: specifier: 1.9.4 - version: 1.9.4(@nestjs/common@10.2.4)(winston@3.10.0) + version: 1.9.4(@nestjs/common@10.2.5)(winston@3.10.0) nestjs-paginate: specifier: 8.3.0 - version: 8.3.0(@nestjs/common@10.2.4)(@nestjs/swagger@7.1.11)(express@4.18.2)(fastify@4.22.2)(typeorm@0.3.17) + version: 8.3.0(@nestjs/common@10.2.5)(@nestjs/swagger@7.1.11)(express@4.18.2)(fastify@4.23.0)(typeorm@0.3.17) node-7z: specifier: 3.0.0 version: 3.0.0 @@ -167,14 +167,14 @@ devDependencies: specifier: 4.0.0 version: 4.0.0 '@types/throttle': - specifier: ^1.0.1 - version: 1.0.1 + specifier: ^1.0.2 + version: 1.0.2 '@typescript-eslint/eslint-plugin': - specifier: 6.6.0 - version: 6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.49.0)(typescript@5.2.2) + specifier: 6.7.0 + version: 6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: 6.6.0 - version: 6.6.0(eslint@8.49.0)(typescript@5.2.2) + specifier: 6.7.0 + version: 6.7.0(eslint@8.49.0)(typescript@5.2.2) eslint: specifier: 8.49.0 version: 8.49.0 @@ -183,7 +183,7 @@ devDependencies: version: 9.0.0(eslint@8.49.0) eslint-plugin-import: specifier: 2.28.1 - version: 2.28.1(@typescript-eslint/parser@6.6.0)(eslint@8.49.0) + version: 2.28.1(@typescript-eslint/parser@6.7.0)(eslint@8.49.0) eslint-plugin-prettier: specifier: 5.0.0 version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.49.0)(prettier@3.0.3) @@ -479,7 +479,7 @@ packages: - supports-color dev: false - /@nestjs/axios@3.0.0(@nestjs/common@10.2.4)(axios@1.5.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + /@nestjs/axios@3.0.0(@nestjs/common@10.2.5)(axios@1.5.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): resolution: {integrity: sha512-ULdH03jDWkS5dy9X69XbUVbhC+0pVnrRcj7bIK/ytTZ76w7CgvTZDJqsIyisg3kNOiljRW/4NIjSf3j6YGvl+g==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -487,7 +487,7 @@ packages: reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) axios: 1.5.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 @@ -534,8 +534,8 @@ packages: - webpack-cli dev: true - /@nestjs/common@10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-3Lg4PUaSDucf14V8rPCH212NqrK09AJbY0NKqFsb4j5OIE+TuOzVZR/yjaJ8JNxH2hjskJNCZie0D/9tA2lzlA==} + /@nestjs/common@10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-2BfkPZKmTVxflm8bhmClKKcHwhlyweEfbM25g7ldXIK9+utCPVXqBfZGORj2L8QagiT6bei48FJmGc2S1tiFEQ==} peerDependencies: class-transformer: '*' class-validator: '*' @@ -556,8 +556,8 @@ packages: uid: 2.0.2 dev: false - /@nestjs/core@10.2.4(@nestjs/common@10.2.4)(@nestjs/platform-express@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-aWeii2l+3pNCc9kIRdLbXQMvrgSZD0jZgXOZv7bZwVf9mClMMi7TussLI4On12VbqVE7LE3gsNgRTwgQJlVC8g==} + /@nestjs/core@10.2.5(@nestjs/common@10.2.5)(@nestjs/platform-express@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-O9AycZc4MjzIFrvCxcQVqfSNuN9eHZrfyVcYkp9CMPj6lGd9TQCZX2MmaP1CWs4UJBmTKflPdtPJ0sj9iIuvLQ==} requiresBuild: true peerDependencies: '@nestjs/common': ^10.0.0 @@ -574,8 +574,8 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-express': 10.2.4(@nestjs/common@10.2.4)(@nestjs/core@10.2.4) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-express': 10.2.5(@nestjs/common@10.2.5)(@nestjs/core@10.2.5) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 @@ -588,7 +588,7 @@ packages: - encoding dev: false - /@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): + /@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): resolution: {integrity: sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -601,30 +601,30 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) class-transformer: 0.5.1 class-validator: 0.14.0 reflect-metadata: 0.1.13 dev: false - /@nestjs/passport@10.0.2(@nestjs/common@10.2.4)(passport@0.6.0): + /@nestjs/passport@10.0.2(@nestjs/common@10.2.5)(passport@0.6.0): resolution: {integrity: sha512-od31vfB2z3y05IDB5dWSbCGE2+pAf2k2WCBinNuTTOxN0O0+wtO1L3kawj/aCW3YR9uxsTOVbTDwtwgpNNsnjQ==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 passport: ^0.4.0 || ^0.5.0 || ^0.6.0 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) passport: 0.6.0 dev: false - /@nestjs/platform-express@10.2.4(@nestjs/common@10.2.4)(@nestjs/core@10.2.4): - resolution: {integrity: sha512-E9F6WYo6bNwvTT0saJpkr8t4BJLbZRwrX5EKbtBRQqyRcw6NAvlKdacKzoo+Sompdre0IbF8AvNRFk4uLZTWqA==} + /@nestjs/platform-express@10.2.5(@nestjs/common@10.2.5)(@nestjs/core@10.2.5): + resolution: {integrity: sha512-BChjJfsVtsvds31rp5V7LwM2XEQaxkFKUE0TGSH91m95FRO65Fii5RH6atasmhZTIW+T8LR5LuI/MO7cgZOiVg==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(@nestjs/platform-express@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.5(@nestjs/common@10.2.5)(@nestjs/platform-express@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) body-parser: 1.20.2 cors: 2.8.5 express: 4.18.2 @@ -634,15 +634,15 @@ packages: - supports-color dev: false - /@nestjs/schedule@3.0.3(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13): + /@nestjs/schedule@3.0.3(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(reflect-metadata@0.1.13): resolution: {integrity: sha512-xsMA4dmP3LcW3rt2iMPfm88bDbCj/hLuDsLrKmJQlbnxyCYtBwLtmu/4cSfZELLM7pTDT+E8QDAqGwhYyUUjxg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 reflect-metadata: ^0.1.12 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(@nestjs/platform-express@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.5(@nestjs/common@10.2.5)(@nestjs/platform-express@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) cron: 2.4.1 reflect-metadata: 0.1.13 uuid: 9.0.0 @@ -678,7 +678,7 @@ packages: - chokidar dev: true - /@nestjs/swagger@7.1.11(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): + /@nestjs/swagger@7.1.11(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): resolution: {integrity: sha512-EneFcucWC4a0n/FVd1Hg1MRugt65vL/1RDsQMqhMRfVw6IbYWuiKh51TNI4QwOPrRGiR1ry8qHJCBcTX9cl89Q==} peerDependencies: '@fastify/static': ^6.0.0 @@ -695,9 +695,9 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(@nestjs/platform-express@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.5(@nestjs/common@10.2.5)(@nestjs/platform-express@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.2.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) class-transformer: 0.5.1 class-validator: 0.14.0 js-yaml: 4.1.0 @@ -707,7 +707,7 @@ packages: swagger-ui-dist: 5.6.2 dev: false - /@nestjs/typeorm@10.0.0(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1)(typeorm@0.3.17): + /@nestjs/typeorm@10.0.0(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1)(typeorm@0.3.17): resolution: {integrity: sha512-WQU4HCDTz4UavsFzvGUKDHqi0MO5K47yFoPXdmh+Z/hCNO7SHCMmV9jLiLukM8n5nKUqJ3jDqiljkWBcZPdCtA==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -716,8 +716,8 @@ packages: rxjs: ^7.2.0 typeorm: ^0.3.0 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(@nestjs/platform-express@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.5(@nestjs/common@10.2.5)(@nestjs/platform-express@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) reflect-metadata: 0.1.13 rxjs: 7.8.1 typeorm: 0.3.17(better-sqlite3@8.6.0)(pg@8.11.3)(ts-node@10.9.1) @@ -773,7 +773,7 @@ packages: is-glob: 4.0.3 open: 9.1.0 picocolors: 1.0.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /@sqltools/formatter@1.2.5: @@ -947,8 +947,8 @@ packages: resolution: {integrity: sha512-dMS4S07fbtY1AILG/RhuwmptmzK1Ql8scmAebOTJ/8iBtK/KI17NwGwKzu1uipjj8Kk+3mfPxum56kKZE93mzQ==} dev: true - /@types/throttle@1.0.1: - resolution: {integrity: sha512-tb2KFn61P0HBt+X5uMGzqlfoSpctymCPp5pQOUDanj7GThQimvrnerQviYhIxz/+tDMEQgWXQiZlznrGIFBsbw==} + /@types/throttle@1.0.2: + resolution: {integrity: sha512-ieT8dv6eJRCcyRXrw6o25/mBkJKT+A92C5JFVqFY99ea6uRWKGta4Q9Xl1IPHEejtHjBeYZK/ffcVcnlIKk8hg==} dependencies: '@types/node': 20.6.0 dev: true @@ -961,8 +961,8 @@ packages: resolution: {integrity: sha512-t1yxFAR2n0+VO6hd/FJ9F2uezAZVWHLmpmlJzm1eX03+H7+HsuTAp7L8QJs+2pQCfWkP1+EXsGK9Z9v7o/qPVQ==} dev: false - /@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.49.0)(typescript@5.2.2): - resolution: {integrity: sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==} + /@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.2.2): + resolution: {integrity: sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -973,11 +973,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.6.0(eslint@8.49.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.6.0 - '@typescript-eslint/type-utils': 6.6.0(eslint@8.49.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.6.0(eslint@8.49.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.6.0 + '@typescript-eslint/parser': 6.7.0(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.7.0 + '@typescript-eslint/type-utils': 6.7.0(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.7.0(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.0 debug: 4.3.4 eslint: 8.49.0 graphemer: 1.4.0 @@ -990,8 +990,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.6.0(eslint@8.49.0)(typescript@5.2.2): - resolution: {integrity: sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==} + /@typescript-eslint/parser@6.7.0(eslint@8.49.0)(typescript@5.2.2): + resolution: {integrity: sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1000,10 +1000,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.6.0 - '@typescript-eslint/types': 6.6.0 - '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.6.0 + '@typescript-eslint/scope-manager': 6.7.0 + '@typescript-eslint/types': 6.7.0 + '@typescript-eslint/typescript-estree': 6.7.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.0 debug: 4.3.4 eslint: 8.49.0 typescript: 5.2.2 @@ -1011,16 +1011,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@6.6.0: - resolution: {integrity: sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==} + /@typescript-eslint/scope-manager@6.7.0: + resolution: {integrity: sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.6.0 - '@typescript-eslint/visitor-keys': 6.6.0 + '@typescript-eslint/types': 6.7.0 + '@typescript-eslint/visitor-keys': 6.7.0 dev: true - /@typescript-eslint/type-utils@6.6.0(eslint@8.49.0)(typescript@5.2.2): - resolution: {integrity: sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==} + /@typescript-eslint/type-utils@6.7.0(eslint@8.49.0)(typescript@5.2.2): + resolution: {integrity: sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1029,8 +1029,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.6.0(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.7.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.7.0(eslint@8.49.0)(typescript@5.2.2) debug: 4.3.4 eslint: 8.49.0 ts-api-utils: 1.0.1(typescript@5.2.2) @@ -1039,13 +1039,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types@6.6.0: - resolution: {integrity: sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==} + /@typescript-eslint/types@6.7.0: + resolution: {integrity: sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.6.0(typescript@5.2.2): - resolution: {integrity: sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==} + /@typescript-eslint/typescript-estree@6.7.0(typescript@5.2.2): + resolution: {integrity: sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -1053,8 +1053,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.6.0 - '@typescript-eslint/visitor-keys': 6.6.0 + '@typescript-eslint/types': 6.7.0 + '@typescript-eslint/visitor-keys': 6.7.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1065,8 +1065,8 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.6.0(eslint@8.49.0)(typescript@5.2.2): - resolution: {integrity: sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==} + /@typescript-eslint/utils@6.7.0(eslint@8.49.0)(typescript@5.2.2): + resolution: {integrity: sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1074,9 +1074,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.6.0 - '@typescript-eslint/types': 6.6.0 - '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.7.0 + '@typescript-eslint/types': 6.7.0 + '@typescript-eslint/typescript-estree': 6.7.0(typescript@5.2.2) eslint: 8.49.0 semver: 7.5.4 transitivePeerDependencies: @@ -1084,11 +1084,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@6.6.0: - resolution: {integrity: sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==} + /@typescript-eslint/visitor-keys@6.7.0: + resolution: {integrity: sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.6.0 + '@typescript-eslint/types': 6.7.0 eslint-visitor-keys: 3.4.3 dev: true @@ -2333,7 +2333,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.6.0)(eslint-import-resolver-node@0.3.7)(eslint@8.49.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.7)(eslint@8.49.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -2354,7 +2354,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.6.0(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.0(eslint@8.49.0)(typescript@5.2.2) debug: 3.2.7 eslint: 8.49.0 eslint-import-resolver-node: 0.3.7 @@ -2362,7 +2362,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.6.0)(eslint@8.49.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.0)(eslint@8.49.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -2372,7 +2372,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.6.0(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.0(eslint@8.49.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 @@ -2381,7 +2381,7 @@ packages: doctrine: 2.1.0 eslint: 8.49.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.6.0)(eslint-import-resolver-node@0.3.7)(eslint@8.49.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.7)(eslint@8.49.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -2709,8 +2709,8 @@ packages: resolution: {integrity: sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==} dev: false - /fastify@4.22.2: - resolution: {integrity: sha512-rK8mF/1mZJHH6H/L22OhmilTgrp5XMkk3RHcSy03LC+TJ6+wLhbq+4U62bjns15VzIbBNgxTqAForBqtGAa0NQ==} + /fastify@4.23.0: + resolution: {integrity: sha512-u4aQUjAqf+GQQI+IeIJtzOKCJHtdwPlGxzopq/Kv6QcEdJ7xuJFSQ5Bi7+uJ+F8990jWECLzRcAyZ4pVsloRpQ==} dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.2.0 @@ -2727,7 +2727,7 @@ packages: rfdc: 1.3.0 secure-json-parse: 2.7.0 semver: 7.5.4 - tiny-lru: 11.0.1 + toad-cache: 3.2.0 transitivePeerDependencies: - supports-color dev: false @@ -4118,18 +4118,18 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /nest-winston@1.9.4(@nestjs/common@10.2.4)(winston@3.10.0): + /nest-winston@1.9.4(@nestjs/common@10.2.5)(winston@3.10.0): resolution: {integrity: sha512-ilEmHuuYSAI6aMNR120fLBl42EdY13QI9WRggHdEizt9M7qZlmXJwpbemVWKW/tqRmULjSx/otKNQ3GMQbfoUQ==} peerDependencies: '@nestjs/common': ^5.0.0 || ^6.6.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 winston: ^3.0.0 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) fast-safe-stringify: 2.1.1 winston: 3.10.0 dev: false - /nestjs-paginate@8.3.0(@nestjs/common@10.2.4)(@nestjs/swagger@7.1.11)(express@4.18.2)(fastify@4.22.2)(typeorm@0.3.17): + /nestjs-paginate@8.3.0(@nestjs/common@10.2.5)(@nestjs/swagger@7.1.11)(express@4.18.2)(fastify@4.23.0)(typeorm@0.3.17): resolution: {integrity: sha512-ZZLzPhsngxeNUUY9AdnLFlnpDhD2paitaTFuvYIVMNURhcRG/XfgEIU4sfxXKzJWVU95zQEyMmcuTacYCybScw==} peerDependencies: '@nestjs/common': ^10.2.4 @@ -4138,10 +4138,10 @@ packages: fastify: ^4.22.2 typeorm: ^0.3.17 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/swagger': 7.1.11(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/swagger': 7.1.11(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) express: 4.18.2 - fastify: 4.22.2 + fastify: 4.23.0 lodash: 4.17.21 typeorm: 0.3.17(better-sqlite3@8.6.0)(pg@8.11.3)(ts-node@10.9.1) dev: false @@ -5460,11 +5460,6 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true - /tiny-lru@11.0.1: - resolution: {integrity: sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==} - engines: {node: '>=12'} - dev: false - /titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} @@ -5484,6 +5479,11 @@ packages: is-number: 7.0.0 dev: true + /toad-cache@3.2.0: + resolution: {integrity: sha512-Hj5zSqBS6OHbZoQk9IU8VqIr+0JUpwzunnwSlFJhG8aJSInYUMEuzItl3kJsGteTPd1qtflafdRHlRtUazYeqg==} + engines: {node: '>=12'} + dev: false + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -5573,7 +5573,6 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} From 52ff2abf210c283e95217b4a9448b818854a7ba2 Mon Sep 17 00:00:00 2001 From: Alper Alkan Date: Tue, 12 Sep 2023 22:26:01 +0200 Subject: [PATCH 3/9] content dispositon fix --- CHANGELOG.md | 1 + package.json | 2 ++ pnpm-lock.yaml | 10 ++++++++++ src/modules/files/files.service.ts | 7 ++----- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98eba56..de6e50d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Recommended Gamevault App Version: `v1.5.0` ### Changes - Fixed Error when mapping RAWG Games that have no background_image. +- Fixed Error when downloading Games that have special Characters in their name. ## 5.0.0 diff --git a/package.json b/package.json index 5086d3a..dcc215c 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "class-transformer": "0.5.1", "class-validator": "0.14.0", "compression": "1.7.4", + "content-disposition": "^0.5.4", "cookie-parser": "1.4.6", "dotenv": "16.3.1", "express": "4.18.2", @@ -66,6 +67,7 @@ "@nestjs/schematics": "10.0.2", "@types/bcrypt": "5.0.0", "@types/compression": "1.7.3", + "@types/content-disposition": "^0.5.6", "@types/cookie-parser": "1.4.4", "@types/express": "4.17.17", "@types/mime": "3.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5cced11..0b8d94f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ dependencies: compression: specifier: 1.7.4 version: 1.7.4 + content-disposition: + specifier: ^0.5.4 + version: 0.5.4 cookie-parser: specifier: 1.4.6 version: 1.4.6 @@ -139,6 +142,9 @@ devDependencies: '@types/compression': specifier: 1.7.3 version: 1.7.3 + '@types/content-disposition': + specifier: ^0.5.6 + version: 0.5.6 '@types/cookie-parser': specifier: 1.4.4 version: 1.4.4 @@ -817,6 +823,10 @@ packages: '@types/node': 20.6.0 dev: true + /@types/content-disposition@0.5.6: + resolution: {integrity: sha512-GmShTb4qA9+HMPPaV2+Up8tJafgi38geFi7vL4qAM7k8BwjoelgHZqEUKJZLvughUw22h6vD/wvwN4IUCaWpDA==} + dev: true + /@types/cookie-parser@1.4.4: resolution: {integrity: sha512-Var+aj5I6ZgIqsQ05N2V8q5OBrFfZXtIGWWDSrEYLIbMw758obagSwdGcLCjwh1Ga7M7+wj0SDIAaAC/WT7aaA==} dependencies: diff --git a/src/modules/files/files.service.ts b/src/modules/files/files.service.ts index 66a8bba..ab46cf0 100644 --- a/src/modules/files/files.service.ts +++ b/src/modules/files/files.service.ts @@ -26,7 +26,7 @@ import { RawgService } from "../providers/rawg/rawg.service"; import { BoxArtsService } from "../boxarts/boxarts.service"; import globals from "../../globals"; import Throttle from "throttle"; - +import contentDisposition from "content-disposition"; @Injectable() export class FilesService implements OnApplicationBootstrap { private readonly logger = new Logger(FilesService.name); @@ -478,10 +478,7 @@ export class FilesService implements OnApplicationBootstrap { const type = mime.getType(fileDownloadPath); const headers = { - disposition: `attachment; filename="${fileDownloadPath.replace( - /^.*[\\\/]/, - "", - )}"`, + disposition: contentDisposition(fileDownloadPath.replace(/^.*[\\/]/, "")), length: statSync(fileDownloadPath).size, type, }; From c406281a9c63f0471a14cf76ce443e227cfe6848 Mon Sep 17 00:00:00 2001 From: Alper Alkan Date: Tue, 12 Sep 2023 22:35:00 +0200 Subject: [PATCH 4/9] dispodebug --- package.json | 2 +- src/modules/files/files.service.ts | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index dcc215c..51c8389 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gamevault-backend", - "version": "5.0.0", + "version": "5.0.1", "description": "the self-hosted gaming platform for drm-free games", "author": "Alkan Alper, Schäfer Philip GbR / Phalcode", "private": true, diff --git a/src/modules/files/files.service.ts b/src/modules/files/files.service.ts index ab46cf0..b348748 100644 --- a/src/modules/files/files.service.ts +++ b/src/modules/files/files.service.ts @@ -477,8 +477,17 @@ export class FilesService implements OnApplicationBootstrap { ); const type = mime.getType(fileDownloadPath); + const dispositionHeader = contentDisposition( + fileDownloadPath.replace(/^.*[\\/]/, ""), + ); + + this.logger.debug({ + DispositionHeader: contentDisposition( + fileDownloadPath.replace(/^.*[\\/]/, ""), + ), + }); const headers = { - disposition: contentDisposition(fileDownloadPath.replace(/^.*[\\/]/, "")), + disposition: dispositionHeader, length: statSync(fileDownloadPath).size, type, }; From 8cf017a387714c439b3927bde48303e4ff183ced Mon Sep 17 00:00:00 2001 From: Alper Alkan Date: Tue, 12 Sep 2023 22:36:01 +0200 Subject: [PATCH 5/9] increment version --- src/modules/files/files.service.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/modules/files/files.service.ts b/src/modules/files/files.service.ts index b348748..ab46cf0 100644 --- a/src/modules/files/files.service.ts +++ b/src/modules/files/files.service.ts @@ -477,17 +477,8 @@ export class FilesService implements OnApplicationBootstrap { ); const type = mime.getType(fileDownloadPath); - const dispositionHeader = contentDisposition( - fileDownloadPath.replace(/^.*[\\/]/, ""), - ); - - this.logger.debug({ - DispositionHeader: contentDisposition( - fileDownloadPath.replace(/^.*[\\/]/, ""), - ), - }); const headers = { - disposition: dispositionHeader, + disposition: contentDisposition(fileDownloadPath.replace(/^.*[\\/]/, "")), length: statSync(fileDownloadPath).size, type, }; From ff1200228850fefb2115c6e578cce4be519d1aec Mon Sep 17 00:00:00 2001 From: Alper Alkan Date: Tue, 12 Sep 2023 22:52:00 +0200 Subject: [PATCH 6/9] fix content disposition header bug --- src/modules/files/files.service.ts | 4 ++-- src/modules/games/games.controller.ts | 13 ++++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/modules/files/files.service.ts b/src/modules/files/files.service.ts index ab46cf0..da6e9f2 100644 --- a/src/modules/files/files.service.ts +++ b/src/modules/files/files.service.ts @@ -26,7 +26,7 @@ import { RawgService } from "../providers/rawg/rawg.service"; import { BoxArtsService } from "../boxarts/boxarts.service"; import globals from "../../globals"; import Throttle from "throttle"; -import contentDisposition from "content-disposition"; + @Injectable() export class FilesService implements OnApplicationBootstrap { private readonly logger = new Logger(FilesService.name); @@ -478,7 +478,7 @@ export class FilesService implements OnApplicationBootstrap { const type = mime.getType(fileDownloadPath); const headers = { - disposition: contentDisposition(fileDownloadPath.replace(/^.*[\\/]/, "")), + disposition: fileDownloadPath.replace(/^.*[\\/]/, ""), length: statSync(fileDownloadPath).size, type, }; diff --git a/src/modules/games/games.controller.ts b/src/modules/games/games.controller.ts index 9b1ded4..e28bbe3 100644 --- a/src/modules/games/games.controller.ts +++ b/src/modules/games/games.controller.ts @@ -7,6 +7,7 @@ import { Param, Put, Request, + Res, StreamableFile, } from "@nestjs/common"; import { @@ -38,6 +39,8 @@ import { MinimumRole } from "../pagination/minimum-role.decorator"; import { Role } from "../users/models/role.enum"; import { UpdateGameDto } from "./models/update-game.dto"; import { GamevaultUser } from "../users/gamevault-user.entity"; +import { Response } from "express"; +import contentDisposition from "content-disposition"; @ApiBasicAuth() @ApiTags("game") @@ -178,13 +181,21 @@ export class GamesController { @MinimumRole(Role.USER) @ApiOkResponse({ type: () => StreamableFile }) async downloadGame( + @Res() response: Response, @Param() params: IdDto, @Headers("X-Download-Speed-Limit") speedlimit?: string, ): Promise { - return await this.filesService.downloadGame( + const file = await this.filesService.downloadGame( Number(params.id), Number(speedlimit), ); + + response.setHeader( + "Content-Disposition", + contentDisposition(file.getHeaders().disposition), + ); + + return file; } @Put(":id") From 58175585bd548734b0905bc7ce0cb9bfee3d515a Mon Sep 17 00:00:00 2001 From: Alper Alkan Date: Tue, 12 Sep 2023 23:04:13 +0200 Subject: [PATCH 7/9] remove stupid dep --- package.json | 2 -- pnpm-lock.yaml | 10 ---------- src/modules/files/files.service.ts | 4 +++- src/modules/games/games.controller.ts | 13 +------------ 4 files changed, 4 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 51c8389..0a9a529 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "class-transformer": "0.5.1", "class-validator": "0.14.0", "compression": "1.7.4", - "content-disposition": "^0.5.4", "cookie-parser": "1.4.6", "dotenv": "16.3.1", "express": "4.18.2", @@ -67,7 +66,6 @@ "@nestjs/schematics": "10.0.2", "@types/bcrypt": "5.0.0", "@types/compression": "1.7.3", - "@types/content-disposition": "^0.5.6", "@types/cookie-parser": "1.4.4", "@types/express": "4.17.17", "@types/mime": "3.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0b8d94f..5cced11 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,9 +50,6 @@ dependencies: compression: specifier: 1.7.4 version: 1.7.4 - content-disposition: - specifier: ^0.5.4 - version: 0.5.4 cookie-parser: specifier: 1.4.6 version: 1.4.6 @@ -142,9 +139,6 @@ devDependencies: '@types/compression': specifier: 1.7.3 version: 1.7.3 - '@types/content-disposition': - specifier: ^0.5.6 - version: 0.5.6 '@types/cookie-parser': specifier: 1.4.4 version: 1.4.4 @@ -823,10 +817,6 @@ packages: '@types/node': 20.6.0 dev: true - /@types/content-disposition@0.5.6: - resolution: {integrity: sha512-GmShTb4qA9+HMPPaV2+Up8tJafgi38geFi7vL4qAM7k8BwjoelgHZqEUKJZLvughUw22h6vD/wvwN4IUCaWpDA==} - dev: true - /@types/cookie-parser@1.4.4: resolution: {integrity: sha512-Var+aj5I6ZgIqsQ05N2V8q5OBrFfZXtIGWWDSrEYLIbMw758obagSwdGcLCjwh1Ga7M7+wj0SDIAaAC/WT7aaA==} dependencies: diff --git a/src/modules/files/files.service.ts b/src/modules/files/files.service.ts index da6e9f2..7416d12 100644 --- a/src/modules/files/files.service.ts +++ b/src/modules/files/files.service.ts @@ -478,7 +478,9 @@ export class FilesService implements OnApplicationBootstrap { const type = mime.getType(fileDownloadPath); const headers = { - disposition: fileDownloadPath.replace(/^.*[\\/]/, ""), + disposition: fileDownloadPath + .replace(/^.*[\\/]/, "") + .replace(/[^\x20-\x7F]/g, ""), length: statSync(fileDownloadPath).size, type, }; diff --git a/src/modules/games/games.controller.ts b/src/modules/games/games.controller.ts index e28bbe3..9b1ded4 100644 --- a/src/modules/games/games.controller.ts +++ b/src/modules/games/games.controller.ts @@ -7,7 +7,6 @@ import { Param, Put, Request, - Res, StreamableFile, } from "@nestjs/common"; import { @@ -39,8 +38,6 @@ import { MinimumRole } from "../pagination/minimum-role.decorator"; import { Role } from "../users/models/role.enum"; import { UpdateGameDto } from "./models/update-game.dto"; import { GamevaultUser } from "../users/gamevault-user.entity"; -import { Response } from "express"; -import contentDisposition from "content-disposition"; @ApiBasicAuth() @ApiTags("game") @@ -181,21 +178,13 @@ export class GamesController { @MinimumRole(Role.USER) @ApiOkResponse({ type: () => StreamableFile }) async downloadGame( - @Res() response: Response, @Param() params: IdDto, @Headers("X-Download-Speed-Limit") speedlimit?: string, ): Promise { - const file = await this.filesService.downloadGame( + return await this.filesService.downloadGame( Number(params.id), Number(speedlimit), ); - - response.setHeader( - "Content-Disposition", - contentDisposition(file.getHeaders().disposition), - ); - - return file; } @Put(":id") From 8e8e38ac6ae4e19de94a6c7a2e670ddd5b248b0b Mon Sep 17 00:00:00 2001 From: Alper Alkan Date: Tue, 12 Sep 2023 23:09:06 +0200 Subject: [PATCH 8/9] uriencode name --- src/modules/files/files.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/files/files.service.ts b/src/modules/files/files.service.ts index 7416d12..081c106 100644 --- a/src/modules/files/files.service.ts +++ b/src/modules/files/files.service.ts @@ -478,9 +478,9 @@ export class FilesService implements OnApplicationBootstrap { const type = mime.getType(fileDownloadPath); const headers = { - disposition: fileDownloadPath - .replace(/^.*[\\/]/, "") - .replace(/[^\x20-\x7F]/g, ""), + disposition: `attachment; filename="${encodeURIComponent( + fileDownloadPath.replace(/^.*[\\/]/, ""), + )}"`, length: statSync(fileDownloadPath).size, type, }; From 2fa1823b862583943b1f46f20ead10b5b4a191a7 Mon Sep 17 00:00:00 2001 From: Alper Alkan Date: Tue, 12 Sep 2023 23:19:38 +0200 Subject: [PATCH 9/9] nextcloud standard --- src/modules/files/files.service.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/modules/files/files.service.ts b/src/modules/files/files.service.ts index 081c106..7da170e 100644 --- a/src/modules/files/files.service.ts +++ b/src/modules/files/files.service.ts @@ -477,10 +477,11 @@ export class FilesService implements OnApplicationBootstrap { ); const type = mime.getType(fileDownloadPath); + const encodedFilename = encodeURIComponent( + fileDownloadPath.replace(/^.*[\\/]/, ""), + ); const headers = { - disposition: `attachment; filename="${encodeURIComponent( - fileDownloadPath.replace(/^.*[\\/]/, ""), - )}"`, + disposition: `attachment; filename*=UTF-8''${encodedFilename}; filename="${encodedFilename}"`, length: statSync(fileDownloadPath).size, type, };