WikiLerni/models/User.js

165 lines
5.5 KiB
JavaScript
Raw Normal View History

"use strict";
const striptags = require("striptags");
const tool = require("../tools/main");
const configMail = require("../config/mail");
const config = require("../config/main.js");
const txt = require("../lang/"+config.adminLang+"/user");
const txtGeneral = require("../lang/"+config.adminLang+"/general");
module.exports = (sequelize, DataTypes) =>
{
const User = sequelize.define("User",
{
name:
{
type: DataTypes.STRING(70),
allowNull: false,
set(value) { this.setDataValue("name", tool.trimIfNotNull(striptags(value))); },
validate:
{
notNull: { msg: txt.needName },
len:
{
args: [1, 70],
msg: txt.needNotTooLongName
}
}
},
email:
{
type: DataTypes.STRING(255),
allowNull: false,
unique:
{
args: true,
msg: txt.needUniqueEmail
},
set(value) { this.setDataValue("email", tool.trimIfNotNull(striptags(value))); },
validate:
{
notNull: { msg: txt.needEmail },
isEmail: { msg: txt.needEmail+" "+txtGeneral.notValidFormat },
len:
{
args: [1, 255],
msg: txt.needNotTooLongEmail
}
}
},
password:
{
type: DataTypes.STRING(255), allowNull: false,
validate:
{
notNull: { msg: txt.needPassWord }
}
},
status:
{
type: DataTypes.ENUM("admin", "manager", "creator", "user"), allowNull: false, defaultValue: "user",
validate:
{
notNull: { msg: txt.needStatus },
isIn:
{
args: [["admin", "manager", "creator", "user"]],
msg: txt.needStatus+" "+txtGeneral.notValidFormat
}
}
},
language: // liste des langues dispo dans un fichier de configuration fourni par l'API au client
{
type: DataTypes.STRING(4), allowNull: false, defaultValue: "fr",
set(value) { this.setDataValue("language", tool.trimIfNotNull(value)); },
validate:
{
notNull: { msg: txt.needLanguage },
len:
{
args: [2, 4],
msg: txt.needLanguage+" "+txtGeneral.notValidFormat
} // en fait, il faudra vérifier l'existence du fichier de la langue choisie.
}
},
adminComments:
{
type: DataTypes.TEXT, allowNull: true,
set(value) { this.setDataValue("adminComments", tool.trimIfNotNull(striptags(value))); },
comment : "Not published."
},
connectedAt:
{
type: DataTypes.DATE,
validate:
{
isDate: { msg: txt.needValidLastConnectionDate }
}// !! attention doit = null et pas seulement vide pour ne pas être rejeté, quand l'utilisateur n'a pas encore validé son compte
},
smtp:
{
type: DataTypes.INTEGER(1).UNSIGNED, allowNull: false, defaultValue: 0,
comment : "Allows to assign a different SMTP server in case of deliverability issues.",
validate:
{
notNull: { msg: txt.needSMTP },
isInt: { msg: txt.needSMTP+" "+txtGeneral.notValidFormat },
validSMTP(value)
{
if(!configMail.SMTP.names[value])
throw new Error(txt.needSMTPNotFound);
}
}
},
newsletterOk:
{
type: DataTypes.BOOLEAN(1), allowNull: false, defaultValue: false,
validate:
{
notNull: { msg: txt.needKnowNewsletterOk },
isIn:
{
args: [[true, false]],
msg: txt.needKnowNewsletterOk
}
}
},
timeDifference: // https://en.wikipedia.org/wiki/Time_zone
{
type: DataTypes.INTEGER(3), allowNull: false, defaultValue: 0,
comment: "Time difference (in minutes) from UTC.",
validate: // messages d'erreur à ne pas envoyer aux utilisateurs
{
notNull: { msg: txt.needTimeDifference },
isInt: { msg: txt.needTimeDifference+" "+txtGeneral.notValidFormat },
min:
{
args: [-720],
msg: txt.needMinTimeDifference
},
max:
{
args: [840],
msg: txt.needMaxTimeDifference
}
}
}
},
{
charset: "utf8mb4",
collate: "utf8mb4_unicode_ci"
}
);
User.associate = function(models)
{
User.hasMany(models.Payment);
User.hasMany(models.Questionnaire, { as: "Creator", foreignKey: { name: "CreatorId" } });
User.hasMany(models.Answer);
User.belongsTo(models.User, { as: "Godfather" });
User.hasOne(models.Subscription);
User.belongsToMany(models.Questionnaire, { through: models.QuestionnaireAccess });
};
return User;
};