diff --git a/src/database/migrations/20260425000000-add-skydiver-profile.js b/src/database/migrations/20260425000000-add-skydiver-profile.js new file mode 100644 index 0000000..f7ed72c --- /dev/null +++ b/src/database/migrations/20260425000000-add-skydiver-profile.js @@ -0,0 +1,52 @@ +'use strict'; + +module.exports = { + async up(queryInterface, Sequelize) { + const transaction = await queryInterface.sequelize.transaction(); + try { + await queryInterface.createTable('skydiver_profile', { + userId: { + type: Sequelize.STRING(36), + allowNull: false, + primaryKey: true, + references: { + model: 'user', + key: 'id' + }, + onDelete: 'CASCADE' + }, + licence: { + type: Sequelize.INTEGER, + allowNull: true + }, + poids: { + type: Sequelize.FLOAT, + allowNull: true + }, + bg_image: { + type: Sequelize.STRING(255), + allowNull: true + }, + createdAt: { + type: Sequelize.DATE, + allowNull: false, + defaultValue: Sequelize.literal('CURRENT_TIMESTAMP') + }, + updatedAt: { + type: Sequelize.DATE, + allowNull: false, + defaultValue: Sequelize.literal('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP') + } + }, { transaction }); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + + async down(queryInterface) { + await queryInterface.dropTable('skydiver_profile'); + } +}; diff --git a/src/database/models/mysql/SkydiverProfile.js b/src/database/models/mysql/SkydiverProfile.js new file mode 100644 index 0000000..11377bd --- /dev/null +++ b/src/database/models/mysql/SkydiverProfile.js @@ -0,0 +1,49 @@ +const { DataTypes, Model } = require("sequelize"); +const sequelize = require("../../config/sequelize"); + +class SkydiverProfile extends Model {} + +const SkydiverProfileModel = () => { + SkydiverProfile.init( + { + userId: { + type: DataTypes.STRING(36), + allowNull: false, + primaryKey: true, + references: { + model: 'user', + key: 'id' + } + }, + licence: { + type: DataTypes.INTEGER, + allowNull: true + }, + poids: { + type: DataTypes.FLOAT, + allowNull: true + }, + bg_image: { + type: DataTypes.STRING(255), + allowNull: true + } + }, + { + sequelize, + tableName: 'skydiver_profile', + timestamps: true + } + ); + + SkydiverProfile.prototype.toJSONFor = function () { + return { + licence: this.licence, + poids: this.poids, + bg_image: this.bg_image || '/assets/images/users/bg_user.jpg' + }; + }; + + return SkydiverProfile; +}; + +module.exports = SkydiverProfileModel; diff --git a/src/database/models/mysql/index.js b/src/database/models/mysql/index.js index 7bbea5a..5e4afa7 100644 --- a/src/database/models/mysql/index.js +++ b/src/database/models/mysql/index.js @@ -10,6 +10,7 @@ exports.Product = require('./Product'); exports.ProductCategoryXref = require('./ProductCategoryXref'); exports.ProductTagXref = require('./ProductTagXref'); exports.Role = require('./Role'); +exports.SkydiverProfile = require('./SkydiverProfile'); exports.Tag = require('./Tag'); exports.TagList = require('./TagList'); exports.User = require('./User'); diff --git a/src/database/relationships/index.js b/src/database/relationships/index.js index 3e38faf..190cf50 100644 --- a/src/database/relationships/index.js +++ b/src/database/relationships/index.js @@ -1,6 +1,9 @@ const DB = require('../mysql'); const associate = () => { + DB.User.hasOne(DB.SkydiverProfile, { as: 'skydiverProfile', foreignKey: 'userId', onDelete: 'CASCADE' }); + DB.SkydiverProfile.belongsTo(DB.User, { as: 'user', foreignKey: 'userId' }); + DB.Article.belongsToMany(DB.Tag, { as: 'articleTags', through: DB.TagList, foreignKey: "articleId", otherKey: "tagName", onDelete: "CASCADE" }); DB.Product.belongsToMany(DB.Tag, { as: 'productTags', through: DB.ProductTagXref, foreignKey: "productId", otherKey: "tagName", onDelete: "CASCADE" }); DB.Article.belongsToMany(DB.User, { as: 'articleFavoriteUsers', through: DB.Favorite, foreignKey: "articleId", otherKey: "userId", onDelete: "CASCADE" }); diff --git a/src/services/index.js b/src/services/index.js index 0d98b04..5e168e0 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -4,6 +4,7 @@ exports.ArticleService = require('./mysql/article.service'); exports.CommentService = require('./mysql/comment.service'); exports.ProductService = require('./mysql/product.service'); +exports.SkydiverProfileService = require('./mysql/skydiver-profile.service'); exports.TagService = require('./mysql/tag.service'); exports.UserService = require('./mysql/user.service'); //exports.HeroWarService = require('./mysql/herowars.service'); diff --git a/src/services/mysql/skydiver-profile.service.js b/src/services/mysql/skydiver-profile.service.js new file mode 100644 index 0000000..70ea872 --- /dev/null +++ b/src/services/mysql/skydiver-profile.service.js @@ -0,0 +1,16 @@ +const DB = require('../../database/mysql'); + +const { SkydiverProfile } = DB; + +class SkydiverProfileService { + static async getByUserId(userId) { + return SkydiverProfile.findByPk(userId); + } + + static async upsert(userId, data) { + const [profile] = await SkydiverProfile.upsert({ userId, ...data }); + return profile; + } +} + +module.exports = SkydiverProfileService;