From df9625ce0c8e3beb1534d8832c77550443c9808e Mon Sep 17 00:00:00 2001 From: L4168 <L4168@student.jamk.fi> Date: Mon, 24 Jun 2019 13:16:28 +0300 Subject: [PATCH] merge fixes --- src/game/coordinate.entity.ts | 23 +++++- src/game/faction.entity.ts | 18 ++--- src/game/game.entity.ts | 18 ++--- src/game/game.module.ts | 2 + src/game/game.service.ts | 4 +- src/mapmarkers/mapmarker.entity.ts | 41 +++++------ src/mapmarkers/mapmarker.service.ts | 10 ++- src/notifications/notifications.module.ts | 1 + src/shared/roles.controller.ts | 88 +++++++++++++++++++++++ src/user/user.entity.ts | 6 +- 10 files changed, 148 insertions(+), 63 deletions(-) create mode 100644 src/shared/roles.controller.ts diff --git a/src/game/coordinate.entity.ts b/src/game/coordinate.entity.ts index d3d7d01..851bb65 100644 --- a/src/game/coordinate.entity.ts +++ b/src/game/coordinate.entity.ts @@ -1,5 +1,11 @@ -import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; -import { GameEntity } from './game.entity'; +import { + Entity, + Column, + PrimaryGeneratedColumn, + ManyToOne, + Timestamp, +} from 'typeorm'; +import { GameEntity, Game_PersonEntity } from './game.entity'; import { FactionEntity } from './faction.entity'; @Entity('MapDrawing') @@ -10,8 +16,19 @@ export class MapDrawingEntity { @Column({ type: 'json', nullable: true }) data: JSON; - @ManyToOne(type => FactionEntity, faction => faction.mapDrawings) + @ManyToOne(type => FactionEntity, faction => faction.factionId) faction: FactionEntity; @ManyToOne(type => GameEntity, gameEntity => gameEntity.id) gameId: GameEntity; } + +@Entity('Game_Person_MapDrawing') +export class Game_Person_MapDrawingEntity { + @PrimaryGeneratedColumn('uuid') GPmapDrawingId: string; + @Column({ type: 'timestamp' }) GPCTimeStamp: Timestamp; + + @ManyToOne(type => Game_PersonEntity, game_person => game_person.gamepersonId) + game_person: Game_PersonEntity; + @ManyToOne(type => MapDrawingEntity, map_drawing => map_drawing.mapDrawingId) + map_drawing: MapDrawingEntity; +} diff --git a/src/game/faction.entity.ts b/src/game/faction.entity.ts index b0a99df..afac7c2 100644 --- a/src/game/faction.entity.ts +++ b/src/game/faction.entity.ts @@ -19,17 +19,9 @@ export class FactionEntity { @Column({ type: 'text' }) factionPassword: string; @Column({ type: 'float' }) multiplier: number; - @OneToMany(type => MapDrawingEntity, mapDrawings => mapDrawings.faction) - mapDrawings: MapDrawingEntity[]; - @OneToMany(type => ScoreEntity, scores => scores.faction) - scores: ScoreEntity[]; - @OneToMany(type => PowerUpEntity, powerUps => powerUps.factions) - powerUps: Faction_PowerUpEntity[]; - @OneToMany(type => TaskEntity, tasks => tasks.faction) - tasks: TaskEntity[]; @OneToMany(type => Game_PersonEntity, game_persons => game_persons.faction) game_persons: Game_PersonEntity[]; - @ManyToOne(type => GameEntity, game => game.factions) + @ManyToOne(type => GameEntity, game => game.id) game: GameEntity; } @@ -41,7 +33,7 @@ export class PowerUpEntity { @Column({ type: 'int' }) amount: number; @Column({ type: 'time' }) cooldown: string; - @OneToMany(type => FactionEntity, factions => factions.powerUps) + @OneToMany(type => FactionEntity, factions => factions.factionId) factions: Faction_PowerUpEntity[]; } @@ -49,7 +41,7 @@ export class PowerUpEntity { export class Faction_PowerUpEntity { @PrimaryGeneratedColumn('uuid') faction_powerUpId: string; - @ManyToOne(type => FactionEntity, faction => faction.powerUps) + @ManyToOne(type => FactionEntity, faction => faction.factionId) faction: FactionEntity; @ManyToOne(type => PowerUpEntity, powerUp => powerUp.factions) powerUp: PowerUpEntity; @@ -75,7 +67,7 @@ export class ScoreEntity { @Column({ type: 'float' }) score: number; @Column({ type: 'timestamp' }) scoreTimeStamp: Timestamp; - @ManyToOne(type => FactionEntity, factionName => factionName.scores) + @ManyToOne(type => FactionEntity, factionName => factionName.factionId) faction: FactionEntity; } @@ -87,7 +79,7 @@ export class TaskEntity { @Column({ type: 'text' }) taskWinner: string; @Column({ type: 'bool' }) taskIsActive: boolean; - @ManyToOne(type => FactionEntity, faction => faction.tasks) + @ManyToOne(type => FactionEntity, faction => faction.factionId) faction: FactionEntity; /* @ManyToOne(type => PersonEntity, person => person.tasks) person: PersonEntity; */ diff --git a/src/game/game.entity.ts b/src/game/game.entity.ts index 06b0508..efa5c48 100644 --- a/src/game/game.entity.ts +++ b/src/game/game.entity.ts @@ -25,8 +25,8 @@ export class GameEntity { @Column({ type: 'json', nullable: true }) nodesettings?: JSON; @Column('timestamp') startdate: Timestamp; @Column('timestamp') enddate: Timestamp; - @OneToMany(type => FactionEntity, faction => faction.game) - factions: FactionEntity[]; + @OneToMany(type => FactionEntity, factions => factions.factionId) + factionsId: FactionEntity[]; @OneToMany(type => Game_PersonEntity, game_persons => game_persons.game) game_persons: Game_PersonEntity[]; @OneToMany(type => GameGroupEntity, group => group.game) @@ -48,11 +48,11 @@ export class GameEntity { export class Game_PersonEntity { @PrimaryGeneratedColumn('uuid') gamepersonId: string; @Column({ type: 'text', nullable: true }) role: string; - @ManyToOne(type => FactionEntity, faction => faction.game_persons) + @ManyToOne(type => FactionEntity, faction => faction.factionId) faction: FactionEntity; - @ManyToOne(type => GameEntity, game => game.game_persons) + @ManyToOne(type => GameEntity, game => game.id) game: GameEntity; - @ManyToOne(type => PersonEntity, person => person.game_persons) + @ManyToOne(type => PersonEntity, person => person.id) person: PersonEntity; @OneToOne(type => GameGroupEntity, group => group.leader, { onDelete: 'CASCADE', @@ -71,17 +71,11 @@ export class ObjectivePointEntity { @PrimaryGeneratedColumn('uuid') objectivePointId: string; @Column({ type: 'text' }) objectivePointDescription: string; @Column({ type: 'float' }) objectivePointMultiplier: number; - //@Column('boolean') captureStatus: boolean; @ManyToOne(type => MapDrawingEntity, coordinate => coordinate.data) coordinate: MapDrawingEntity; @ManyToOne(type => GameEntity, game => game.objective_points) game: GameEntity; - @OneToMany( - type => ObjectivePoint_HistoryEntity, - op_history => op_history.objective_point, - ) - op_history: ObjectivePoint_HistoryEntity[]; } @Entity('ObjectivePoint_History') @@ -95,7 +89,7 @@ export class ObjectivePoint_HistoryEntity { owner: FactionEntity; @ManyToOne( type => ObjectivePointEntity, - objective_point => objective_point.op_history, + objective_point => objective_point.objectivePointId, ) objective_point: ObjectivePointEntity; } diff --git a/src/game/game.module.ts b/src/game/game.module.ts index 54520a8..c908e48 100644 --- a/src/game/game.module.ts +++ b/src/game/game.module.ts @@ -12,6 +12,7 @@ import { import { PersonEntity } from '../user/user.entity'; import { GameGroupEntity } from './group.entity'; import { FactionEntity } from './faction.entity'; +import { NotificationModule } from '../notifications/notifications.module'; @Module({ imports: [ @@ -24,6 +25,7 @@ import { FactionEntity } from './faction.entity'; ObjectivePointEntity, ObjectivePoint_HistoryEntity, ]), + NotificationModule, ], controllers: [GameController], providers: [GameService], diff --git a/src/game/game.service.ts b/src/game/game.service.ts index 8efdd87..31f31d7 100644 --- a/src/game/game.service.ts +++ b/src/game/game.service.ts @@ -47,7 +47,7 @@ export class GameService { // else add the game to the database const game = await this.gameRepository.create({ ...gameData, - factions: gameData.factions, + factionsId: gameData.factions, }); await this.gameRepository.insert(game); const gamePerson = await this.game_PersonRepository.create({ @@ -76,7 +76,7 @@ export class GameService { // update game entry in db const updatedGame = await this.gameRepository.create({ ...gameData, - factions: null, + factionsId: null, objective_points: null, }); updatedGame['id'] = id; diff --git a/src/mapmarkers/mapmarker.entity.ts b/src/mapmarkers/mapmarker.entity.ts index b83b1d9..ed4896c 100644 --- a/src/mapmarkers/mapmarker.entity.ts +++ b/src/mapmarkers/mapmarker.entity.ts @@ -1,26 +1,23 @@ import { - Entity, - Column, - PrimaryGeneratedColumn, - Timestamp, - ManyToOne, - } from 'typeorm'; - - import { PersonEntity } from '../user/user.entity'; - - /* + Entity, + Column, + PrimaryGeneratedColumn, + Timestamp, + ManyToOne, +} from 'typeorm'; + +import { PersonEntity } from '../user/user.entity'; + +/* Entity: MapMarker - represents data that database contains on mapmarker */ - - @Entity('MapMarker') - export class MapMarkerEntity { - @PrimaryGeneratedColumn('uuid') id: string; - @Column({ type: 'text', nullable: true }) latitude: string; - @Column({ type: 'text', nullable: true }) longitude: string; - @Column({ type: 'timestamp' }) timestamp: Timestamp; - @Column({ type: 'json', nullable: true }) features: JSON; - @ManyToOne(type => PersonEntity, player => player.markers) - player: PersonEntity; - } - \ No newline at end of file + +@Entity('MapMarker') +export class MapMarkerEntity { + @PrimaryGeneratedColumn('uuid') id: string; + @Column({ type: 'text', nullable: true }) latitude: string; + @Column({ type: 'text', nullable: true }) longitude: string; + @Column({ type: 'timestamp' }) timestamp: Timestamp; + @Column({ type: 'json', nullable: true }) features: JSON; +} diff --git a/src/mapmarkers/mapmarker.service.ts b/src/mapmarkers/mapmarker.service.ts index 1a94869..f320d17 100644 --- a/src/mapmarkers/mapmarker.service.ts +++ b/src/mapmarkers/mapmarker.service.ts @@ -1,11 +1,10 @@ -import { Injectable, HttpException, HttpStatus } from '@nestjs/common'; -import { Repository, In } from 'typeorm'; +import { Injectable } from '@nestjs/common'; +import { Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { MapMarkerEntity } from './mapmarker.entity'; import { MapMarkerDTO } from './mapmarker.dto'; import { PersonEntity } from '../user/user.entity'; -import { userInfo } from 'os'; @Injectable() export class MapMarkerService { @@ -29,12 +28,11 @@ export class MapMarkerService { //create© entity properties const location = await this.mapmarkerRepository.create({ ...data, - player: user, }); // insert created entity NOTE: insert method doesn't check for duplicates. await this.mapmarkerRepository.insert(location); // return data and player id&name - return { ...data, player: location.player.nameObject() }; + return { ...data }; } catch (error) { return error; } @@ -49,7 +47,7 @@ export class MapMarkerService { }); // return markers from database with said playerdata return markers.map(marker => { - return { ...marker, player: marker.player.nameObject() }; + return { ...marker }; }); } catch (error) { return error.message; diff --git a/src/notifications/notifications.module.ts b/src/notifications/notifications.module.ts index 5441d12..97cf59c 100644 --- a/src/notifications/notifications.module.ts +++ b/src/notifications/notifications.module.ts @@ -6,5 +6,6 @@ import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [TypeOrmModule.forFeature([NotificationEntity])], providers: [NotificationGateway], + exports: [NotificationGateway], }) export class NotificationModule {} diff --git a/src/shared/roles.controller.ts b/src/shared/roles.controller.ts new file mode 100644 index 0000000..0d91e06 --- /dev/null +++ b/src/shared/roles.controller.ts @@ -0,0 +1,88 @@ +const AccessControl = require('accesscontrol'); + +const grants = { + admin: { + mapmarker: { + 'create:any': [], + 'delete:any': [], + 'read:any': [], + 'update:any': [], + }, + powerup: { + 'create:any': [], + 'delete:any': [], + 'read:any': [], + 'update:any': [], + }, + faction: { + 'create:any': [], + 'delete:any': [], + 'read:any': [], + 'update:any': [], + }, + players: { + 'create:any': [], + 'delete:any': [], + 'read:any': [], + 'update:any': [], + }, + }, + faction_leader: { + mapmarker: { + 'create:own': [], + 'delete:own': [], + 'read:own': [], + }, + powerup: { + 'read:own': [], + }, + faction: { + 'read:own': [], + 'update:own': [], + }, + players: { + 'read:own': [], + 'update:own': [], + }, + }, + //player & spectator +}; + +const ac = new AccessControl(grants); + +/*const express = require ('express'); +const router express.Router; + +const ac = new AccessControl(); +ac.grant('faction_leader') // define new or modify existing role. also takes an array. + .createOwn('mapmarker') // equivalent to .createOwn('video', ['*']) + .deleteOwn('mapmarker') + .readOwn('mapmarker') + .grant('admin') // switch to another role without breaking the chain + .extend('user') // inherit role capabilities. also takes an array + .updateAny('mapmarker', ['title']) // explicitly defined attributes + .deleteAny('mapmarker') + .readAny('mapmarker'); + +//const +let permission = ac.can('user').createOwn('mapmarker'); +console.log(permission.granted); // —> true +console.log(permission.attributes); // —> ['*'] (all attributes) + +permission = ac.can('admin').updateAny('mapmarker'); +console.log(permission.granted); // —> true +console.log(permission.attributes); // —> ['title'] + +router.get('/videos/:title', function (req, res, next) { + const permission = ac.can(req.user.role).readAny('video'); + if (permission.granted) { + Video.find(req.params.title, function (err, data) { + if (err || !data) return res.status(404).end(); + // filter data by permission attributes and send. + res.json(permission.filter(data)); + }); + } else { + // resource is forbidden for this user/role + res.status(403).end(); + } +});*/ diff --git a/src/user/user.entity.ts b/src/user/user.entity.ts index 6323836..ba2578f 100644 --- a/src/user/user.entity.ts +++ b/src/user/user.entity.ts @@ -7,17 +7,13 @@ import { } from 'typeorm'; import * as bcrypt from 'bcryptjs'; import * as jwt from 'jsonwebtoken'; -import { MapMarkerEntity } from 'src/mapmarkers/mapmarker.entity'; -import {TaskEntity} from '../game/faction.entity' -import {Game_PersonEntity} from '../game/game.entity' +import { Game_PersonEntity } from '../game/game.entity'; @Entity('Person') export class PersonEntity { @PrimaryGeneratedColumn('uuid') id: string; @Column({ type: 'text', unique: true }) name: string; @Column('text') password: string; - @OneToMany(type => MapMarkerEntity, marker => marker.player) - markers: MapMarkerEntity[]; @OneToMany(type => Game_PersonEntity, game_persons => game_persons.person) game_persons: Game_PersonEntity[]; -- GitLab