diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66786e3..3b5d0f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,10 +34,10 @@ importers: version: 11.2.3(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2) '@platformatic/kafka': specifier: ^1.12.0 - version: 1.21.0 + version: 1.22.0 '@prisma/client': specifier: ^6.3.1 - version: 6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3) + version: 6.19.1(prisma@6.19.1(typescript@5.9.3))(typescript@5.9.3) '@types/jsonwebtoken': specifier: ^9.0.9 version: 9.0.10 @@ -89,10 +89,10 @@ importers: version: 3.3.3 '@eslint/js': specifier: ^9.18.0 - version: 9.39.1 + version: 9.39.2 '@nestjs/cli': specifier: ^11.0.0 - version: 11.0.14(@swc/cli@0.6.0(@swc/core@1.15.3)(chokidar@4.0.3))(@swc/core@1.15.3)(@types/node@22.19.2) + version: 11.0.14(@swc/cli@0.6.0(@swc/core@1.15.4)(chokidar@4.0.3))(@swc/core@1.15.4)(@types/node@22.19.3) '@nestjs/schematics': specifier: ^11.0.0 version: 11.0.9(chokidar@4.0.3)(typescript@5.9.3) @@ -101,13 +101,13 @@ importers: version: 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-express@11.1.9) '@swc/cli': specifier: ^0.6.0 - version: 0.6.0(@swc/core@1.15.3)(chokidar@4.0.3) + version: 0.6.0(@swc/core@1.15.4)(chokidar@4.0.3) '@swc/core': specifier: ^1.10.7 - version: 1.15.3 + version: 1.15.4 '@swc/jest': specifier: ^0.2.39 - version: 0.2.39(@swc/core@1.15.3) + version: 0.2.39(@swc/core@1.15.4) '@types/express': specifier: ^5.0.0 version: 5.0.6 @@ -119,19 +119,19 @@ importers: version: 1.4.13 '@types/node': specifier: ^22.10.7 - version: 22.19.2 + version: 22.19.3 '@types/supertest': specifier: ^6.0.2 version: 6.0.3 eslint: specifier: ^9.18.0 - version: 9.39.1(jiti@2.6.1) + version: 9.39.2(jiti@2.6.1) eslint-config-prettier: specifier: ^10.0.1 - version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-prettier: specifier: ^5.2.2 - version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))(prettier@3.7.4) + version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.7.4) express: specifier: ^5.1.0 version: 5.2.1 @@ -140,13 +140,13 @@ importers: version: 15.15.0 jest: specifier: ^30.0.0 - version: 30.2.0(@types/node@22.19.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3)) + version: 30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3)) prettier: specifier: ^3.4.2 version: 3.7.4 prisma: specifier: ^6.3.1 - version: 6.19.0(typescript@5.9.3) + version: 6.19.1(typescript@5.9.3) source-map-support: specifier: ^0.5.21 version: 0.5.21 @@ -158,10 +158,10 @@ importers: version: 13.2.16 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.9.3)(webpack@5.103.0(@swc/core@1.15.3)) + version: 9.5.4(typescript@5.9.3)(webpack@5.103.0(@swc/core@1.15.4)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -170,7 +170,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: ^8.20.0 - version: 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + version: 8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) winston: specifier: ^3.17.0 version: 3.19.0 @@ -686,8 +686,8 @@ packages: resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': @@ -1444,12 +1444,12 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@platformatic/kafka@1.21.0': - resolution: {integrity: sha512-IelA5LUgK6XzSCQndMNA5ZMvAdJrSmhyeGY/56m9nKEWOdRpP0vlxtLKC66OJq/pcYYIjxTQ8gdoj/Hb6HAlyw==} + '@platformatic/kafka@1.22.0': + resolution: {integrity: sha512-zUHxGGJfjbuPAXVA185Dd9oA1e5xittHUFFlnyRGKFztPuHXIxnTcOIImUph12hNVAaaap4azXyBhAz9mTOtMg==} engines: {node: '>= 20.19.4 || >= 22.18.0 || >= 24.6.0'} - '@prisma/client@6.19.0': - resolution: {integrity: sha512-QXFT+N/bva/QI2qoXmjBzL7D6aliPffIwP+81AdTGq0FXDoLxLkWivGMawG8iM5B9BKfxLIXxfWWAF6wbuJU6g==} + '@prisma/client@6.19.1': + resolution: {integrity: sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==} engines: {node: '>=18.18'} peerDependencies: prisma: '*' @@ -1460,23 +1460,23 @@ packages: typescript: optional: true - '@prisma/config@6.19.0': - resolution: {integrity: sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==} + '@prisma/config@6.19.1': + resolution: {integrity: sha512-bUL/aYkGXLwxVGhJmQMtslLT7KPEfUqmRa919fKI4wQFX4bIFUKiY8Jmio/2waAjjPYrtuDHa7EsNCnJTXxiOw==} - '@prisma/debug@6.19.0': - resolution: {integrity: sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==} + '@prisma/debug@6.19.1': + resolution: {integrity: sha512-h1JImhlAd/s5nhY/e9qkAzausWldbeT+e4nZF7A4zjDYBF4BZmKDt4y0jK7EZapqOm1kW7V0e9agV/iFDy3fWw==} - '@prisma/engines-version@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': - resolution: {integrity: sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==} + '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7': + resolution: {integrity: sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==} - '@prisma/engines@6.19.0': - resolution: {integrity: sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==} + '@prisma/engines@6.19.1': + resolution: {integrity: sha512-xy95dNJ7DiPf9IJ3oaVfX785nbFl7oNDzclUF+DIiJw6WdWCvPl0LPU0YqQLsrwv8N64uOQkH391ujo3wSo+Nw==} - '@prisma/fetch-engine@6.19.0': - resolution: {integrity: sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==} + '@prisma/fetch-engine@6.19.1': + resolution: {integrity: sha512-mmgcotdaq4VtAHO6keov3db+hqlBzQS6X7tR7dFCbvXjLVTxBYdSJFRWz+dq7F9p6dvWyy1X0v8BlfRixyQK6g==} - '@prisma/get-platform@6.19.0': - resolution: {integrity: sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==} + '@prisma/get-platform@6.19.1': + resolution: {integrity: sha512-zsg44QUiQAnFUyh6Fbt7c9HjMXHwFTqtrgcX7DAZmRgnkPyYT7Sh8Mn8D5PuuDYNtMOYcpLGg576MLfIORsBYw==} '@scarf/scarf@1.4.0': resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} @@ -1727,68 +1727,68 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.15.3': - resolution: {integrity: sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==} + '@swc/core-darwin-arm64@1.15.4': + resolution: {integrity: sha512-NU/Of+ShFGG/i0lXKsF6GaGeTBNsr9iD8uUzdXxFfGbEjTeuKNXc5CWn3/Uo4Gr4LMAGD3hsRwG2Jq5iBDMalw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.3': - resolution: {integrity: sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==} + '@swc/core-darwin-x64@1.15.4': + resolution: {integrity: sha512-9oWYMZHiEfHLqjjRGrXL17I8HdAOpWK/Rps34RKQ74O+eliygi1Iyq1TDUzYqUXcNvqN2K5fHgoMLRIni41ClQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.3': - resolution: {integrity: sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==} + '@swc/core-linux-arm-gnueabihf@1.15.4': + resolution: {integrity: sha512-I1dPxXli3N1Vr71JXogUTLcspM5ICgCYaA16RE+JKchj3XKKmxLlYjwAHAA4lh/Cy486ikzACaG6pIBcegoGkg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.3': - resolution: {integrity: sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==} + '@swc/core-linux-arm64-gnu@1.15.4': + resolution: {integrity: sha512-iGpuS/2PDZ68ioAlhkxiN5M4+pB9uDJolTKk4mZ0JM29uFf9YIkiyk7Bbr2y1QtmD82rF0tDHhoG9jtnV8mZMg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.15.3': - resolution: {integrity: sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==} + '@swc/core-linux-arm64-musl@1.15.4': + resolution: {integrity: sha512-Ly95wc+VXDhl08pjAoPUhVu5vNbuPMbURknRZa5QOZuiizJ6DkaSI0/zsEc26PpC6HTc4prNLY3ARVwZ7j/IJQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.15.3': - resolution: {integrity: sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==} + '@swc/core-linux-x64-gnu@1.15.4': + resolution: {integrity: sha512-7pIG0BnaMn4zTpHeColPwyrWoTY9Drr+ISZQIgYHUKh3oaPtNCrXb289ScGbPPPjLsSfcGTeOy2pXmNczMC+yg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.15.3': - resolution: {integrity: sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==} + '@swc/core-linux-x64-musl@1.15.4': + resolution: {integrity: sha512-oaqTV25V9H+PpSkvTcK25q6Q56FvXc6d2xBu486dv9LAPCHWgeAworE8WpBLV26g8rubcN5nGhO5HwSunXA7Ww==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.15.3': - resolution: {integrity: sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==} + '@swc/core-win32-arm64-msvc@1.15.4': + resolution: {integrity: sha512-VcPuUJw27YbGo1HcOaAriI50dpM3ZZeDW3x2cMnJW6vtkeyzUFk1TADmTwFax0Fn+yicCxhaWjnFE3eAzGAxIQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.3': - resolution: {integrity: sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==} + '@swc/core-win32-ia32-msvc@1.15.4': + resolution: {integrity: sha512-dREjghAZEuKAK9nQzJETAiCSihSpAVS6Vk9+y2ElaoeTj68tNB1txV/m1RTPPD/+Kgbz6ITPNyXRWxPdkP5aXw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.3': - resolution: {integrity: sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==} + '@swc/core-win32-x64-msvc@1.15.4': + resolution: {integrity: sha512-o/odIBuQkoxKbRweJWOMI9LeRSOenFKN2zgPeaaNQ/cyuVk2r6DCAobKMOodvDdZWlMn6N1xJrldeCRSTZIgiQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.3': - resolution: {integrity: sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==} + '@swc/core@1.15.4': + resolution: {integrity: sha512-fH81BPo6EiJ7BUb6Qa5SY/NLWIRVambqU3740g0XPFPEz5KFPnzRYpR6zodQNOcEb9XUtZzRO1Y0WyIJP7iBxQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -1919,8 +1919,8 @@ packages: '@types/multer@1.4.13': resolution: {integrity: sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw==} - '@types/node@22.19.2': - resolution: {integrity: sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==} + '@types/node@22.19.3': + resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} @@ -2396,8 +2396,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.5: - resolution: {integrity: sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA==} + baseline-browser-mapping@2.9.7: + resolution: {integrity: sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==} hasBin: true bin-version-check@5.1.0: @@ -2832,8 +2832,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} error-ex@1.3.4: @@ -2912,8 +2912,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3275,8 +3275,8 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + iconv-lite@0.7.1: + resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==} engines: {node: '>=0.10.0'} ieee754@1.2.1: @@ -4151,8 +4151,8 @@ packages: resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - prisma@6.19.0: - resolution: {integrity: sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==} + prisma@6.19.1: + resolution: {integrity: sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==} engines: {node: '>=18.18'} hasBin: true peerDependencies: @@ -4515,8 +4515,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@2.1.1: - resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} strtok3@10.3.4: resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} @@ -4573,8 +4573,8 @@ packages: version: 3.0.1 engines: {node: '>= 14'} - terser-webpack-plugin@5.3.15: - resolution: {integrity: sha512-PGkOdpRFK+rb1TzVz+msVhw4YMRT9txLF4kRqvJhGhCM324xuR3REBSHALN+l+sAhKUmz0aotnjp5D+P83mLhQ==} + terser-webpack-plugin@5.3.16: + resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -4911,11 +4911,11 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@angular-devkit/schematics-cli@19.2.19(@types/node@22.19.2)(chokidar@4.0.3)': + '@angular-devkit/schematics-cli@19.2.19(@types/node@22.19.3)(chokidar@4.0.3)': dependencies: '@angular-devkit/core': 19.2.19(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) - '@inquirer/prompts': 7.3.2(@types/node@22.19.2) + '@inquirer/prompts': 7.3.2(@types/node@22.19.3) ansi-colors: 4.1.3 symbol-observable: 4.0.0 yargs-parser: 21.1.1 @@ -5700,9 +5700,9 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -5737,7 +5737,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.39.1': {} + '@eslint/js@9.39.2': {} '@eslint/object-schema@2.1.7': {} @@ -5761,143 +5761,143 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@22.19.2)': + '@inquirer/checkbox@4.3.2(@types/node@22.19.3)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.3) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/type': 3.0.10(@types/node@22.19.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/confirm@5.1.21(@types/node@22.19.2)': + '@inquirer/confirm@5.1.21(@types/node@22.19.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/core@10.3.2(@types/node@22.19.2)': + '@inquirer/core@10.3.2(@types/node@22.19.3)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/type': 3.0.10(@types/node@22.19.3) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/editor@4.2.23(@types/node@22.19.2)': + '@inquirer/editor@4.2.23(@types/node@22.19.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/external-editor': 1.0.3(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/expand@4.0.23(@types/node@22.19.2)': + '@inquirer/expand@4.0.23(@types/node@22.19.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/external-editor@1.0.3(@types/node@22.19.2)': + '@inquirer/external-editor@1.0.3(@types/node@22.19.3)': dependencies: chardet: 2.1.1 - iconv-lite: 0.7.0 + iconv-lite: 0.7.1 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.3.1(@types/node@22.19.2)': + '@inquirer/input@4.3.1(@types/node@22.19.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/number@3.0.23(@types/node@22.19.2)': + '@inquirer/number@3.0.23(@types/node@22.19.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/password@4.0.23(@types/node@22.19.2)': + '@inquirer/password@4.0.23(@types/node@22.19.3)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) optionalDependencies: - '@types/node': 22.19.2 - - '@inquirer/prompts@7.10.1(@types/node@22.19.2)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@22.19.2) - '@inquirer/confirm': 5.1.21(@types/node@22.19.2) - '@inquirer/editor': 4.2.23(@types/node@22.19.2) - '@inquirer/expand': 4.0.23(@types/node@22.19.2) - '@inquirer/input': 4.3.1(@types/node@22.19.2) - '@inquirer/number': 3.0.23(@types/node@22.19.2) - '@inquirer/password': 4.0.23(@types/node@22.19.2) - '@inquirer/rawlist': 4.1.11(@types/node@22.19.2) - '@inquirer/search': 3.2.2(@types/node@22.19.2) - '@inquirer/select': 4.4.2(@types/node@22.19.2) + '@types/node': 22.19.3 + + '@inquirer/prompts@7.10.1(@types/node@22.19.3)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.3) + '@inquirer/confirm': 5.1.21(@types/node@22.19.3) + '@inquirer/editor': 4.2.23(@types/node@22.19.3) + '@inquirer/expand': 4.0.23(@types/node@22.19.3) + '@inquirer/input': 4.3.1(@types/node@22.19.3) + '@inquirer/number': 3.0.23(@types/node@22.19.3) + '@inquirer/password': 4.0.23(@types/node@22.19.3) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.3) + '@inquirer/search': 3.2.2(@types/node@22.19.3) + '@inquirer/select': 4.4.2(@types/node@22.19.3) optionalDependencies: - '@types/node': 22.19.2 - - '@inquirer/prompts@7.3.2(@types/node@22.19.2)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@22.19.2) - '@inquirer/confirm': 5.1.21(@types/node@22.19.2) - '@inquirer/editor': 4.2.23(@types/node@22.19.2) - '@inquirer/expand': 4.0.23(@types/node@22.19.2) - '@inquirer/input': 4.3.1(@types/node@22.19.2) - '@inquirer/number': 3.0.23(@types/node@22.19.2) - '@inquirer/password': 4.0.23(@types/node@22.19.2) - '@inquirer/rawlist': 4.1.11(@types/node@22.19.2) - '@inquirer/search': 3.2.2(@types/node@22.19.2) - '@inquirer/select': 4.4.2(@types/node@22.19.2) + '@types/node': 22.19.3 + + '@inquirer/prompts@7.3.2(@types/node@22.19.3)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.3) + '@inquirer/confirm': 5.1.21(@types/node@22.19.3) + '@inquirer/editor': 4.2.23(@types/node@22.19.3) + '@inquirer/expand': 4.0.23(@types/node@22.19.3) + '@inquirer/input': 4.3.1(@types/node@22.19.3) + '@inquirer/number': 3.0.23(@types/node@22.19.3) + '@inquirer/password': 4.0.23(@types/node@22.19.3) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.3) + '@inquirer/search': 3.2.2(@types/node@22.19.3) + '@inquirer/select': 4.4.2(@types/node@22.19.3) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/rawlist@4.1.11(@types/node@22.19.2)': + '@inquirer/rawlist@4.1.11(@types/node@22.19.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/search@3.2.2(@types/node@22.19.2)': + '@inquirer/search@3.2.2(@types/node@22.19.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.3) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/type': 3.0.10(@types/node@22.19.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/select@4.4.2(@types/node@22.19.2)': + '@inquirer/select@4.4.2(@types/node@22.19.3)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.3) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/type': 3.0.10(@types/node@22.19.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 - '@inquirer/type@3.0.10(@types/node@22.19.2)': + '@inquirer/type@3.0.10(@types/node@22.19.3)': optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@isaacs/balanced-match@4.0.1': {} @@ -5927,13 +5927,13 @@ snapshots: '@jest/console@30.2.0': dependencies: '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 chalk: 4.1.2 jest-message-util: 30.2.0 jest-util: 30.2.0 slash: 3.0.0 - '@jest/core@30.2.0(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3))': + '@jest/core@30.2.0(ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3))': dependencies: '@jest/console': 30.2.0 '@jest/pattern': 30.0.1 @@ -5941,14 +5941,14 @@ snapshots: '@jest/test-result': 30.2.0 '@jest/transform': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.3.1 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.2.0 - jest-config: 30.2.0(@types/node@22.19.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3)) + jest-config: 30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3)) jest-haste-map: 30.2.0 jest-message-util: 30.2.0 jest-regex-util: 30.0.1 @@ -5979,7 +5979,7 @@ snapshots: dependencies: '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 jest-mock: 30.2.0 '@jest/expect-utils@30.2.0': @@ -5997,7 +5997,7 @@ snapshots: dependencies: '@jest/types': 30.2.0 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 22.19.2 + '@types/node': 22.19.3 jest-message-util: 30.2.0 jest-mock: 30.2.0 jest-util: 30.2.0 @@ -6015,7 +6015,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 jest-regex-util: 30.0.1 '@jest/reporters@30.2.0': @@ -6026,7 +6026,7 @@ snapshots: '@jest/transform': 30.2.0 '@jest/types': 30.2.0 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 22.19.2 + '@types/node': 22.19.3 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -6103,7 +6103,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -6291,29 +6291,29 @@ snapshots: axios: 1.13.2 rxjs: 7.8.2 - '@nestjs/cli@11.0.14(@swc/cli@0.6.0(@swc/core@1.15.3)(chokidar@4.0.3))(@swc/core@1.15.3)(@types/node@22.19.2)': + '@nestjs/cli@11.0.14(@swc/cli@0.6.0(@swc/core@1.15.4)(chokidar@4.0.3))(@swc/core@1.15.4)(@types/node@22.19.3)': dependencies: '@angular-devkit/core': 19.2.19(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) - '@angular-devkit/schematics-cli': 19.2.19(@types/node@22.19.2)(chokidar@4.0.3) - '@inquirer/prompts': 7.10.1(@types/node@22.19.2) + '@angular-devkit/schematics-cli': 19.2.19(@types/node@22.19.3)(chokidar@4.0.3) + '@inquirer/prompts': 7.10.1(@types/node@22.19.3) '@nestjs/schematics': 11.0.9(chokidar@4.0.3)(typescript@5.9.3) ansis: 4.2.0 chokidar: 4.0.3 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.103.0(@swc/core@1.15.3)) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.103.0(@swc/core@1.15.4)) glob: 13.0.0 node-emoji: 1.11.0 ora: 5.4.1 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.2.0 typescript: 5.9.3 - webpack: 5.103.0(@swc/core@1.15.3) + webpack: 5.103.0(@swc/core@1.15.4) webpack-node-externals: 3.0.0 optionalDependencies: - '@swc/cli': 0.6.0(@swc/core@1.15.3)(chokidar@4.0.3) - '@swc/core': 1.15.3 + '@swc/cli': 0.6.0(@swc/core@1.15.4)(chokidar@4.0.3) + '@swc/core': 1.15.4 transitivePeerDependencies: - '@types/node' - esbuild @@ -6497,7 +6497,7 @@ snapshots: '@pkgr/core@0.2.9': {} - '@platformatic/kafka@1.21.0': + '@platformatic/kafka@1.22.0': dependencies: ajv: 8.17.1 debug: 4.4.3 @@ -6511,12 +6511,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@prisma/client@6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3)': + '@prisma/client@6.19.1(prisma@6.19.1(typescript@5.9.3))(typescript@5.9.3)': optionalDependencies: - prisma: 6.19.0(typescript@5.9.3) + prisma: 6.19.1(typescript@5.9.3) typescript: 5.9.3 - '@prisma/config@6.19.0': + '@prisma/config@6.19.1': dependencies: c12: 3.1.0 deepmerge-ts: 7.1.5 @@ -6525,26 +6525,26 @@ snapshots: transitivePeerDependencies: - magicast - '@prisma/debug@6.19.0': {} + '@prisma/debug@6.19.1': {} - '@prisma/engines-version@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': {} + '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7': {} - '@prisma/engines@6.19.0': + '@prisma/engines@6.19.1': dependencies: - '@prisma/debug': 6.19.0 - '@prisma/engines-version': 6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773 - '@prisma/fetch-engine': 6.19.0 - '@prisma/get-platform': 6.19.0 + '@prisma/debug': 6.19.1 + '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7 + '@prisma/fetch-engine': 6.19.1 + '@prisma/get-platform': 6.19.1 - '@prisma/fetch-engine@6.19.0': + '@prisma/fetch-engine@6.19.1': dependencies: - '@prisma/debug': 6.19.0 - '@prisma/engines-version': 6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773 - '@prisma/get-platform': 6.19.0 + '@prisma/debug': 6.19.1 + '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7 + '@prisma/get-platform': 6.19.1 - '@prisma/get-platform@6.19.0': + '@prisma/get-platform@6.19.1': dependencies: - '@prisma/debug': 6.19.0 + '@prisma/debug': 6.19.1 '@scarf/scarf@1.4.0': {} @@ -6905,9 +6905,9 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@swc/cli@0.6.0(@swc/core@1.15.3)(chokidar@4.0.3)': + '@swc/cli@0.6.0(@swc/core@1.15.4)(chokidar@4.0.3)': dependencies: - '@swc/core': 1.15.3 + '@swc/core': 1.15.4 '@swc/counter': 0.1.3 '@xhmikosr/bin-wrapper': 13.2.0 commander: 8.3.0 @@ -6924,58 +6924,58 @@ snapshots: - react-native-b4a - supports-color - '@swc/core-darwin-arm64@1.15.3': + '@swc/core-darwin-arm64@1.15.4': optional: true - '@swc/core-darwin-x64@1.15.3': + '@swc/core-darwin-x64@1.15.4': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.3': + '@swc/core-linux-arm-gnueabihf@1.15.4': optional: true - '@swc/core-linux-arm64-gnu@1.15.3': + '@swc/core-linux-arm64-gnu@1.15.4': optional: true - '@swc/core-linux-arm64-musl@1.15.3': + '@swc/core-linux-arm64-musl@1.15.4': optional: true - '@swc/core-linux-x64-gnu@1.15.3': + '@swc/core-linux-x64-gnu@1.15.4': optional: true - '@swc/core-linux-x64-musl@1.15.3': + '@swc/core-linux-x64-musl@1.15.4': optional: true - '@swc/core-win32-arm64-msvc@1.15.3': + '@swc/core-win32-arm64-msvc@1.15.4': optional: true - '@swc/core-win32-ia32-msvc@1.15.3': + '@swc/core-win32-ia32-msvc@1.15.4': optional: true - '@swc/core-win32-x64-msvc@1.15.3': + '@swc/core-win32-x64-msvc@1.15.4': optional: true - '@swc/core@1.15.3': + '@swc/core@1.15.4': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.3 - '@swc/core-darwin-x64': 1.15.3 - '@swc/core-linux-arm-gnueabihf': 1.15.3 - '@swc/core-linux-arm64-gnu': 1.15.3 - '@swc/core-linux-arm64-musl': 1.15.3 - '@swc/core-linux-x64-gnu': 1.15.3 - '@swc/core-linux-x64-musl': 1.15.3 - '@swc/core-win32-arm64-msvc': 1.15.3 - '@swc/core-win32-ia32-msvc': 1.15.3 - '@swc/core-win32-x64-msvc': 1.15.3 + '@swc/core-darwin-arm64': 1.15.4 + '@swc/core-darwin-x64': 1.15.4 + '@swc/core-linux-arm-gnueabihf': 1.15.4 + '@swc/core-linux-arm64-gnu': 1.15.4 + '@swc/core-linux-arm64-musl': 1.15.4 + '@swc/core-linux-x64-gnu': 1.15.4 + '@swc/core-linux-x64-musl': 1.15.4 + '@swc/core-win32-arm64-msvc': 1.15.4 + '@swc/core-win32-ia32-msvc': 1.15.4 + '@swc/core-win32-x64-msvc': 1.15.4 '@swc/counter@0.1.3': {} - '@swc/jest@0.2.39(@swc/core@1.15.3)': + '@swc/jest@0.2.39(@swc/core@1.15.4)': dependencies: '@jest/create-cache-key-function': 30.2.0 - '@swc/core': 1.15.3 + '@swc/core': 1.15.4 '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 @@ -7042,11 +7042,11 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@types/cookiejar@2.1.5': {} @@ -7064,14 +7064,14 @@ snapshots: '@types/express-serve-static-core@4.19.7': dependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -7113,7 +7113,7 @@ snapshots: '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@types/lodash@4.17.21': {} @@ -7127,7 +7127,7 @@ snapshots: dependencies: '@types/express': 5.0.6 - '@types/node@22.19.2': + '@types/node@22.19.3': dependencies: undici-types: 6.21.0 @@ -7138,22 +7138,22 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@types/send@1.2.1': dependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@types/send': 0.17.6 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@types/stack-utils@2.0.3': {} @@ -7161,7 +7161,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.19.2 + '@types/node': 22.19.3 form-data: 4.0.5 '@types/supertest@6.0.3': @@ -7181,15 +7181,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.49.0 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.9.3) @@ -7197,14 +7197,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.49.0 '@typescript-eslint/types': 8.49.0 '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.49.0 debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7227,13 +7227,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.49.0 '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -7256,13 +7256,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.49.0 '@typescript-eslint/types': 8.49.0 '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7705,7 +7705,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.9.5: {} + baseline-browser-mapping@2.9.7: {} bin-version-check@5.1.0: dependencies: @@ -7730,7 +7730,7 @@ snapshots: content-type: 1.0.5 debug: 4.4.3 http-errors: 2.0.1 - iconv-lite: 0.7.0 + iconv-lite: 0.7.1 on-finished: 2.4.1 qs: 6.14.0 raw-body: 3.0.2 @@ -7755,7 +7755,7 @@ snapshots: browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.9.5 + baseline-browser-mapping: 2.9.7 caniuse-lite: 1.0.30001760 electron-to-chromium: 1.5.267 node-releases: 2.0.27 @@ -8112,7 +8112,7 @@ snapshots: encodeurl@2.0.0: {} - enhanced-resolve@5.18.3: + enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 @@ -8148,19 +8148,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))(prettier@3.7.4): + eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.7.4): dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) prettier: 3.7.4 prettier-linter-helpers: 1.0.0 synckit: 0.11.11 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.8(eslint@9.39.1(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) eslint-scope@5.1.1: dependencies: @@ -8176,15 +8176,15 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.1(jiti@2.6.1): + eslint@9.39.2(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.39.1 + '@eslint/js': 9.39.2 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 @@ -8378,7 +8378,7 @@ snapshots: fast-xml-parser@5.2.5: dependencies: - strnum: 2.1.1 + strnum: 2.1.2 fastq@1.19.1: dependencies: @@ -8469,7 +8469,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.103.0(@swc/core@1.15.3)): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.103.0(@swc/core@1.15.4)): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -8484,7 +8484,7 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.9.3 - webpack: 5.103.0(@swc/core@1.15.3) + webpack: 5.103.0(@swc/core@1.15.4) form-data-encoder@2.1.4: {} @@ -8662,7 +8662,7 @@ snapshots: human-signals@2.1.0: {} - iconv-lite@0.7.0: + iconv-lite@0.7.1: dependencies: safer-buffer: 2.1.2 @@ -8776,7 +8776,7 @@ snapshots: '@jest/expect': 30.2.0 '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0 @@ -8796,15 +8796,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.2.0(@types/node@22.19.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3)): + jest-cli@30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3)): dependencies: - '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3)) + '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3)) '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.2.0(@types/node@22.19.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3)) + jest-config: 30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3)) jest-util: 30.2.0 jest-validate: 30.2.0 yargs: 17.7.2 @@ -8815,7 +8815,7 @@ snapshots: - supports-color - ts-node - jest-config@30.2.0(@types/node@22.19.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3)): + jest-config@30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.5 '@jest/get-type': 30.1.0 @@ -8842,8 +8842,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.19.2 - ts-node: 10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3) + '@types/node': 22.19.3 + ts-node: 10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -8872,7 +8872,7 @@ snapshots: '@jest/environment': 30.2.0 '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 jest-mock: 30.2.0 jest-util: 30.2.0 jest-validate: 30.2.0 @@ -8880,7 +8880,7 @@ snapshots: jest-haste-map@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -8919,7 +8919,7 @@ snapshots: jest-mock@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 jest-util: 30.2.0 jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): @@ -8953,7 +8953,7 @@ snapshots: '@jest/test-result': 30.2.0 '@jest/transform': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -8982,7 +8982,7 @@ snapshots: '@jest/test-result': 30.2.0 '@jest/transform': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 chalk: 4.1.2 cjs-module-lexer: 2.1.1 collect-v8-coverage: 1.0.3 @@ -9029,7 +9029,7 @@ snapshots: jest-util@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 chalk: 4.1.2 ci-info: 4.3.1 graceful-fs: 4.2.11 @@ -9048,7 +9048,7 @@ snapshots: dependencies: '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.2 + '@types/node': 22.19.3 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -9057,24 +9057,24 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.2.0: dependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.3 '@ungap/structured-clone': 1.3.0 jest-util: 30.2.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.2.0(@types/node@22.19.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3)): + jest@30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3)): dependencies: - '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3)) + '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3)) '@jest/types': 30.2.0 import-local: 3.2.0 - jest-cli: 30.2.0(@types/node@22.19.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3)) + jest-cli: 30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -9670,10 +9670,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - prisma@6.19.0(typescript@5.9.3): + prisma@6.19.1(typescript@5.9.3): dependencies: - '@prisma/config': 6.19.0 - '@prisma/engines': 6.19.0 + '@prisma/config': 6.19.1 + '@prisma/engines': 6.19.1 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9719,7 +9719,7 @@ snapshots: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.0 + iconv-lite: 0.7.1 unpipe: 1.0.0 rc9@2.1.2: @@ -10074,7 +10074,7 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@2.1.1: {} + strnum@2.1.2: {} strtok3@10.3.4: dependencies: @@ -10184,16 +10184,16 @@ snapshots: - debug - supports-color - terser-webpack-plugin@5.3.15(@swc/core@1.15.3)(webpack@5.103.0(@swc/core@1.15.3)): + terser-webpack-plugin@5.3.16(@swc/core@1.15.4)(webpack@5.103.0(@swc/core@1.15.4)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.1 - webpack: 5.103.0(@swc/core@1.15.3) + webpack: 5.103.0(@swc/core@1.15.4) optionalDependencies: - '@swc/core': 1.15.3 + '@swc/core': 1.15.4 terser@5.44.1: dependencies: @@ -10247,24 +10247,24 @@ snapshots: dependencies: typescript: 5.9.3 - ts-loader@9.5.4(typescript@5.9.3)(webpack@5.103.0(@swc/core@1.15.3)): + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.103.0(@swc/core@1.15.4)): dependencies: chalk: 4.1.2 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.18.4 micromatch: 4.0.8 semver: 7.7.3 source-map: 0.7.6 typescript: 5.9.3 - webpack: 5.103.0(@swc/core@1.15.3) + webpack: 5.103.0(@swc/core@1.15.4) - ts-node@10.9.2(@swc/core@1.15.3)(@types/node@22.19.2)(typescript@5.9.3): + ts-node@10.9.2(@swc/core@1.15.4)(@types/node@22.19.3)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.2 + '@types/node': 22.19.3 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -10275,12 +10275,12 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.3 + '@swc/core': 1.15.4 tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.18.4 tapable: 2.3.0 tsconfig-paths: 4.2.0 @@ -10315,13 +10315,13 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -10412,7 +10412,7 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.103.0(@swc/core@1.15.3): + webpack@5.103.0(@swc/core@1.15.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -10424,7 +10424,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.18.4 es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -10436,7 +10436,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.15(@swc/core@1.15.3)(webpack@5.103.0(@swc/core@1.15.3)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.4)(webpack@5.103.0(@swc/core@1.15.4)) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: diff --git a/src/api/review-application/reviewApplication.service.ts b/src/api/review-application/reviewApplication.service.ts index 6610fdc..8c3119f 100644 --- a/src/api/review-application/reviewApplication.service.ts +++ b/src/api/review-application/reviewApplication.service.ts @@ -71,7 +71,6 @@ export class ReviewApplicationService { } // make sure application role matches if ( - // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison ReviewApplicationRoleOpportunityTypeMap[dto.role] !== opportunity.type ) { throw new BadRequestException( diff --git a/src/api/submission/submission.controller.ts b/src/api/submission/submission.controller.ts index 7a4726f..3ed1a59 100644 --- a/src/api/submission/submission.controller.ts +++ b/src/api/submission/submission.controller.ts @@ -197,7 +197,8 @@ export class SubmissionController { this.logger.log( `Getting submissions with filters - ${JSON.stringify(queryDto)}`, ); - const authUser: JwtUser = req['user'] as JwtUser; + const authUser: JwtUser = + (req['user'] as JwtUser) ?? ({ isMachine: false, roles: [] } as JwtUser); return this.service.listSubmission( authUser, queryDto, diff --git a/src/api/submission/submission.service.spec.ts b/src/api/submission/submission.service.spec.ts index 8cdb3e7..208b393 100644 --- a/src/api/submission/submission.service.spec.ts +++ b/src/api/submission/submission.service.spec.ts @@ -510,6 +510,7 @@ describe('SubmissionService', () => { reviewType: { findMany: jest.Mock; }; + $queryRaw: jest.Mock; }; let prismaErrorServiceMock: { handleError: jest.Mock }; let challengePrismaMock: { @@ -537,9 +538,14 @@ describe('SubmissionService', () => { reviewType: { findMany: jest.fn().mockResolvedValue([]), }, + $queryRaw: jest.fn().mockResolvedValue([]), }; prismaErrorServiceMock = { - handleError: jest.fn(), + handleError: jest.fn().mockReturnValue({ + message: 'Unexpected error', + code: 'INTERNAL_ERROR', + details: {}, + }), }; challengePrismaMock = { $queryRaw: jest.fn().mockResolvedValue([]), @@ -624,6 +630,7 @@ describe('SubmissionService', () => { prismaMock.submission.findFirst.mockResolvedValue({ id: 'submission-new', }); + prismaMock.$queryRaw.mockResolvedValue([{ id: 'submission-new' }]); const result = await listService.listSubmission( { isMachine: false } as any, @@ -1241,5 +1248,56 @@ describe('SubmissionService', () => { expect(screeningReview?.reviewerHandle).toBe('screeningHandle'); expect(screeningReview?.reviewerMaxRating).toBe(2000); }); + + it('exposes submitter identity but strips reviews for anonymous challenge queries', async () => { + const now = new Date('2025-02-01T12:00:00Z'); + const submissions = [ + { + id: 'submission-anon', + challengeId: 'challenge-1', + memberId: '101', + submittedDate: now, + createdAt: now, + updatedAt: now, + type: SubmissionType.CONTEST_SUBMISSION, + status: SubmissionStatus.ACTIVE, + review: [{ id: 'review-public', score: 100 }], + reviewSummation: [{ id: 'summation-public' }], + url: 'https://example.com/submission.zip', + legacyChallengeId: null, + prizeId: null, + }, + ]; + + prismaMock.submission.findMany.mockResolvedValue( + submissions.map((entry) => ({ ...entry })), + ); + prismaMock.submission.count.mockResolvedValue(submissions.length); + prismaMock.submission.findFirst.mockResolvedValue({ + id: 'submission-anon', + }); + + memberPrismaMock.member.findMany.mockResolvedValue([ + { + userId: BigInt(101), + handle: 'anonUser', + maxRating: { rating: 1500 }, + }, + ]); + + const result = await listService.listSubmission( + { isMachine: false, roles: [] } as any, + { challengeId: 'challenge-1' } as any, + { page: 1, perPage: 10 } as any, + ); + + const submissionResult = result.data[0]; + expect(submissionResult.memberId).toBe('101'); + expect(submissionResult.submitterHandle).toBe('anonUser'); + expect(submissionResult.submitterMaxRating).toBe(1500); + expect(submissionResult).not.toHaveProperty('review'); + expect(submissionResult).not.toHaveProperty('reviewSummation'); + expect(submissionResult.url).toBeNull(); + }); }); }); diff --git a/src/api/submission/submission.service.ts b/src/api/submission/submission.service.ts index 9695239..d17ae00 100644 --- a/src/api/submission/submission.service.ts +++ b/src/api/submission/submission.service.ts @@ -1812,9 +1812,9 @@ export class SubmissionService { : undefined; if (requestedMemberId) { - const userId = authUser.userId ? String(authUser.userId) : undefined; + const userId = authUser?.userId ? String(authUser.userId) : undefined; const isRequestingMember = userId === requestedMemberId; - const hasCopilotRole = (authUser.roles ?? []).includes( + const hasCopilotRole = (authUser?.roles ?? []).includes( UserRole.Copilot, ); const hasElevatedAccess = isAdmin(authUser) || hasCopilotRole; @@ -1862,7 +1862,7 @@ export class SubmissionService { : ''; let restrictedChallengeIds = new Set(); - if (!isPrivilegedRequester && requesterUserId) { + if (!isPrivilegedRequester && requesterUserId && !queryDto.challengeId) { try { restrictedChallengeIds = await this.getActiveSubmitterRestrictedChallengeIds( @@ -1885,7 +1885,8 @@ export class SubmissionService { if ( !isPrivilegedRequester && requesterUserId && - restrictedChallengeIds.size + restrictedChallengeIds.size && + !queryDto.challengeId ) { const restrictedList = Array.from(restrictedChallengeIds); const restrictionCriteria: Prisma.submissionWhereInput = { @@ -1928,12 +1929,16 @@ export class SubmissionService { orderBy, }); - // Enrich with submitter handle and max rating for authorized callers - const canViewSubmitter = await this.canViewSubmitterIdentity( - authUser, - queryDto.challengeId, - ); - if (canViewSubmitter && submissions.length) { + // Enrich with submitter handle and max rating (always for challenge listings) + const shouldEnrichSubmitter = + submissions.length > 0 && + (queryDto.challengeId + ? true + : await this.canViewSubmitterIdentity( + authUser, + queryDto.challengeId, + )); + if (shouldEnrichSubmitter) { try { const memberIds = Array.from( new Set( @@ -1943,11 +1948,24 @@ export class SubmissionService { ), ); if (memberIds.length) { - const idsAsBigInt = memberIds.map((id) => BigInt(id)); - const members = await this.memberPrisma.member.findMany({ - where: { userId: { in: idsAsBigInt } }, - include: { maxRating: true }, - }); + const idsAsBigInt: bigint[] = []; + for (const id of memberIds) { + try { + idsAsBigInt.push(BigInt(id)); + } catch (error) { + this.logger.debug( + `[listSubmission] Skipping submitter ${id}: unable to convert to BigInt. ${error}`, + ); + } + } + + const members = + idsAsBigInt.length > 0 + ? await this.memberPrisma.member.findMany({ + where: { userId: { in: idsAsBigInt } }, + include: { maxRating: true }, + }) + : []; const map = new Map< string, { handle: string; maxRating: number | null } @@ -2001,11 +2019,6 @@ export class SubmissionService { submissions, reviewVisibilityContext, ); - this.stripSubmitterMemberIds( - authUser, - submissions, - reviewVisibilityContext, - ); await this.stripIsLatestForUnlimitedChallenges(submissions); this.logger.log( @@ -2408,25 +2421,43 @@ export class SubmissionService { return emptyContext; } + const requesterUserId = + authUser?.userId !== undefined && authUser?.userId !== null + ? String(authUser.userId).trim() + : ''; + const isPrivilegedRequester = authUser?.isMachine || isAdmin(authUser); + if (!isPrivilegedRequester && !requesterUserId) { + for (const submission of submissions) { + if (Object.prototype.hasOwnProperty.call(submission, 'review')) { + delete (submission as any).review; + } + if ( + Object.prototype.hasOwnProperty.call(submission, 'reviewSummation') + ) { + delete (submission as any).reviewSummation; + } + } + return { + ...emptyContext, + requesterUserId, + }; + } + if (isPrivilegedRequester) { - const requesterUserId = - authUser?.userId !== undefined && authUser?.userId !== null - ? String(authUser.userId).trim() - : ''; return { ...emptyContext, requesterUserId, }; } - const uid = - authUser?.userId !== undefined && authUser?.userId !== null - ? String(authUser.userId).trim() - : ''; + const uid = requesterUserId; if (!uid) { - return emptyContext; + return { + ...emptyContext, + requesterUserId, + }; } const challengeIds = Array.from( @@ -3397,7 +3428,26 @@ export class SubmissionService { } const uid = visibilityContext.requesterUserId; + this.logger.debug( + `[stripSubmitterSubmissionDetails] requesterUserId=${uid ?? ''}`, + ); if (!uid) { + this.logger.debug( + '[stripSubmitterSubmissionDetails] Anonymized requester; removing review metadata and URLs.', + ); + for (const submission of submissions) { + if (Object.prototype.hasOwnProperty.call(submission, 'review')) { + delete (submission as any).review; + } + if ( + Object.prototype.hasOwnProperty.call(submission, 'reviewSummation') + ) { + delete (submission as any).reviewSummation; + } + if (Object.prototype.hasOwnProperty.call(submission, 'url')) { + (submission as any).url = null; + } + } return; } @@ -3472,6 +3522,19 @@ export class SubmissionService { const uid = visibilityContext.requesterUserId; if (!uid) { + for (const submission of submissions) { + if (Object.prototype.hasOwnProperty.call(submission, 'review')) { + delete (submission as any).review; + } + if ( + Object.prototype.hasOwnProperty.call(submission, 'reviewSummation') + ) { + delete (submission as any).reviewSummation; + } + if (Object.prototype.hasOwnProperty.call(submission, 'url')) { + (submission as any).url = null; + } + } return; } diff --git a/src/dto/reviewApplication.dto.ts b/src/dto/reviewApplication.dto.ts index a71f0ce..e26b988 100644 --- a/src/dto/reviewApplication.dto.ts +++ b/src/dto/reviewApplication.dto.ts @@ -1,4 +1,5 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import type { ReviewOpportunityType as PrismaReviewOpportunityType } from '@prisma/client'; import { IsIn, IsNotEmpty, IsOptional, IsString } from 'class-validator'; import { ReviewOpportunityType } from './reviewOpportunity.dto'; @@ -37,7 +38,7 @@ export const ReviewApplicationRoleIds: Record = { // read from review_application_role_lu.review_auction_type_id export const ReviewApplicationRoleOpportunityTypeMap: Record< ReviewApplicationRole, - ReviewOpportunityType + PrismaReviewOpportunityType > = { PRIMARY_REVIEWER: ReviewOpportunityType.COMPONENT_DEV_REVIEW, SECONDARY_REVIEWER: ReviewOpportunityType.COMPONENT_DEV_REVIEW, diff --git a/src/shared/guards/tokenRoles.guard.spec.ts b/src/shared/guards/tokenRoles.guard.spec.ts index f44bf00..9526243 100644 --- a/src/shared/guards/tokenRoles.guard.spec.ts +++ b/src/shared/guards/tokenRoles.guard.spec.ts @@ -20,7 +20,7 @@ describe('TokenRolesGuard', () => { type TestRequest = Record & { method: string; query: Record; - user: { + user?: { userId: string; isMachine: boolean; roles?: unknown[]; @@ -132,5 +132,16 @@ describe('TokenRolesGuard', () => { expect(() => guard.canActivate(context)).toThrow(ForbiddenException); }); + + it('allows anonymous access when challengeId is provided', () => { + const request = { + method: 'GET', + query: { challengeId: '12345' }, + }; + + const context = createExecutionContext(request as TestRequest); + + expect(guard.canActivate(context)).toBe(true); + }); }); }); diff --git a/src/shared/guards/tokenRoles.guard.ts b/src/shared/guards/tokenRoles.guard.ts index acb9067..e0bf184 100644 --- a/src/shared/guards/tokenRoles.guard.ts +++ b/src/shared/guards/tokenRoles.guard.ts @@ -66,6 +66,23 @@ export class TokenRolesGuard implements CanActivate { const user = request['user']; if (!user && (requiredRoles.length || requiredScopes.length)) { + if ( + this.allowAnonymousSubmissionListByChallenge( + context, + request, + requiredRoles, + ) + ) { + this.logger.log({ + message: + 'Allowing anonymous request for submission list with challengeId', + ...requestMeta, + hasUser: false, + requiredRoles, + requiredScopes, + }); + return true; + } this.logger.warn({ message: 'Rejecting request due to missing user payload', ...requestMeta, @@ -238,6 +255,46 @@ export class TokenRolesGuard implements CanActivate { return true; } + private allowAnonymousSubmissionListByChallenge( + context: ExecutionContext, + request: any, + requiredRoles: UserRole[], + ): boolean { + const generalUserRole = String(UserRole.User).trim().toLowerCase(); + const normalizedRequiredRoles = (requiredRoles || []).map((role) => + String(role ?? '') + .trim() + .toLowerCase(), + ); + + if (!normalizedRequiredRoles.includes(generalUserRole)) { + return false; + } + + const handler = context.getHandler?.(); + const controllerClass = context.getClass?.(); + + const isSubmissionListHandler = + controllerClass?.name === 'SubmissionController' && + handler?.name === 'listSubmissions'; + + if (!isSubmissionListHandler) { + return false; + } + + const method = (request?.method || '').toUpperCase(); + if (method !== 'GET') { + return false; + } + + const challengeId = request?.query?.challengeId; + if (!this.hasNonEmptyQueryParam(challengeId)) { + return false; + } + + return true; + } + private hasNonEmptyQueryParam(value: unknown): boolean { if (typeof value === 'string') { return value.trim().length > 0; diff --git a/src/shared/modules/global/submission-scan-complete.orchestrator.ts b/src/shared/modules/global/submission-scan-complete.orchestrator.ts index 9d0556e..2e27a4a 100644 --- a/src/shared/modules/global/submission-scan-complete.orchestrator.ts +++ b/src/shared/modules/global/submission-scan-complete.orchestrator.ts @@ -49,6 +49,17 @@ export class SubmissionScanCompleteOrchestrator { return; } + // check if workflow runs have already been queued for this submission + const alreadyQueued = + await this.workflowQueueHandler.hasQueuedWorkflowRuns(submissionId); + + if (alreadyQueued) { + this.logger.log( + `AI workflow runs already queued for submission ${submissionId}. Skipping queueing.`, + ); + return; + } + await this.workflowQueueHandler.queueWorkflowRuns( challenge.workflows, challenge.id, diff --git a/src/shared/modules/global/workflow-queue.handler.ts b/src/shared/modules/global/workflow-queue.handler.ts index 1c230bd..e6caef1 100644 --- a/src/shared/modules/global/workflow-queue.handler.ts +++ b/src/shared/modules/global/workflow-queue.handler.ts @@ -79,6 +79,18 @@ export class WorkflowQueueHandler implements OnModuleInit { }); } + async hasQueuedWorkflowRuns(submissionId: string): Promise { + if (!submissionId) return false; + + const existing = await this.prisma.aiWorkflowRun.findFirst({ + where: { + submissionId, + }, + }); + + return !!existing; + } + async handleQueuedWorkflowRun([job]: [Job]) { this.logger.log(`Processing job ${job.id}`);