diff options
author | Joseph Ditton <jditton.atomic@gmail.com> | 2021-11-30 15:40:07 -0700 |
---|---|---|
committer | Joseph Ditton <jditton.atomic@gmail.com> | 2021-11-30 15:40:07 -0700 |
commit | 694f2318bd2eaf526d8714c56774022a15beae04 (patch) | |
tree | edaed14ca7d7a52e8a7a8bcdb7483d1a34bd334a /server | |
parent | 8d0b32f8dfe45291426e58f6bf20cffac8dab6e7 (diff) | |
download | locchat-694f2318bd2eaf526d8714c56774022a15beae04.tar.gz locchat-694f2318bd2eaf526d8714c56774022a15beae04.zip |
adds setup for roles
Diffstat (limited to 'server')
-rw-r--r-- | server/database/migrations/1638307700052-AddRoles.ts | 73 | ||||
-rw-r--r-- | server/entities/role.entity.ts | 21 | ||||
-rw-r--r-- | server/entities/user.entity.ts | 4 | ||||
-rw-r--r-- | server/entities/user_role.entity.ts | 15 | ||||
-rw-r--r-- | server/main.ts | 13 | ||||
-rw-r--r-- | server/providers/guards/roles.guard.ts | 0 |
6 files changed, 124 insertions, 2 deletions
diff --git a/server/database/migrations/1638307700052-AddRoles.ts b/server/database/migrations/1638307700052-AddRoles.ts new file mode 100644 index 0000000..237fb53 --- /dev/null +++ b/server/database/migrations/1638307700052-AddRoles.ts @@ -0,0 +1,73 @@ +import { MigrationInterface, QueryRunner, Table, TableForeignKey } from 'typeorm'; + +export class AddRoles1638307700052 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise<void> { + await queryRunner.createTable( + new Table({ + name: 'role', + columns: [ + { + name: 'id', + type: 'int', + isPrimary: true, + isGenerated: true, + }, + { + name: 'key', + type: 'text', + isNullable: false, + }, + ], + }), + ); + + await queryRunner.createTable( + new Table({ + name: 'user_role', + columns: [ + { + name: 'id', + type: 'int', + isPrimary: true, + isGenerated: true, + }, + { + name: 'userId', + type: 'int', + isNullable: false, + }, + { + name: 'roleId', + type: 'int', + isNullable: false, + }, + ], + }), + ); + + await queryRunner.createForeignKey( + 'user_role', + new TableForeignKey({ + columnNames: ['userId'], + referencedColumnNames: ['id'], + referencedTableName: 'user', + onDelete: 'CASCADE', + }), + ); + + await queryRunner.createForeignKey( + 'user_role', + new TableForeignKey({ + columnNames: ['roleId'], + referencedColumnNames: ['id'], + referencedTableName: 'role', + onDelete: 'CASCADE', + }), + ); + } + + public async down(queryRunner: QueryRunner): Promise<void> { + await queryRunner.dropTable('user_role'); + await queryRunner.dropTable('role'); + } +} diff --git a/server/entities/role.entity.ts b/server/entities/role.entity.ts new file mode 100644 index 0000000..35b4ac3 --- /dev/null +++ b/server/entities/role.entity.ts @@ -0,0 +1,21 @@ +import { Entity, PrimaryGeneratedColumn, OneToMany, Column } from 'typeorm'; +import { UserRole } from './user_role.entity'; + +@Entity() +export class Role { + static ADMIN = 'admin'; + static USER = 'user'; + + // make sure add additional roles to this arraylist as it + // will be used during seeds to initiallize all roles. + static ROLES = [Role.ADMIN, Role.USER]; + + @PrimaryGeneratedColumn() + id: number; + + @Column() + key: string; + + @OneToMany(() => UserRole, (userRole) => userRole.role) + userRoles: UserRole[]; +} diff --git a/server/entities/user.entity.ts b/server/entities/user.entity.ts index 6ddbeeb..faf054f 100644 --- a/server/entities/user.entity.ts +++ b/server/entities/user.entity.ts @@ -1,5 +1,6 @@ import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from 'typeorm'; import { RefreshToken } from './refresh_token.entity'; +import { UserRole } from './user_role.entity'; @Entity() export class User { @@ -17,4 +18,7 @@ export class User { @OneToMany(() => RefreshToken, (token) => token.user) refreshTokens: RefreshToken[]; + + @OneToMany(() => UserRole, (userRole) => userRole.user) + userRoles: UserRole[]; } diff --git a/server/entities/user_role.entity.ts b/server/entities/user_role.entity.ts new file mode 100644 index 0000000..0a6c5c6 --- /dev/null +++ b/server/entities/user_role.entity.ts @@ -0,0 +1,15 @@ +import { Entity, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; +import { Role } from './role.entity'; +import { User } from './user.entity'; + +@Entity() +export class UserRole { + @PrimaryGeneratedColumn() + id: number; + + @ManyToOne(() => Role, (role) => role.userRoles) + role: Role; + + @ManyToOne(() => User, (user) => user.userRoles) + user: User; +} diff --git a/server/main.ts b/server/main.ts index b4f319b..a8dc0ae 100644 --- a/server/main.ts +++ b/server/main.ts @@ -1,14 +1,16 @@ import './env'; import * as fs from 'fs'; import { NestFactory } from '@nestjs/core'; +import { Logger } from '@nestjs/common'; import { join } from 'path'; import { NestExpressApplication } from '@nestjs/platform-express'; import * as cookieParser from 'cookie-parser'; import { AppModule } from './app.module'; +import * as morgan from 'morgan'; async function bootstrap() { let httpsOptions; - if (process.env.NODE_ENV === 'development') { + if (process.env.USE_SSL === 'true') { httpsOptions = { key: fs.readFileSync('./private-key.pem'), cert: fs.readFileSync('./public-cert.pem'), @@ -18,11 +20,18 @@ async function bootstrap() { httpsOptions, logger: ['verbose'], }); - app.use(cookieParser()); app.useStaticAssets(join(__dirname, '..', 'static')); app.setBaseViewsDir(join(__dirname, '..', 'views')); app.setViewEngine('hbs'); + const logger = new Logger('Request'); + app.use( + morgan('tiny', { + stream: { + write: (message) => logger.log(message.replace('\n', '')), + }, + }), + ); await app.listen(process.env.PORT); } bootstrap(); diff --git a/server/providers/guards/roles.guard.ts b/server/providers/guards/roles.guard.ts new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/server/providers/guards/roles.guard.ts |