summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorJoseph Ditton <jditton.atomic@gmail.com>2021-11-30 15:40:07 -0700
committerJoseph Ditton <jditton.atomic@gmail.com>2021-11-30 15:40:07 -0700
commit694f2318bd2eaf526d8714c56774022a15beae04 (patch)
treeedaed14ca7d7a52e8a7a8bcdb7483d1a34bd334a /server
parent8d0b32f8dfe45291426e58f6bf20cffac8dab6e7 (diff)
downloadlocchat-694f2318bd2eaf526d8714c56774022a15beae04.tar.gz
locchat-694f2318bd2eaf526d8714c56774022a15beae04.zip
adds setup for roles
Diffstat (limited to 'server')
-rw-r--r--server/database/migrations/1638307700052-AddRoles.ts73
-rw-r--r--server/entities/role.entity.ts21
-rw-r--r--server/entities/user.entity.ts4
-rw-r--r--server/entities/user_role.entity.ts15
-rw-r--r--server/main.ts13
-rw-r--r--server/providers/guards/roles.guard.ts0
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