From 774f44a306397ed3f7d1fdf7ffce49ab03503a45 Mon Sep 17 00:00:00 2001 From: tvpeter Date: Wed, 28 Aug 2019 19:13:24 +0100 Subject: [PATCH] ft(requests): Creates migrations [Start #167891585] --- .../migrations/20190821105503-create-user.js | 10 ++++ .../migrations/20190828140409-create-trip.js | 57 +++++++++++++++++++ .../20190828145910-create-location.js | 40 +++++++++++++ .../20190828145911-create-branch.js | 35 ++++++++++++ .../20190828150143-create-accomodation.js | 43 ++++++++++++++ .../migrations/20190828150144-create-stop.js | 49 ++++++++++++++++ src/database/models/accomodation.js | 23 ++++++++ src/database/models/branch.js | 33 +++++++++++ src/database/models/company.js | 13 ++++- src/database/models/location.js | 22 +++++++ src/database/models/stop.js | 28 +++++++++ src/database/models/trip.js | 34 +++++++++++ src/database/models/user.js | 17 +++++- .../seeders/20190821112340-companies.js | 2 +- .../20190829125544-create-locations.js | 18 ++++++ .../seeders/20190829125545-create-branches.js | 15 +++++ .../seeders/20190829125546-create-trips.js | 45 +++++++++++++++ .../20190829130100-create-accomodations.js | 19 +++++++ .../seeders/20190829130101-create-stops.js | 23 ++++++++ test/mockData/mockAuth.js | 8 +-- 20 files changed, 525 insertions(+), 9 deletions(-) create mode 100644 src/database/migrations/20190828140409-create-trip.js create mode 100644 src/database/migrations/20190828145910-create-location.js create mode 100644 src/database/migrations/20190828145911-create-branch.js create mode 100644 src/database/migrations/20190828150143-create-accomodation.js create mode 100644 src/database/migrations/20190828150144-create-stop.js create mode 100644 src/database/models/accomodation.js create mode 100644 src/database/models/branch.js create mode 100644 src/database/models/location.js create mode 100644 src/database/models/stop.js create mode 100644 src/database/models/trip.js create mode 100644 src/database/seeders/20190829125544-create-locations.js create mode 100644 src/database/seeders/20190829125545-create-branches.js create mode 100644 src/database/seeders/20190829125546-create-trips.js create mode 100644 src/database/seeders/20190829130100-create-accomodations.js create mode 100644 src/database/seeders/20190829130101-create-stops.js diff --git a/src/database/migrations/20190821105503-create-user.js b/src/database/migrations/20190821105503-create-user.js index d7fc35a..646267a 100644 --- a/src/database/migrations/20190821105503-create-user.js +++ b/src/database/migrations/20190821105503-create-user.js @@ -51,6 +51,16 @@ module.exports = { type: Sequelize.ENUM('active', 'inactive', 'unverified'), defaultValue: 'unverified' }, + favorites: { + allowNull: false, + type: Sequelize.BOOLEAN, + defaultValue: false, + set: (value) => { + if (value === 'true') value = true; + if (value === 'false') value = false; + this.setDataValue('favorites', value); + } + }, createdAt: { allowNull: false, type: Sequelize.DATE, diff --git a/src/database/migrations/20190828140409-create-trip.js b/src/database/migrations/20190828140409-create-trip.js new file mode 100644 index 0000000..cd1c624 --- /dev/null +++ b/src/database/migrations/20190828140409-create-trip.js @@ -0,0 +1,57 @@ + +module.exports = { + up: (queryInterface, Sequelize) => queryInterface.sequelize.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";').then(() => queryInterface.createTable('Trips', { + id: { + allowNull: false, + primaryKey: true, + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.literal('uuid_generate_v4()'), + }, + type: { + type: Sequelize.ENUM('oneway', 'return', 'multiple'), + allowNull: false, + }, + userId: { + type: Sequelize.UUID, + allowNull: false, + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + references: { + model: 'Users', + key: 'id', + }, + }, + status: { + allowNull: false, + type: Sequelize.ENUM('pending', 'approved', 'rejected'), + defaultValue: 'pending', + }, + startBranchId: { + type: Sequelize.UUID, + allowNull: false, + }, + reason: { + type: Sequelize.STRING, + allowNull: false + }, + tripDate: { + type: Sequelize.DATE, + allowNull: false + }, + returnDate: { + type: Sequelize.DATE, + allowNull: true + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn('now') + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn('now') + } + })), + down: queryInterface => queryInterface.dropTable('Trips') +}; diff --git a/src/database/migrations/20190828145910-create-location.js b/src/database/migrations/20190828145910-create-location.js new file mode 100644 index 0000000..315eeea --- /dev/null +++ b/src/database/migrations/20190828145910-create-location.js @@ -0,0 +1,40 @@ + +module.exports = { + up: (queryInterface, Sequelize) => queryInterface.sequelize.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";').then(() => queryInterface.createTable('Locations', { + id: { + allowNull: false, + primaryKey: true, + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.literal('uuid_generate_v4()'), + }, + companyId: { + type: Sequelize.UUID, + allowNull: false, + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + references: { + model: 'Companies', + key: 'id' + } + }, + country: { + type: Sequelize.STRING, + allowNull: false + }, + city: { + type: Sequelize.STRING, + allowNull: false + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn('now') + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn('now') + } + })), + down: queryInterface => queryInterface.dropTable('Locations') +}; diff --git a/src/database/migrations/20190828145911-create-branch.js b/src/database/migrations/20190828145911-create-branch.js new file mode 100644 index 0000000..1d5a495 --- /dev/null +++ b/src/database/migrations/20190828145911-create-branch.js @@ -0,0 +1,35 @@ + +module.exports = { + up: (queryInterface, Sequelize) => queryInterface.sequelize.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";').then(() => queryInterface.createTable('Branches', { + id: { + allowNull: false, + primaryKey: true, + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.literal('uuid_generate_v4()'), + }, + name: { + type: Sequelize.STRING, + allowNull: false + }, + locationId: { + type: Sequelize.UUID, + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + references: { + model: 'Locations', + key: 'id' + } + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn('now') + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn('now') + } + })), + down: queryInterface => queryInterface.dropTable('Branches') +}; diff --git a/src/database/migrations/20190828150143-create-accomodation.js b/src/database/migrations/20190828150143-create-accomodation.js new file mode 100644 index 0000000..e0ae63b --- /dev/null +++ b/src/database/migrations/20190828150143-create-accomodation.js @@ -0,0 +1,43 @@ + +module.exports = { + up: (queryInterface, Sequelize) => queryInterface.sequelize.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";').then(() => queryInterface.createTable('Accomodations', { + id: { + allowNull: false, + primaryKey: true, + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.literal('uuid_generate_v4()') + }, + name: { + type: Sequelize.STRING, + allowNull: false + }, + branchId: { + type: Sequelize.UUID, + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + references: { + model: 'Branches', + key: 'id' + } + }, + capacity: { + type: Sequelize.INTEGER, + allowNull: false + }, + status: { + type: Sequelize.ENUM('available', 'filled'), + allowNull: false + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn('now') + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn('now') + } + })), + down: queryInterface => queryInterface.dropTable('Accomodations') +}; diff --git a/src/database/migrations/20190828150144-create-stop.js b/src/database/migrations/20190828150144-create-stop.js new file mode 100644 index 0000000..73e1a74 --- /dev/null +++ b/src/database/migrations/20190828150144-create-stop.js @@ -0,0 +1,49 @@ +module.exports = { + up: (queryInterface, Sequelize) => queryInterface.sequelize.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";').then(() => queryInterface.createTable('Stops', { + id: { + allowNull: false, + primaryKey: true, + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.literal('uuid_generate_v4()'), + }, + destinationBranchId: { + type: Sequelize.UUID, + onDelete: 'RESTRICT', + onUpdate: 'RESTRICT', + references: { + model: 'Branches', + key: 'id', + } + }, + accomodationId: { + type: Sequelize.UUID, + onDelete: 'RESTRICT', + onUpdate: 'RESTRICT', + references: { + model: 'Accomodations', + key: 'id' + } + }, + tripId: { + type: Sequelize.UUID, + allowNull: false, + onDelete: 'RESTRICT', + onUpdate: 'RESTRICT', + references: { + model: 'Trips', + key: 'id' + } + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn('now') + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn('now') + } + })), + down: queryInterface => queryInterface.dropTable('Stops') +}; diff --git a/src/database/models/accomodation.js b/src/database/models/accomodation.js new file mode 100644 index 0000000..60aeadd --- /dev/null +++ b/src/database/models/accomodation.js @@ -0,0 +1,23 @@ +module.exports = (sequelize, DataTypes) => { + const Accomodation = sequelize.define('Accomodation', { + name: DataTypes.STRING, + branchId: DataTypes.UUID, + capacity: DataTypes.INTEGER, + status: DataTypes.STRING + }, {}); + Accomodation.associate = (models) => { + Accomodation.belongsTo(models.Branch, { + foreignKey: 'branchId', + as: 'branch', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + Accomodation.hasMany(models.Stop, { + foreignKey: 'accomodationId', + as: 'stop', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + }; + return Accomodation; +}; diff --git a/src/database/models/branch.js b/src/database/models/branch.js new file mode 100644 index 0000000..7b7fb06 --- /dev/null +++ b/src/database/models/branch.js @@ -0,0 +1,33 @@ +module.exports = (sequelize, DataTypes) => { + const Branch = sequelize.define('Branch', { + name: DataTypes.STRING, + locationId: DataTypes.UUID + }, {}); + Branch.associate = (models) => { + Branch.belongsTo(models.Location, { + foreignKey: 'locationId', + as: 'location', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + Branch.hasMany(models.Trip, { + foreignKey: 'startBranchId', + as: 'trip', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + Branch.hasMany(models.Accomodation, { + foreignKey: 'branchId', + as: 'accomodation', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + Branch.hasMany(models.Stop, { + foreignKey: 'destinationBranchId', + as: 'stop', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + }; + return Branch; +}; diff --git a/src/database/models/company.js b/src/database/models/company.js index 3c7d97a..dc23792 100644 --- a/src/database/models/company.js +++ b/src/database/models/company.js @@ -6,7 +6,18 @@ module.exports = (sequelize, DataTypes) => { owner: DataTypes.STRING }, {}); Company.associate = (models) => { - // associations can be defined here + Company.hasMany(models.Location, { + foreignKey: 'companyId', + as: 'location', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + Company.hasMany(models.User, { + foreignKey: 'companyId', + as: 'user', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); }; return Company; }; diff --git a/src/database/models/location.js b/src/database/models/location.js new file mode 100644 index 0000000..0b307d2 --- /dev/null +++ b/src/database/models/location.js @@ -0,0 +1,22 @@ +module.exports = (sequelize, DataTypes) => { + const Location = sequelize.define('Location', { + companyId: DataTypes.UUID, + country: DataTypes.STRING, + city: DataTypes.STRING + }, {}); + Location.associate = (models) => { + Location.belongsTo(models.Company, { + foreignKey: 'companyId', + as: 'company', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + Location.hasMany(models.Branch, { + foreignKey: 'locationId', + as: 'branch', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + }; + return Location; +}; diff --git a/src/database/models/stop.js b/src/database/models/stop.js new file mode 100644 index 0000000..71b8b98 --- /dev/null +++ b/src/database/models/stop.js @@ -0,0 +1,28 @@ +module.exports = (sequelize, DataTypes) => { + const Stop = sequelize.define('Stop', { + destinationBranchId: DataTypes.UUID, + accomodationId: DataTypes.UUID, + tripId: DataTypes.UUID, + }, {}); + Stop.associate = (models) => { + Stop.belongsTo(models.Trip, { + foreignKey: 'tripId', + as: 'trip', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + Stop.belongsTo(models.Accomodation, { + foreignKey: 'accomodationId', + as: 'accomodation', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + Stop.belongsTo(models.Branch, { + foreignKey: 'destinationBranchId', + as: 'branch', + onDelete: 'RESTRICT', + onUpdate: 'RESTRICT' + }); + }; + return Stop; +}; diff --git a/src/database/models/trip.js b/src/database/models/trip.js new file mode 100644 index 0000000..1c482b0 --- /dev/null +++ b/src/database/models/trip.js @@ -0,0 +1,34 @@ +module.exports = (sequelize, DataTypes) => { + const Trip = sequelize.define('Trip', { + type: DataTypes.STRING, + startBranchId: DataTypes.UUID, + userId: DataTypes.UUID, + tripDate: DataTypes.DATEONLY, + returnDate: DataTypes.DATEONLY, + reason: DataTypes.STRING, + status: DataTypes.ENUM('pending', 'approved', 'rejected') + }, {}); + Trip.associate = (models) => { + Trip.belongsTo(models.User, { + foreignKey: 'userId', + as: 'user', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + + }); + Trip.hasMany(models.Stop, { + foreignKey: 'tripId', + as: 'stop', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + Trip.belongsTo(models.Branch, { + foreignKey: 'startBranchId', + as: 'branch', + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + sourceKey: 'startBranchId' + }); + }; + return Trip; +}; diff --git a/src/database/models/user.js b/src/database/models/user.js index 70eac5b..d7eacac 100644 --- a/src/database/models/user.js +++ b/src/database/models/user.js @@ -10,13 +10,24 @@ module.exports = (sequelize, DataTypes) => { dob: DataTypes.DATEONLY, role: DataTypes.ENUM('owner', 'admin', 'staff'), status: DataTypes.ENUM('active', 'inactive', 'unverified'), - companyId: DataTypes.UUID + companyId: DataTypes.UUID, + favorites: DataTypes.BOOLEAN }, {} ); User.associate = (models) => { - // associations can be defined here - + User.hasMany(models.Trip, { + foreignKey: 'userId', + as: 'trip', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); + User.belongsTo(models.Company, { + foreignKey: 'companyId', + as: 'company', + onDelete: 'CASCADE', + onUpdate: 'CASCADE' + }); }; return User; }; diff --git a/src/database/seeders/20190821112340-companies.js b/src/database/seeders/20190821112340-companies.js index c8d5fcf..a35da84 100644 --- a/src/database/seeders/20190821112340-companies.js +++ b/src/database/seeders/20190821112340-companies.js @@ -12,7 +12,7 @@ module.exports = { id: 'a6e35eb9-8c59-4c7d-b8d4-ae724aa7fb62', name: 'Spanish Premier League', address: 'Villareal Road, spaiard', - code: 'NOM-0024', + code: 'NOMP0024', owner: 'Raul' }, ]), diff --git a/src/database/seeders/20190829125544-create-locations.js b/src/database/seeders/20190829125544-create-locations.js new file mode 100644 index 0000000..8838e12 --- /dev/null +++ b/src/database/seeders/20190829125544-create-locations.js @@ -0,0 +1,18 @@ + +module.exports = { + up: (queryInterface) => queryInterface.bulkInsert('Locations', [ + { + id: '0190ae78-d184-4258-add5-0b2c6982efef', + companyId: 'a6e35eb9-8c59-4c7d-b8d4-ae724aa7fb61', + country: 'Nigeria', + city: 'Abuja' + }, + { + id: '3dd3b24a-7554-425e-a688-36afda195614', + companyId: 'a6e35eb9-8c59-4c7d-b8d4-ae724aa7fb62', + country: 'Nigeria', + city: 'Lagos' + } + ]), + down: queryInterface => queryInterface.bulkDelete('Locations', null, {}) +}; diff --git a/src/database/seeders/20190829125545-create-branches.js b/src/database/seeders/20190829125545-create-branches.js new file mode 100644 index 0000000..c2cb647 --- /dev/null +++ b/src/database/seeders/20190829125545-create-branches.js @@ -0,0 +1,15 @@ +module.exports = { + up: (queryInterface) => queryInterface.bulkInsert('Branches', [ + { + id: '3dd3b34a-7554-425e-a688-36afda199614', + name: 'Ikeja', + locationId: '3dd3b24a-7554-425e-a688-36afda195614' + }, + { + id: '3dd3b34a-7554-455e-a688-36afda199624', + name: 'Gwagwalada', + locationId: '0190ae78-d184-4258-add5-0b2c6982efef' + } + ]), + down: queryInterface => queryInterface.bulkDelete('Branches', null, {}) +}; diff --git a/src/database/seeders/20190829125546-create-trips.js b/src/database/seeders/20190829125546-create-trips.js new file mode 100644 index 0000000..110a4c5 --- /dev/null +++ b/src/database/seeders/20190829125546-create-trips.js @@ -0,0 +1,45 @@ +module.exports = { + up: queryInterface => queryInterface.bulkInsert('Trips', [ + { + id: 'ffe25dbe-29ea-4759-8461-ed116f6739df', + type: 'oneway', + startBranchId: 'ffe35dbe-29ea-4759-8461-ed116f6739dd', + userId: 'ffe25dbe-29ea-4759-8461-ed116f6739dd', + tripDate: '2019-02-17', + returnDate: '2019-02-23', + reason: 'for holiday', + status: 'pending' + }, + { + id: 'ffe25dbe-29ea-4759-8462-ed116f6739df', + type: 'return', + startBranchId: 'ffe35dbe-29ea-4759-8461-ed116f6739dd', + userId: '91542e6f-94bc-4e80-a667-586fb0752f23', + tripDate: '2019-08-30', + returnDate: '2019-09-23', + reason: 'for work', + status: 'approved' + }, + { + id: 'ffe25dbe-29ea-4759-8462-ed116f6749df', + type: 'multiple', + startBranchId: 'efe35dbe-29ea-4759-8461-ed116f6739dd', + userId: '91542e6f-94bc-4e80-a667-586fb0752f24', + tripDate: '2019-09-01', + returnDate: '2019-09-21', + reason: 'to meet with clients', + status: 'rejected' + }, + { + id: 'ffe25dbe-49ea-4759-8462-ed116f6749df', + type: 'oneway', + startBranchId: '3dd3b34a-7554-425e-a688-36afda199614', + userId: '91542e6f-94bc-4e80-a667-586fb0752f25', + tripDate: '2019-10-01', + returnDate: null, + reason: 'to meet with clients', + status: 'approved' + } + ]), + down: queryInterface => queryInterface.bulkDelete('Trips', null, {}) +}; diff --git a/src/database/seeders/20190829130100-create-accomodations.js b/src/database/seeders/20190829130100-create-accomodations.js new file mode 100644 index 0000000..51d83a7 --- /dev/null +++ b/src/database/seeders/20190829130100-create-accomodations.js @@ -0,0 +1,19 @@ +module.exports = { + up: (queryInterface) => queryInterface.bulkInsert('Accomodations', [ + { + id: '3dd3b34a-7554-425e-a688-36afda199619', + name: 'Johnny Hills Palace', + branchId: '3dd3b34a-7554-425e-a688-36afda199614', + capacity: 40, + status: 'available' + }, + { + id: '3dd3b34a-7554-425e-c688-36afda199619', + name: 'Martinez Guest Inn', + branchId: '3dd3b34a-7554-455e-a688-36afda199624', + capacity: 20, + status: 'filled' + } + ]), + down: queryInterface => queryInterface.bulkDelete('Accomodations', null, {}) +}; diff --git a/src/database/seeders/20190829130101-create-stops.js b/src/database/seeders/20190829130101-create-stops.js new file mode 100644 index 0000000..a2075cb --- /dev/null +++ b/src/database/seeders/20190829130101-create-stops.js @@ -0,0 +1,23 @@ +module.exports = { + up: (queryInterface) => queryInterface.bulkInsert('Stops', [ + { + id: '6190ae78-d184-4258-add5-0b2c6982efef', + destinationBranchId: '3dd3b34a-7554-425e-a688-36afda199614', + accomodationId: '3dd3b34a-7554-425e-a688-36afda199619', + tripId: 'ffe25dbe-29ea-4759-8461-ed116f6739df' + }, + { + id: '6190ae28-d184-4258-add5-0b2c6982efef', + destinationBranchId: '3dd3b34a-7554-455e-a688-36afda199624', + accomodationId: '3dd3b34a-7554-425e-c688-36afda199619', + tripId: 'ffe25dbe-29ea-4759-8462-ed116f6739df' + }, + { + id: '6790ae28-d184-4228-add5-0b2c6982efef', + destinationBranchId: '3dd3b34a-7554-455e-a688-36afda199624', + accomodationId: '3dd3b34a-7554-425e-c688-36afda199619', + tripId: 'ffe25dbe-49ea-4759-8462-ed116f6749df' + } + ]), + down: queryInterface => queryInterface.bulkDelete('Stops', null, {}) +}; diff --git a/test/mockData/mockAuth.js b/test/mockData/mockAuth.js index 96401f0..fb53930 100644 --- a/test/mockData/mockAuth.js +++ b/test/mockData/mockAuth.js @@ -218,7 +218,7 @@ const invalidCode = { const credentials = { email: 'ogedengbe123@gmail.com', password: 'malcomX123', - code: 'NOM-0024' + code: 'NOMP0024' }; const credentialsWithIncorrectCode = { @@ -230,18 +230,18 @@ const credentialsWithIncorrectCode = { const credentialsWithIncorrectPassword = { email: 'ogedengbe123@gmail.com', password: 'malcomX1', - code: 'NOM-0024' + code: 'NOMP0024' }; const credentialsWithIncorrectEmail = { email: 'ogedengbe12@gmail.com', password: 'malcomX123', - code: 'NOM-0024' + code: 'NOMP0024' }; const credentialsWithoutEmail = { password: 'malcomX123', - code: 'NOM-0024' + code: 'NOMP0024' }; const credentialsWithoutCode = {