♻️ Migrated more credits module to Prisma

This commit is contained in:
Axel Olausson Holtenäs 2022-10-19 17:13:08 +02:00
parent d26a8367dd
commit 7da0d9a97f
4 changed files with 156 additions and 318 deletions

View file

@ -5,14 +5,14 @@ import {
EmbedBuilder,
PermissionsBitField,
} from "discord.js";
import logger from "../../../../../../../middlewares/logger";
// Configurations
import getEmbedConfig from "../../../../../../../helpers/getEmbedData";
// Helpers../../../../../../../helpers/userData
import pluralize from "../../../../../../../helpers/pluralize";
// Models
import fetchUser from "../../../../../../../helpers/userData";
// Handlers
import prisma from "../../../../../../../prisma";
// Function
export default {
metadata: {
@ -48,37 +48,55 @@ export default {
const creditAmount = options?.getInteger("amount");
// If amount option is null
if (creditAmount === null) {
if (creditAmount === null)
throw new Error("You need to provide a credit amount.");
}
// If amount is zero or below
if (creditAmount <= 0) {
if (creditAmount <= 0)
throw new Error("You must provide a credit amount greater than zero");
}
if (discordReceiver === null) {
if (discordReceiver === null)
throw new Error("We could not get the receiving user from Discord");
}
if (guild === null) {
if (guild === null)
throw new Error("We could not get the current guild from discord.");
}
const toUser = await fetchUser(discordReceiver, guild);
const createGuildMember = await prisma.guildMember.upsert({
where: {
userId_guildId: {
userId: discordReceiver.id,
guildId: guild.id,
},
},
update: { creditsEarned: { increment: creditAmount } },
create: {
creditsEarned: creditAmount,
user: {
connectOrCreate: {
create: {
id: discordReceiver.id,
},
where: {
id: discordReceiver.id,
},
},
},
guild: {
connectOrCreate: {
create: {
id: guild.id,
},
where: {
id: guild.id,
},
},
},
},
});
if (toUser === null) {
throw new Error("The receiving user is not found.");
}
if (toUser?.credits === null) {
throw new Error("The receiving user's credits value could not found.");
}
// Deposit amount to toUser
toUser.credits += creditAmount;
logger.silly(createGuildMember);
// Save toUser
await toUser?.save()?.then(async () => {
await interaction?.editReply({
embeds: [
new EmbedBuilder()
@ -92,6 +110,5 @@ export default {
],
});
return;
});
},
};

View file

@ -9,9 +9,9 @@ import {
} from "discord.js";
// Configurations
import getEmbedConfig from "../../../../../../../helpers/getEmbedData";
import fetchUser from "../../../../../../../helpers/userData";
// Handlers
import logger from "../../../../../../../middlewares/logger";
import prisma from "../../../../../../../prisma";
// Function
export default {
@ -91,47 +91,40 @@ export default {
});
}
// toUser Information
const toUser = await fetchUser(discordUser, guild);
// If toUser does not exist
if (toUser === null) {
logger?.silly(`User does not exist`);
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Set)")
.setDescription(`The user you provided does not exist.`)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
const createGuildMember = await prisma.guildMember.upsert({
where: {
userId_guildId: {
userId: discordUser.id,
guildId: guild.id,
},
},
update: { creditsEarned: creditAmount },
create: {
creditsEarned: creditAmount,
user: {
connectOrCreate: {
create: {
id: discordUser.id,
},
where: {
id: discordUser.id,
},
},
},
guild: {
connectOrCreate: {
create: {
id: guild.id,
},
where: {
id: guild.id,
},
},
},
},
});
}
// If toUser.credits does not exist
if (toUser?.credits === null) {
logger?.silly(`User does not have any credits`);
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Set)")
.setDescription(`The user you provided does not have any credits.`)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
}
// Set toUser with amount
toUser.credits = creditAmount;
// Save toUser
await toUser?.save()?.then(async () => {
logger?.silly(`Saved user`);
logger.silly(createGuildMember);
return interaction?.editReply({
embeds: [
@ -145,6 +138,5 @@ export default {
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
});
},
};

View file

@ -10,9 +10,9 @@ import {
import getEmbedConfig from "../../../../../../../helpers/getEmbedData";
// Helpers../../../../../../../helpers/userData
import pluralize from "../../../../../../../helpers/pluralize";
import fetchUser from "../../../../../../../helpers/userData";
// Handlers
import logger from "../../../../../../../middlewares/logger";
import prisma from "../../../../../../../prisma";
// Function
export default {
@ -45,7 +45,7 @@ export default {
const { guild, options } = interaction;
// User option
const optionUser = options?.getUser("user");
const discordReceiver = options?.getUser("user");
// Amount option
const optionAmount = options?.getInteger("amount");
@ -82,7 +82,7 @@ export default {
});
}
if (optionUser === null) {
if (discordReceiver === null) {
logger?.silly(`Discord receiver is null`);
return interaction?.editReply({
@ -111,52 +111,46 @@ export default {
});
}
// toUser Information
const toUser = await fetchUser(optionUser, guild);
// If toUser does not exist
if (toUser === null) {
logger?.silly(`ToUser is null`);
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Take)")
.setDescription(`The user you provided does not exist.`)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
const createGuildMember = await prisma.guildMember.upsert({
where: {
userId_guildId: {
userId: discordReceiver.id,
guildId: guild.id,
},
},
update: { creditsEarned: { decrement: optionAmount } },
create: {
creditsEarned: -optionAmount,
user: {
connectOrCreate: {
create: {
id: discordReceiver.id,
},
where: {
id: discordReceiver.id,
},
},
},
guild: {
connectOrCreate: {
create: {
id: guild.id,
},
where: {
id: guild.id,
},
},
},
},
});
}
// If toUser.credits does not exist
if (toUser?.credits === null) {
logger?.silly(`ToUser.credits is null`);
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Take)")
.setDescription(`The user you provided does not have credits.`)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
}
// Withdraw amount from toUser
toUser.credits -= optionAmount;
// Save toUser
await toUser?.save()?.then(async () => {
logger.silly(createGuildMember);
await interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Take)")
.setDescription(
`Took ${pluralize(optionAmount, "credit")} from ${optionUser}.`
`Took ${pluralize(optionAmount, "credit")} from ${discordReceiver}.`
)
.setTimestamp(new Date())
.setColor(successColor)
@ -164,6 +158,5 @@ export default {
],
});
return;
});
},
};

