diff --git a/packages/backend/src/graphql/mutation-resolvers.js b/packages/backend/src/graphql/mutation-resolvers.js index d9ea9567..cacd3936 100644 --- a/packages/backend/src/graphql/mutation-resolvers.js +++ b/packages/backend/src/graphql/mutation-resolvers.js @@ -32,7 +32,6 @@ import verifyConnection from './mutations/verify-connection.js'; // Converted mutations import deleteUser from './mutations/delete-user.ee.js'; import login from './mutations/login.js'; -import forgotPassword from './mutations/forgot-password.ee.js'; import resetPassword from './mutations/reset-password.ee.js'; const mutationResolvers = { @@ -51,7 +50,6 @@ const mutationResolvers = { deleteUser, duplicateFlow, executeFlow, - forgotPassword, generateAuthUrl, login, registerUser, diff --git a/packages/backend/src/graphql/mutations/forgot-password.ee.js b/packages/backend/src/graphql/mutations/forgot-password.ee.js deleted file mode 100644 index 60cb4bbc..00000000 --- a/packages/backend/src/graphql/mutations/forgot-password.ee.js +++ /dev/null @@ -1,43 +0,0 @@ -import appConfig from '../../config/app.js'; -import User from '../../models/user.js'; -import emailQueue from '../../queues/email.js'; -import { - REMOVE_AFTER_30_DAYS_OR_150_JOBS, - REMOVE_AFTER_7_DAYS_OR_50_JOBS, -} from '../../helpers/remove-job-configuration.js'; - -const forgotPassword = async (_parent, params) => { - const { email } = params.input; - - const user = await User.query().findOne({ email: email.toLowerCase() }); - - if (!user) { - throw new Error('Email address not found!'); - } - - await user.generateResetPasswordToken(); - - const jobName = `Reset Password Email - ${user.id}`; - - const jobPayload = { - email: user.email, - subject: 'Reset Password', - template: 'reset-password-instructions.ee', - params: { - token: user.resetPasswordToken, - webAppUrl: appConfig.webAppUrl, - fullName: user.fullName, - }, - }; - - const jobOptions = { - removeOnComplete: REMOVE_AFTER_7_DAYS_OR_50_JOBS, - removeOnFail: REMOVE_AFTER_30_DAYS_OR_150_JOBS, - }; - - await emailQueue.add(jobName, jobPayload, jobOptions); - - return true; -}; - -export default forgotPassword; diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index 3944e1c5..e64228fd 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -17,7 +17,6 @@ type Mutation { deleteUser(input: DeleteUserInput): Boolean duplicateFlow(input: DuplicateFlowInput): Flow executeFlow(input: ExecuteFlowInput): executeFlowType - forgotPassword(input: ForgotPasswordInput): Boolean generateAuthUrl(input: GenerateAuthUrlInput): AuthLink login(input: LoginInput): Auth registerUser(input: RegisterUserInput): User @@ -405,10 +404,6 @@ input UpdateCurrentUserInput { fullName: String } -input ForgotPasswordInput { - email: String! -} - input ResetPasswordInput { token: String! password: String! diff --git a/packages/backend/src/helpers/authentication.js b/packages/backend/src/helpers/authentication.js index d60ac986..f57c41fa 100644 --- a/packages/backend/src/helpers/authentication.js +++ b/packages/backend/src/helpers/authentication.js @@ -53,7 +53,6 @@ const isAuthenticatedRule = rule()(isAuthenticated); export const authenticationRules = { Mutation: { '*': isAuthenticatedRule, - forgotPassword: allow, login: allow, registerUser: allow, resetPassword: allow, diff --git a/packages/web/src/components/ForgotPasswordForm/index.ee.jsx b/packages/web/src/components/ForgotPasswordForm/index.ee.jsx index 92a7205d..aca44330 100644 --- a/packages/web/src/components/ForgotPasswordForm/index.ee.jsx +++ b/packages/web/src/components/ForgotPasswordForm/index.ee.jsx @@ -1,23 +1,36 @@ import * as React from 'react'; -import { useMutation } from '@apollo/client'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; import LoadingButton from '@mui/lab/LoadingButton'; -import { FORGOT_PASSWORD } from 'graphql/mutations/forgot-password.ee'; +import { enqueueSnackbar } from 'notistack'; + +import useForgotPassword from 'hooks/useForgotPassword'; import Form from 'components/Form'; import TextField from 'components/TextField'; import useFormatMessage from 'hooks/useFormatMessage'; export default function ForgotPasswordForm() { const formatMessage = useFormatMessage(); - const [forgotPassword, { data, loading }] = useMutation(FORGOT_PASSWORD); + const { + mutateAsync: forgotPassword, + isPending: loading, + isSuccess, + } = useForgotPassword(); const handleSubmit = async (values) => { - await forgotPassword({ - variables: { - input: values, - }, - }); + const { email } = values; + try { + await forgotPassword({ + email, + }); + } catch (error) { + enqueueSnackbar( + error?.message || formatMessage('forgotPasswordForm.error'), + { + variant: 'error', + }, + ); + } }; return ( @@ -35,7 +48,6 @@ export default function ForgotPasswordForm() { > {formatMessage('forgotPasswordForm.title')} -