separate member repo from member helper

This commit is contained in:
Aster Fialla
2026-03-01 14:46:39 -05:00
parent 80da0c91d8
commit 5ef9050a7d
2 changed files with 101 additions and 49 deletions

View File

@@ -1,8 +1,7 @@
const {database} = require('../database.js');
const {enums} = require("../enums.js"); const {enums} = require("../enums.js");
const {Op} = require("sequelize");
const {EmbedBuilder} = require("@fluxerjs/core"); const {EmbedBuilder} = require("@fluxerjs/core");
const {utils} = require("./utils.js"); const {utils} = require("./utils.js");
const {memberRepo} = require("../repositories/memberRepository");
const memberHelper = {}; const memberHelper = {};
@@ -52,7 +51,7 @@ memberHelper.parseMemberCommand = async function (authorId, authorFull, args, at
isHelp = true; 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 <EmbedBuilder>} A list of 25 members as an embed. * @returns {Promise <EmbedBuilder>} A list of 25 members as an embed.
* @returns {Promise <EmbedBuilder>} A list of member commands and descriptions. * @returns {Promise <EmbedBuilder>} A list of member commands and descriptions.
* @returns {Promise<{EmbedBuilder, [string], string}>} A member info embed + info/errors. * @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. * @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) { 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 * @throws {Error} When there's no member
*/ */
memberHelper.sendCurrentValue = async function(authorId, memberName, command= null) { 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 (!member) throw new Error(enums.err.NO_MEMBER);
if (!command) { 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[]} 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} attachmentUrl - The attachment URL, if any
* @param {string | null} attachmentExpiration - The attachment expiry date, if any * @param {string | null} attachmentExpiration - The attachment expiry date, if any
* @returns {Promise<string>} A success message. * @returns {Promise<string> | Promise <EmbedBuilder> | Promise<{EmbedBuilder, [string], string}>}
* @returns {Promise <EmbedBuilder>} A list of 25 members as an embed.
* @returns {Promise <EmbedBuilder>} A list of member commands and descriptions.
* @returns {Promise<{EmbedBuilder, [string], string}>} A member info embed + info/errors.
*/ */
memberHelper.memberCommandHandler = async function(authorId, command, memberName, values, attachmentUrl = null, attachmentExpiration = null) { memberHelper.memberCommandHandler = async function(authorId, command, memberName, values, attachmentUrl = null, attachmentExpiration = null) {
switch (command) { switch (command) {
@@ -208,7 +205,7 @@ memberHelper.addNewMember = async function (authorId, memberName, values, attach
const propic = values[2] ?? attachmentUrl; const propic = values[2] ?? attachmentUrl;
const memberObj = await memberHelper.addFullMember(authorId, memberName, displayName, proxy, propic, attachmentExpiration); 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.`} 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. * @throws {Error} When there is no member to remove.
*/ */
memberHelper.removeMember = async function (authorId, memberName) { memberHelper.removeMember = async function (authorId, memberName) {
const destroyed = await database.members.destroy({ const destroyed = await memberRepo.removeMember(authorId, memberName);
where: {
name: {[Op.iLike]: memberName},
userid: authorId
}
})
if (destroyed > 0) { if (destroyed > 0) {
return `Member "${memberName}" has been deleted.`; return `Member "${memberName}" has been deleted.`;
} else { } else {
@@ -322,7 +314,7 @@ memberHelper.removeMember = async function (authorId, memberName) {
* @param {string | null} [proxy] - The proxy tag of the member. * @param {string | null} [proxy] - The proxy tag of the member.
* @param {string | null} [propic] - The profile picture URL 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. * @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. * @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) { 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 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. * @throws {Error} When no member row was updated.
*/ */
memberHelper.updateMemberField = async function (authorId, memberName, columnName, value, expirationWarning = null) { memberHelper.updateMemberField = async function (authorId, memberName, columnName, value, expirationWarning = null) {
const res = await database.members.update({[columnName]: value}, { const res = await memberRepo.updateMemberValue(authorId, memberName, columnName, value);
where: { if (res === 0) {
name: {[Op.iLike]: memberName},
userid: authorId
}
})
if (res[0] === 0) {
throw new Error(`Can't update ${memberName}. ${enums.err.NO_MEMBER}.`); throw new Error(`Can't update ${memberName}. ${enums.err.NO_MEMBER}.`);
} else { } else {
return `Updated ${columnName} for ${memberName} to ${value}${expirationWarning ? `. ${expirationWarning}.` : '.'}`; 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. * 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. * @returns {EmbedBuilder} The member's info.
*/ */
memberHelper.getMemberInfo = function (member) { memberHelper.getMemberInfo = function (member) {
@@ -451,29 +438,6 @@ memberHelper.getAllMembersInfo = async function (authorId, authorName) {
.addFields(...fields); .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<model>} 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<model[] | null>} The member object array.
*/
memberHelper.getMembersByAuthor = async function (authorId) {
return await database.members.findAll({where: {userid: authorId}});
}
/** /**
* Checks if proxy exists for a member. * Checks if proxy exists for a member.
* *

View File

@@ -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<ObjectLiteral[] | null>} 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<Entity[]>} 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>} 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<ObjectLiteral[]>} 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<number>} 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;