Browse Source

Added a link between users and racers, no ui yet

feature/mapper-integration
Quildra 2 years ago
parent
commit
40d0aa3e83
  1. 39
      packages/bridge-server/migrations/20231220172744-create-users-racer.js
  2. 24
      packages/bridge-server/models/usersracer.js
  3. 4
      packages/bridge-server/src/racers/racers.service.ts
  4. 18
      packages/bridge-server/src/upload/upload.service.ts
  5. 16
      packages/bridge-server/src/users/users-racer.model.ts
  6. 2
      packages/bridge-server/src/users/users.controller.ts
  7. 2
      packages/bridge-server/src/users/users.module.ts
  8. 17
      packages/bridge-server/src/users/users.service.ts
  9. 14
      packages/bridge-ui/src/app/pages/user/user.component.html
  10. 4
      packages/bridge-ui/src/app/pages/user/user.component.scss
  11. 4
      packages/bridge-ui/src/app/services/users.service.ts

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

@ -0,0 +1,39 @@
'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');
}
};

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

@ -0,0 +1,24 @@
'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;
};

4
packages/bridge-server/src/racers/racers.service.ts

@ -12,6 +12,10 @@ export class RacersService {
)
{}
async findOne(gameHandle: string) {
return this.racerModel.findOne({ where: {gameHandle: gameHandle} });
}
async findOrCreate(gameHandle: string): Promise<Racer> {
try {
return this.sequelize.transaction( async t => {

18
packages/bridge-server/src/upload/upload.service.ts

@ -24,6 +24,24 @@ export class UploadService {
)
{}
async getRacerFromReplay(file: Express.Multer.File) {
let buffer = readFileSync(file.path);
let buff = new AdvancableBuffer(buffer);
let header = new gbxHeader();
header.parse(buff);
if (header.is_vaild == false)
{
unlinkSync(file.path);
throw new NotAcceptableException('GBXInvalid', {cause: new Error(), description: 'This is not a valid replay file'});
}
let replay = new gbxReplay();
replay.parse(buff);
return await this.racersService.findOne(replay.gamerHandle);
}
async replayUploaded(file: Express.Multer.File, body: any) {
const hash = createHash('sha256');

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

@ -0,0 +1,16 @@
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;
}

2
packages/bridge-server/src/users/users.controller.ts

@ -18,4 +18,6 @@ export class UsersController {
updateLastLogin(@Body() body: any) {
return this.usersService.updateLastLogin(body.id, body.nickname, body.picture, body.time);
}
}

2
packages/bridge-server/src/users/users.module.ts

@ -3,10 +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';
@Module({
imports: [
SequelizeModule.forFeature([User]),
SequelizeModule.forFeature([UsersRacer]),
],
providers: [UsersService],
controllers: [UsersController],

17
packages/bridge-server/src/users/users.service.ts

@ -2,6 +2,8 @@ import { Injectable } from '@nestjs/common';
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;
@ -15,6 +17,7 @@ export class UsersService {
constructor(
@InjectModel(User) private userModel: typeof User,
@InjectModel(UsersRacer) private usersRacerModel: typeof UsersRacer,
private sequelize: Sequelize
)
{}
@ -22,4 +25,18 @@ export class UsersService {
updateLastLogin(id, nickname, picture, time) {
this.userModel.upsert({auth0id: id, nickname: nickname, picture: picture, lastLogin: time});
}
async claimRacer(user, racer: Racer) {
try {
await this.sequelize.transaction( async t => {
const transactionHost = { transaction: t };
await this.usersRacerModel.create(
{ userId: user.sub, racerId: racer.id },
transactionHost
);
});
} catch (error) {
}
}
}

14
packages/bridge-ui/src/app/pages/user/user.component.html

@ -12,7 +12,19 @@
<mat-card-actions>
<button mat-button>Edit</button>
</mat-card-actions>
</mat-card>
</mat-card>
<mat-card>
<mat-card-header>
<mat-card-title>Racer Stats</mat-card-title>
</mat-card-header>
<mat-card-content>
</mat-card-content>
<mat-card-actions>
<button mat-button>Claim</button>
</mat-card-actions>
</mat-card>
</div>
<div class="column middle">

4
packages/bridge-ui/src/app/pages/user/user.component.scss

@ -19,3 +19,7 @@
.user-image {
width: 200px;
}
mat-card {
margin-bottom: 1rem;
}

4
packages/bridge-ui/src/app/services/users.service.ts

@ -84,9 +84,9 @@ export class UsersService {
}
getUserRealName() : string {
if(!this.isAuthenticated || !this.user || !this.additionalInfo) {return ""}
if(!this.isAuthenticated || !this.user || !this.additionalInfo) {return "??? ???"}
return "";
return "??? ???";
}
canCreateSeasons() : boolean {

Loading…
Cancel
Save