View file

@ -6,12 +6,10 @@ import {
EmbedBuilder,
PermissionsBitField,
} from "discord.js";
import mongoose from "mongoose";
import transferCredits from "../../../../../../../helpers/transferCredits";
// Configurations
import getEmbedConfig from "../../../../../../../helpers/getEmbedData";
import fetchUser from "../../../../../../../helpers/userData";
// Handlers../../../../../../../helpers/userData
import logger from "../../../../../../../middlewares/logger";
// Function
export default {
@ -54,188 +52,26 @@ export default {
const optionToUser = options?.getUser("to");
const optionAmount = options?.getInteger("amount");
// If amount is null
if (optionAmount === null) {
logger?.silly(`Amount is null`);
if (optionAmount === null) throw new Error("Amount is not specified");
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Transfer)")
.setDescription(`You must provide an amount.`)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
}
if (optionAmount <= 0)
throw new Error("You need to set amount above zero to transfer.");
if (guild === null) {
logger?.silly(`Guild is null`);
if (!guild) throw new Error(`We could not find this guild.`);
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Transfer)")
.setDescription(`You must be in a guild.`)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
}
if (optionFromUser === null) {
logger?.silly(`From user is null`);
if (!optionFromUser)
throw new Error("You must provide a user to transfer from.");
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Transfer)")
.setDescription(`You must provide a user to transfer from.`)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
}
if (optionToUser === null) {
logger?.silly(`To user is null`);
if (!optionToUser)
throw new Error("You must provide a user to transfer to.");
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Transfer)")
.setDescription(`You must provide a user to transfer to.`)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
}
// Get fromUser object
const fromUser = await fetchUser(optionFromUser, guild);
// Get toUser object
const toUser = await fetchUser(optionToUser, guild);
// If toUser does not exist
if (fromUser === null) {
logger?.silly(`From user does not exist`);
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Transfer)")
.setDescription(
`The user you provided to transfer from does not exist.`
)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
}
// If toUser.credits does not exist
if (!fromUser?.credits) {
logger?.silly(`From user does not have credits`);
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Transfer)")
.setDescription(
`The user you provided to transfer from does not have credits.`
)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
}
// If toUser does not exist
if (toUser === null) {
logger?.silly(`To user does not exist`);
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Transfer)")
.setDescription(
`The user you provided to transfer to does not exist.`
)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
}
// If toUser.credits does not exist
if (toUser?.credits === null) {
logger?.silly(`To user does not have credits`);
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Transfer)")
.setDescription(
`The user you provided to transfer to does not have credits.`
)
.setTimestamp(new Date())
.setColor(errorColor)
.setFooter({ text: footerText, iconURL: footerIcon }),
],
});
}
const session = await mongoose.startSession();
session.startTransaction();
try {
// Withdraw amount from fromUserDB
fromUser.credits -= optionAmount;
// Deposit amount to toUserDB
toUser.credits += optionAmount;
await fromUser.save();
await toUser.save();
await session.commitTransaction();
} catch (error: unknown) {
await session.abortTransaction();
session.endSession();
throw new Error(
"An error occurred while trying to gift credits. Please try again later."
);
} finally {
// ending the session
session.endSession();
}
await transferCredits(guild, optionFromUser, optionToUser, optionAmount);
return interaction?.editReply({
embeds: [
new EmbedBuilder()
.setTitle("[:toolbox:] Manage - Credits (Transfer)")
.setDescription(`Transferred ${optionAmount} credits.`)
.addFields(
{
name: `${optionFromUser?.username} Balance`,
value: `${fromUser?.credits}`,
inline: true,
},
{
name: `${optionToUser?.username} Balance`,
value: `${toUser?.credits}`,
inline: true,
}
)
.setTimestamp(new Date())
.setColor(successColor)
.setFooter({ text: footerText, iconURL: footerIcon }),