From 35d86335671c7b1ef29933361420c0a771d20ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Thu, 29 May 2025 22:28:26 +0200 Subject: [PATCH] progress on team and player positions --- backend/controllers/player.controller.js | 10 ++++- backend/controllers/position.controller.js | 0 backend/controllers/team.controller.js | 41 +++++++++++++++++++ backend/migrations/08-create-position.js | 0 .../migrations/09-create-player-position.js | 0 backend/migrations/10-create-team.js | 0 backend/migrations/11-create-player-team.js | 0 ...a.js => 12-create-player-and-move-data.js} | 4 +- ...user.js => 13-remove-columns-from-user.js} | 0 backend/models/pitchType.model.js | 1 - backend/models/player.model.js | 10 +++++ backend/models/playerTeam.model.js | 30 ++++++++++++++ backend/models/position.model.js | 33 +++++++++++++++ backend/models/team.model.js | 34 +++++++++++++++ backend/seeders/04-positions.js | 20 +++++++++ backend/test/data/player.test.data.js | 20 +++++---- 16 files changed, 191 insertions(+), 12 deletions(-) create mode 100644 backend/controllers/position.controller.js create mode 100644 backend/controllers/team.controller.js create mode 100644 backend/migrations/08-create-position.js create mode 100644 backend/migrations/09-create-player-position.js create mode 100644 backend/migrations/10-create-team.js create mode 100644 backend/migrations/11-create-player-team.js rename backend/migrations/{08-create-player-and-move-data.js => 12-create-player-and-move-data.js} (96%) rename backend/migrations/{09-remove-columns-from-user.js => 13-remove-columns-from-user.js} (100%) create mode 100644 backend/models/playerTeam.model.js create mode 100644 backend/models/position.model.js create mode 100644 backend/models/team.model.js create mode 100644 backend/seeders/04-positions.js diff --git a/backend/controllers/player.controller.js b/backend/controllers/player.controller.js index 858107d..8b56d8a 100644 --- a/backend/controllers/player.controller.js +++ b/backend/controllers/player.controller.js @@ -47,7 +47,15 @@ exports.findOne = (req, res) => { const id = req.params.id; Player.findByPk(id, { - include: { model: User } + include: { + model: User, + as: 'user', + include: { + model: Auth, + as: 'auth', + attributes: ['email'] + } + } }).then(data => { if (data) { res.send(data); diff --git a/backend/controllers/position.controller.js b/backend/controllers/position.controller.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/controllers/team.controller.js b/backend/controllers/team.controller.js new file mode 100644 index 0000000..fa0be0a --- /dev/null +++ b/backend/controllers/team.controller.js @@ -0,0 +1,41 @@ +const db = require("../models/index"); +const Team = db.Team; +const Player = db.Player; +const Op = db.Sequelize.Op; + +exports.findAll = (req, res) => { + const title = req.query.title; + const condition = title ? {title: {[Op.iLike]: `%${title}%`}} : null; + + Team.findAll({ + where: condition, + include: ['players'] + }).then(data => { + res.send(data); + }).catch(err => { + res.status(500).send({ + message: + err.message || "Some error occurred while retrieving teams." + }); + }); +}; + +exports.findOne = (req, res) => { + const id = req.params.id; + + Team.findByPk(id, { + include: ['players'] + }).then(data => { + res.send(data); + }).catch(err => { + res.status(500).send({ + message: `Error retrieving team with id=${id}: ${err.message}` + }); + }); +}; + +exports.addPlayer = (req, res) => { + const id = req.params.id; + const playerId = req.params.playerId; + +} \ No newline at end of file diff --git a/backend/migrations/08-create-position.js b/backend/migrations/08-create-position.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/migrations/09-create-player-position.js b/backend/migrations/09-create-player-position.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/migrations/10-create-team.js b/backend/migrations/10-create-team.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/migrations/11-create-player-team.js b/backend/migrations/11-create-player-team.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/migrations/08-create-player-and-move-data.js b/backend/migrations/12-create-player-and-move-data.js similarity index 96% rename from backend/migrations/08-create-player-and-move-data.js rename to backend/migrations/12-create-player-and-move-data.js index 0168ad7..535ee9d 100644 --- a/backend/migrations/08-create-player-and-move-data.js +++ b/backend/migrations/12-create-player-and-move-data.js @@ -18,10 +18,10 @@ module.exports = { onDelete: 'CASCADE' }, height: { - type: Sequelize.FLOAT + type: Sequelize.INTEGER }, weight: { - type: Sequelize.FLOAT + type: Sequelize.INTEGER }, gender: { allowNull: false, diff --git a/backend/migrations/09-remove-columns-from-user.js b/backend/migrations/13-remove-columns-from-user.js similarity index 100% rename from backend/migrations/09-remove-columns-from-user.js rename to backend/migrations/13-remove-columns-from-user.js diff --git a/backend/models/pitchType.model.js b/backend/models/pitchType.model.js index 139f6f5..5be9f1e 100644 --- a/backend/models/pitchType.model.js +++ b/backend/models/pitchType.model.js @@ -1,4 +1,3 @@ -'use strict'; const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class PitchType extends Model { diff --git a/backend/models/player.model.js b/backend/models/player.model.js index 7daab1e..0885625 100644 --- a/backend/models/player.model.js +++ b/backend/models/player.model.js @@ -12,6 +12,16 @@ module.exports = (sequelize, DataTypes) => { foreignKey: "userId", as: "user" }); + Player.belongsToMany(models.Team, { + through: "PlayerTeams", + foreignKey: 'playerId', + otherKey: 'teamId', + as: 'teams', + }); + Player.hasMany(models.Position, { + through: "PlayerPositions", + as: 'positions', + }) } } Player.init({ diff --git a/backend/models/playerTeam.model.js b/backend/models/playerTeam.model.js new file mode 100644 index 0000000..ff51d58 --- /dev/null +++ b/backend/models/playerTeam.model.js @@ -0,0 +1,30 @@ +const { Model } = require('sequelize'); + +module.exports = (sequelize, DataTypes) => { + class PlayerTeam extends Model { + static associate(models) {} + } + + PlayerTeam.init({ + playerId: { + type: DataTypes.INTEGER, + references: { + model: 'Players', + key: 'id' + } + }, + teamId: { + type: DataTypes.INTEGER, + references: { + model: 'Teams', + key: 'id' + } + } + }, { + sequelize, + modelName: 'PlayerTeam', + tableName: 'PlayerTeams' + }); + + return PlayerTeam; +}; diff --git a/backend/models/position.model.js b/backend/models/position.model.js new file mode 100644 index 0000000..57dab04 --- /dev/null +++ b/backend/models/position.model.js @@ -0,0 +1,33 @@ +const { Model } = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Position 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 + } + } + Position.init({ + name: { + type: DataTypes.STRING, + allowNull: false, + unique: true + }, + abbreviation: { + type: DataTypes.STRING, + allowNull: false + }, + description: { + type: DataTypes.STRING, + allowNull: false + } + }, { + sequelize, + modelName: 'Position', + tableName: 'Positions' + }); + return Position; +}; \ No newline at end of file diff --git a/backend/models/team.model.js b/backend/models/team.model.js new file mode 100644 index 0000000..c270659 --- /dev/null +++ b/backend/models/team.model.js @@ -0,0 +1,34 @@ +const { Model } = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Team 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) { + Team.belongsToMany(models.Player, { + through: "PlayerTeams", + foreignKey: 'teamId', + otherKey: 'playerId', + as: 'players', + }); + } + } + Team.init({ + name: { + type: DataTypes.STRING, + allowNull: false, + unique: true + }, + description: { + type: DataTypes.STRING, + allowNull: false + } + }, { + sequelize, + modelName: 'Team', + tableName: 'Teams' + }); + return Team; +}; \ No newline at end of file diff --git a/backend/seeders/04-positions.js b/backend/seeders/04-positions.js new file mode 100644 index 0000000..9c1fb98 --- /dev/null +++ b/backend/seeders/04-positions.js @@ -0,0 +1,20 @@ +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + return queryInterface.bulkInsert('Positions',[ + { name: 'Pitcher', abbreviation: 'P', description: '', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Catcher', abbreviation: 'C', description: '', createdAt: new Date(), updatedAt: new Date() }, + { name: 'First Baseman', abbreviation: '1B', description: '', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Second Baseman', abbreviation: '2B', description: '', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Third Baseman', abbreviation: '3B', description: '', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Short Stop', abbreviation: 'SS', description: '', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Left Fielder', abbreviation: 'LF', description: '', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Center Fielder', abbreviation: 'CF', description: '', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Right Fielder', abbreviation: 'RF', description: '', createdAt: new Date(), updatedAt: new Date() }, + ]); + }, + + async down (queryInterface, Sequelize) { + return queryInterface.dropTable('Positions'); + } +}; diff --git a/backend/test/data/player.test.data.js b/backend/test/data/player.test.data.js index be10f0b..9460bff 100644 --- a/backend/test/data/player.test.data.js +++ b/backend/test/data/player.test.data.js @@ -1,17 +1,21 @@ const signupPlayer = { - firstName: "Hans", - lastName: "Zimmer", - dateOfBirth: "1956-11-23", - email: "base.ball@email.com", - height: 183.3, - weight: 83.3, + height: 183, + weight: 83, gender: "male", bats: "right", throws: "left", jerseyNumber: 13, state: "inactive", - password: "base$123", - roles: ['player'] + user: { + firstName: "Hans", + lastName: "Zimmer", + dateOfBirth: "1956-11-23", + roles: ['player'], + auth: { + email: "base.ball@email.com", + password: "base$123" + } + } } module.exports = {