@mshima/generator-jhipster-nodejs 0.0.0-stage → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +204 -0
- package/README.md +243 -2
- package/build-info.json +3 -0
- package/cli/cli-customizations.cjs +9 -0
- package/cli/cli.cjs +40 -0
- package/cli/logo.js +31 -0
- package/cli/version.cjs +12 -0
- package/generators/ci-cd/USAGE +5 -0
- package/generators/ci-cd/command.js +5 -0
- package/generators/ci-cd/generator.js +158 -0
- package/generators/ci-cd/index.js +2 -0
- package/generators/ci-cd/templates/.gitlab-ci.yml.ejs +137 -0
- package/generators/ci-cd/templates/azure-pipelines.yml.ejs +68 -0
- package/generators/ci-cd/templates/circle.yml.ejs +59 -0
- package/generators/ci-cd/templates/docker-registry.yml.ejs +58 -0
- package/generators/ci-cd/templates/github-ci.yml.ejs +90 -0
- package/generators/ci-cd/templates/jenkins/Jenkinsfile.ejs +104 -0
- package/generators/ci-cd/templates/jenkins/idea.gdsl +90 -0
- package/generators/ci-cd/templates/jenkins/jenkins.yml.ejs +33 -0
- package/generators/ci-cd/templates/travis.yml.ejs +75 -0
- package/generators/client/command.js +5 -0
- package/generators/client/generator.js +21 -0
- package/generators/client/generators/bootstrap/command.js +5 -0
- package/generators/client/generators/bootstrap/generator.js +28 -0
- package/generators/client/generators/bootstrap/index.js +2 -0
- package/generators/client/index.js +2 -0
- package/generators/common/generators/bootstrap/command.js +5 -0
- package/generators/common/generators/bootstrap/generator.js +37 -0
- package/generators/common/generators/bootstrap/index.js +2 -0
- package/generators/docker/command.js +5 -0
- package/generators/docker/generator.js +16 -0
- package/generators/docker/generators/bootstrap/command.js +5 -0
- package/generators/docker/generators/bootstrap/generator.js +56 -0
- package/generators/docker/generators/bootstrap/index.js +2 -0
- package/generators/docker/index.js +2 -0
- package/generators/docker/templates/docker/app.yml.ejs +25 -0
- package/generators/generator-nodejs-constants.js +32 -0
- package/generators/languages/command.js +5 -0
- package/generators/languages/generator.js +22 -0
- package/generators/languages/index.js +2 -0
- package/generators/languages/templates/src/main/webapp/i18n/en/home.json +19 -0
- package/generators/languages/templates/src/main/webapp/i18n/es/home.json +19 -0
- package/generators/languages/templates/src/main/webapp/i18n/it/home.json +19 -0
- package/generators/node-server/command.js +96 -0
- package/generators/node-server/entity-files.js +26 -0
- package/generators/node-server/files.js +254 -0
- package/generators/node-server/generator.js +705 -0
- package/generators/node-server/generators/bootstrap/command.js +5 -0
- package/generators/node-server/generators/bootstrap/generator.js +84 -0
- package/generators/node-server/generators/bootstrap/index.js +2 -0
- package/generators/node-server/generators/migrations/command.js +5 -0
- package/generators/node-server/generators/migrations/files.js +42 -0
- package/generators/node-server/generators/migrations/generator.js +108 -0
- package/generators/node-server/generators/migrations/index.js +2 -0
- package/generators/node-server/generators/migrations/templates/server/src/migrations/_entityConstraintsMigration_.ts.ejs +40 -0
- package/generators/node-server/generators/migrations/templates/server/src/migrations/_entityMigration_.ts.ejs +26 -0
- package/generators/node-server/generators/migrations/templates/server/src/migrations/_entityRemovedMigration_.ts.ejs +15 -0
- package/generators/node-server/generators/migrations/templates/server/src/migrations/_entityUpdatedConstraintsMigration_.ts.ejs +60 -0
- package/generators/node-server/generators/migrations/templates/server/src/migrations/_entityUpdatedMigration_.ts.ejs +28 -0
- package/generators/node-server/index.js +2 -0
- package/generators/node-server/resources/package.json +76 -0
- package/generators/node-server/support/api-fake-data.js +54 -0
- package/generators/node-server/support/columns.js +73 -0
- package/generators/node-server/support/database.js +24 -0
- package/generators/node-server/support/entity-authorities.js +32 -0
- package/generators/node-server/support/entity-paths.js +13 -0
- package/generators/node-server/support/enums.js +11 -0
- package/generators/node-server/support/index.js +9 -0
- package/generators/node-server/support/mail-templates.js +82 -0
- package/generators/node-server/support/migrations.js +376 -0
- package/generators/node-server/support/validators.js +25 -0
- package/generators/node-server/templates/.dockerignore.ejs +16 -0
- package/generators/node-server/templates/.gitignore.jhi.nodejs.ejs +24 -0
- package/generators/node-server/templates/Dockerfile.ejs +54 -0
- package/generators/node-server/templates/README.md.jhi.nodejs.ejs +220 -0
- package/generators/node-server/templates/package.json.ejs +82 -0
- package/generators/node-server/templates/server/README.md.ejs +277 -0
- package/generators/node-server/templates/server/e2e/_entityFileName_.database.e2e-spec.ts.ejs +192 -0
- package/generators/node-server/templates/server/e2e/_entityFileName_.e2e-spec.ts.ejs +402 -0
- package/generators/node-server/templates/server/e2e/account.e2e-spec.ts.ejs +349 -0
- package/generators/node-server/templates/server/e2e/app.e2e-spec.ts.ejs +188 -0
- package/generators/node-server/templates/server/e2e/authority.e2e-spec.ts.ejs +50 -0
- package/generators/node-server/templates/server/e2e/cors.e2e-spec.ts.ejs +110 -0
- package/generators/node-server/templates/server/e2e/management.e2e-spec.ts.ejs +180 -0
- package/generators/node-server/templates/server/e2e/oauth2-bearer.e2e-spec.ts.ejs +71 -0
- package/generators/node-server/templates/server/e2e/session.e2e-spec.ts.ejs +234 -0
- package/generators/node-server/templates/server/e2e/setup.test.js.ejs +1 -0
- package/generators/node-server/templates/server/e2e/user.e2e-spec.ts.ejs +318 -0
- package/generators/node-server/templates/server/env.ejs +1 -0
- package/generators/node-server/templates/server/eslint.config.mjs.ejs +48 -0
- package/generators/node-server/templates/server/nest-cli.json.ejs +11 -0
- package/generators/node-server/templates/server/ormconfig.ts.ejs +35 -0
- package/generators/node-server/templates/server/package.json.ejs +143 -0
- package/generators/node-server/templates/server/sonar-project.properties.ejs +10 -0
- package/generators/node-server/templates/server/src/app.config.spec.ts.ejs +13 -0
- package/generators/node-server/templates/server/src/app.config.ts.ejs +179 -0
- package/generators/node-server/templates/server/src/app.module.ts.ejs +80 -0
- package/generators/node-server/templates/server/src/application-config.ts.ejs +153 -0
- package/generators/node-server/templates/server/src/auth/account.controller.ts.ejs +183 -0
- package/generators/node-server/templates/server/src/auth/auth.module.ts.ejs +104 -0
- package/generators/node-server/templates/server/src/auth/auth.service.ts.ejs +294 -0
- package/generators/node-server/templates/server/src/auth/csrf.middleware.spec.ts.ejs +76 -0
- package/generators/node-server/templates/server/src/auth/csrf.middleware.ts.ejs +85 -0
- package/generators/node-server/templates/server/src/auth/decorators/auth-user.decorator.ts.ejs +8 -0
- package/generators/node-server/templates/server/src/auth/decorators/roles.decorator.ts.ejs +4 -0
- package/generators/node-server/templates/server/src/auth/dto/key-and-password.dto.ts.ejs +17 -0
- package/generators/node-server/templates/server/src/auth/dto/password-change.dto.ts.ejs +17 -0
- package/generators/node-server/templates/server/src/auth/dto/user-login.dto.ts.ejs +21 -0
- package/generators/node-server/templates/server/src/auth/guards/auth.guard.ts.ejs +50 -0
- package/generators/node-server/templates/server/src/auth/guards/oauth2-login.guard.ts.ejs +6 -0
- package/generators/node-server/templates/server/src/auth/guards/roles.guard.ts.ejs +25 -0
- package/generators/node-server/templates/server/src/auth/index.ts.ejs +8 -0
- package/generators/node-server/templates/server/src/auth/jwt.config.spec.ts.ejs +22 -0
- package/generators/node-server/templates/server/src/auth/jwt.config.ts.ejs +29 -0
- package/generators/node-server/templates/server/src/auth/oauth2.authorities.spec.ts.ejs +24 -0
- package/generators/node-server/templates/server/src/auth/oauth2.authorities.ts.ejs +33 -0
- package/generators/node-server/templates/server/src/auth/oauth2.config.ts.ejs +51 -0
- package/generators/node-server/templates/server/src/auth/passport.jwt.strategy.ts.ejs +45 -0
- package/generators/node-server/templates/server/src/auth/passport.oauth2-bearer.strategy.ts.ejs +32 -0
- package/generators/node-server/templates/server/src/auth/passport.oauth2.strategy.spec.ts.ejs +27 -0
- package/generators/node-server/templates/server/src/auth/passport.oauth2.strategy.ts.ejs +44 -0
- package/generators/node-server/templates/server/src/auth/password-util.ts.ejs +10 -0
- package/generators/node-server/templates/server/src/auth/password.service.ts.ejs +34 -0
- package/generators/node-server/templates/server/src/auth/payload.interface.ts.ejs +14 -0
- package/generators/node-server/templates/server/src/auth/role-type.ts.ejs +7 -0
- package/generators/node-server/templates/server/src/auth/session-user.middleware.ts.ejs +33 -0
- package/generators/node-server/templates/server/src/auth/session.entity.ts.ejs +36 -0
- package/generators/node-server/templates/server/src/auth/session.store.spec.ts.ejs +99 -0
- package/generators/node-server/templates/server/src/auth/session.store.ts.ejs +116 -0
- package/generators/node-server/templates/server/src/auth/user.jwt.controller.ts.ejs +26 -0
- package/generators/node-server/templates/server/src/auth/user.oauth2.controller.ts.ejs +78 -0
- package/generators/node-server/templates/server/src/auth/user.session.controller.ts.ejs +103 -0
- package/generators/node-server/templates/server/src/common/common.module.ts.ejs +19 -0
- package/generators/node-server/templates/server/src/common/database/base.entity.ts.ejs +13 -0
- package/generators/node-server/templates/server/src/common/database/column-transformers.spec.ts.ejs +46 -0
- package/generators/node-server/templates/server/src/common/database/column-transformers.ts.ejs +69 -0
- package/generators/node-server/templates/server/src/common/database/column-types.spec.ts.ejs +21 -0
- package/generators/node-server/templates/server/src/common/database/column-types.ts.ejs +29 -0
- package/generators/node-server/templates/server/src/common/database/pagination.entity.spec.ts.ejs +66 -0
- package/generators/node-server/templates/server/src/common/database/pagination.entity.ts.ejs +108 -0
- package/generators/node-server/templates/server/src/common/dto/base.dto.ts.ejs +19 -0
- package/generators/node-server/templates/server/src/common/errors/error-constants.ts.ejs +10 -0
- package/generators/node-server/templates/server/src/common/errors/problem-details.filter.ts.ejs +63 -0
- package/generators/node-server/templates/server/src/common/errors/problem.exception.ts.ejs +92 -0
- package/generators/node-server/templates/server/src/common/field_validators.ejs +77 -0
- package/generators/node-server/templates/server/src/common/header-util.ts.ejs +105 -0
- package/generators/node-server/templates/server/src/common/interceptors/logging.interceptor.spec.ts.ejs +93 -0
- package/generators/node-server/templates/server/src/common/interceptors/logging.interceptor.ts.ejs +48 -0
- package/generators/node-server/templates/server/src/common/logging.spec.ts.ejs +83 -0
- package/generators/node-server/templates/server/src/common/logging.ts.ejs +129 -0
- package/generators/node-server/templates/server/src/common/metrics.spec.ts.ejs +43 -0
- package/generators/node-server/templates/server/src/common/metrics.ts.ejs +198 -0
- package/generators/node-server/templates/server/src/common/request.ts.ejs +8 -0
- package/generators/node-server/templates/server/src/common/sortable-properties.ts.ejs +43 -0
- package/generators/node-server/templates/server/src/common/updatable-properties.ts.ejs +14 -0
- package/generators/node-server/templates/server/src/config/application-dev.yml.ejs +118 -0
- package/generators/node-server/templates/server/src/config/application-prod.yml.ejs +97 -0
- package/generators/node-server/templates/server/src/config/application-secret-samples.yml.ejs +42 -0
- package/generators/node-server/templates/server/src/config/application-test.yml.ejs +68 -0
- package/generators/node-server/templates/server/src/config/application-tls-samples.yml.ejs +15 -0
- package/generators/node-server/templates/server/src/config/application-tls.yml.ejs +15 -0
- package/generators/node-server/templates/server/src/config/application.yml.ejs +149 -0
- package/generators/node-server/templates/server/src/config.spec.ts.ejs +81 -0
- package/generators/node-server/templates/server/src/config.ts.ejs +255 -0
- package/generators/node-server/templates/server/src/entities/_entityFileName_/_entityFileName_.controller.ts.ejs +178 -0
- package/generators/node-server/templates/server/src/entities/_entityFileName_/_entityFileName_.entity.ts.ejs +110 -0
- package/generators/node-server/templates/server/src/entities/_entityFileName_/_entityFileName_.mapper.ts.ejs +37 -0
- package/generators/node-server/templates/server/src/entities/_entityFileName_/_entityFileName_.module.ts.ejs +14 -0
- package/generators/node-server/templates/server/src/entities/_entityFileName_/_entityFileName_.service.ts.ejs +123 -0
- package/generators/node-server/templates/server/src/entities/_entityFileName_/dto/_entityFileName_.dto.ts.ejs +99 -0
- package/generators/node-server/templates/server/src/mail/mail.module.ts.ejs +49 -0
- package/generators/node-server/templates/server/src/mail/mail.service.spec.ts.ejs +105 -0
- package/generators/node-server/templates/server/src/mail/mail.service.ts.ejs +120 -0
- package/generators/node-server/templates/server/src/main.ts.ejs +114 -0
- package/generators/node-server/templates/server/src/management/api-docs.controller.ts.ejs +27 -0
- package/generators/node-server/templates/server/src/management/api-docs.service.ts.ejs +8 -0
- package/generators/node-server/templates/server/src/management/configuration.controller.ts.ejs +80 -0
- package/generators/node-server/templates/server/src/management/health.controller.spec.ts.ejs +79 -0
- package/generators/node-server/templates/server/src/management/health.controller.ts.ejs +87 -0
- package/generators/node-server/templates/server/src/management/health.module.ts.ejs +9 -0
- package/generators/node-server/templates/server/src/management/loggers.controller.ts.ejs +40 -0
- package/generators/node-server/templates/server/src/management/management.controller.spec.ts.ejs +26 -0
- package/generators/node-server/templates/server/src/management/management.controller.ts.ejs +34 -0
- package/generators/node-server/templates/server/src/management/management.module.ts.ejs +21 -0
- package/generators/node-server/templates/server/src/management/metrics.controller.ts.ejs +85 -0
- package/generators/node-server/templates/server/src/migrations/1570200270081-CreateTables.ts.ejs +64 -0
- package/generators/node-server/templates/server/src/migrations/1570200270082-CreateSessions.ts.ejs +26 -0
- package/generators/node-server/templates/server/src/migrations/1570200490072-SeedUsersRoles.ts.ejs +74 -0
- package/generators/node-server/templates/server/src/migrations/support/schema.ts.ejs +254 -0
- package/generators/node-server/templates/server/src/orm.config.ts.ejs +147 -0
- package/generators/node-server/templates/server/src/registry/consul.service.ts.ejs +70 -0
- package/generators/node-server/templates/server/src/registry/eureka.service.ts.ejs +129 -0
- package/generators/node-server/templates/server/src/swagger.ts.ejs +24 -0
- package/generators/node-server/templates/server/src/tls.ts.ejs +27 -0
- package/generators/node-server/templates/server/src/users/authority.controller.ts.ejs +85 -0
- package/generators/node-server/templates/server/src/users/authority.entity.ts.ejs +22 -0
- package/generators/node-server/templates/server/src/users/dto/authority.dto.ts.ejs +10 -0
- package/generators/node-server/templates/server/src/users/dto/user.dto.ts.ejs +116 -0
- package/generators/node-server/templates/server/src/users/public.user.controller.ts.ejs +51 -0
- package/generators/node-server/templates/server/src/users/user.controller.ts.ejs +191 -0
- package/generators/node-server/templates/server/src/users/user.entity.ts.ejs +63 -0
- package/generators/node-server/templates/server/src/users/user.mapper.ts.ejs +26 -0
- package/generators/node-server/templates/server/src/users/user.module.ts.ejs +19 -0
- package/generators/node-server/templates/server/src/users/user.service.ts.ejs +156 -0
- package/generators/node-server/templates/server/tsconfig.build.json.ejs +9 -0
- package/generators/node-server/templates/server/tsconfig.json.ejs +23 -0
- package/generators/node-server/templates/server/typeorm-migration.ts.ejs +18 -0
- package/generators/node-server/templates/server/vitest.config.e2e.ts.ejs +16 -0
- package/generators/node-server/templates/server/vitest.config.ts.ejs +16 -0
- package/generators/server/command.js +7 -0
- package/generators/server/generator.js +20 -0
- package/generators/server/generators/bootstrap/command.js +5 -0
- package/generators/server/generators/bootstrap/generator.js +15 -0
- package/generators/server/generators/bootstrap/index.js +2 -0
- package/generators/server/index.js +2 -0
- package/package.json +75 -4
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Body, Controller, Delete, Get, NotFoundException, Param, Post as PostMethod, Req, UseGuards } from '@nestjs/common';
|
|
2
|
+
import { InjectRepository } from '@nestjs/typeorm';
|
|
3
|
+
import { <% if (authenticationTypeJwt) { %>ApiBearerAuth<% } else { %>ApiSecurity<% } %>, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
|
|
4
|
+
import { Repository } from 'typeorm';
|
|
5
|
+
|
|
6
|
+
import { HeaderUtil } from '../common/header-util.ts';
|
|
7
|
+
import { Request } from '../common/request.ts';
|
|
8
|
+
import { Authority } from './authority.entity.ts';
|
|
9
|
+
import { AuthGuard, Roles, RolesGuard } from '../auth/index.ts';
|
|
10
|
+
import { AuthorityDTO } from './dto/authority.dto.ts';
|
|
11
|
+
|
|
12
|
+
import { BadRequestAlertException } from '../common/errors/problem.exception.ts';
|
|
13
|
+
|
|
14
|
+
const ENTITY_NAME = '<%= nodejsAuthorityAlertName %>';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The authorities, like the AuthorityResource of JHipster Spring Boot: for the administrators, the profiles the user
|
|
18
|
+
* management assigns, and the authority pages of the client.
|
|
19
|
+
*/
|
|
20
|
+
@Controller('api/authorities')
|
|
21
|
+
@UseGuards(AuthGuard, RolesGuard)
|
|
22
|
+
@Roles(<%- authority.nodejsWriteRoles %>)
|
|
23
|
+
<%_ if (authenticationTypeJwt) { _%>
|
|
24
|
+
@ApiBearerAuth()
|
|
25
|
+
<%_ } else { _%>
|
|
26
|
+
@ApiSecurity({})
|
|
27
|
+
<%_ } _%>
|
|
28
|
+
@ApiTags('authority-resource')
|
|
29
|
+
export class AuthorityController {
|
|
30
|
+
constructor(
|
|
31
|
+
@InjectRepository(Authority) private readonly authorityRepository: Repository<Authority>,
|
|
32
|
+
private readonly headerUtil: HeaderUtil,
|
|
33
|
+
) {}
|
|
34
|
+
|
|
35
|
+
@Get()
|
|
36
|
+
<%_ if (authority.nodejsReadOnlyRoles) { _%>
|
|
37
|
+
// The roles of @EntityReadAuthority read the authorities too, like JHipster Spring Boot.
|
|
38
|
+
@Roles(<%- authority.nodejsReadRoles %>)
|
|
39
|
+
<%_ } _%>
|
|
40
|
+
@ApiOperation({ summary: 'Get all the authorities' })
|
|
41
|
+
@ApiResponse({ status: 200, type: AuthorityDTO, isArray: true })
|
|
42
|
+
async getAll(): Promise<AuthorityDTO[]> {
|
|
43
|
+
const authorities = await this.authorityRepository.find();
|
|
44
|
+
return authorities.map(({ name }) => ({ name }));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@Get('/:name')
|
|
48
|
+
<%_ if (authority.nodejsReadOnlyRoles) { _%>
|
|
49
|
+
// The roles of @EntityReadAuthority read the authorities too, like JHipster Spring Boot.
|
|
50
|
+
@Roles(<%- authority.nodejsReadRoles %>)
|
|
51
|
+
<%_ } _%>
|
|
52
|
+
@ApiOperation({ summary: 'Get an authority' })
|
|
53
|
+
@ApiResponse({ status: 200, type: AuthorityDTO })
|
|
54
|
+
@ApiResponse({ status: 404, description: 'No authority of that name.' })
|
|
55
|
+
async getOne(@Param('name') name: string): Promise<AuthorityDTO> {
|
|
56
|
+
const authority = await this.authorityRepository.findOne({ where: { name } });
|
|
57
|
+
if (!authority) {
|
|
58
|
+
throw new NotFoundException();
|
|
59
|
+
}
|
|
60
|
+
return { name: authority.name };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@PostMethod()
|
|
64
|
+
@ApiOperation({ summary: 'Create an authority' })
|
|
65
|
+
@ApiResponse({ status: 201, type: AuthorityDTO })
|
|
66
|
+
@ApiResponse({ status: 400, description: 'The authority exists already.' })
|
|
67
|
+
async create(@Req() req: Request, @Body() authorityDTO: AuthorityDTO): Promise<AuthorityDTO> {
|
|
68
|
+
// Like JHipster Spring Boot, the name is the id of an authority: an existing one is not a new one.
|
|
69
|
+
if (await this.authorityRepository.findOne({ where: { name: authorityDTO.name } })) {
|
|
70
|
+
throw new BadRequestAlertException('A new authority cannot already have an ID', ENTITY_NAME, 'idexists');
|
|
71
|
+
}
|
|
72
|
+
await this.authorityRepository.save(this.authorityRepository.create({ name: authorityDTO.name }));
|
|
73
|
+
this.headerUtil.addEntityCreatedHeaders(req.res, ENTITY_NAME, authorityDTO.name);
|
|
74
|
+
req.res.location(`/api/authorities/${encodeURIComponent(authorityDTO.name)}`);
|
|
75
|
+
return { name: authorityDTO.name };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@Delete('/:name')
|
|
79
|
+
@ApiOperation({ summary: 'Delete an authority' })
|
|
80
|
+
@ApiResponse({ status: 204, description: 'The authority has been deleted.' })
|
|
81
|
+
async delete(@Req() req: Request, @Param('name') name: string): Promise<void> {
|
|
82
|
+
this.headerUtil.addEntityDeletedHeaders(req.res, ENTITY_NAME, name);
|
|
83
|
+
await this.authorityRepository.delete({ name });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Entity, <%_ if (databaseType === 'mongodb') { _%> ObjectIdColumn, <%_ } _%><%_ if (databaseType === 'mongodb') { _%> Column <%_ } else { _%> PrimaryColumn <%_ } _%> } from 'typeorm';
|
|
2
|
+
import { ApiProperty } from '@nestjs/swagger';
|
|
3
|
+
<%_ if (databaseType === 'mongodb') { _%>
|
|
4
|
+
import { BaseEntity } from '../common/database/base.entity.ts';
|
|
5
|
+
<%_ } _%>
|
|
6
|
+
|
|
7
|
+
@Entity('<%- jhiTablePrefix %>_authority')
|
|
8
|
+
<%_ if (databaseTypeMongodb) { _%>
|
|
9
|
+
export class Authority extends BaseEntity {
|
|
10
|
+
@ObjectIdColumn({ name: '_id' })
|
|
11
|
+
id?: string;
|
|
12
|
+
<%_ } else { _%>
|
|
13
|
+
export class Authority {
|
|
14
|
+
<%_ } _%>
|
|
15
|
+
@ApiProperty({ example: 'ROLE_USER', description: 'User role' })
|
|
16
|
+
<%_ if (databaseTypeMongodb) { _%>
|
|
17
|
+
@Column({ unique: true })
|
|
18
|
+
<%_ } else { _%>
|
|
19
|
+
@PrimaryColumn()
|
|
20
|
+
<%_ } _%>
|
|
21
|
+
name!: string;
|
|
22
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ApiProperty } from '@nestjs/swagger';
|
|
2
|
+
import { IsNotEmpty, MaxLength } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
/** An authority, like the Authority of JHipster Spring Boot: its name, like ROLE_USER. */
|
|
5
|
+
export class AuthorityDTO {
|
|
6
|
+
@ApiProperty({ example: 'ROLE_USER', description: 'The name of the authority' })
|
|
7
|
+
@IsNotEmpty()
|
|
8
|
+
@MaxLength(50)
|
|
9
|
+
name!: string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { ApiProperty } from '@nestjs/swagger';
|
|
2
|
+
import { Allow, IsBoolean, IsEmail, IsNotEmpty, IsOptional, IsString, Length, Matches, MaxLength } from 'class-validator';
|
|
3
|
+
<%_ if (databaseTypeMongodb) { _%>
|
|
4
|
+
import { Transform } from 'class-transformer';
|
|
5
|
+
<%_ } _%>
|
|
6
|
+
import { Exclude } from 'class-transformer';
|
|
7
|
+
import { BaseDTO } from '../../common/dto/base.dto.ts';
|
|
8
|
+
|
|
9
|
+
/** The pattern of a login, the one of the clients of JHipster (the LOGIN_REGEX of JHipster Spring Boot). */
|
|
10
|
+
export const LOGIN_PATTERN = /^[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$/;
|
|
11
|
+
export const PASSWORD_MIN_LENGTH = 4;
|
|
12
|
+
export const PASSWORD_MAX_LENGTH = 100;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A user, with the constraints of the AdminUserDTO of JHipster Spring Boot.
|
|
16
|
+
*/
|
|
17
|
+
export class <%= userLoginVmClass %> extends BaseDTO {
|
|
18
|
+
<%_ if (user) { _%>
|
|
19
|
+
<%_ if (databaseTypeMongodb) { _%>
|
|
20
|
+
@Transform(({ value }) => value?.toHexString ? value?.toHexString() : value, {toPlainOnly: true})
|
|
21
|
+
<%_ } _%>
|
|
22
|
+
@Allow()
|
|
23
|
+
<%= user.primaryKey.name %>?: <%= user.primaryKey.tsType %>;
|
|
24
|
+
<%_ } else { _%>
|
|
25
|
+
@Allow()
|
|
26
|
+
id?: string;
|
|
27
|
+
<%_ } _%>
|
|
28
|
+
|
|
29
|
+
@ApiProperty({ uniqueItems: true, example: 'myuser', description: 'User login' })
|
|
30
|
+
@IsString()
|
|
31
|
+
@IsNotEmpty()
|
|
32
|
+
@Length(1, 50)
|
|
33
|
+
@Matches(LOGIN_PATTERN)
|
|
34
|
+
login!: string;
|
|
35
|
+
|
|
36
|
+
@ApiProperty({ example: 'MyUser', description: 'User first name', required: false })
|
|
37
|
+
@IsOptional()
|
|
38
|
+
@IsString()
|
|
39
|
+
@MaxLength(50)
|
|
40
|
+
firstName?: string;
|
|
41
|
+
|
|
42
|
+
@ApiProperty({ example: 'MyUser', description: 'User last name', required: false })
|
|
43
|
+
@IsOptional()
|
|
44
|
+
@IsString()
|
|
45
|
+
@MaxLength(50)
|
|
46
|
+
lastName?: string;
|
|
47
|
+
|
|
48
|
+
@ApiProperty({ example: 'myuser@localhost', description: 'User email' })
|
|
49
|
+
// A domain without a top level domain too, like user@localhost, as the @Email of JHipster Spring Boot.
|
|
50
|
+
@IsEmail({ require_tld: false })
|
|
51
|
+
@Length(5, 254)
|
|
52
|
+
email!: string;
|
|
53
|
+
|
|
54
|
+
@ApiProperty({ example: 'true', description: 'User activation', required: false })
|
|
55
|
+
@IsOptional()
|
|
56
|
+
@IsBoolean()
|
|
57
|
+
activated?: boolean;
|
|
58
|
+
|
|
59
|
+
@ApiProperty({ example: 'en', description: 'User language', required: false })
|
|
60
|
+
@IsOptional()
|
|
61
|
+
@IsString()
|
|
62
|
+
@Length(2, 10)
|
|
63
|
+
langKey?: string;
|
|
64
|
+
|
|
65
|
+
@ApiProperty({
|
|
66
|
+
isArray: true,
|
|
67
|
+
enum: ['ROLE_USER', 'ROLE_ADMIN', 'ROLE_ANONYMOUS'],
|
|
68
|
+
description: 'Array of permissions',
|
|
69
|
+
required: false
|
|
70
|
+
})
|
|
71
|
+
@Allow()
|
|
72
|
+
authorities?: any[];
|
|
73
|
+
|
|
74
|
+
// Never in the responses.
|
|
75
|
+
@Exclude({ toPlainOnly: true })
|
|
76
|
+
@ApiProperty({ example: 'myuser', description: 'User password' })
|
|
77
|
+
@Allow()
|
|
78
|
+
password<%- generateUserManagement ? '!' : '?' %>: string;
|
|
79
|
+
|
|
80
|
+
@ApiProperty({ example: 'http://my-image-url', description: 'Image url', required: false })
|
|
81
|
+
@IsOptional()
|
|
82
|
+
@IsString()
|
|
83
|
+
@MaxLength(256)
|
|
84
|
+
imageUrl?: string;
|
|
85
|
+
|
|
86
|
+
// The keys the mails send to the user, never in the responses, like the DTOs of JHipster Spring Boot.
|
|
87
|
+
@Exclude()
|
|
88
|
+
activationKey?: string;
|
|
89
|
+
|
|
90
|
+
@Exclude()
|
|
91
|
+
resetKey?: string;
|
|
92
|
+
|
|
93
|
+
@Exclude()
|
|
94
|
+
resetDate?: Date;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** A user registering, with a password, like the ManagedUserVM of JHipster Spring Boot. */
|
|
98
|
+
export class Managed<%= userLoginVmClass %> extends <%= userLoginVmClass %> {
|
|
99
|
+
@Exclude({ toPlainOnly: true })
|
|
100
|
+
@ApiProperty({ example: 'myuser', description: 'User password', minLength: PASSWORD_MIN_LENGTH, maxLength: PASSWORD_MAX_LENGTH })
|
|
101
|
+
@IsString()
|
|
102
|
+
@Length(PASSWORD_MIN_LENGTH, PASSWORD_MAX_LENGTH)
|
|
103
|
+
// Initialized like the redeclaration of a property must be (useDefineForClassFields), the body sets it.
|
|
104
|
+
override password = '';
|
|
105
|
+
}
|
|
106
|
+
<%_ if (user) { _%>
|
|
107
|
+
|
|
108
|
+
/** A user of the public user list, like the UserDTO of JHipster Spring Boot: its id and login only. */
|
|
109
|
+
export class PublicUserDTO {
|
|
110
|
+
@ApiProperty({ description: 'User id' })
|
|
111
|
+
id!: <%= user.primaryKey.tsType %>;
|
|
112
|
+
|
|
113
|
+
@ApiProperty({ example: 'myuser', description: 'User login' })
|
|
114
|
+
login!: string;
|
|
115
|
+
}
|
|
116
|
+
<%_ } _%>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Controller, ClassSerializerInterceptor, Get, Logger, Req, UseGuards, UseInterceptors } from '@nestjs/common';
|
|
2
|
+
import { PageRequest, Page } from '../common/database/pagination.entity.ts';
|
|
3
|
+
import { PublicUserDTO } from './dto/user.dto.ts';
|
|
4
|
+
import { AuthGuard } from '../auth/index.ts';
|
|
5
|
+
import { Request } from '../common/request.ts';
|
|
6
|
+
import { HeaderUtil } from '../common/header-util.ts';
|
|
7
|
+
import { ApiTags, ApiResponse, ApiOperation } from '@nestjs/swagger';
|
|
8
|
+
import { UserService } from './user.service.ts';
|
|
9
|
+
|
|
10
|
+
// The properties the public user list can be sorted on, like the PublicUserResource of JHipster Spring Boot.
|
|
11
|
+
const ALLOWED_ORDERED_PROPERTIES = ['<%- user.primaryKey.name %>', 'login', 'firstName', 'lastName', 'email', 'activated', 'langKey'];
|
|
12
|
+
|
|
13
|
+
@Controller('api')
|
|
14
|
+
@UseInterceptors(ClassSerializerInterceptor)
|
|
15
|
+
@ApiTags('public-user-controller')
|
|
16
|
+
export class PublicUserController {
|
|
17
|
+
|
|
18
|
+
logger = new Logger('PublicUserController');
|
|
19
|
+
|
|
20
|
+
constructor(
|
|
21
|
+
private readonly userService: UserService,
|
|
22
|
+
private readonly headerUtil: HeaderUtil,
|
|
23
|
+
) {}
|
|
24
|
+
|
|
25
|
+
/** Like the PublicUserResource of JHipster Spring Boot: the activated users, by their id and login, for authenticated users. */
|
|
26
|
+
@Get('/users')
|
|
27
|
+
@UseGuards(AuthGuard)
|
|
28
|
+
@ApiOperation({ summary: 'Get the list of the activated users, by their id and login' })
|
|
29
|
+
@ApiResponse({
|
|
30
|
+
status: 200,
|
|
31
|
+
description: 'List the activated users',
|
|
32
|
+
type: PublicUserDTO,
|
|
33
|
+
isArray: true,
|
|
34
|
+
})
|
|
35
|
+
async getAllPublicUsers(@Req() req: Request): Promise<PublicUserDTO[]> {
|
|
36
|
+
const pageRequest: PageRequest = new PageRequest(
|
|
37
|
+
req.query.page,
|
|
38
|
+
req.query.size,
|
|
39
|
+
req.query.sort ?? '<%- user.primaryKey.name %>,ASC',
|
|
40
|
+
property => ALLOWED_ORDERED_PROPERTIES.includes(property),
|
|
41
|
+
);
|
|
42
|
+
const [results, count] = await this.userService.findPublicUsers({
|
|
43
|
+
skip: +pageRequest.page * pageRequest.size,
|
|
44
|
+
take: +pageRequest.size,
|
|
45
|
+
order: pageRequest.asOrder(),
|
|
46
|
+
});
|
|
47
|
+
this.headerUtil.addPaginationHeaders(req.res, new Page(results, count, pageRequest));
|
|
48
|
+
return results;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { Body, Controller, NotFoundException, Delete, Get, Logger, Param, Post, Put, UseGuards, Req, UseInterceptors, ClassSerializerInterceptor } from '@nestjs/common';
|
|
2
|
+
import { AuthGuard, Roles, RolesGuard, RoleType } from '../auth/index.ts';
|
|
3
|
+
import { PageRequest, Page } from '../common/database/pagination.entity.ts';
|
|
4
|
+
import { <%= user.dtoClass%> } from './dto/user.dto.ts';
|
|
5
|
+
import { HeaderUtil } from '../common/header-util.ts';
|
|
6
|
+
import { Request } from '../common/request.ts';
|
|
7
|
+
import {<%_ if (authenticationTypeJwt) { _%> ApiBearerAuth, <%_ } else { _%> ApiSecurity, <%_ } _%> ApiTags, ApiResponse, ApiOperation } from '@nestjs/swagger';
|
|
8
|
+
import { UserService } from './user.service.ts';
|
|
9
|
+
import { MailService } from '../mail/mail.service.ts';
|
|
10
|
+
import { randomBytes } from 'crypto';
|
|
11
|
+
import { BadRequestAlertException, EmailAlreadyUsedException, LoginAlreadyUsedException } from '../common/errors/problem.exception.ts';
|
|
12
|
+
import { isSortableProperty } from '../common/sortable-properties.ts';
|
|
13
|
+
|
|
14
|
+
// The columns of a user no list can be sorted on: its password, its activation and reset keys and the date of its reset.
|
|
15
|
+
const UNSORTABLE_PROPERTIES = ['password', 'activationKey', 'resetKey', 'resetDate'];
|
|
16
|
+
|
|
17
|
+
@Controller('api/admin/users')
|
|
18
|
+
@UseGuards(AuthGuard, RolesGuard)
|
|
19
|
+
@UseInterceptors(ClassSerializerInterceptor)
|
|
20
|
+
<%_ if (authenticationType === 'jwt') { _%>
|
|
21
|
+
@ApiBearerAuth()
|
|
22
|
+
<%_ } else { _%>
|
|
23
|
+
@ApiSecurity({})
|
|
24
|
+
<%_ } _%>
|
|
25
|
+
@ApiTags('user-resource')
|
|
26
|
+
export class UserController {
|
|
27
|
+
logger = new Logger('UserController');
|
|
28
|
+
|
|
29
|
+
constructor(
|
|
30
|
+
private readonly userService: UserService,
|
|
31
|
+
private readonly mailService: MailService,
|
|
32
|
+
private readonly headerUtil: HeaderUtil,
|
|
33
|
+
) {}
|
|
34
|
+
|
|
35
|
+
@Get('/')
|
|
36
|
+
@Roles(RoleType.ADMIN)
|
|
37
|
+
@ApiOperation({ summary: 'Get the list of users' })
|
|
38
|
+
@ApiResponse({
|
|
39
|
+
status: 200,
|
|
40
|
+
description: 'List all users',
|
|
41
|
+
type: <%= user.dtoClass%>,
|
|
42
|
+
isArray: true,
|
|
43
|
+
})
|
|
44
|
+
async getAllUsers(@Req() req: Request): Promise<<%= user.dtoClass%>[]> {
|
|
45
|
+
const pageRequest: PageRequest = new PageRequest(
|
|
46
|
+
req.query.page,
|
|
47
|
+
req.query.size,
|
|
48
|
+
req.query.sort ?? '<%- user.primaryKey.name %>,ASC',
|
|
49
|
+
property => isSortableProperty(this.userService.metadata, property, { unsortable: UNSORTABLE_PROPERTIES }),
|
|
50
|
+
);
|
|
51
|
+
const [results, count] = await this.userService.findAndCount({
|
|
52
|
+
skip: +pageRequest.page * pageRequest.size,
|
|
53
|
+
take: +pageRequest.size,
|
|
54
|
+
order: pageRequest.asOrder(),
|
|
55
|
+
});
|
|
56
|
+
this.headerUtil.addPaginationHeaders(req.res, new Page(results, count, pageRequest));
|
|
57
|
+
return results;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@Post('/')
|
|
61
|
+
@Roles(RoleType.ADMIN)
|
|
62
|
+
@ApiOperation({ summary: 'Create user' })
|
|
63
|
+
@ApiResponse({
|
|
64
|
+
status: 201,
|
|
65
|
+
description: 'The record has been successfully created.',
|
|
66
|
+
type: <%= user.dtoClass%>,
|
|
67
|
+
})
|
|
68
|
+
@ApiResponse({ status: 403, description: 'Forbidden.' })
|
|
69
|
+
@ApiResponse({ status: 400, description: 'The user already has an id, or its login or mail is already used.' })
|
|
70
|
+
async createUser(@Req() req: Request, @Body() userDTO: <%= user.dtoClass%>): Promise<<%= user.dtoClass%>> {
|
|
71
|
+
if (userDTO.<%= user.primaryKey.name %> !== undefined && userDTO.<%= user.primaryKey.name %> !== null) {
|
|
72
|
+
// Like JHipster Spring Boot, a new user cannot have an id: it would update an existing one.
|
|
73
|
+
throw new BadRequestAlertException('A new user cannot already have an ID', 'userManagement', 'idexists');
|
|
74
|
+
}
|
|
75
|
+
// Like JHipster Spring Boot, the login and the mail in lower case, each one of a single user.
|
|
76
|
+
const login = userDTO.login.toLowerCase();
|
|
77
|
+
const email = userDTO.email.toLowerCase();
|
|
78
|
+
if (await this.userService.findByFields({ where: { login } })) {
|
|
79
|
+
throw new LoginAlreadyUsedException();
|
|
80
|
+
}
|
|
81
|
+
if (await this.userService.findByFields({ where: { email } })) {
|
|
82
|
+
throw new EmailAlreadyUsedException();
|
|
83
|
+
}
|
|
84
|
+
// The fields of the UserService.createUser of JHipster Spring Boot only (not the password, the keys or the audit of
|
|
85
|
+
// the body): the user is activated, with a random password and a reset key, the creation mail linking to the page that
|
|
86
|
+
// sets the password.
|
|
87
|
+
const created = await this.userService.save(
|
|
88
|
+
{
|
|
89
|
+
login,
|
|
90
|
+
firstName: userDTO.firstName,
|
|
91
|
+
lastName: userDTO.lastName,
|
|
92
|
+
email,
|
|
93
|
+
imageUrl: userDTO.imageUrl,
|
|
94
|
+
langKey: userDTO.langKey ?? '<%= nativeLanguage %>',
|
|
95
|
+
authorities: userDTO.authorities,
|
|
96
|
+
activated: true,
|
|
97
|
+
password: randomBytes(15).toString('base64url'),
|
|
98
|
+
resetKey: randomBytes(15).toString('base64url'),
|
|
99
|
+
resetDate: new Date(),
|
|
100
|
+
},
|
|
101
|
+
req.user?.login,
|
|
102
|
+
<%_ if (generateUserManagement) { _%>
|
|
103
|
+
true,
|
|
104
|
+
<%_ } _%>
|
|
105
|
+
);
|
|
106
|
+
void this.mailService.sendCreationEmail(created);
|
|
107
|
+
this.headerUtil.addUserManagementHeaders(req.res, 'created', created.login);
|
|
108
|
+
// Like JHipster Spring Boot, the location of the created user, by its login.
|
|
109
|
+
req.res.location(`/api/admin/users/${encodeURIComponent(created.login)}`);
|
|
110
|
+
return created;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@Put(['/', '/:login'])
|
|
114
|
+
@Roles(RoleType.ADMIN)
|
|
115
|
+
@ApiOperation({ summary: 'Update user' })
|
|
116
|
+
@ApiResponse({
|
|
117
|
+
status: 200,
|
|
118
|
+
description: 'The record has been successfully updated.',
|
|
119
|
+
type: <%= user.dtoClass%>,
|
|
120
|
+
})
|
|
121
|
+
@ApiResponse({ status: 400, description: 'The login or the mail is used by another user.' })
|
|
122
|
+
@ApiResponse({ status: 404, description: 'No user of this id.' })
|
|
123
|
+
async updateUser(@Req() req: Request, @Body() userDTO: <%= user.dtoClass%>): Promise<<%= user.dtoClass%>> {
|
|
124
|
+
// Like JHipster Spring Boot, the user of the id of the body, whose login and mail are not the ones of another user.
|
|
125
|
+
const id = userDTO.<%= user.primaryKey.name %>;
|
|
126
|
+
const isAnotherUser = (other?: <%= user.dtoClass%>): boolean => other !== undefined && other !== null && String(other.<%= user.primaryKey.name %>) !== String(id);
|
|
127
|
+
const login = userDTO.login.toLowerCase();
|
|
128
|
+
const email = userDTO.email.toLowerCase();
|
|
129
|
+
if (isAnotherUser(await this.userService.findByFields({ where: { email } }))) {
|
|
130
|
+
throw new EmailAlreadyUsedException();
|
|
131
|
+
}
|
|
132
|
+
if (isAnotherUser(await this.userService.findByFields({ where: { login } }))) {
|
|
133
|
+
throw new LoginAlreadyUsedException();
|
|
134
|
+
}
|
|
135
|
+
const existing = id === undefined || id === null ? undefined : await this.userService.findByFields({ where: { <%= user.primaryKey.name %>: id } });
|
|
136
|
+
if (!existing) {
|
|
137
|
+
throw new NotFoundException();
|
|
138
|
+
}
|
|
139
|
+
// The fields of the UserService.updateUser of JHipster Spring Boot only: the password, the keys and the audit stay.
|
|
140
|
+
const updated = await this.userService.update(
|
|
141
|
+
{
|
|
142
|
+
...existing,
|
|
143
|
+
login,
|
|
144
|
+
firstName: userDTO.firstName,
|
|
145
|
+
lastName: userDTO.lastName,
|
|
146
|
+
email,
|
|
147
|
+
imageUrl: userDTO.imageUrl,
|
|
148
|
+
activated: userDTO.activated,
|
|
149
|
+
langKey: userDTO.langKey,
|
|
150
|
+
authorities: userDTO.authorities,
|
|
151
|
+
},
|
|
152
|
+
req.user?.login,
|
|
153
|
+
);
|
|
154
|
+
this.headerUtil.addUserManagementHeaders(req.res, 'updated', updated.login);
|
|
155
|
+
return updated;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@Get('/:login')
|
|
159
|
+
@Roles(RoleType.ADMIN)
|
|
160
|
+
@ApiOperation({ summary: 'Get user' })
|
|
161
|
+
@ApiResponse({
|
|
162
|
+
status: 200,
|
|
163
|
+
description: 'The found record',
|
|
164
|
+
type: <%= user.dtoClass%>,
|
|
165
|
+
})
|
|
166
|
+
async getUser(@Param('login') loginValue: string): Promise<<%= user.dtoClass%>> {
|
|
167
|
+
// With its authorities, which the edition page of the client shows and sends back.
|
|
168
|
+
const user = await this.userService.findByFields({ where: { login: loginValue } });
|
|
169
|
+
if (!user) {
|
|
170
|
+
throw new NotFoundException();
|
|
171
|
+
}
|
|
172
|
+
return user;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@Delete('/:login')
|
|
176
|
+
@Roles(RoleType.ADMIN)
|
|
177
|
+
@ApiOperation({ summary: 'Delete user' })
|
|
178
|
+
@ApiResponse({
|
|
179
|
+
status: 204,
|
|
180
|
+
description: 'The record has been successfully deleted.',
|
|
181
|
+
type: <%= user.dtoClass%>
|
|
182
|
+
})
|
|
183
|
+
async deleteUser(@Req() req: Request, @Param('login') loginValue: string): Promise<<%= user.dtoClass%> | undefined> {
|
|
184
|
+
const userToDelete = await this.userService.find({ where: { login: loginValue } });
|
|
185
|
+
if (!userToDelete) {
|
|
186
|
+
throw new NotFoundException();
|
|
187
|
+
}
|
|
188
|
+
this.headerUtil.addUserManagementHeaders(req.res, 'deleted', loginValue);
|
|
189
|
+
return await this.userService.delete(userToDelete);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Authority } from './authority.entity.ts';
|
|
2
|
+
import { <%_ if (databaseType === 'mongodb') { _%> ObjectIdColumn <%_ } else { _%> PrimaryGeneratedColumn <%_ } _%>, Entity, Column<%_ if (databaseType !== 'mongodb') { _%>, ManyToMany, JoinTable <%_ } _%> } from 'typeorm';
|
|
3
|
+
import { BaseEntity } from '../common/database/base.entity.ts';
|
|
4
|
+
import { Exclude } from 'class-transformer';
|
|
5
|
+
|
|
6
|
+
@Entity('<%- jhiTablePrefix %>_user')
|
|
7
|
+
export class <%= user.persistClass %> extends BaseEntity {
|
|
8
|
+
|
|
9
|
+
<%_ if (databaseTypeMongodb) { _%>
|
|
10
|
+
@ObjectIdColumn({ name: '_<%- user.primaryKey.name %>' })
|
|
11
|
+
<%_ } else if (databaseTypeSql) { _%>
|
|
12
|
+
@PrimaryGeneratedColumn(<%- user.primaryKey.typeUUID ? "'uuid'" : '' %>)
|
|
13
|
+
<%_ } _%>
|
|
14
|
+
<%- user.primaryKey.name %>?: <%- user.primaryKey.tsType %>;
|
|
15
|
+
|
|
16
|
+
@Column({ unique: true })
|
|
17
|
+
login!: string;
|
|
18
|
+
@Column({ nullable: true })
|
|
19
|
+
firstName?: string;
|
|
20
|
+
@Column({ nullable: true })
|
|
21
|
+
lastName?: string;
|
|
22
|
+
// Unique, like the ux_user_email constraint of JHipster Spring Boot.
|
|
23
|
+
@Column({ unique: true })
|
|
24
|
+
email!: string;
|
|
25
|
+
@Column({ default: false})
|
|
26
|
+
activated?: boolean;
|
|
27
|
+
@Column({default: 'en'})
|
|
28
|
+
langKey?: string;
|
|
29
|
+
|
|
30
|
+
<%_ if (databaseType === 'mongodb') { _%>
|
|
31
|
+
@Column()
|
|
32
|
+
authorities?: Authority[];
|
|
33
|
+
<%_ } else { _%>
|
|
34
|
+
@ManyToMany(() => Authority)
|
|
35
|
+
@JoinTable()
|
|
36
|
+
authorities?: any[];
|
|
37
|
+
<%_ } _%>
|
|
38
|
+
|
|
39
|
+
<%_ if (generateUserManagement) { _%>
|
|
40
|
+
@Column({
|
|
41
|
+
type: "varchar"
|
|
42
|
+
})
|
|
43
|
+
@Exclude()
|
|
44
|
+
password!: string;
|
|
45
|
+
<%_ } else { _%>
|
|
46
|
+
// The identity provider authenticates the users: no password of their own, like JHipster Spring Boot with OAuth2.
|
|
47
|
+
@Column({ type: 'varchar', nullable: true })
|
|
48
|
+
@Exclude()
|
|
49
|
+
password?: string;
|
|
50
|
+
<%_ } _%>
|
|
51
|
+
@Column({ nullable: true })
|
|
52
|
+
imageUrl?: string;
|
|
53
|
+
// Never in a response, like the @JsonIgnore keys of JHipster Spring Boot: a user related to an entity is serialized
|
|
54
|
+
// with this class (the password-reset key would let anyone set its password).
|
|
55
|
+
@Column({ nullable: true })
|
|
56
|
+
@Exclude()
|
|
57
|
+
activationKey?: string;
|
|
58
|
+
@Column({ nullable: true })
|
|
59
|
+
@Exclude()
|
|
60
|
+
resetKey?: string;
|
|
61
|
+
@Column({ nullable: true })
|
|
62
|
+
resetDate?: Date;
|
|
63
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { <%= user.persistClass %> } from './user.entity.ts';
|
|
2
|
+
import { <%= user.dtoClass%> } from './dto/user.dto.ts';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* An User mapper object.
|
|
6
|
+
*/
|
|
7
|
+
export class UserMapper {
|
|
8
|
+
|
|
9
|
+
static fromDTOtoEntity(userDTO: <%= user.dtoClass%>): <%= user.persistClass %>;
|
|
10
|
+
static fromDTOtoEntity(userDTO: <%= user.dtoClass%> | null | undefined): <%= user.persistClass %> | undefined;
|
|
11
|
+
static fromDTOtoEntity(userDTO: <%= user.dtoClass%> | null | undefined): <%= user.persistClass %> | undefined {
|
|
12
|
+
if (!userDTO) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
return Object.assign(new <%= user.persistClass %>(), userDTO);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
static fromEntityToDTO(user: <%= user.persistClass %>): <%= user.dtoClass%>;
|
|
19
|
+
static fromEntityToDTO(user: <%= user.persistClass %> | null | undefined): <%= user.dtoClass%> | undefined;
|
|
20
|
+
static fromEntityToDTO(user: <%= user.persistClass %> | null | undefined): <%= user.dtoClass%> | undefined {
|
|
21
|
+
if (!user) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return Object.assign(new <%= user.dtoClass%>(), user);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Module } from '@nestjs/common';
|
|
2
|
+
import { User } from './user.entity.ts';
|
|
3
|
+
<%_ if (generateUserManagement) { _%>
|
|
4
|
+
import { UserController } from './user.controller.ts';
|
|
5
|
+
<%_ } _%>
|
|
6
|
+
import { ManagementController } from '../management/management.controller.ts';
|
|
7
|
+
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
8
|
+
import { UserService } from './user.service.ts';
|
|
9
|
+
<%_ if (generateUserManagement) { _%>
|
|
10
|
+
import { MailModule } from '../mail/mail.module.ts';
|
|
11
|
+
<%_ } _%>
|
|
12
|
+
|
|
13
|
+
@Module({
|
|
14
|
+
imports: [TypeOrmModule.forFeature([User])<% if (generateUserManagement) { %>, MailModule<% } %>],
|
|
15
|
+
controllers: [<% if (generateUserManagement) { %>UserController, <% } %>ManagementController],
|
|
16
|
+
providers: [UserService],
|
|
17
|
+
exports: [UserService<% if (generateUserManagement) { %>, MailModule<% } %>],
|
|
18
|
+
})
|
|
19
|
+
export class UserModule {}
|