payloadcms_otp_plugin
Version:
A comprehensive One-Time Password (OTP) authentication plugin for Payload CMS that enables secure passwordless authentication via SMS and email
92 lines (91 loc) • 3.46 kB
JavaScript
import { OTPService } from '../services/index.js';
import { createTranslationHelper } from '../utilities/translation.js';
// Helper function to create standardized responses
const createResponse = (data, message, success)=>({
data: success ? data : null,
message,
code: success ? 200 : 400,
error: !success
});
// Helper function to handle errors
const handleError = (error, operation, headers)=>{
// console.error(`${operation} Error:`, error);
const { t } = createTranslationHelper(headers || new Headers());
const response = createResponse(null, t("api.internal_server_error"), false);
return Response.json(response, {
status: 500
});
};
// Helper function to initialize OTP service
const initOTPService = (req)=>{
const afterSetOtpHook = req.payload.otpPluginHooks?.afterSetOtp;
return new OTPService(req, 'users', afterSetOtpHook);
};
export const sendOtpEndpointHandler = async (req)=>{
try {
const { t } = createTranslationHelper(req.headers);
const body = req.json ? await req.json() : {};
const { mobile, email } = body;
if (!mobile && !email) {
const response = createResponse(null, t("api.mobile_or_email_required"), false);
return Response.json(response, {
status: 400
});
}
const otpService = initOTPService(req);
const result = await otpService.sendOTP({
email,
mobile
}, req.headers);
const response = createResponse(null, result.message, result.success);
return Response.json(response, {
status: result.success ? 200 : 400
});
} catch (error) {
return handleError(error, 'Send OTP', req.headers);
}
};
export const loginWithMobileEndpointHandler = async (req)=>{
try {
const { t } = createTranslationHelper(req.headers);
const body = req.json ? await req.json() : {};
const { mobile, otp, email } = body;
if (!mobile && !email || !otp) {
const response = createResponse(null, t("api.mobile_email_and_otp_required"), false);
return Response.json(response, {
status: 400
});
}
const otpService = initOTPService(req);
const result = await otpService.loginWithOTP({
mobile,
email,
otp
}, req.headers);
const responseData = result.success ? result.data : null;
const response = createResponse(responseData, result.message, result.success);
return Response.json(response, {
status: result.success ? 200 : 400
});
} catch (error) {
return handleError(error, 'Login with OTP', req.headers);
}
};
export const getOtpConfigEndpointHandler = async (req)=>{
try {
const { t } = createTranslationHelper(req.headers);
const config = req.payload.otpPluginConfig;
const otpLength = config?.otpLength || 6;
const expiredTime = config?.expiredTime || 300000; // Default 5 minutes
const response = createResponse({
otpLength,
expiredTime
}, t("api.otp_config_retrieved"), true);
return Response.json(response, {
status: 200
});
} catch (error) {
return handleError(error, 'Get OTP Config', req.headers);
}
};
//# sourceMappingURL=customEndpointHandler.js.map