diff --git a/backend/app.js b/backend/app.js index f409f3c..ae076ad 100644 --- a/backend/app.js +++ b/backend/app.js @@ -18,7 +18,7 @@ app.use(express.urlencoded({ extended: true })); const db = require("./models/index"); const Role = db.Role; const User = db.User; -const PitchType = db.pitchType; +const PitchType = db.PitchType; db.sequelize.sync(); // force: true will drop the table if it already exists @@ -40,8 +40,7 @@ require('./routes/pitchType.routes')(app); function initial() { Role.bulkCreate([ { name: 'user' }, - { name: 'moderator' }, - { name: 'administrato' }, + { name: 'administrator' }, ]); User.bulkCreate([ { firstName: 'Nolan', lastName: 'Ryan', dateOfBirth: new Date(1947, 1, 31), email: 'ryan.nolan@bullpen.com', password: bcrypt.hashSync('nolan', 8) }, diff --git a/backend/controllers/auth.controller.js b/backend/controllers/auth.controller.js index dadee88..187e80a 100644 --- a/backend/controllers/auth.controller.js +++ b/backend/controllers/auth.controller.js @@ -6,7 +6,7 @@ const Op = db.Sequelize.Op; const jwt = require("jsonwebtoken"); -exports.signup = (req, res) => { +exports.register = (req, res) => { // Save User to Database User.create({ firstName: req.body.firstName, @@ -42,7 +42,7 @@ exports.signup = (req, res) => { }); }; -exports.signin = (req, res) => { +exports.login = (req, res) => { User.findOne({ where: { email: req.body.email @@ -92,6 +92,10 @@ exports.signin = (req, res) => { }); }; +exports.logout = (req, res) => { + +} + exports.refreshToken = async (req, res) => { const { refreshToken: requestToken } = req.body; @@ -113,7 +117,7 @@ exports.refreshToken = async (req, res) => { RefreshToken.destroy({ where: { id: refreshToken.id } }); res.status(403).json({ - message: "Refresh token was expired. Please make a new signin request", + message: "Refresh token was expired. Please make a new login request", }); return; } diff --git a/backend/controllers/bullpenSession.controller.js b/backend/controllers/bullpenSession.controller.js new file mode 100644 index 0000000..d2b4d42 --- /dev/null +++ b/backend/controllers/bullpenSession.controller.js @@ -0,0 +1,6 @@ +const db = require("../models/index"); +const BullpenSession = db.BullpenSession; + +exports.insert = (req, res) => { + BullpenSession.create(req.body) +}; diff --git a/backend/controllers/pitchType.controller.js b/backend/controllers/pitchType.controller.js index 39cfd1f..5528efe 100644 --- a/backend/controllers/pitchType.controller.js +++ b/backend/controllers/pitchType.controller.js @@ -1,5 +1,5 @@ const db = require("../models/index"); -const PitchType = db.pitchType; +const PitchType = db.PitchType; const Op = db.Sequelize.Op; exports.findAll = (req, res) => { diff --git a/backend/controllers/user.controller.js b/backend/controllers/user.controller.js index 1b3d8fa..e81b497 100644 --- a/backend/controllers/user.controller.js +++ b/backend/controllers/user.controller.js @@ -1,5 +1,5 @@ const db = require("../models/index"); -const User = db.user; +const User = db.User; const Op = db.Sequelize.Op; exports.findAll = (req, res) => { diff --git a/backend/migrations/07-create-pitch.js b/backend/migrations/07-create-pitch.js index 1d3e11f..52d0e04 100644 --- a/backend/migrations/07-create-pitch.js +++ b/backend/migrations/07-create-pitch.js @@ -27,6 +27,9 @@ module.exports = { onUpdate: 'CASCADE', onDelete: 'CASCADE' }, + pitchTime: { + type: Sequelize.DATE, + }, aimedArea: { type: Sequelize.INTEGER }, diff --git a/backend/models/bullpenSession.model.js b/backend/models/bullpenSession.model.js index 0568e2a..a070051 100644 --- a/backend/models/bullpenSession.model.js +++ b/backend/models/bullpenSession.model.js @@ -1,7 +1,5 @@ 'use strict'; -const { - Model -} = require('sequelize'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class BullpenSession extends Model { /** @@ -42,4 +40,4 @@ module.exports = (sequelize, DataTypes) => { tableName: 'BullpenSessions' }); return BullpenSession; -}; \ No newline at end of file +}; diff --git a/backend/models/pitch.model.js b/backend/models/pitch.model.js index 4787dbd..6e0716f 100644 --- a/backend/models/pitch.model.js +++ b/backend/models/pitch.model.js @@ -1,7 +1,4 @@ -'use strict'; -const { - Model, DataTypes -} = require('sequelize'); +const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class Pitch extends Model { /** @@ -34,6 +31,10 @@ module.exports = (sequelize, DataTypes) => { key: 'id' } }, + pitchTime: { + type: DataTypes.DATE, + allowNull: false + }, aimedArea: { type: DataTypes.INTEGER, allowNull: false diff --git a/backend/routes/auth.routes.js b/backend/routes/auth.routes.js index 770cc0e..892dd7f 100644 --- a/backend/routes/auth.routes.js +++ b/backend/routes/auth.routes.js @@ -11,14 +11,15 @@ module.exports = function(app) { }); app.post( - "/api/auth/signup", + "/api/auth/register", [ verifySignUp.checkDuplicateUsernameOrEmail, verifySignUp.checkRolesExisted ], - controller.signup + controller.register ); - app.post("/api/auth/signin", controller.signin); + app.post("/api/auth/login", controller.login); + app.post("/api/auth/logout", controller.logout); app.post("/api/auth/refreshtoken", controller.refreshToken); }; diff --git a/backend/routes/pitchType.routes.js b/backend/routes/pitchType.routes.js index 96f409f..91eff8d 100644 --- a/backend/routes/pitchType.routes.js +++ b/backend/routes/pitchType.routes.js @@ -10,6 +10,12 @@ module.exports = function(app) { next(); }); - app.get("/api/pitch_types", controller.findAll); - app.get("/api/pitch_types/:id", controller.findOne); + app.get( + "/api/pitch_types", + [authJwt.verifyToken], + controller.findAll); + app.get( + "/api/pitch_types/:id", + [authJwt.verifyToken], + controller.findOne); }; diff --git a/backend/seeders/01-roles.js b/backend/seeders/01-roles.js index 67b4072..0f29b56 100644 --- a/backend/seeders/01-roles.js +++ b/backend/seeders/01-roles.js @@ -17,11 +17,6 @@ module.exports = { }, async down (queryInterface, Sequelize) { - /** - * Add commands to revert seed here. - * - * Example: - * await queryInterface.bulkDelete('People', null, {}); - */ + return queryInterface.dropTable('Roles'); } }; diff --git a/backend/seeders/02-users.js b/backend/seeders/02-users.js index e527a1e..8f7f3e5 100644 --- a/backend/seeders/02-users.js +++ b/backend/seeders/02-users.js @@ -15,11 +15,6 @@ module.exports = { }, async down (queryInterface, Sequelize) { - /** - * Add commands to revert seed here. - * - * Example: - * await queryInterface.bulkDelete('People', null, {}); - */ + return queryInterface.dropTable('Users'); } }; diff --git a/backend/seeders/03-pitch-types.js b/backend/seeders/03-pitch-types.js index 48a68a0..9dab30c 100644 --- a/backend/seeders/03-pitch-types.js +++ b/backend/seeders/03-pitch-types.js @@ -3,23 +3,18 @@ /** @type {import('sequelize-cli').Migration} */ module.exports = { async up (queryInterface, Sequelize) { - /** - * Add seed commands here. - * - * Example: - * await queryInterface.bulkInsert('People', [{ - * name: 'John Doe', - * isBetaMember: false - * }], {}); - */ + return queryInterface.bulkInsert('PitchTypes',[ + { name: 'Fastball', abbreviation: 'FB', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Curveball', abbreviation: 'CB', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Slider', abbreviation: 'SL', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Changeup', abbreviation: 'CH', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Cutter', abbreviation: 'CUT', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Sweeper', abbreviation: 'SW', createdAt: new Date(), updatedAt: new Date() }, + { name: 'Slurve', abbreviation: 'SLV', createdAt: new Date(), updatedAt: new Date() }, + ]); }, async down (queryInterface, Sequelize) { - /** - * Add commands to revert seed here. - * - * Example: - * await queryInterface.bulkDelete('People', null, {}); - */ + return queryInterface.dropTable('PitchTypes'); } }; diff --git a/backend/test/data/bullpenSession.test.data.js b/backend/test/data/bullpenSession.test.data.js new file mode 100644 index 0000000..1927217 --- /dev/null +++ b/backend/test/data/bullpenSession.test.data.js @@ -0,0 +1,20 @@ +const bullpenData = { + pitcherId: 1, + startedAt: new Date(2025, 3, 22, 16, 5, 13), + finishedAt: new Date(2025, 3, 22, 16, 23, 45), + pitches: [{ + pitchTypeId: 1, + pitchTime: new Date(2025, 3, 22, 16, 7, 21), + aimedArea: 11, + hitArea: 12 + }, { + pitchTypeId: 4, + pitchTime: new Date(2025, 3, 22, 16, 9, 57), + aimedArea: 6, + hitArea: 14 + }] +}; + +module.exports = { + bullpenData +} diff --git a/backend/test/pitchType.test.js b/backend/test/pitchType.test.js new file mode 100644 index 0000000..202839b --- /dev/null +++ b/backend/test/pitchType.test.js @@ -0,0 +1,28 @@ +const request = require("supertest") +const { + expect, + describe, + test, + afterAll, +} = require('@jest/globals'); + +const app = require("../app") + +describe("Test retrieving pitch types", () => { + test("should retrieve all pitch types", async () => { + let user = {}; + let response = await request(app) + .post("/api/auth/login") + .send({ + email: 'ryan.nolan@bullpen.com', + password: 'nolan' + }); + user = response.body; + + response = await request(app) + .get('/api/pitch_types') + .set('x-access-token', user.accessToken); + expect(response.statusCode).toBe(200); + expect(response.body.length).toEqual(7); + }); +}); diff --git a/backend/test/user.test.js b/backend/test/user.test.js index c3a3514..1092200 100644 --- a/backend/test/user.test.js +++ b/backend/test/user.test.js @@ -3,8 +3,6 @@ const { expect, describe, test, - beforeAll, - afterAll, } = require('@jest/globals'); const app = require("../app") @@ -13,38 +11,27 @@ const { signupUser } = require("./data/user.test.data") const res = require("express/lib/response"); describe("Test user authentication", () => { - test("should signup a user", done => { - request(app) - .post("/api/auth/signup") - .send(signupUser) - .then( res => { - expect(res.header['content-type']).toBe('application/json; charset=utf-8'); - expect(res.statusCode).toBe(200); - done(); - }); + test("should register a user", async () => { + const response = await request(app) + .post("/api/auth/register") + .send(signupUser); + expect(response.header['content-type']).toBe('application/json; charset=utf-8'); + expect(response.statusCode).toBe(200); }); - test("Test user login", done => { - let user = {}; - request(app) - .post("/api/auth/signin") + test("Test user login", async() => { + let response = await request(app) + .post("/api/auth/login") .send({ email: 'ryan.nolan@bullpen.com', password: 'nolan' - }) - .then( res => { - expect(res.statusCode).toBe(200); - expect(res.body.accessToken).not.toBeNull(); - console.log(res.body); - user = res.body; - done(); - // }).then(() => { - // request(app) - // .get(`/api/users/${user.id}`) - // .then( res2 => { - // expect(res2.statusCode).toBe(200); - // }) - // }); + expect(response.statusCode).toBe(200); + expect(response.body.accessToken).not.toBeNull(); + const user = response.body; + response = await request(app) + .get(`/api/users/${user.id}`) + .set('x-access-token', user.accessToken); + expect(response.statusCode).toBe(200); }); });