diff --git a/src/game/coordinate.entity.ts b/src/game/coordinate.entity.ts index 65ad6545eb030813a796cb4fef836030bf247154..e0087ba1c338d1b9420a3edf1db843e6bbf94275 100644 --- a/src/game/coordinate.entity.ts +++ b/src/game/coordinate.entity.ts @@ -13,6 +13,7 @@ import { GameEntity, } from './game.entity'; import { FactionEntity } from './faction.entity'; +import { type } from 'os'; @Entity('MapDrawing') export class MapDrawingEntity { @@ -22,9 +23,20 @@ import { @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; + } \ No newline at end of file diff --git a/src/game/faction.entity.ts b/src/game/faction.entity.ts index b0a99df8f152d4572ba528cc8149a8d0021beac7..135d73a4108b3191e29c9e8921f1fbf5dffc9a37 100644 --- a/src/game/faction.entity.ts +++ b/src/game/faction.entity.ts @@ -19,18 +19,10 @@ 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) - game: GameEntity; + @ManyToOne(type => GameEntity, game => game.id) + gameId: GameEntity; } @Entity('PowerUp') @@ -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 0ef442c04c6d4b2cf6b6f6089c045fb1b88aad51..739e02a0a7bbd77b0267ba723e7a6b622af5ee83 100644 --- a/src/game/game.entity.ts +++ b/src/game/game.entity.ts @@ -11,8 +11,8 @@ import { import { PersonEntity } from '../user/user.entity'; import { GameGroupEntity } from './group.entity'; -import { FactionEntity } from './faction.entity'; -import { MapDrawingEntity } from './coordinate.entity'; +import { FactionEntity, TaskEntity } from './faction.entity'; +import { MapDrawingEntity, Game_Person_MapDrawingEntity } from './coordinate.entity'; // table that stores all created games @Entity('Game') @@ -24,8 +24,9 @@ export class GameEntity { @Column({ type: 'json', nullable: true }) map: 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) @@ -47,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', @@ -75,11 +76,6 @@ export class ObjectivePointEntity { coordinate: MapDrawingEntity; @ManyToOne(type => GameEntity, game => game.objective_points) game: GameEntity; - @OneToMany( - type => ObjectivePoint_HistoryEntity, - op_history => op_history.objective_point, - ) - op_history: Game_PersonEntity[]; } @Entity('ObjectivePoint_History') @@ -90,7 +86,7 @@ export class ObjectivePoint_HistoryEntity { @ManyToOne( type => ObjectivePointEntity, - objective_point => objective_point.op_history, + objective_point => objective_point.objectivePointId, ) objective_point: ObjectivePointEntity; } diff --git a/src/game/game.service.ts b/src/game/game.service.ts index ec89d51b81276bc07ef1a282b2f4329428013049..44b38fca6b800a960312599362ef1c6874b405b8 100644 --- a/src/game/game.service.ts +++ b/src/game/game.service.ts @@ -34,7 +34,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({ @@ -63,7 +63,7 @@ export class GameService { // update game entry in db const updatedGame = await this.gameRepository.create({ ...gameData, - factions: null, + factionsId: null, }); updatedGame['id'] = id; const gameId = await this.gameRepository.save(updatedGame); @@ -78,7 +78,7 @@ export class GameService { if (!Object.values(factionNames).includes(faction.factionName)) { let name = await this.factionRepository.create({ ...faction, - game: gameId, + gameId: gameId, }); await this.factionRepository.insert(name); } diff --git a/src/mapmarkers/mapmarker.entity.ts b/src/mapmarkers/mapmarker.entity.ts index b83b1d9ad56c6de51563aa0e1a5fe024e5cf9665..237951a9f362fe774515f82d2fd63dfc1ed7415a 100644 --- a/src/mapmarkers/mapmarker.entity.ts +++ b/src/mapmarkers/mapmarker.entity.ts @@ -7,20 +7,21 @@ import { } from 'typeorm'; import { PersonEntity } from '../user/user.entity'; +import { GameEntity, Game_PersonEntity } from 'src/game/game.entity'; /* Entity: MapMarker - represents data that database contains on mapmarker */ - @Entity('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; + @ManyToOne(type => Game_PersonEntity, player => player.markers) + player: Game_PersonEntity; } - \ No newline at end of file + */ \ No newline at end of file diff --git a/src/mapmarkers/mapmarkers.module.ts b/src/mapmarkers/mapmarkers.module.ts index 9fda8c9309e32239634c65ce72c4816860aa8cec..a69970ec970f6f70adc8b38351364698c9e61a1e 100644 --- a/src/mapmarkers/mapmarkers.module.ts +++ b/src/mapmarkers/mapmarkers.module.ts @@ -3,7 +3,7 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { MapMarkersController } from './mapmarkers.controller'; import { MapMarkerService } from './mapmarker.service'; -import { MapMarkerEntity } from './mapmarker.entity'; +/*import { MapMarkerEntity } from './mapmarker.entity'; import { PersonEntity } from '../user/user.entity'; @Module({ @@ -11,4 +11,4 @@ import { PersonEntity } from '../user/user.entity'; controllers: [MapMarkersController], providers: [MapMarkerService] }) -export class MapMarkerModule {} +export class MapMarkerModule {}*/ diff --git a/src/shared/roles.controller.ts b/src/shared/roles.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..76f56300b3abd944e86a9c5bdbfb651e322e8ab6 --- /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(); + } +});*/ \ No newline at end of file diff --git a/src/user/user.entity.ts b/src/user/user.entity.ts index 6323836fdcaf3fbd91a3be97268e9a659e142b41..99dbea97b97aaa448e723e0602369991c6b243e1 100644 --- a/src/user/user.entity.ts +++ b/src/user/user.entity.ts @@ -7,8 +7,6 @@ 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' @Entity('Person') @@ -16,8 +14,7 @@ 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[];