Added error handling to registration
This commit is contained in:
parent
1d6ca4abd8
commit
8de9738d85
|
|
@ -2,7 +2,10 @@
|
||||||
// for information about these interfaces
|
// for information about these interfaces
|
||||||
declare global {
|
declare global {
|
||||||
namespace App {
|
namespace App {
|
||||||
// interface Error {}
|
interface Error {
|
||||||
|
message: string
|
||||||
|
cause?: number,
|
||||||
|
}
|
||||||
// interface Locals {}
|
// interface Locals {}
|
||||||
// interface PageData {}
|
// interface PageData {}
|
||||||
// interface PageState {}
|
// interface PageState {}
|
||||||
|
|
|
||||||
|
|
@ -4,3 +4,22 @@ export class ArgumentError extends Error {
|
||||||
super(message)
|
super(message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class DuplicateError extends Error {
|
||||||
|
fields: Array<string>
|
||||||
|
|
||||||
|
constructor(fields: Array<string>, message: string) {
|
||||||
|
super(message)
|
||||||
|
this.fields = fields
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const enum RegisterResponseCause {
|
||||||
|
Server = 1,
|
||||||
|
MalformedRequest,
|
||||||
|
EmailLength,
|
||||||
|
EmailFormat,
|
||||||
|
EmailDuplicate,
|
||||||
|
PasswordLength,
|
||||||
|
DisplayNameLength
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,8 @@ export enum LogSeverity {
|
||||||
|
|
||||||
export enum LogModule {
|
export enum LogModule {
|
||||||
PROCESS,
|
PROCESS,
|
||||||
USER
|
USER,
|
||||||
|
DATABASE
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class Logger {
|
abstract class Logger {
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
import Bun from "bun"
|
import Bun from "bun"
|
||||||
|
|
||||||
import { ArgumentError } from "$lib/errors"
|
import { ArgumentError, DuplicateError } from "$lib/errors"
|
||||||
|
|
||||||
import Log from "$lib/server/log"
|
import Log from "$lib/server/log"
|
||||||
import db from "$lib/server/database"
|
import db from "$lib/server/database"
|
||||||
|
import { Prisma } from "@prisma/client"
|
||||||
|
|
||||||
class UserMgmt {
|
class UserMgmt {
|
||||||
|
|
||||||
|
|
@ -12,6 +13,7 @@ class UserMgmt {
|
||||||
throw new ArgumentError("No field may be empty")
|
throw new ArgumentError("No field may be empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
const user = await db.user.create({
|
const user = await db.user.create({
|
||||||
data: {
|
data: {
|
||||||
email: email,
|
email: email,
|
||||||
|
|
@ -24,6 +26,15 @@ class UserMgmt {
|
||||||
console.log(user)
|
console.log(user)
|
||||||
|
|
||||||
return user;
|
return user;
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Prisma.PrismaClientKnownRequestError && e.code == "P2002") {
|
||||||
|
const duplicates = Array.isArray(e.meta?.target) ? e.meta.target as Array<string> : ["unknown"]
|
||||||
|
throw new DuplicateError(duplicates, "Already exists")
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.error(Log.module.DATABASE, `Failed to create User in database! Error: ${JSON.stringify(e)}`)
|
||||||
|
return null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async login(email: string, password: string) {
|
async login(email: string, password: string) {
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import { json, error } from "@sveltejs/kit"
|
||||||
import UserMgmt from "$lib/server/usermgmt"
|
import UserMgmt from "$lib/server/usermgmt"
|
||||||
|
|
||||||
import Util from "$lib/util"
|
import Util from "$lib/util"
|
||||||
|
import { DuplicateError, RegisterResponseCause } from "$lib/errors"
|
||||||
|
|
||||||
export const POST: RequestHandler = async ({ request }) => {
|
export const POST: RequestHandler = async ({ request }) => {
|
||||||
|
|
||||||
|
|
@ -15,26 +16,32 @@ export const POST: RequestHandler = async ({ request }) => {
|
||||||
const display_name = data.get("display_name")
|
const display_name = data.get("display_name")
|
||||||
|
|
||||||
if (data.keys.length > 3 || !(typeof email === "string" && typeof password === "string" && typeof display_name === "string")) {
|
if (data.keys.length > 3 || !(typeof email === "string" && typeof password === "string" && typeof display_name === "string")) {
|
||||||
return error(400, { message: "Invalid field arguments" })
|
return error(400, { cause: RegisterResponseCause.MalformedRequest, message: "Invalid field arguments" })
|
||||||
}
|
}
|
||||||
if (email.length == 0) {
|
if (email.length == 0) {
|
||||||
return error(400, { message: "email must not be empty" })
|
return error(400, { cause: RegisterResponseCause.EmailLength, message: "email must not be empty" })
|
||||||
}
|
}
|
||||||
if (password.length == 0) {
|
if (password.length == 0) {
|
||||||
return error(400, { message: "password must not be empty" })
|
return error(400, { cause: RegisterResponseCause.PasswordLength, message: "password must not be empty" })
|
||||||
}
|
}
|
||||||
if (display_name.length == 0) {
|
if (display_name.length == 0) {
|
||||||
return error(400, { message: "Display name must not be empty" })
|
return error(400, { cause: RegisterResponseCause.DisplayNameLength, message: "Display name must not be empty" })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Util.check_email_format(email)) {
|
if (!Util.check_email_format(email)) {
|
||||||
return error(400, { message: "invalid email format" })
|
return error(400, { cause: RegisterResponseCause.EmailFormat, message: "invalid email format" })
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const user = UserMgmt.register(email, password, display_name)
|
const user = await UserMgmt.register(email, password, display_name)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return error(500)
|
if (e instanceof DuplicateError) {
|
||||||
|
if (e.fields.includes("email")) {
|
||||||
|
return error(409, { cause: RegisterResponseCause.EmailDuplicate, message: "email already in use" })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return error(500, { cause: RegisterResponseCause.Server, message: "Server failed to create user"})
|
||||||
}
|
}
|
||||||
|
|
||||||
return json({})
|
return json({})
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue