From 49f1508197ff047f1dc53cbf2c7346f6b26ea5c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Mozs=C3=A1r?= Date: Mon, 23 Feb 2026 11:00:58 +0100 Subject: [PATCH 1/5] picture export --- .idea/jsLinters/eslint.xml | 2 +- apps/backend/package.json | 2 + apps/backend/src/user/user.controller.ts | 12 ++- apps/backend/src/user/user.service.ts | 31 ++++++ .../app/admin/profile-picture-export/page.tsx | 100 ++++++++++++++++++ .../src/app/periods/[id]/data-table.tsx | 9 ++ apps/frontend/src/app/periods/[id]/page.tsx | 5 + apps/frontend/src/app/roles/page.tsx | 18 +++- apps/frontend/src/components/ui/UserCard.tsx | 23 ++-- .../src/components/ui/generating-dialog.tsx | 3 +- apps/frontend/src/lib/profile-pictures.ts | 17 +++ apps/frontend/src/middleware.ts | 5 +- apps/frontend/src/types/user-entity.ts | 6 +- 13 files changed, 217 insertions(+), 16 deletions(-) create mode 100644 apps/frontend/src/app/admin/profile-picture-export/page.tsx create mode 100644 apps/frontend/src/lib/profile-pictures.ts diff --git a/.idea/jsLinters/eslint.xml b/.idea/jsLinters/eslint.xml index 4c28db17..c759507d 100644 --- a/.idea/jsLinters/eslint.xml +++ b/.idea/jsLinters/eslint.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/apps/backend/package.json b/apps/backend/package.json index eff6d1f0..819bc6b2 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -29,6 +29,7 @@ "@nestjs/swagger": "^8.1.1", "@prisma/client": "^6.5.0", "@radix-ui/react-dialog": "^1.1.4", + "archiver": "^7.0.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "nestjs-prisma": "^0.24.0", @@ -43,6 +44,7 @@ "@faker-js/faker": "^9.3.0", "@nestjs/cli": "^10.4.9", "@nestjs/schematics": "^10.2.3", + "@types/archiver": "^7.0.0", "@types/express": "^5.0.0", "@types/multer": "^1.4.12", "@types/node": "^20.17.12", diff --git a/apps/backend/src/user/user.controller.ts b/apps/backend/src/user/user.controller.ts index 6172c93b..167490a0 100644 --- a/apps/backend/src/user/user.controller.ts +++ b/apps/backend/src/user/user.controller.ts @@ -4,11 +4,11 @@ import { Controller, Delete, Get, + Header, Param, ParseIntPipe, Patch, Post, - Query, StreamableFile, UploadedFile, UseGuards, @@ -109,6 +109,16 @@ export class UserController { return this.userService.findPendingProfilePictures(); } + @Post('profile-pictures/export') + @UseGuards(AuthGuard('jwt'), RolesGuard) + @ApiBearerAuth() + @Roles(Role.BODY_ADMIN) + @Header('Content-Type', 'application/zip') + @Header('Content-Disposition', 'attachment; filename="profile-pictures.zip"') + async exportProfilePictures(@Body('userIds') userIds?: string[]): Promise { + return new StreamableFile(await this.userService.exportProfilePictures(userIds)); + } + @Patch(':id') @UseGuards(AuthGuard('jwt'), RolesGuard) @ApiBearerAuth() diff --git a/apps/backend/src/user/user.service.ts b/apps/backend/src/user/user.service.ts index 851cd2b5..12d480ae 100644 --- a/apps/backend/src/user/user.service.ts +++ b/apps/backend/src/user/user.service.ts @@ -6,6 +6,7 @@ import { UnauthorizedException, } from '@nestjs/common'; import { Prisma, ProfilePictureStatus, User } from '@prisma/client'; +import archiver from 'archiver'; import { PrismaService } from 'nestjs-prisma'; import { optimizeImage } from 'src/util'; @@ -242,6 +243,36 @@ export class UserService { } } + async exportProfilePictures(userIds?: string[]): Promise { + const where: Prisma.ProfilePictureWhereInput = { status: ProfilePictureStatus.ACCEPTED }; + if (userIds && userIds.length > 0) { + where.userId = { in: userIds }; + } + const pictures = await this.prisma.profilePicture.findMany({ + where, + select: { + profileImage: true, + user: { select: { fullName: true, authSchId: true } }, + }, + }); + + return new Promise((resolve, reject) => { + const archive = archiver('zip', { zlib: { level: 0 } }); + const chunks: Buffer[] = []; + archive.on('data', (chunk: Buffer) => chunks.push(chunk)); + archive.on('end', () => resolve(Buffer.concat(chunks))); + archive.on('error', (err: Error) => reject(err)); + + for (const picture of pictures) { + const imageBuffer = Buffer.from(picture.profileImage.buffer); + const safeName = picture.user.fullName.replace(/[^\w\s\-áéíóöőúüűÁÉÍÓÖŐÚÜŰ]/g, '_'); + archive.append(imageBuffer, { name: `${safeName}.jpg` }); + } + + archive.finalize(); + }); + } + async findProfilePicture(authSchId: string): Promise { try { const profilePic = await this.prisma.profilePicture.findUniqueOrThrow({ where: { userId: authSchId } }); diff --git a/apps/frontend/src/app/admin/profile-picture-export/page.tsx b/apps/frontend/src/app/admin/profile-picture-export/page.tsx new file mode 100644 index 00000000..0e23bc0a --- /dev/null +++ b/apps/frontend/src/app/admin/profile-picture-export/page.tsx @@ -0,0 +1,100 @@ +'use client'; +import { useRouter } from 'next/navigation'; +import React from 'react'; +import useSWR from 'swr'; + +import Th1 from '@/components/typography/typography'; +import { Button } from '@/components/ui/button'; +import { Card } from '@/components/ui/card'; +import { Checkbox } from '@/components/ui/checkbox'; +import LoadingCard from '@/components/ui/LoadingCard'; +import { axiosGetFetcher } from '@/lib/fetchers'; +import { exportProfilePictures } from '@/lib/profile-pictures'; +import { ProfilePictureStatus, UserEntityPagination } from '@/types/user-entity'; +import { LuDownload } from 'react-icons/lu'; + +export default function Page() { + const router = useRouter(); + const { data, isLoading } = useSWR('users?page=-1&pageSize=-1', axiosGetFetcher); + const [selectedIds, setSelectedIds] = React.useState>(new Set()); + + const usersWithPictures = React.useMemo( + () => data?.users.filter((u) => u.profilePicture?.status === ProfilePictureStatus.ACCEPTED) ?? [], + [data] + ); + + const allSelected = usersWithPictures.length > 0 && selectedIds.size === usersWithPictures.length; + + const toggleSelectAll = () => { + if (allSelected) { + setSelectedIds(new Set()); + } else { + setSelectedIds(new Set(usersWithPictures.map((u) => u.authSchId))); + } + }; + + const toggleUser = (authSchId: string) => { + setSelectedIds((prev) => { + const next = new Set(prev); + if (next.has(authSchId)) { + next.delete(authSchId); + } else { + next.add(authSchId); + } + return next; + }); + }; + + const handleExport = () => exportProfilePictures(selectedIds.size > 0 ? [...selectedIds] : undefined); + + const exportLabel = selectedIds.size === 0 ? 'mind' : `${selectedIds.size} db`; + + return ( + <> +
+ Profilképek exportálása +
+ + +
+
+ + {isLoading && } + + {!isLoading && usersWithPictures.length === 0 && ( +

Nincs jóváhagyott profilkép.

+ )} + +
+ {usersWithPictures.map((user) => ( + toggleUser(user.authSchId)} + > + toggleUser(user.authSchId)} /> + {user.fullName} +
+

{user.fullName}

+

{user.nickName}

+
+
+ ))} +
+ + + + ); +} diff --git a/apps/frontend/src/app/periods/[id]/data-table.tsx b/apps/frontend/src/app/periods/[id]/data-table.tsx index 2aec974f..83358e44 100644 --- a/apps/frontend/src/app/periods/[id]/data-table.tsx +++ b/apps/frontend/src/app/periods/[id]/data-table.tsx @@ -52,6 +52,7 @@ interface DataTableProps { onExportApplicationsClicked: (data: TData[]) => void; onSetToManufactured: (data: TData[]) => void; onExportToExcelClicked: (data: TData[]) => void; + onExportProfilePicturesClicked: (data: TData[]) => void; } export function DataTable({ @@ -62,6 +63,7 @@ export function DataTable({ onExportPassesClicked, onSetToManufactured, onExportToExcelClicked, + onExportProfilePicturesClicked, }: DataTableProps) { const [sorting, setSorting] = React.useState([ { @@ -216,6 +218,13 @@ export function DataTable({ > Minden kiosztott jelentkezés exportálása Excel file-ba + + onExportProfilePicturesClicked(data.filter((_, i) => rowSelection[i]))} + > + Kijelöltek profilképeinek exportálása + diff --git a/apps/frontend/src/app/periods/[id]/page.tsx b/apps/frontend/src/app/periods/[id]/page.tsx index ded99048..63f3878a 100644 --- a/apps/frontend/src/app/periods/[id]/page.tsx +++ b/apps/frontend/src/app/periods/[id]/page.tsx @@ -20,6 +20,7 @@ import { toast } from '@/lib/use-toast'; import { ApplicationEntity, ApplicationStatus } from '@/types/application-entity'; import { generateXlsx } from '@/lib/xlsx'; +import { exportProfilePictures } from '@/lib/profile-pictures'; import { saveAs } from 'file-saver'; import { ApplicationExport } from './application-export'; import { PassExport } from './pass-export'; @@ -194,6 +195,9 @@ export default function Page(props: { params: Promise<{ id: number }> }) { * This function exports the selected applications which have the status {@link ApplicationStatus.DISTRIBUTED} * to an Excel file. */ + const onExportProfilePictures = (data: ApplicationEntity[]) => + exportProfilePictures(data.map((a) => a.user.authSchId)); + const onExportToExcel = async (data: ApplicationEntity[]) => { const distributedApplications = data.filter((a) => a.status === getStatusKey(ApplicationStatus.DISTRIBUTED)); @@ -278,6 +282,7 @@ export default function Page(props: { params: Promise<{ id: number }> }) { onExportApplicationsClicked={onApplicationsExport} onSetToManufactured={onSetToManufactured} onExportToExcelClicked={onExportToExcel} + onExportProfilePicturesClicked={onExportProfilePictures} /> )} diff --git a/apps/frontend/src/app/roles/page.tsx b/apps/frontend/src/app/roles/page.tsx index c13a28f4..88656485 100644 --- a/apps/frontend/src/app/roles/page.tsx +++ b/apps/frontend/src/app/roles/page.tsx @@ -1,24 +1,29 @@ 'use client'; +import { useRouter } from 'next/navigation'; import React from 'react'; import api from '@/components/network/apiSetup'; import Th1 from '@/components/typography/typography'; import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import LoadingCard from '@/components/ui/LoadingCard'; import NotFoundCard from '@/components/ui/NotFoundCard'; import OwnPagination from '@/components/ui/ownPagination'; import UserCard from '@/components/ui/UserCard'; import { useUsers } from '@/hooks/useUsers'; +import { exportProfilePictures } from '@/lib/profile-pictures'; import { toast } from '@/lib/use-toast'; import { Role } from '@/types/user-entity'; +import { LuDownload } from 'react-icons/lu'; export default function Page() { + const router = useRouter(); const [search, setSearch] = React.useState(''); const [pageIndex, setPageIndex] = React.useState(0); const users = useUsers(search, pageIndex); - async function onChange(newRole: Role, userId: string) { + async function onRoleChange(newRole: Role, userId: string) { try { await api.patch(`/users/${userId}`, { role: newRole }); await users.mutate(); @@ -32,11 +37,19 @@ export default function Page() { } } + async function mutateUsers() { + await users.mutate(); + } + return ( <>
Jogosultságok kezelése
+ onChange(newRole, user.authSchId)} + onChange={(newRole: Role) => onRoleChange(newRole, user.authSchId)} + mutateUsers={mutateUsers} /> ))}
diff --git a/apps/frontend/src/components/ui/UserCard.tsx b/apps/frontend/src/components/ui/UserCard.tsx index 4b6e621e..d0d2f95e 100644 --- a/apps/frontend/src/components/ui/UserCard.tsx +++ b/apps/frontend/src/components/ui/UserCard.tsx @@ -1,6 +1,6 @@ import { Card, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { RoleBadgeSelector } from '@/components/ui/RoleBadgeSelector'; -import { Role, UserEntity } from '@/types/user-entity'; +import { ProfilePictureStatus, Role, UserEntity } from '@/types/user-entity'; import Image from 'next/image'; import { LuPencil, LuUser, LuUserCheck, LuUserMinus, LuUserSearch } from 'react-icons/lu'; import api from '@/components/network/apiSetup'; @@ -8,27 +8,34 @@ import { toast } from '@/lib/use-toast'; import { Button } from '@/components/ui/button'; /*admin component*/ -export default function UserCard(props: { user: UserEntity; onChange: (newRole: Role) => Promise }) { +export default function UserCard(props: { + user: UserEntity; + onChange: (newRole: Role) => Promise; + mutateUsers: () => Promise; +}) { async function sendStatusChange(string: string) { const resp = await api.patch('/users/' + props.user.authSchId + '/profile-picture/' + string); toast({ title: 'Profilkép státusz módosítva!', description: resp.statusText, }); + await props.mutateUsers(); } + // @ts-ignore return (
KEP
+

{props.user.authSchId}

{props.user.fullName}

@@ -52,20 +59,24 @@ export default function UserCard(props: { user: UserEntity; onChange: (newRole:

- diff --git a/apps/frontend/src/components/ui/generating-dialog.tsx b/apps/frontend/src/components/ui/generating-dialog.tsx index 8b9fc06c..beb2bb19 100644 --- a/apps/frontend/src/components/ui/generating-dialog.tsx +++ b/apps/frontend/src/components/ui/generating-dialog.tsx @@ -1,12 +1,11 @@ import { CgSandClock } from 'react-icons/cg'; import { Th2 } from '../typography/typography'; -import { Dialog, DialogContent, DialogTitle } from './dialog'; +import { Dialog, DialogContent } from './dialog'; export function GeneratingDialog({ open }: { open: boolean }) { return ( - Dolgozunk rajta!
diff --git a/apps/frontend/src/lib/profile-pictures.ts b/apps/frontend/src/lib/profile-pictures.ts new file mode 100644 index 00000000..873d53c8 --- /dev/null +++ b/apps/frontend/src/lib/profile-pictures.ts @@ -0,0 +1,17 @@ +import api from '@/components/network/apiSetup'; + +export const exportProfilePictures = async (userIds?: string[]) => { + const response = await api.post( + 'users/profile-pictures/export', + { userIds: userIds ?? [] }, + { responseType: 'blob' } + ); + const objectUrl = URL.createObjectURL(new Blob([response.data], { type: 'application/zip' })); + const link = document.createElement('a'); + link.href = objectUrl; + link.download = 'profile-pictures.zip'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(objectUrl); +}; diff --git a/apps/frontend/src/middleware.ts b/apps/frontend/src/middleware.ts index 7dda2e30..0ef426eb 100644 --- a/apps/frontend/src/middleware.ts +++ b/apps/frontend/src/middleware.ts @@ -20,7 +20,8 @@ export function middleware(request: NextRequest) { if ( request.nextUrl.pathname.startsWith('/periods') || request.nextUrl.pathname.startsWith('/roles') || - request.nextUrl.pathname.startsWith('/profile-picture-check') + request.nextUrl.pathname.startsWith('/profile-picture-check') || + request.nextUrl.pathname.startsWith('/admin') ) { if (role === 'BODY_MEMBER' || role === 'BODY_ADMIN' || role === 'SUPERUSER') { return NextResponse.next(); @@ -39,5 +40,7 @@ export const config = { '/periods/:path*', '/profile-picture-check', '/roles', + '/admin', + '/admin/:path*', ], }; diff --git a/apps/frontend/src/types/user-entity.ts b/apps/frontend/src/types/user-entity.ts index 8a1c9173..247e149c 100644 --- a/apps/frontend/src/types/user-entity.ts +++ b/apps/frontend/src/types/user-entity.ts @@ -6,9 +6,9 @@ export enum Role { } export enum ProfilePictureStatus { - ACCEPTED = 'Jóváhagyott profilkép', - PENDING = 'Elbírálás alatt álló profilkép', - REJECTED = 'Elutasított profilkép', + ACCEPTED = 'ACCEPTED', + PENDING = 'PENDING', + REJECTED = 'REJECTED', } export type UserEntity = { From d766a34d7944f10a97f8199f23e9cfb82b12e033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Mozs=C3=A1r?= Date: Mon, 23 Feb 2026 11:07:44 +0100 Subject: [PATCH 2/5] added yarn.lock --- yarn.lock | 716 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 657 insertions(+), 59 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1365a0e3..3e1a6449 100644 --- a/yarn.lock +++ b/yarn.lock @@ -474,6 +474,15 @@ __metadata: languageName: node linkType: hard +"@emnapi/runtime@npm:^1.7.0": + version: 1.8.1 + resolution: "@emnapi/runtime@npm:1.8.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f4929d75e37aafb24da77d2f58816761fe3f826aad2e37fa6d4421dac9060cbd5098eea1ac3c9ecc4526b89deb58153852fa432f87021dc57863f2ff726d713f + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.25.1": version: 0.25.1 resolution: "@esbuild/aix-ppc64@npm:0.25.1" @@ -838,6 +847,13 @@ __metadata: languageName: node linkType: hard +"@img/colour@npm:^1.0.0": + version: 1.0.0 + resolution: "@img/colour@npm:1.0.0" + checksum: 10c0/02261719c1e0d7aa5a2d585981954f2ac126f0c432400aa1a01b925aa2c41417b7695da8544ee04fd29eba7ecea8eaf9b8bef06f19dc8faba78f94eeac40667d + languageName: node + linkType: hard + "@img/sharp-darwin-arm64@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-darwin-arm64@npm:0.33.5" @@ -850,6 +866,18 @@ __metadata: languageName: node linkType: hard +"@img/sharp-darwin-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-arm64": + optional: true + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@img/sharp-darwin-x64@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-darwin-x64@npm:0.33.5" @@ -862,6 +890,18 @@ __metadata: languageName: node linkType: hard +"@img/sharp-darwin-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-x64": + optional: true + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@img/sharp-libvips-darwin-arm64@npm:1.0.4": version: 1.0.4 resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.4" @@ -869,6 +909,13 @@ __metadata: languageName: node linkType: hard +"@img/sharp-libvips-darwin-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.2.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@img/sharp-libvips-darwin-x64@npm:1.0.4": version: 1.0.4 resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.4" @@ -876,6 +923,13 @@ __metadata: languageName: node linkType: hard +"@img/sharp-libvips-darwin-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.2.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@img/sharp-libvips-linux-arm64@npm:1.0.4": version: 1.0.4 resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.4" @@ -883,6 +937,13 @@ __metadata: languageName: node linkType: hard +"@img/sharp-libvips-linux-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@img/sharp-libvips-linux-arm@npm:1.0.5": version: 1.0.5 resolution: "@img/sharp-libvips-linux-arm@npm:1.0.5" @@ -890,6 +951,27 @@ __metadata: languageName: node linkType: hard +"@img/sharp-libvips-linux-arm@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm@npm:1.2.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-ppc64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-ppc64@npm:1.2.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-riscv64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-riscv64@npm:1.2.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + "@img/sharp-libvips-linux-s390x@npm:1.0.4": version: 1.0.4 resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.4" @@ -897,6 +979,13 @@ __metadata: languageName: node linkType: hard +"@img/sharp-libvips-linux-s390x@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.2.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + "@img/sharp-libvips-linux-x64@npm:1.0.4": version: 1.0.4 resolution: "@img/sharp-libvips-linux-x64@npm:1.0.4" @@ -904,6 +993,13 @@ __metadata: languageName: node linkType: hard +"@img/sharp-libvips-linux-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4": version: 1.0.4 resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4" @@ -911,6 +1007,13 @@ __metadata: languageName: node linkType: hard +"@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@img/sharp-libvips-linuxmusl-x64@npm:1.0.4": version: 1.0.4 resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.4" @@ -918,6 +1021,13 @@ __metadata: languageName: node linkType: hard +"@img/sharp-libvips-linuxmusl-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@img/sharp-linux-arm64@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-linux-arm64@npm:0.33.5" @@ -930,6 +1040,18 @@ __metadata: languageName: node linkType: hard +"@img/sharp-linux-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@img/sharp-linux-arm@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-linux-arm@npm:0.33.5" @@ -942,6 +1064,42 @@ __metadata: languageName: node linkType: hard +"@img/sharp-linux-arm@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm": + optional: true + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-ppc64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-ppc64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-ppc64": + optional: true + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-riscv64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-riscv64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-riscv64": + optional: true + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + "@img/sharp-linux-s390x@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-linux-s390x@npm:0.33.5" @@ -954,6 +1112,18 @@ __metadata: languageName: node linkType: hard +"@img/sharp-linux-s390x@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-s390x@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-s390x": + optional: true + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + "@img/sharp-linux-x64@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-linux-x64@npm:0.33.5" @@ -966,6 +1136,18 @@ __metadata: languageName: node linkType: hard +"@img/sharp-linux-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@img/sharp-linuxmusl-arm64@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.5" @@ -978,6 +1160,18 @@ __metadata: languageName: node linkType: hard +"@img/sharp-linuxmusl-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@img/sharp-linuxmusl-x64@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-linuxmusl-x64@npm:0.33.5" @@ -990,6 +1184,18 @@ __metadata: languageName: node linkType: hard +"@img/sharp-linuxmusl-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@img/sharp-wasm32@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-wasm32@npm:0.33.5" @@ -999,6 +1205,22 @@ __metadata: languageName: node linkType: hard +"@img/sharp-wasm32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-wasm32@npm:0.34.5" + dependencies: + "@emnapi/runtime": "npm:^1.7.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@img/sharp-win32-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-arm64@npm:0.34.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@img/sharp-win32-ia32@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-win32-ia32@npm:0.33.5" @@ -1006,6 +1228,13 @@ __metadata: languageName: node linkType: hard +"@img/sharp-win32-ia32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-ia32@npm:0.34.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@img/sharp-win32-x64@npm:0.33.5": version: 0.33.5 resolution: "@img/sharp-win32-x64@npm:0.33.5" @@ -1013,6 +1242,13 @@ __metadata: languageName: node linkType: hard +"@img/sharp-win32-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-x64@npm:0.34.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -1352,9 +1588,11 @@ __metadata: "@nestjs/swagger": "npm:^8.1.1" "@prisma/client": "npm:^6.5.0" "@radix-ui/react-dialog": "npm:^1.1.4" + "@types/archiver": "npm:^7.0.0" "@types/express": "npm:^5.0.0" "@types/multer": "npm:^1.4.12" "@types/node": "npm:^20.17.12" + archiver: "npm:^7.0.1" class-transformer: "npm:^0.5.1" class-validator: "npm:^0.14.1" eslint: "npm:^9.18.0" @@ -1381,7 +1619,7 @@ __metadata: resolution: "@next-nest-template/frontend@workspace:apps/frontend" dependencies: "@hookform/resolvers": "npm:^3.10.0" - "@next/eslint-plugin-next": "npm:15.2.2" + "@next/eslint-plugin-next": "npm:^16.0.10" "@radix-ui/react-accordion": "npm:^1.2.2" "@radix-ui/react-alert-dialog": "npm:^1.1.4" "@radix-ui/react-aspect-ratio": "npm:^1.1.1" @@ -1433,7 +1671,7 @@ __metadata: js-cookie: "npm:^3.0.5" jsonwebtoken: "npm:^9.0.2" lucide-react: "npm:^0.471.1" - next: "npm:15.2.2" + next: "npm:15.4.8" postcss: "npm:^8.5.0" react: "npm:19.0.0" react-day-picker: "npm:8.10.1" @@ -1453,10 +1691,10 @@ __metadata: languageName: unknown linkType: soft -"@next/env@npm:15.2.2": - version: 15.2.2 - resolution: "@next/env@npm:15.2.2" - checksum: 10c0/a5188353cbbb955f4c87b1d04f8d9419af3f05086b5bf640f456d3e0cd810f17811ca0a29a0b5e492d96ce636eeedc6e306f7dd191c82ff8076c00123481709c +"@next/env@npm:15.4.8": + version: 15.4.8 + resolution: "@next/env@npm:15.4.8" + checksum: 10c0/6b0555e30c175a04781a75f0ddc2630bea1af0f31bac0c7875d6063bec9fb2ee50ccf6a3965e532604f40a2c98f1ceb8eb52283b449ba4345ab1b50a0fde8b88 languageName: node linkType: hard @@ -1469,58 +1707,67 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.2.2": - version: 15.2.2 - resolution: "@next/swc-darwin-arm64@npm:15.2.2" +"@next/eslint-plugin-next@npm:^16.0.10": + version: 16.1.6 + resolution: "@next/eslint-plugin-next@npm:16.1.6" + dependencies: + fast-glob: "npm:3.3.1" + checksum: 10c0/1498ded3421326738411eb11e794a5ef6aa01daeff0d89a12d05f360984527ccce2cc9588cc11477ee0e4b09a7570a640e7b6ff79ee3eb49c8cf0fc6b105a24b + languageName: node + linkType: hard + +"@next/swc-darwin-arm64@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-darwin-arm64@npm:15.4.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.2.2": - version: 15.2.2 - resolution: "@next/swc-darwin-x64@npm:15.2.2" +"@next/swc-darwin-x64@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-darwin-x64@npm:15.4.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.2.2": - version: 15.2.2 - resolution: "@next/swc-linux-arm64-gnu@npm:15.2.2" +"@next/swc-linux-arm64-gnu@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-linux-arm64-gnu@npm:15.4.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.2.2": - version: 15.2.2 - resolution: "@next/swc-linux-arm64-musl@npm:15.2.2" +"@next/swc-linux-arm64-musl@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-linux-arm64-musl@npm:15.4.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.2.2": - version: 15.2.2 - resolution: "@next/swc-linux-x64-gnu@npm:15.2.2" +"@next/swc-linux-x64-gnu@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-linux-x64-gnu@npm:15.4.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.2.2": - version: 15.2.2 - resolution: "@next/swc-linux-x64-musl@npm:15.2.2" +"@next/swc-linux-x64-musl@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-linux-x64-musl@npm:15.4.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.2.2": - version: 15.2.2 - resolution: "@next/swc-win32-arm64-msvc@npm:15.2.2" +"@next/swc-win32-arm64-msvc@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-win32-arm64-msvc@npm:15.4.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.2.2": - version: 15.2.2 - resolution: "@next/swc-win32-x64-msvc@npm:15.2.2" +"@next/swc-win32-x64-msvc@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-win32-x64-msvc@npm:15.4.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2992,13 +3239,6 @@ __metadata: languageName: node linkType: hard -"@swc/counter@npm:0.1.3": - version: 0.1.3 - resolution: "@swc/counter@npm:0.1.3" - checksum: 10c0/8424f60f6bf8694cfd2a9bca45845bce29f26105cda8cf19cdb9fd3e78dc6338699e4db77a89ae449260bafa1cc6bec307e81e7fb96dbf7dcfce0eea55151356 - languageName: node - linkType: hard - "@swc/helpers@npm:0.5.15": version: 0.5.15 resolution: "@swc/helpers@npm:0.5.15" @@ -3379,6 +3619,15 @@ __metadata: languageName: node linkType: hard +"@types/archiver@npm:^7.0.0": + version: 7.0.0 + resolution: "@types/archiver@npm:7.0.0" + dependencies: + "@types/readdir-glob": "npm:*" + checksum: 10c0/30fe68377e3fbdd9691235bca1c99e1d6ac9c850156a56abc09fa3ed7777c520a260cbee6a1c796994a5adee96dcdc6dd3742cc4444aca713e2611c6b6d1f73d + languageName: node + linkType: hard + "@types/body-parser@npm:*": version: 1.19.5 resolution: "@types/body-parser@npm:1.19.5" @@ -3607,6 +3856,15 @@ __metadata: languageName: node linkType: hard +"@types/readdir-glob@npm:*": + version: 1.1.5 + resolution: "@types/readdir-glob@npm:1.1.5" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/46849136a3b5246105bca0303aab80552a9ff67e024e77ef1845a806a24c1a621dfcba0e4ee5a00ebad17f51edb80928f2dd6dc510a1d9897f3bc22ed64e5cbd + languageName: node + linkType: hard + "@types/semver@npm:^7.5.0": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" @@ -4172,6 +4430,15 @@ __metadata: languageName: node linkType: hard +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: "npm:^5.0.0" + checksum: 10c0/90ccc50f010250152509a344eb2e71977fbf8db0ab8f1061197e3275ddf6c61a41a6edfd7b9409c664513131dd96e962065415325ef23efa5db931b382d24ca5 + languageName: node + linkType: hard + "abs-svg-path@npm:^0.1.1": version: 0.1.1 resolution: "abs-svg-path@npm:0.1.1" @@ -4415,6 +4682,36 @@ __metadata: languageName: node linkType: hard +"archiver-utils@npm:^5.0.0, archiver-utils@npm:^5.0.2": + version: 5.0.2 + resolution: "archiver-utils@npm:5.0.2" + dependencies: + glob: "npm:^10.0.0" + graceful-fs: "npm:^4.2.0" + is-stream: "npm:^2.0.1" + lazystream: "npm:^1.0.0" + lodash: "npm:^4.17.15" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/3782c5fa9922186aa1a8e41ed0c2867569faa5f15c8e5e6418ea4c1b730b476e21bd68270b3ea457daf459ae23aaea070b2b9f90cf90a59def8dc79b9e4ef538 + languageName: node + linkType: hard + +"archiver@npm:^7.0.1": + version: 7.0.1 + resolution: "archiver@npm:7.0.1" + dependencies: + archiver-utils: "npm:^5.0.2" + async: "npm:^3.2.4" + buffer-crc32: "npm:^1.0.0" + readable-stream: "npm:^4.0.0" + readdir-glob: "npm:^1.1.2" + tar-stream: "npm:^3.0.0" + zip-stream: "npm:^6.0.1" + checksum: 10c0/02afd87ca16f6184f752db8e26884e6eff911c476812a0e7f7b26c4beb09f06119807f388a8e26ed2558aa8ba9db28646ebd147a4f99e46813b8b43158e1438e + languageName: node + linkType: hard + "arg@npm:^4.1.0": version: 4.1.3 resolution: "arg@npm:4.1.3" @@ -4638,6 +4935,13 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.2.4": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -4690,6 +4994,18 @@ __metadata: languageName: node linkType: hard +"b4a@npm:^1.6.4": + version: 1.8.0 + resolution: "b4a@npm:1.8.0" + peerDependencies: + react-native-b4a: "*" + peerDependenciesMeta: + react-native-b4a: + optional: true + checksum: 10c0/27eab5c50ea1f1314f36256f160d2e6d6950f55f02ee4942732ecafd8bcc4b3a2ed209fab532b288770d41df2befa97a2745175c06471875b716eb87abf31519 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -4697,6 +5013,18 @@ __metadata: languageName: node linkType: hard +"bare-events@npm:^2.7.0": + version: 2.8.2 + resolution: "bare-events@npm:2.8.2" + peerDependencies: + bare-abort-controller: "*" + peerDependenciesMeta: + bare-abort-controller: + optional: true + checksum: 10c0/53fef240cf2cdcca62f78b6eead90ddb5a59b0929f414b13a63764c2b4f9de98ea8a578d033b04d64bb7b86dfbc402e937984e69950855cc3754c7b63da7db21 + languageName: node + linkType: hard + "base64-js@npm:^1.1.2, base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -4836,6 +5164,13 @@ __metadata: languageName: node linkType: hard +"buffer-crc32@npm:^1.0.0": + version: 1.0.0 + resolution: "buffer-crc32@npm:1.0.0" + checksum: 10c0/8b86e161cee4bb48d5fa622cbae4c18f25e4857e5203b89e23de59e627ab26beb82d9d7999f2b8de02580165f61f83f997beaf02980cdf06affd175b651921ab + languageName: node + linkType: hard + "buffer-equal-constant-time@npm:1.0.1": version: 1.0.1 resolution: "buffer-equal-constant-time@npm:1.0.1" @@ -4870,7 +5205,7 @@ __metadata: languageName: node linkType: hard -"busboy@npm:1.6.0, busboy@npm:^1.0.0": +"busboy@npm:^1.0.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" dependencies: @@ -5326,6 +5661,19 @@ __metadata: languageName: node linkType: hard +"compress-commons@npm:^6.0.2": + version: 6.0.2 + resolution: "compress-commons@npm:6.0.2" + dependencies: + crc-32: "npm:^1.2.0" + crc32-stream: "npm:^6.0.0" + is-stream: "npm:^2.0.1" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/2347031b7c92c8ed5011b07b93ec53b298fa2cd1800897532ac4d4d1aeae06567883f481b6e35f13b65fc31b190c751df6635434d525562f0203fde76f1f0814 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -5441,7 +5789,7 @@ __metadata: languageName: node linkType: hard -"crc-32@npm:~1.2.0, crc-32@npm:~1.2.1": +"crc-32@npm:^1.2.0, crc-32@npm:~1.2.0, crc-32@npm:~1.2.1": version: 1.2.2 resolution: "crc-32@npm:1.2.2" bin: @@ -5450,6 +5798,16 @@ __metadata: languageName: node linkType: hard +"crc32-stream@npm:^6.0.0": + version: 6.0.0 + resolution: "crc32-stream@npm:6.0.0" + dependencies: + crc-32: "npm:^1.2.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/bf9c84571ede2d119c2b4f3a9ef5eeb9ff94b588493c0d3862259af86d3679dcce1c8569dd2b0a6eff2f35f5e2081cc1263b846d2538d4054da78cf34f262a3d + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -5706,6 +6064,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.1.2": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 + languageName: node + linkType: hard + "detect-node-es@npm:^1.1.0": version: 1.1.0 resolution: "detect-node-es@npm:1.1.0" @@ -6656,6 +7021,22 @@ __metadata: languageName: node linkType: hard +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 10c0/0255d9f936215fd206156fd4caa9e8d35e62075d720dc7d847e89b417e5e62cf1ce6c9b4e0a1633a9256de0efefaf9f8d26924b1f3c8620cffb9db78e7d3076b + languageName: node + linkType: hard + +"events-universal@npm:^1.0.0": + version: 1.0.1 + resolution: "events-universal@npm:1.0.1" + dependencies: + bare-events: "npm:^2.7.0" + checksum: 10c0/a1d9a5e9f95843650f8ec240dd1221454c110189a9813f32cdf7185759b43f1f964367ac7dca4ebc69150b59043f2d77c7e122b0d03abf7c25477ea5494785a5 + languageName: node + linkType: hard + "events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -6751,6 +7132,13 @@ __metadata: languageName: node linkType: hard +"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 10c0/d53f6f786875e8b0529f784b59b4b05d4b5c31c651710496440006a398389a579c8dbcd2081311478b5bf77f4b0b21de69109c5a4eabea9d8e8783d1eb864e4c + languageName: node + linkType: hard + "fast-glob@npm:3.3.1": version: 3.3.1 resolution: "fast-glob@npm:3.3.1" @@ -7279,6 +7667,22 @@ __metadata: languageName: node linkType: hard +"glob@npm:^10.0.0": + version: 10.5.0 + resolution: "glob@npm:10.5.0" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/100705eddbde6323e7b35e1d1ac28bcb58322095bd8e63a7d0bef1a2cdafe0d0f7922a981b2b48369a4f8c1b077be5c171804534c3509dfe950dde15fbe6d828 + languageName: node + linkType: hard + "glob@npm:^11.0.0": version: 11.0.0 resolution: "glob@npm:11.0.0" @@ -8008,6 +8412,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^2.0.1": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + "is-stream@npm:^3.0.0": version: 3.0.0 resolution: "is-stream@npm:3.0.0" @@ -8441,6 +8852,15 @@ __metadata: languageName: node linkType: hard +"lazystream@npm:^1.0.0": + version: 1.0.1 + resolution: "lazystream@npm:1.0.1" + dependencies: + readable-stream: "npm:^2.0.5" + checksum: 10c0/ea4e509a5226ecfcc303ba6782cc269be8867d372b9bcbd625c88955df1987ea1a20da4643bf9270336415a398d33531ebf0d5f0d393b9283dc7c98bfcbd7b69 + languageName: node + linkType: hard + "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -8581,6 +9001,13 @@ __metadata: languageName: node linkType: hard +"lodash@npm:^4.17.15": + version: 4.17.23 + resolution: "lodash@npm:4.17.23" + checksum: 10c0/1264a90469f5bb95d4739c43eb6277d15b6d9e186df4ac68c3620443160fc669e2f14c11e7d8b2ccf078b81d06147c01a8ccced9aab9f9f63d50dcf8cace6bf6 + languageName: node + linkType: hard + "log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" @@ -8846,6 +9273,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^5.1.0": + version: 5.1.7 + resolution: "minimatch@npm:5.1.7" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/db29063fba9929d07cec7a08386849f4c18b6ffabf1836bd0ab70715f83ff8f596efb354dbc1f5a36653357d06a8b98bb5e3d82159306a9f84ba7ab296e4fa27 + languageName: node + linkType: hard + "minimatch@npm:^7.4.3": version: 7.4.6 resolution: "minimatch@npm:7.4.6" @@ -9137,29 +9573,27 @@ __metadata: languageName: unknown linkType: soft -"next@npm:15.2.2": - version: 15.2.2 - resolution: "next@npm:15.2.2" - dependencies: - "@next/env": "npm:15.2.2" - "@next/swc-darwin-arm64": "npm:15.2.2" - "@next/swc-darwin-x64": "npm:15.2.2" - "@next/swc-linux-arm64-gnu": "npm:15.2.2" - "@next/swc-linux-arm64-musl": "npm:15.2.2" - "@next/swc-linux-x64-gnu": "npm:15.2.2" - "@next/swc-linux-x64-musl": "npm:15.2.2" - "@next/swc-win32-arm64-msvc": "npm:15.2.2" - "@next/swc-win32-x64-msvc": "npm:15.2.2" - "@swc/counter": "npm:0.1.3" +"next@npm:15.4.8": + version: 15.4.8 + resolution: "next@npm:15.4.8" + dependencies: + "@next/env": "npm:15.4.8" + "@next/swc-darwin-arm64": "npm:15.4.8" + "@next/swc-darwin-x64": "npm:15.4.8" + "@next/swc-linux-arm64-gnu": "npm:15.4.8" + "@next/swc-linux-arm64-musl": "npm:15.4.8" + "@next/swc-linux-x64-gnu": "npm:15.4.8" + "@next/swc-linux-x64-musl": "npm:15.4.8" + "@next/swc-win32-arm64-msvc": "npm:15.4.8" + "@next/swc-win32-x64-msvc": "npm:15.4.8" "@swc/helpers": "npm:0.5.15" - busboy: "npm:1.6.0" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" - sharp: "npm:^0.33.5" + sharp: "npm:^0.34.3" styled-jsx: "npm:5.1.6" peerDependencies: "@opentelemetry/api": ^1.1.0 - "@playwright/test": ^1.41.2 + "@playwright/test": ^1.51.1 babel-plugin-react-compiler: "*" react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -9194,7 +9628,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/ed303ae014fa8236afa556d178fe426a81aa2baebff912dfbfbb9178a955cbc7d528d27608b66d6d9fb5b33a415ad550cdd984d9b6dbc2a6ff7f2d991b760029 + checksum: 10c0/4bbeb66d2db81f7f8580b3db0e14569bf09d71b958a3c65ddfb23015f316f3b85a4bf32349c9d21b03a61cd31b7d4e19829ff625b71dbde6ab0aa8db60bacd90 languageName: node linkType: hard @@ -9956,6 +10390,13 @@ __metadata: languageName: node linkType: hard +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -10483,7 +10924,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.2.2": +"readable-stream@npm:^2.0.5, readable-stream@npm:^2.2.2": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -10509,6 +10950,28 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^4.0.0": + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" + dependencies: + abort-controller: "npm:^3.0.0" + buffer: "npm:^6.0.3" + events: "npm:^3.3.0" + process: "npm:^0.11.10" + string_decoder: "npm:^1.3.0" + checksum: 10c0/fd86d068da21cfdb10f7a4479f2e47d9c0a9b0c862fc0c840a7e5360201580a55ac399c764b12a4f6fa291f8cee74d9c4b7562e0d53b3c4b2769f2c98155d957 + languageName: node + linkType: hard + +"readdir-glob@npm:^1.1.2": + version: 1.1.3 + resolution: "readdir-glob@npm:1.1.3" + dependencies: + minimatch: "npm:^5.1.0" + checksum: 10c0/a37e0716726650845d761f1041387acd93aa91b28dd5381950733f994b6c349ddc1e21e266ec7cc1f9b92e205a7a972232f9b89d5424d07361c2c3753d5dbace + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -10896,6 +11359,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.7.3": + version: 7.7.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 + languageName: node + linkType: hard + "send@npm:0.19.0": version: 0.19.0 resolution: "send@npm:0.19.0" @@ -11081,6 +11553,90 @@ __metadata: languageName: node linkType: hard +"sharp@npm:^0.34.3": + version: 0.34.5 + resolution: "sharp@npm:0.34.5" + dependencies: + "@img/colour": "npm:^1.0.0" + "@img/sharp-darwin-arm64": "npm:0.34.5" + "@img/sharp-darwin-x64": "npm:0.34.5" + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + "@img/sharp-linux-arm": "npm:0.34.5" + "@img/sharp-linux-arm64": "npm:0.34.5" + "@img/sharp-linux-ppc64": "npm:0.34.5" + "@img/sharp-linux-riscv64": "npm:0.34.5" + "@img/sharp-linux-s390x": "npm:0.34.5" + "@img/sharp-linux-x64": "npm:0.34.5" + "@img/sharp-linuxmusl-arm64": "npm:0.34.5" + "@img/sharp-linuxmusl-x64": "npm:0.34.5" + "@img/sharp-wasm32": "npm:0.34.5" + "@img/sharp-win32-arm64": "npm:0.34.5" + "@img/sharp-win32-ia32": "npm:0.34.5" + "@img/sharp-win32-x64": "npm:0.34.5" + detect-libc: "npm:^2.1.2" + semver: "npm:^7.7.3" + dependenciesMeta: + "@img/sharp-darwin-arm64": + optional: true + "@img/sharp-darwin-x64": + optional: true + "@img/sharp-libvips-darwin-arm64": + optional: true + "@img/sharp-libvips-darwin-x64": + optional: true + "@img/sharp-libvips-linux-arm": + optional: true + "@img/sharp-libvips-linux-arm64": + optional: true + "@img/sharp-libvips-linux-ppc64": + optional: true + "@img/sharp-libvips-linux-riscv64": + optional: true + "@img/sharp-libvips-linux-s390x": + optional: true + "@img/sharp-libvips-linux-x64": + optional: true + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + "@img/sharp-libvips-linuxmusl-x64": + optional: true + "@img/sharp-linux-arm": + optional: true + "@img/sharp-linux-arm64": + optional: true + "@img/sharp-linux-ppc64": + optional: true + "@img/sharp-linux-riscv64": + optional: true + "@img/sharp-linux-s390x": + optional: true + "@img/sharp-linux-x64": + optional: true + "@img/sharp-linuxmusl-arm64": + optional: true + "@img/sharp-linuxmusl-x64": + optional: true + "@img/sharp-wasm32": + optional: true + "@img/sharp-win32-arm64": + optional: true + "@img/sharp-win32-ia32": + optional: true + "@img/sharp-win32-x64": + optional: true + checksum: 10c0/fd79e29df0597a7d5704b8461c51f944ead91a5243691697be6e8243b966402beda53ddc6f0a53b96ea3cb8221f0b244aa588114d3ebf8734fb4aefd41ab802f + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -11340,6 +11896,17 @@ __metadata: languageName: node linkType: hard +"streamx@npm:^2.15.0": + version: 2.23.0 + resolution: "streamx@npm:2.23.0" + dependencies: + events-universal: "npm:^1.0.0" + fast-fifo: "npm:^1.3.2" + text-decoder: "npm:^1.1.0" + checksum: 10c0/15708ce37818d588632fe1104e8febde573e33e8c0868bf583fce0703f3faf8d2a063c278e30df2270206811b69997f64eb78792099933a1fe757e786fbcbd44 + languageName: node + linkType: hard + "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -11476,7 +12043,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1": +"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -11724,6 +12291,17 @@ __metadata: languageName: node linkType: hard +"tar-stream@npm:^3.0.0": + version: 3.1.7 + resolution: "tar-stream@npm:3.1.7" + dependencies: + b4a: "npm:^1.6.4" + fast-fifo: "npm:^1.2.0" + streamx: "npm:^2.15.0" + checksum: 10c0/a09199d21f8714bd729993ac49b6c8efcb808b544b89f23378ad6ffff6d1cb540878614ba9d4cfec11a64ef39e1a6f009a5398371491eb1fda606ffc7f70f718 + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -11774,6 +12352,15 @@ __metadata: languageName: node linkType: hard +"text-decoder@npm:^1.1.0": + version: 1.2.7 + resolution: "text-decoder@npm:1.2.7" + dependencies: + b4a: "npm:^1.6.4" + checksum: 10c0/929938ed154fbadb660a7f3d1aca30b7e53649a731af7583168fcfba0c158046325d35d945926e2a512bb62d1a49a7818151c987ea38b48853f01e1615722fc5 + languageName: node + linkType: hard + "thenify-all@npm:^1.0.0": version: 1.6.0 resolution: "thenify-all@npm:1.6.0" @@ -12807,6 +13394,17 @@ __metadata: languageName: node linkType: hard +"zip-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "zip-stream@npm:6.0.1" + dependencies: + archiver-utils: "npm:^5.0.0" + compress-commons: "npm:^6.0.2" + readable-stream: "npm:^4.0.0" + checksum: 10c0/50f2fb30327fb9d09879abf7ae2493705313adf403e794b030151aaae00009162419d60d0519e807673ec04d442e140c8879ca14314df0a0192de3b233e8f28b + languageName: node + linkType: hard + "zod@npm:^3.20.2": version: 3.23.8 resolution: "zod@npm:3.23.8" From 2050e998af903413ec4c1347e1744a18c5102ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Mozs=C3=A1r?= Date: Mon, 23 Feb 2026 11:14:55 +0100 Subject: [PATCH 3/5] minor fixes --- apps/backend/src/user/user.service.ts | 7 ++-- apps/frontend/src/app/roles/page.tsx | 2 -- apps/frontend/src/components/ui/UserCard.tsx | 1 - apps/frontend/src/lib/profile-pictures.ts | 38 +++++++++++++------- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/apps/backend/src/user/user.service.ts b/apps/backend/src/user/user.service.ts index 12d480ae..6a8d1aea 100644 --- a/apps/backend/src/user/user.service.ts +++ b/apps/backend/src/user/user.service.ts @@ -257,7 +257,7 @@ export class UserService { }); return new Promise((resolve, reject) => { - const archive = archiver('zip', { zlib: { level: 0 } }); + const archive = archiver('zip', { zlib: { level: 6 } }); const chunks: Buffer[] = []; archive.on('data', (chunk: Buffer) => chunks.push(chunk)); archive.on('end', () => resolve(Buffer.concat(chunks))); @@ -265,8 +265,9 @@ export class UserService { for (const picture of pictures) { const imageBuffer = Buffer.from(picture.profileImage.buffer); - const safeName = picture.user.fullName.replace(/[^\w\s\-áéíóöőúüűÁÉÍÓÖŐÚÜŰ]/g, '_'); - archive.append(imageBuffer, { name: `${safeName}.jpg` }); + const safeName = + picture.user.fullName.replace(/[^\w\s\-áéíóöőúüűÁÉÍÓÖŐÚÜŰ]/g, '_').trim() || picture.user.authSchId; + archive.append(imageBuffer, { name: `${safeName}-${picture.user.authSchId}.jpg` }); } archive.finalize(); diff --git a/apps/frontend/src/app/roles/page.tsx b/apps/frontend/src/app/roles/page.tsx index 88656485..00888f07 100644 --- a/apps/frontend/src/app/roles/page.tsx +++ b/apps/frontend/src/app/roles/page.tsx @@ -1,5 +1,4 @@ 'use client'; -import { useRouter } from 'next/navigation'; import React from 'react'; import api from '@/components/network/apiSetup'; @@ -18,7 +17,6 @@ import { Role } from '@/types/user-entity'; import { LuDownload } from 'react-icons/lu'; export default function Page() { - const router = useRouter(); const [search, setSearch] = React.useState(''); const [pageIndex, setPageIndex] = React.useState(0); const users = useUsers(search, pageIndex); diff --git a/apps/frontend/src/components/ui/UserCard.tsx b/apps/frontend/src/components/ui/UserCard.tsx index d0d2f95e..59c3fd60 100644 --- a/apps/frontend/src/components/ui/UserCard.tsx +++ b/apps/frontend/src/components/ui/UserCard.tsx @@ -22,7 +22,6 @@ export default function UserCard(props: { await props.mutateUsers(); } - // @ts-ignore return ( diff --git a/apps/frontend/src/lib/profile-pictures.ts b/apps/frontend/src/lib/profile-pictures.ts index 873d53c8..af2f8f33 100644 --- a/apps/frontend/src/lib/profile-pictures.ts +++ b/apps/frontend/src/lib/profile-pictures.ts @@ -1,17 +1,29 @@ import api from '@/components/network/apiSetup'; +import { toast } from '@/lib/use-toast'; export const exportProfilePictures = async (userIds?: string[]) => { - const response = await api.post( - 'users/profile-pictures/export', - { userIds: userIds ?? [] }, - { responseType: 'blob' } - ); - const objectUrl = URL.createObjectURL(new Blob([response.data], { type: 'application/zip' })); - const link = document.createElement('a'); - link.href = objectUrl; - link.download = 'profile-pictures.zip'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - URL.revokeObjectURL(objectUrl); + try { + toast({ + title: 'Profilképek exportálása', + description: 'Dolgozunk rajta...', + }); + const response = await api.post( + 'users/profile-pictures/export', + { userIds: userIds ?? [] }, + { responseType: 'blob' } + ); + const objectUrl = URL.createObjectURL(new Blob([response.data], { type: 'application/zip' })); + const link = document.createElement('a'); + link.href = objectUrl; + link.download = 'profile-pictures.zip'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(objectUrl); + } catch (error) { + toast({ + title: 'Hiba', + description: 'A profilképek exportálása nem sikerült.', + }); + } }; From 74a71647a78fd009e0b4ec1373e12ff4fa34b863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Mozs=C3=A1r?= Date: Mon, 23 Feb 2026 11:28:58 +0100 Subject: [PATCH 4/5] eslint and prettier --- .idea/jsLinters/eslint.xml | 4 +-- apps/frontend/eslint.config.mjs | 31 +++++++------------- apps/frontend/package.json | 2 +- apps/frontend/src/lib/useKeyboardShortcut.ts | 2 -- yarn.lock | 20 ++++++------- 5 files changed, 23 insertions(+), 36 deletions(-) diff --git a/.idea/jsLinters/eslint.xml b/.idea/jsLinters/eslint.xml index c759507d..a8cf89cb 100644 --- a/.idea/jsLinters/eslint.xml +++ b/.idea/jsLinters/eslint.xml @@ -2,7 +2,7 @@ - + - \ No newline at end of file + diff --git a/apps/frontend/eslint.config.mjs b/apps/frontend/eslint.config.mjs index dc892a4b..71d67b43 100644 --- a/apps/frontend/eslint.config.mjs +++ b/apps/frontend/eslint.config.mjs @@ -1,5 +1,4 @@ -import { FlatCompat } from '@eslint/eslintrc'; -import js from '@eslint/js'; +import nextPlugin from '@next/eslint-plugin-next'; import typescriptEslintPlugin from '@typescript-eslint/eslint-plugin'; import tsParser from '@typescript-eslint/parser'; import path from 'node:path'; @@ -7,24 +6,20 @@ import { fileURLToPath } from 'node:url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, - allConfig: js.configs.all, -}); export default [ { ignores: ['**/.eslintrc.js', 'eslint.config.mjs'], }, - ...compat.config({ - extends: [ - 'next/core-web-vitals', - // next/typescript already has @typescript-eslint/eslint-plugin bundled, but it probably has - // a different version than the one we're using, so we're including it manually in the plugins - // 'next/typescript' - ], - }), + { + plugins: { + '@next/next': nextPlugin, + }, + rules: { + ...nextPlugin.configs.recommended.rules, + ...nextPlugin.configs['core-web-vitals'].rules, + }, + }, { plugins: { '@typescript-eslint': typescriptEslintPlugin, @@ -41,12 +36,6 @@ export default [ }, }, - // settings: { - // react: { - // version: 'detect', - // }, - // }, - rules: { 'no-html-link-for-pages': 'off', 'react/react-in-jsx-scope': 'off', diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 9ce61f34..b535b04b 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -77,7 +77,7 @@ "@types/node": "^20.17.12", "@types/react": "19.0.10", "@types/react-dom": "19.0.4", - "eslint-config-next": "15.2.2", + "eslint-config-next": "15.4.8", "eslint-config-prettier": "^10.0.1", "eslint-plugin-prettier": "5.2.1", "eslint-plugin-simple-import-sort": "^12.1.1", diff --git a/apps/frontend/src/lib/useKeyboardShortcut.ts b/apps/frontend/src/lib/useKeyboardShortcut.ts index 2cdfc4ba..d5035e9a 100644 --- a/apps/frontend/src/lib/useKeyboardShortcut.ts +++ b/apps/frontend/src/lib/useKeyboardShortcut.ts @@ -47,11 +47,9 @@ export const useKeyboardShortcut = (keys: Key[], callback: (idxOfKey?: number) = } }; - window.addEventListener('keydown', handleKeyDown); return () => { - window.removeEventListener('keydown', handleKeyDown); }; }, [keys, callback]); diff --git a/yarn.lock b/yarn.lock index 3e1a6449..ee93734a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1661,7 +1661,7 @@ __metadata: clsx: "npm:^2.1.1" cmdk: "npm:1.0.4" date-fns: "npm:^4.1.0" - eslint-config-next: "npm:15.2.2" + eslint-config-next: "npm:15.4.8" eslint-config-prettier: "npm:^10.0.1" eslint-plugin-prettier: "npm:5.2.1" eslint-plugin-simple-import-sort: "npm:^12.1.1" @@ -1698,12 +1698,12 @@ __metadata: languageName: node linkType: hard -"@next/eslint-plugin-next@npm:15.2.2": - version: 15.2.2 - resolution: "@next/eslint-plugin-next@npm:15.2.2" +"@next/eslint-plugin-next@npm:15.4.8": + version: 15.4.8 + resolution: "@next/eslint-plugin-next@npm:15.4.8" dependencies: fast-glob: "npm:3.3.1" - checksum: 10c0/fce7a9f4be9541b1a67ca6a94903559bfdcec293e658a94ca8dac987de5dc7039d317b8d0c90eb119bf701eba12dab425875d3478aceca7b29fe6bd1cfd886ef + checksum: 10c0/37ed005e71f464d8f63d7c8a514440c36621e58031d91d42b19b82b42af6d2c4a699e4ecdbfd81aabcd2d75d3bcc8b518240d3e28b0774673268774bb7185f7e languageName: node linkType: hard @@ -6645,11 +6645,11 @@ __metadata: languageName: node linkType: hard -"eslint-config-next@npm:15.2.2": - version: 15.2.2 - resolution: "eslint-config-next@npm:15.2.2" +"eslint-config-next@npm:15.4.8": + version: 15.4.8 + resolution: "eslint-config-next@npm:15.4.8" dependencies: - "@next/eslint-plugin-next": "npm:15.2.2" + "@next/eslint-plugin-next": "npm:15.4.8" "@rushstack/eslint-patch": "npm:^1.10.3" "@typescript-eslint/eslint-plugin": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -6665,7 +6665,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/b59c19a1c269ba7715fa3fc4b41bf0480ae2065999139ac5a14cb275fb3a8999c615f977769f0d7a7c18578f3cd33afcbb8756d6df4b65b5a727466c4aff70ea + checksum: 10c0/3bd0eae05c08aa39c0904d7ffd8af1fe480f88ad503f3093a96c14b3f7e798cb84605f919547c6166b494273cfca5fbb526042d65e5b8f4e43546dadec4a12f7 languageName: node linkType: hard From 4bb74fe80a4240ef7c52a331b998a3ababfe743b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Mozs=C3=A1r?= Date: Mon, 23 Feb 2026 11:35:10 +0100 Subject: [PATCH 5/5] added missing import --- apps/backend/src/user/user.controller.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/backend/src/user/user.controller.ts b/apps/backend/src/user/user.controller.ts index 167490a0..bb34a545 100644 --- a/apps/backend/src/user/user.controller.ts +++ b/apps/backend/src/user/user.controller.ts @@ -9,6 +9,7 @@ import { ParseIntPipe, Patch, Post, + Query, StreamableFile, UploadedFile, UseGuards,