From 2150abed881a869b5e9ecd5125f18023885cb5cf Mon Sep 17 00:00:00 2001 From: Quildra Date: Thu, 21 Dec 2023 13:10:10 +0000 Subject: [PATCH] Simpler assoication for users to racers --- .../20231220172744-create-users-racer.js | 39 ----------- ...0231221105728-racer-to-user-assoication.js | 68 +++++++++++++++++++ packages/bridge-server/models/racer.js | 3 +- packages/bridge-server/models/user.js | 3 +- packages/bridge-server/models/usersracer.js | 24 ------- .../bridge-server/src/racers/racer.model.ts | 10 ++- .../bridge-server/src/races/races.service.ts | 3 +- .../src/seasons/seasons.service.ts | 12 +++- .../src/users/users-racer.model.ts | 16 ----- .../bridge-server/src/users/users.model.ts | 10 ++- .../bridge-server/src/users/users.module.ts | 4 +- .../bridge-server/src/users/users.service.ts | 19 ++++-- 12 files changed, 119 insertions(+), 92 deletions(-) delete mode 100644 packages/bridge-server/migrations/20231220172744-create-users-racer.js create mode 100644 packages/bridge-server/migrations/20231221105728-racer-to-user-assoication.js delete mode 100644 packages/bridge-server/models/usersracer.js delete mode 100644 packages/bridge-server/src/users/users-racer.model.ts diff --git a/packages/bridge-server/migrations/20231220172744-create-users-racer.js b/packages/bridge-server/migrations/20231220172744-create-users-racer.js deleted file mode 100644 index bba57ba..0000000 --- a/packages/bridge-server/migrations/20231220172744-create-users-racer.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; -/** @type {import('sequelize-cli').Migration} */ -module.exports = { - async up(queryInterface, Sequelize) { - await queryInterface.createTable('UsersRacers', { - userId: { - primaryKey: true, - type: Sequelize.STRING, - references: { - model: { - tableName: 'Users', - }, - key: 'auth0id', - }, - }, - racerId: { - primaryKey: true, - type: Sequelize.NUMBER, - references: { - model: { - tableName: 'Racers', - }, - key: 'id', - }, - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE - } - }); - }, - async down(queryInterface, Sequelize) { - await queryInterface.dropTable('UsersRacers'); - } -}; \ No newline at end of file diff --git a/packages/bridge-server/migrations/20231221105728-racer-to-user-assoication.js b/packages/bridge-server/migrations/20231221105728-racer-to-user-assoication.js new file mode 100644 index 0000000..f070564 --- /dev/null +++ b/packages/bridge-server/migrations/20231221105728-racer-to-user-assoication.js @@ -0,0 +1,68 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + /** + * Add altering commands here. + * + * Example: + * await queryInterface.createTable('users', { id: Sequelize.INTEGER }); + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + await queryInterface.addColumn( + 'Users', + 'tmRacerId', + { + allowNull: true, + type: Sequelize.NUMBER, + references: { + model: { + tableName: 'Racers', + }, + key: 'id', + }, + }, + { transaction } + ); + await queryInterface.addColumn( + 'Racers', + 'userId', + { + allowNull: true, + type: Sequelize.STRING, + references: { + model: { + tableName: 'Users', + }, + key: 'auth0id', + }, + }, + { transaction } + ); + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + + async down (queryInterface, Sequelize) { + /** + * Add reverting commands here. + * + * Example: + * await queryInterface.dropTable('users'); + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + await queryInterface.removeColumn('Users', 'tmRacerId', { transaction }); + await queryInterface.removeColumn('Racers', 'userId', { transaction }); + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/packages/bridge-server/models/racer.js b/packages/bridge-server/models/racer.js index af42d1a..2c1d4ae 100644 --- a/packages/bridge-server/models/racer.js +++ b/packages/bridge-server/models/racer.js @@ -15,7 +15,8 @@ module.exports = (sequelize, DataTypes) => { } Racer.init({ name: DataTypes.STRING, - gameHandle: DataTypes.STRING + gameHandle: DataTypes.STRING, + userId: DataTypes.STRING }, { sequelize, modelName: 'Racer', diff --git a/packages/bridge-server/models/user.js b/packages/bridge-server/models/user.js index 7fc115a..c3155a8 100644 --- a/packages/bridge-server/models/user.js +++ b/packages/bridge-server/models/user.js @@ -18,7 +18,8 @@ module.exports = (sequelize, DataTypes) => { auth0id: DataTypes.STRING, picture: DataTypes.STRING, realName: DataTypes.STRING, - lastLogin: DataTypes.DATE + lastLogin: DataTypes.DATE, + tmRacerId: DataTypes.NUMBER }, { sequelize, modelName: 'User', diff --git a/packages/bridge-server/models/usersracer.js b/packages/bridge-server/models/usersracer.js deleted file mode 100644 index f7c27a7..0000000 --- a/packages/bridge-server/models/usersracer.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; -const { - Model -} = require('sequelize'); -module.exports = (sequelize, DataTypes) => { - class UsersRacer extends Model { - /** - * Helper method for defining associations. - * This method is not a part of Sequelize lifecycle. - * The `models/index` file will call this method automatically. - */ - static associate(models) { - // define association here - } - } - UsersRacer.init({ - racerId: DataTypes.NUMBER, - userId: DataTypes.STRING - }, { - sequelize, - modelName: 'UsersRacer', - }); - return UsersRacer; -}; \ No newline at end of file diff --git a/packages/bridge-server/src/racers/racer.model.ts b/packages/bridge-server/src/racers/racer.model.ts index fce6138..b5e3cab 100644 --- a/packages/bridge-server/src/racers/racer.model.ts +++ b/packages/bridge-server/src/racers/racer.model.ts @@ -1,5 +1,6 @@ -import { Column, Model, Table, HasMany } from "sequelize-typescript"; +import { Column, Model, Table, HasMany, HasOne, BelongsTo, ForeignKey } from "sequelize-typescript"; import { RaceResult } from "src/race-results/race-result.model"; +import { User } from "src/users/users.model"; @Table export class Racer extends Model { @@ -11,4 +12,11 @@ export class Racer extends Model { @HasMany(() => RaceResult) results: RaceResult[]; + + @ForeignKey(() => User) + @Column + userId: string; + + @BelongsTo(() => User) + user: User } \ No newline at end of file diff --git a/packages/bridge-server/src/races/races.service.ts b/packages/bridge-server/src/races/races.service.ts index 4d2e763..3c7e0d3 100644 --- a/packages/bridge-server/src/races/races.service.ts +++ b/packages/bridge-server/src/races/races.service.ts @@ -9,6 +9,7 @@ import { Season } from 'src/seasons/season.model'; import * as TMIO from 'trackmania.io'; import { from } from 'rxjs'; import { Racer } from 'src/racers/racer.model'; +import { User } from 'src/users/users.model'; @Injectable() export class RacesService { @@ -25,7 +26,7 @@ export class RacesService { async findOne(id: number) { return this.raceModel.findOne({ where: {id: id}, - include:[{model: RaceResult, include:[Racer]}, Season] + include:[{model: RaceResult, include:[{model:Racer, include:[User]}]}, Season] }); } diff --git a/packages/bridge-server/src/seasons/seasons.service.ts b/packages/bridge-server/src/seasons/seasons.service.ts index ac5175b..8f3b036 100644 --- a/packages/bridge-server/src/seasons/seasons.service.ts +++ b/packages/bridge-server/src/seasons/seasons.service.ts @@ -5,6 +5,7 @@ import { SeasonStanding } from 'src/season-standings/season-standing.model'; import { Race } from 'src/races/race.model'; import { Sequelize } from 'sequelize-typescript'; import { Racer } from 'src/racers/racer.model'; +import { User } from 'src/users/users.model'; @Injectable() export class SeasonsService { @@ -19,7 +20,16 @@ export class SeasonsService { } async findOne(id: number) { - return this.seasonModel.findOne({ where: {id: id} , include:[{model: SeasonStanding, include:[Racer]}, Race] }) + return this.seasonModel.findOne( + { + where: {id: id}, + include:[ + {model: SeasonStanding, include:[ + {model:Racer, include:[User]} + ]}, + Race + ] + }); } async create(title: string, subTitle: string, startingDate: Date) { diff --git a/packages/bridge-server/src/users/users-racer.model.ts b/packages/bridge-server/src/users/users-racer.model.ts deleted file mode 100644 index 26dc445..0000000 --- a/packages/bridge-server/src/users/users-racer.model.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Column, ForeignKey, HasMany, Model, PrimaryKey, Table } from "sequelize-typescript"; -import { Racer } from "src/racers/racer.model"; -import { User } from "./users.model"; - -@Table -export class UsersRacer extends Model { - @ForeignKey(() => User) - @PrimaryKey - @Column - userId: string; - - @ForeignKey(() => Racer) - @PrimaryKey - @Column - racerId: number; -} \ No newline at end of file diff --git a/packages/bridge-server/src/users/users.model.ts b/packages/bridge-server/src/users/users.model.ts index 16dc9aa..f71c207 100644 --- a/packages/bridge-server/src/users/users.model.ts +++ b/packages/bridge-server/src/users/users.model.ts @@ -1,4 +1,5 @@ -import { Column, HasMany, Model, PrimaryKey, Table } from "sequelize-typescript"; +import { BelongsTo, Column, ForeignKey, HasMany, HasOne, Model, PrimaryKey, Table } from "sequelize-typescript"; +import { Racer } from "src/racers/racer.model"; @Table export class User extends Model { @@ -17,4 +18,11 @@ export class User extends Model { @Column lastLogin: Date; + + @ForeignKey(() => Racer) + @Column + tmRacerId: number; + + @BelongsTo(() => Racer) + racer: Racer } \ No newline at end of file diff --git a/packages/bridge-server/src/users/users.module.ts b/packages/bridge-server/src/users/users.module.ts index 9a7d2e4..3ec43a7 100644 --- a/packages/bridge-server/src/users/users.module.ts +++ b/packages/bridge-server/src/users/users.module.ts @@ -3,12 +3,12 @@ import { SequelizeModule } from '@nestjs/sequelize'; import { UsersService } from './users.service'; import { UsersController } from './users.controller'; import { User } from './users.model'; -import { UsersRacer } from './users-racer.model'; +import { Racer } from 'src/racers/racer.model'; @Module({ imports: [ SequelizeModule.forFeature([User]), - SequelizeModule.forFeature([UsersRacer]), + SequelizeModule.forFeature([Racer]), ], providers: [UsersService], controllers: [UsersController], diff --git a/packages/bridge-server/src/users/users.service.ts b/packages/bridge-server/src/users/users.service.ts index bf4f62c..4b8e79c 100644 --- a/packages/bridge-server/src/users/users.service.ts +++ b/packages/bridge-server/src/users/users.service.ts @@ -3,7 +3,6 @@ import { InjectModel } from '@nestjs/sequelize'; import { Sequelize } from 'sequelize-typescript'; import { User } from './users.model'; import { Racer } from 'src/racers/racer.model'; -import { UsersRacer } from './users-racer.model'; // This should be a real class/interface representing a user entity //export type User = any; @@ -17,7 +16,7 @@ export class UsersService { constructor( @InjectModel(User) private userModel: typeof User, - @InjectModel(UsersRacer) private usersRacerModel: typeof UsersRacer, + @InjectModel(Racer) private racersModel: typeof Racer, private sequelize: Sequelize ) {} @@ -30,10 +29,20 @@ export class UsersService { try { await this.sequelize.transaction( async t => { const transactionHost = { transaction: t }; - await this.usersRacerModel.create( - { userId: user.sub, racerId: racer.id }, - transactionHost + let target_user = await this.userModel.findOne( + { where: {auth0id: user.sub} } ); + + if(!target_user) + { + throw new Error(); + } + + target_user.tmRacerId = racer.id; + racer.userId = target_user.auth0id; + + target_user.save(); + racer.save(); }); } catch (error) {