Browse Source

Simpler assoication for users to racers

feature/mapper-integration
Quildra 2 years ago
parent
commit
2150abed88
  1. 39
      packages/bridge-server/migrations/20231220172744-create-users-racer.js
  2. 68
      packages/bridge-server/migrations/20231221105728-racer-to-user-assoication.js
  3. 3
      packages/bridge-server/models/racer.js
  4. 3
      packages/bridge-server/models/user.js
  5. 24
      packages/bridge-server/models/usersracer.js
  6. 10
      packages/bridge-server/src/racers/racer.model.ts
  7. 3
      packages/bridge-server/src/races/races.service.ts
  8. 12
      packages/bridge-server/src/seasons/seasons.service.ts
  9. 16
      packages/bridge-server/src/users/users-racer.model.ts
  10. 10
      packages/bridge-server/src/users/users.model.ts
  11. 4
      packages/bridge-server/src/users/users.module.ts
  12. 19
      packages/bridge-server/src/users/users.service.ts

39
packages/bridge-server/migrations/20231220172744-create-users-racer.js

@ -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');
}
};

68
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;
}
}
};

3
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',

3
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',

24
packages/bridge-server/models/usersracer.js

@ -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;
};

10
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
}

3
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]
});
}

12
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) {

16
packages/bridge-server/src/users/users-racer.model.ts

@ -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;
}

10
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
}

4
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],

19
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) {

Loading…
Cancel
Save