diff --git a/database/seeders/DatabaseSeeder.ts b/database/seeders/DatabaseSeeder.ts index 5b2ead1fd087a6c0532cc2341ad55ad919a1fbc6..437d04f467592e5d7d15752f052706a99d5f53ec 100644 --- a/database/seeders/DatabaseSeeder.ts +++ b/database/seeders/DatabaseSeeder.ts @@ -5,25 +5,53 @@ import { Category } from '../../src/category/category.entity'; import { Room } from '../../src/room/room.entity'; import * as bcrypt from 'bcrypt'; import { UserService } from '../../src/user/user.service'; +import { fakerDE as faker } from '@faker-js/faker'; export class DatabaseSeeder extends Seeder { async run(em: EntityManager): Promise<void> { const password = await bcrypt.hash('12345', UserService.SALT_OR_ROUNDS); - em.create(User, { + const user = em.create(User, { email: 'test@example.com', name: 'Test User', - organization: 'Test Organization', + organization: faker.company.name(), password, role: 'admin', }); + this.generateRoomsFor(em, user); + + for (let i = 0; i < 2; i++) { + this.generateUser(em, 'admin', password); + } + + for (let i = 0; i < 10; i++) { + this.generateUser(em, 'user', password); + } + } + + generateUser(em: EntityManager, role: 'user' | 'admin', password: string) { + const firstName = faker.person.firstName(); + const lastName = faker.person.lastName(); + + const user = em.create(User, { + email: faker.internet.email({ firstName, lastName }), + name: `${firstName} ${lastName}`, + organization: faker.company.name(), + password, + role, + }); + + this.generateRoomsFor(em, user); + } + + generateRoomsFor(em: EntityManager, user: User) { const categories = ['Mathe', 'Deutsch', 'Physik', 'Religion']; for (const category of categories) { const createdCategory = em.create(Category, { name: category, - owner: em.getReference(User, 1), + owner: user, }); const rooms = Math.floor(Math.random() * 7); diff --git a/package-lock.json b/package-lock.json index 3ac021aa1a2b573c882327f1017f84213b36e5f9..ee19bd4a43f3c2a54a54022160de7da976546604 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,6 +35,7 @@ "socket.io": "^4.6.2" }, "devDependencies": { + "@faker-js/faker": "^8.0.2", "@mikro-orm/cli": "^5.7.11", "@mikro-orm/seeder": "^5.7.11", "@nestjs/cli": "^9.5.0", @@ -844,13 +845,19 @@ } }, "node_modules/@faker-js/faker": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", - "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", - "devOptional": true, + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.0.2.tgz", + "integrity": "sha512-Uo3pGspElQW91PCvKSIAXoEgAUlRnH29sX2/p89kg7sP1m2PzCufHINd0FhTXQf6DYGiUlVncdSPa2F9wxed2A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" } }, "node_modules/@humanwhocodes/config-array": { @@ -1671,6 +1678,16 @@ "@mikro-orm/core": "^5.0.0" } }, + "node_modules/@mikro-orm/seeder/node_modules/@faker-js/faker": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", + "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", + "devOptional": true, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, "node_modules/@nestjs/cli": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.5.0.tgz", diff --git a/package.json b/package.json index 193cb97fbdbb7c8c200c1d7a810d1d82b6a583d8..c649535a3bcd9f7d226701db88214a3f064625b5 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "socket.io": "^4.6.2" }, "devDependencies": { + "@faker-js/faker": "^8.0.2", "@mikro-orm/cli": "^5.7.11", "@mikro-orm/seeder": "^5.7.11", "@nestjs/cli": "^9.5.0", diff --git a/src/user/user.controller.ts b/src/user/user.controller.ts index f4318a6716823d61ec72984c56b0cb584f01fbd2..682b1af4da078849f9f7847714b327525af4ffe0 100644 --- a/src/user/user.controller.ts +++ b/src/user/user.controller.ts @@ -1,7 +1,9 @@ import { Body, Controller, + Delete, Get, + Param, Post, Put, UnprocessableEntityException, @@ -46,6 +48,14 @@ export class UserController { return this.userService.changeUserData(data); } + @UseGuards(AuthGuard, AdminGuard) + @Delete('/:userId') + public async delete(@Param('userId') userId: number) { + await this.userService.delete(userId); + + return { message: 'success' }; + } + @UseGuards(AuthGuard) @Post('changePassword') public async changePassword(@Body() data: ChangePassword) { diff --git a/src/user/user.service.ts b/src/user/user.service.ts index 8953b4b4412af8ea73b0f559f6409f47a117fa0b..028452e6dd8f364668807d411899c4a64ef0fe31 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -52,6 +52,11 @@ export class UserService { } public async delete(id: number): Promise<void> { + const user = await this.repository.findOne({ id }); + + if (!user) { + throw new Error('User not found'); + } await this.repository.nativeDelete({ id }); }