const { Sequelize, Op, DataTypes } = require("sequelize"); let seq = null; let userModel = null; async function connectToDB() { if (!seq) { seq = new Sequelize( "postgres", process.env.USERNAME, process.env.PASSWORD, { port: 5432, dialect: "postgres", }, ); } if (!userModel) { userModel = seq.define( "epitinder_users", { name: { type: DataTypes.STRING, }, age: { type: DataTypes.INTEGER, }, description: { type: DataTypes.STRING, }, }, { // Other model options go here timestamps: false, }, ); } return seq; } async function getAllUsers() { return userModel.findAll({ attributes: ["id", "name", "age", "description"], raw: true, }); } async function getUser(id) { return userModel .findOne({ attributes: ["id", "name", "age", "description"], where: { id: id }, raw: true, }) .catch(() => { return null; }); } async function addUser(newUser) { if ( newUser["id"] || !newUser["name"] || !newUser["age"] || !newUser["description"] ) { return null; } return userModel .create({ name: newUser.name, age: newUser.age, description: newUser.description, }) .then((usr) => usr.dataValues) .catch(() => null); } async function updateUser(user) { if ( !user["id"] || !user["name"] || !user["age"] || !user["description"] || Object.keys(user).length > 4 ) { return null; } const res = await userModel .findOne({ where: { id: user.id }, raw: true, }) .catch(() => null); if (!res) { return null; } await userModel .update( { name: user.name, age: user.age, description: user.description, }, { where: { id: user.id }, raw: true, }, ) .catch(() => null); return user; } async function deleteUser(id) { let res = await userModel .findOne({ where: { id: id }, raw: true, }) .catch(() => null); if (!res) { return null; } res = { id: res.id, name: res.name, age: res.age, description: res.description, }; await userModel.destroy({ where: { id: id } }); return res; } async function getAllUsersName() { return userModel .findAll({ attributes: ["name"], raw: true, }) .catch(() => { return null; }); } async function getAllYoungAdults() { return userModel .findAll({ where: { age: { [Op.between]: [18, 29], }, }, raw: true, }) .catch(() => { return null; }); } module.exports = { getAllUsers, getAllUsersName, getAllYoungAdults, getUser, addUser, deleteUser, updateUser, connectToDB, }; async function main() { await connectToDB(); //console.log(await getAllUsers()); //console.log(await getAllUsersName()); //console.log(await getAllYoungAdults()); //console.log(await getUser(5)); /*console.log( await addUser({ name: "Martial Simon", age: 19, description: "Sex is like pointers, I like it raw", }), );*/ console.log( await updateUser({ id: 56, name: "Mickael Razzouk", age: 21, sex_appeal: 100, description: "Le goat", }), ); //console.log(await getUser(5)); //console.log(await deleteUser(23)); } main();