Fix seeder and fix the schema for password and confirm password.

This commit is contained in:
Bradley Shellnut 2024-02-17 00:10:19 -08:00
parent 858a356ddf
commit 9a87af4c3c
4 changed files with 28 additions and 66 deletions

View file

@ -1,17 +1,9 @@
<script lang="ts"> <script lang="ts">
import { superForm } from 'sveltekit-superforms/client'; import { superForm } from 'sveltekit-superforms/client';
import { userSchema } from '$lib/config/zod-schemas'; import { signUpSchema } from '$lib/config/zod-schemas';
export let data; export let data;
const signUpSchema = userSchema.pick({ const { form, errors, enhance } = superForm(data.form, {
firstName: true,
lastName: true,
username: true,
email: true,
password: true
});
const { form, errors, enhance, delayed } = superForm(data.form, {
taintedMessage: null, taintedMessage: null,
validators: signUpSchema, validators: signUpSchema,
delayMs: 0 delayMs: 0

View file

@ -29,13 +29,10 @@ export const userSchema = z.object({
.max(50, { message: 'Username must be less than 50 characters' }), .max(50, { message: 'Username must be less than 50 characters' }),
password: z password: z
.string({ required_error: 'Password is required' }) .string({ required_error: 'Password is required' })
.trim() .trim(),
.min(8, { message: 'Password must be at least 8 characters' })
.max(128, { message: 'Password must be less than 128 characters' }),
confirm_password: z confirm_password: z
.string({ required_error: 'Confirm Password is required' }) .string({ required_error: 'Confirm Password is required' })
.trim() .trim(),
.min(8, { message: 'Confirm Password must be at least 8 characters' }),
role: z.enum(['USER', 'ADMIN'], { required_error: 'You must have a role' }).default('USER'), role: z.enum(['USER', 'ADMIN'], { required_error: 'You must have a role' }).default('USER'),
verified: z.boolean().default(false), verified: z.boolean().default(false),
token: z.string().optional(), token: z.string().optional(),
@ -111,54 +108,44 @@ const checkPasswordStrength = async function (password: string, ctx: z.Refinemen
countOfSpecialChar = 0; countOfSpecialChar = 0;
for (let i = 0; i < password.length; i++) { for (let i = 0; i < password.length; i++) {
const char = password.charAt(i); const char = password.charAt(i);
if (!isNaN(+char)) countOfNumbers++; if (!isNaN(+char)) {
else if (containsUppercase(char)) countOfUpperCase++; countOfNumbers++;
else if (containsLowercase(char)) countOfLowerCase++; } else if (containsUppercase(char)) {
else if (containsSpecialChar(char)) countOfSpecialChar++; countOfUpperCase++;
} else if (containsLowercase(char)) {
countOfLowerCase++;
} else if (containsSpecialChar(char)) {
countOfSpecialChar++;
}
} }
let errors = { let errorMessage = 'Your password:';
upperCase: { pass: true, message: "At least one upper case." },
lowerCase: { pass: true, message: "At least one lower case." },
specialCharacter: { pass: true, message: "At least one special character." },
totalNumber: { pass: true, message: "At least one number." },
minimumLength: { pass: true, message: "At least 8 characters." },
maximumLength: { pass: true, message: "At most 128 characters." },
};
if (countOfLowerCase < 1) { if (countOfLowerCase < 1) {
errors = { ...errors, lowerCase: { ...errors.lowerCase, pass: false } }; errorMessage = ' Must have at least one lowercase letter. ';
} }
if (countOfNumbers < 1) { if (countOfNumbers < 1) {
errors = { errorMessage += ' Must have at least one number. ';
...errors,
totalNumber: { ...errors.totalNumber, pass: false },
};
} }
if (countOfUpperCase < 1) { if (countOfUpperCase < 1) {
errors = { ...errors, upperCase: { ...errors.upperCase, pass: false } }; errorMessage += ' Must have at least one uppercase letter. ';
} }
if (countOfSpecialChar < 1) { if (countOfSpecialChar < 1) {
errors = { ...errors, specialCharacter: { ...errors.specialCharacter, pass: false } }; errorMessage += ' Must have at least one special character.';
} }
if (minimumLength) { if (minimumLength) {
errors = { ...errors, minimumLength: { ...errors.minimumLength, pass: false } }; errorMessage += ' Be at least 8 characters long.';
} }
if (maximumLength) { if (maximumLength) {
errors = { ...errors, maximumLength: { ...errors.maximumLength, pass: false } }; errorMessage += ' Be less than 128 characters long.';
} }
if ( if (errorMessage.length > 'Your password:'.length) {
countOfLowerCase < 1 ||
countOfUpperCase < 1 ||
countOfSpecialChar < 1 ||
countOfNumbers < 1
) {
ctx.addIssue({ ctx.addIssue({
code: "custom", code: 'custom',
message: JSON.stringify(errors), message: errorMessage,
path: ["password"] path: ['password']
}); });
} }
} }

View file

@ -5,32 +5,12 @@ import { nanoid } from 'nanoid';
import { setError, superValidate } from 'sveltekit-superforms/server'; import { setError, superValidate } from 'sveltekit-superforms/server';
import type { PageServerLoad } from './$types'; import type { PageServerLoad } from './$types';
import { lucia } from '$lib/server/auth'; import { lucia } from '$lib/server/auth';
import { userSchema } from '$lib/config/zod-schemas'; import { signUpSchema } from '$lib/config/zod-schemas';
import { add_user_to_role } from '$server/roles'; import { add_user_to_role } from '$server/roles';
import type { Message } from '$lib/types.js'; import type { Message } from '$lib/types.js';
import db from '$lib/drizzle'; import db from '$lib/drizzle';
import { collections, users, wishlists } from '../../../schema'; import { collections, users, wishlists } from '../../../schema';
const signUpSchema = userSchema
.pick({
firstName: true,
lastName: true,
email: true,
username: true,
password: true,
confirm_password: true,
terms: true
})
.superRefine(({ confirm_password, password }, ctx) => {
if (confirm_password !== password) {
ctx.addIssue({
code: 'custom',
message: 'Password and Confirm Password must match',
path: ['confirm_password']
});
}
});
export const load: PageServerLoad = async (event) => { export const load: PageServerLoad = async (event) => {
console.log('sign up load event', event); console.log('sign up load event', event);
// const session = await event.locals.auth.validate(); // const session = await event.locals.auth.validate();

View file

@ -27,3 +27,6 @@ if (existingRoles.length === 0) {
} else { } else {
console.log('Roles already exist. No action taken.'); console.log('Roles already exist. No action taken.');
} }
await pool.end();
process.exit();