diff --git a/src/helpers/memberHelper.js b/src/helpers/memberHelper.js index 879bc30..3629920 100644 --- a/src/helpers/memberHelper.js +++ b/src/helpers/memberHelper.js @@ -1,8 +1,7 @@ -const {database} = require('../database.js'); const {enums} = require("../enums.js"); -const {Op} = require("sequelize"); const {EmbedBuilder} = require("@fluxerjs/core"); const {utils} = require("./utils.js"); +const {memberRepo} = require("../repositories/memberRepository"); const memberHelper = {}; @@ -52,7 +51,7 @@ memberHelper.parseMemberCommand = async function (authorId, authorFull, args, at isHelp = true; } - return await memberHelper.memberArgumentHandler(authorId, authorFull, isHelp, command, memberName, args, attachmentUrl, attachmentExpiration) + return memberHelper.memberArgumentHandler(authorId, authorFull, isHelp, command, memberName, args, attachmentUrl, attachmentExpiration); } /** @@ -71,6 +70,7 @@ memberHelper.parseMemberCommand = async function (authorId, authorFull, args, at * @returns {Promise } A list of 25 members as an embed. * @returns {Promise } A list of member commands and descriptions. * @returns {Promise<{EmbedBuilder, [string], string}>} A member info embed + info/errors. + * @returns {string} - A help message * @throws {Error} When there's no member or a command is not recognized. */ memberHelper.memberArgumentHandler = async function(authorId, authorFull, isHelp, command = null, memberName = null, args = [], attachmentUrl = null, attachmentExpiration = null) { @@ -113,7 +113,7 @@ memberHelper.memberArgumentHandler = async function(authorId, authorFull, isHelp * @throws {Error} When there's no member */ memberHelper.sendCurrentValue = async function(authorId, memberName, command= null) { - const member = await memberHelper.getMemberByName(authorId, memberName); + const member = await memberRepo.getMemberByName(authorId, memberName); if (!member) throw new Error(enums.err.NO_MEMBER); if (!command) { @@ -167,10 +167,7 @@ memberHelper.sendHelpEnum = function(command) { * @param {string[]} values - The values to be passed in. Only includes the values after member name and command name. * @param {string | null} attachmentUrl - The attachment URL, if any * @param {string | null} attachmentExpiration - The attachment expiry date, if any - * @returns {Promise} A success message. - * @returns {Promise } A list of 25 members as an embed. - * @returns {Promise } A list of member commands and descriptions. - * @returns {Promise<{EmbedBuilder, [string], string}>} A member info embed + info/errors. + * @returns {Promise | Promise | Promise<{EmbedBuilder, [string], string}>} */ memberHelper.memberCommandHandler = async function(authorId, command, memberName, values, attachmentUrl = null, attachmentExpiration = null) { switch (command) { @@ -208,7 +205,7 @@ memberHelper.addNewMember = async function (authorId, memberName, values, attach const propic = values[2] ?? attachmentUrl; const memberObj = await memberHelper.addFullMember(authorId, memberName, displayName, proxy, propic, attachmentExpiration); - const memberInfoEmbed = memberHelper.getMemberInfo(memberObj.member); + const memberInfoEmbed = memberHelper.getMemberInfo(memberObj); return {embed: memberInfoEmbed, errors: memberObj.errors, success: `${memberName} has been added successfully.`} } @@ -297,12 +294,7 @@ memberHelper.updatePropic = async function (authorId, memberName, values, attach * @throws {Error} When there is no member to remove. */ memberHelper.removeMember = async function (authorId, memberName) { - const destroyed = await database.members.destroy({ - where: { - name: {[Op.iLike]: memberName}, - userid: authorId - } - }) + const destroyed = await memberRepo.removeMember(authorId, memberName); if (destroyed > 0) { return `Member "${memberName}" has been deleted.`; } else { @@ -322,7 +314,7 @@ memberHelper.removeMember = async function (authorId, memberName) { * @param {string | null} [proxy] - The proxy tag of the member. * @param {string | null} [propic] - The profile picture URL of the member. * @param {string | null} [attachmentExpiration] - The expiration date of an uploaded profile picture. - * @returns {Promise<{model, string[]}>} A successful addition object, including errors if there are any. + * @returns {Promise<{ObjectLiteral[], string[]}>} A successful addition object, including errors if there are any. * @throws {Error} When the member already exists, there are validation errors, or adding a member doesn't work. */ memberHelper.addFullMember = async function (authorId, memberName, displayName = null, proxy = null, propic = null, attachmentExpiration = null) { @@ -380,11 +372,11 @@ memberHelper.addFullMember = async function (authorId, memberName, displayName = } } - const member = await database.members.create({ + const member = await memberRepo.createMember({ name: memberName, userid: authorId, displayname: isValidDisplayName ? displayName : null, proxy: isValidProxy ? proxy : null, propic: isValidPropic ? propic : null }); - return {member: member, errors: errors}; + return {member: member.generatedMaps, errors: errors}; } /** @@ -400,13 +392,8 @@ memberHelper.addFullMember = async function (authorId, memberName, displayName = * @throws {Error} When no member row was updated. */ memberHelper.updateMemberField = async function (authorId, memberName, columnName, value, expirationWarning = null) { - const res = await database.members.update({[columnName]: value}, { - where: { - name: {[Op.iLike]: memberName}, - userid: authorId - } - }) - if (res[0] === 0) { + const res = await memberRepo.updateMemberValue(authorId, memberName, columnName, value); + if (res === 0) { throw new Error(`Can't update ${memberName}. ${enums.err.NO_MEMBER}.`); } else { return `Updated ${columnName} for ${memberName} to ${value}${expirationWarning ? `. ${expirationWarning}.` : '.'}`; @@ -416,7 +403,7 @@ memberHelper.updateMemberField = async function (authorId, memberName, columnNam /** * Gets the details for a member. * - * @param {model} member - The member object + * @param {{ObjectLiteral, string[]}} member - The member object * @returns {EmbedBuilder} The member's info. */ memberHelper.getMemberInfo = function (member) { @@ -451,29 +438,6 @@ memberHelper.getAllMembersInfo = async function (authorId, authorName) { .addFields(...fields); } -/** - * Gets a member based on the author and proxy tag. - * - * @async - * @param {string} authorId - The author of the message. - * @param {string} memberName - The member's name. - * @returns {Promise} The member object. - */ -memberHelper.getMemberByName = async function (authorId, memberName) { - return await database.members.findOne({where: {userid: authorId, name: {[Op.iLike]: memberName}}}); -} - -/** - * Gets all members belonging to the author. - * - * @async - * @param {string} authorId - The author of the message - * @returns {Promise} The member object array. - */ -memberHelper.getMembersByAuthor = async function (authorId) { - return await database.members.findAll({where: {userid: authorId}}); -} - /** * Checks if proxy exists for a member. * diff --git a/src/repositories/memberRepository.js b/src/repositories/memberRepository.js new file mode 100644 index 0000000..06b9cd4 --- /dev/null +++ b/src/repositories/memberRepository.js @@ -0,0 +1,88 @@ +const {Member} = require("../../database/entity/Member"); +const { dataSource } = require("../../database/index"); +const {ILike} = require("typeorm"); + +const members = dataSource.getRepository(Member) + +const memberRepo = {}; + +/** + * Gets a member based on the author and proxy tag. + * + * @async + * @param {string} authorId - The author of the message. + * @param {string} memberName - The member's name. + * @returns {Promise} The member object or null if not found. + */ +memberRepo.getMemberByName = async function (authorId, memberName) { + const member = await members.findOneBy({where: {userid: authorId, name: ILike(`%${memberName}%`)}}); + return member.generatedMaps; +} + +/** + * Gets all members belonging to the author. + * + * @async + * @param {string} authorId - The author of the message + * @returns {Promise} The member object array. + */ +memberRepo.getMembersByAuthor = async function (authorId) { + return await members.findBy({userid: authorId}); +} + +/** + * Removes a member. + * + * @async + * @param {string} authorId - The author of the message + * @param {string} memberName - The name of the member to remove + * @returns {Promise} Number of results removed. + * @throws {Error} When there is no member to remove. + */ +memberRepo.removeMember = async function (authorId, memberName) { + const deleted = await members.delete({ + where: { + name: ILike(`%${memberName}%`), + userid: authorId + } + }) + return deleted.affected; +} + +/** + * Adds a member with full details. + * + * @async + * @param {{name: string, userid: string, displayname: (string|null), proxy: (string|null), propic: (string|null)}} createObj - Object with parameters in it + * @returns {Promise} A successful inserted object. + * @throws {Error} When the member already exists, there are validation errors, or adding a member doesn't work. + */ +memberRepo.createMember = async function (createObj) { + const member = members.insert({ + name: createObj.name, userid: createObj.authorId, displayname: createObj.displayName, proxy: createObj.proxy, propic: createObj.propic + }); + return member.generatedMaps; +} + +/** + * Updates one fields for a member in the database. + * + * @async + * @param {string} authorId - The author of the message + * @param {string} memberName - The member to update + * @param {string} columnName - The column name to update. + * @param {string} value - The value to update to. + * @returns {Promise} A successful update. + * @throws {Error} When no member row was updated. + */ +memberRepo.updateMemberValue = async function (authorId, memberName, columnName, value) { + const updated = members.update({columnName: value}, { + where: { + name: ILike(`%${memberName}%`), + userid: authorId + } + }) + return updated.affected; +} + +module.exports.memberRepo = memberRepo; \ No newline at end of file