diff --git a/migrations/20230226202413-create-badge.js b/migrations/20230226202413-create-badge.js new file mode 100644 index 0000000..e28c243 --- /dev/null +++ b/migrations/20230226202413-create-badge.js @@ -0,0 +1,41 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Badges', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + name: { + type: Sequelize.STRING + }, + description: { + type: Sequelize.STRING + }, + image: { + type: Sequelize.STRING, + allowNull: true + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.literal('CURRENT_TIMESTAMP') + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.literal('CURRENT_TIMESTAMP') + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.sequelize.query('ALTER TABLE BadgeCharacter DROP FOREIGN KEY BadgeCharacter_ibfk_1;'); + await queryInterface.sequelize.query('ALTER TABLE BadgeCharacter DROP FOREIGN KEY BadgeCharacter_ibfk_2;'); + await queryInterface.sequelize.query('ALTER TABLE BadgeUser DROP FOREIGN KEY BadgeUser_ibfk_1;'); + await queryInterface.sequelize.query('ALTER TABLE BadgeUser DROP FOREIGN KEY BadgeUser_ibfk_2;'); + await queryInterface.dropTable('Badges'); + } +}; \ No newline at end of file diff --git a/models/badge.js b/models/badge.js new file mode 100644 index 0000000..4bf864b --- /dev/null +++ b/models/badge.js @@ -0,0 +1,24 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Badge extends Model { + static associate(models) { + // A badge can belong to many cards + Badge.belongsToMany(models.Character, { through: 'BadgeCharacter' }); + + // A badge can belong to many users + Badge.belongsToMany(models.User, { through: 'BadgeUser' }); + } + } + Badge.init({ + name: DataTypes.STRING, + description: DataTypes.STRING, + image: DataTypes.STRING + }, { + sequelize, + modelName: 'Badge', + }); + return Badge; +}; \ No newline at end of file diff --git a/models/character.js b/models/character.js index c0fed7f..e2dbb58 100644 --- a/models/character.js +++ b/models/character.js @@ -11,6 +11,8 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { Character.belongsTo(models.Group, { foreignKey: 'groupId', }); + // A character can belong to many badges + Character.belongsToMany(models.Badge, { through: 'BadgeCharacter' }); } } Character.init({ diff --git a/models/user.js b/models/user.js index 2937259..c06dc10 100644 --- a/models/user.js +++ b/models/user.js @@ -17,6 +17,8 @@ module.exports = (sequelize, DataTypes) => { User.hasMany(models.Card); User.hasMany(models.CurrencyHistory); User.hasOne(models.Profile); + // A user can have many badges + User.belongsToMany(models.Badge, { through: 'BadgeUser' }); } async addExperience(amount, source='unknown') { console.log(`Adding ${amount} experience to user ${this.id}`);