|
@@ -1,118 +1,82 @@
|
|
|
-import crypto from "crypto";
|
|
|
|
|
import {
|
|
import {
|
|
|
- User
|
|
|
|
|
|
|
+ plainToInstance
|
|
|
|
|
+} from "class-transformer";
|
|
|
|
|
+import {
|
|
|
|
|
+ validate
|
|
|
|
|
+} from "class-validator";
|
|
|
|
|
+import {
|
|
|
|
|
+ User
|
|
|
} from "../../../models/User";
|
|
} from "../../../models/User";
|
|
|
import {
|
|
import {
|
|
|
- RegisterResult,
|
|
|
|
|
- RegisterInput
|
|
|
|
|
|
|
+ RegisterInput, RegisterResult
|
|
|
} from "./types";
|
|
} from "./types";
|
|
|
|
|
|
|
|
-const isValidEmail = (mail: string): boolean => {
|
|
|
|
|
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
|
|
|
- return emailRegex.test(mail);
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-const isValidPhone = (phone: string): boolean => {
|
|
|
|
|
- const phoneRegex = /^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/;
|
|
|
|
|
- return phoneRegex.test(phone);
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-const isStrongPassword = (password: string): { valid: boolean; message: string } => {
|
|
|
|
|
- if (password.length < 8) return {
|
|
|
|
|
- valid: false, message: "Şifre en az 8 karakter olmalı"
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- if (!/[A-Z]/.test(password)) return {
|
|
|
|
|
- valid: false, message: "Şifre en az 1 büyük harf içermeli"
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- if (!/[a-z]/.test(password)) return {
|
|
|
|
|
- valid: false, message: "Şifre en az 1 küçük harf içermeli"
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- if (!/[0-9]/.test(password)) return {
|
|
|
|
|
- valid: false, message: "Şifre en az 1 sayı içermeli"
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- if (!/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)) return {
|
|
|
|
|
- valid: false, message: "Şifre en az 1 özel karakter içermeli"
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- return {
|
|
|
|
|
- valid: true,
|
|
|
|
|
- message: ""
|
|
|
|
|
- };
|
|
|
|
|
-};
|
|
|
|
|
|
|
+/* const isStrongPassword = (password: string): { valid: boolean; message: string } => {
|
|
|
|
|
+ if (password.length < 8) return { message: "Password must be at least 8 characters", valid: false };
|
|
|
|
|
+ if (!/[A-Z]/.test(password)) return { message: "Password must contain at least 1 uppercase letter", valid: false };
|
|
|
|
|
+ if (!/[a-z]/.test(password)) return { message: "Password must contain at least 1 lowercase letter", valid: false };
|
|
|
|
|
+ if (!/[0-9]/.test(password)) return { message: "Password must contain at least 1 number", valid: false };
|
|
|
|
|
+ if (!/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)) return { message: "Password must contain at least 1 special character", valid: false };
|
|
|
|
|
+ return { message: "", valid: true };
|
|
|
|
|
+}; */
|
|
|
|
|
|
|
|
export const register = async (input: RegisterInput): Promise<RegisterResult> => {
|
|
export const register = async (input: RegisterInput): Promise<RegisterResult> => {
|
|
|
- const {
|
|
|
|
|
- companyName,
|
|
|
|
|
- phoneNumber,
|
|
|
|
|
- firstName,
|
|
|
|
|
- lastName,
|
|
|
|
|
- password,
|
|
|
|
|
- mail,
|
|
|
|
|
- } = input;
|
|
|
|
|
|
|
+ const dto = plainToInstance(RegisterInput, input);
|
|
|
|
|
+ const errors = await validate(dto);
|
|
|
|
|
|
|
|
- if (!isValidEmail(mail)) {
|
|
|
|
|
|
|
+ if (errors.length > 0) {
|
|
|
|
|
+ const message = Object.values(errors[0].constraints!)[0];
|
|
|
return {
|
|
return {
|
|
|
- success: false,
|
|
|
|
|
- message: "Geçersiz email formatı",
|
|
|
|
|
- statusCode: 400
|
|
|
|
|
|
|
+ code: 400,
|
|
|
|
|
+ message,
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (!isValidPhone(phoneNumber)) {
|
|
|
|
|
- return {
|
|
|
|
|
- success: false, message: "Geçersiz telefon numarası formatı", statusCode: 400
|
|
|
|
|
- };
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- const passwordCheck = isStrongPassword(password);
|
|
|
|
|
-
|
|
|
|
|
- if (!passwordCheck.valid) {
|
|
|
|
|
- return {
|
|
|
|
|
- success: false,
|
|
|
|
|
- message: passwordCheck.message,
|
|
|
|
|
- statusCode: 400
|
|
|
|
|
- };
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ const {
|
|
|
|
|
+ companyName,
|
|
|
|
|
+ phoneNumber,
|
|
|
|
|
+ firstName,
|
|
|
|
|
+ lastName,
|
|
|
|
|
+ password,
|
|
|
|
|
+ mail
|
|
|
|
|
+ } = input;
|
|
|
|
|
|
|
|
const existingUser = await User.findOne({
|
|
const existingUser = await User.findOne({
|
|
|
- mail
|
|
|
|
|
|
|
+ mail
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
if (existingUser) {
|
|
if (existingUser) {
|
|
|
return {
|
|
return {
|
|
|
- success: false, message: "Bu email zaten kayıtlı", statusCode: 409
|
|
|
|
|
|
|
+ message: "Email already in use",
|
|
|
|
|
+ code: 409
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const existingPhone = await User.findOne({
|
|
const existingPhone = await User.findOne({
|
|
|
- phoneNumber
|
|
|
|
|
|
|
+ phoneNumber
|
|
|
});
|
|
});
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (existingPhone) {
|
|
if (existingPhone) {
|
|
|
return {
|
|
return {
|
|
|
- success: false, message: "Bu telefon numarası zaten kayıtlı", statusCode: 409
|
|
|
|
|
|
|
+ message: "Phone number already in use",
|
|
|
|
|
+ code: 409
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
- const hashedPassword = crypto.createHash("md5").update(password).digest("hex");
|
|
|
|
|
|
|
|
|
|
await User.create({
|
|
await User.create({
|
|
|
fullName: `${firstName} ${lastName}`,
|
|
fullName: `${firstName} ${lastName}`,
|
|
|
- password: hashedPassword,
|
|
|
|
|
phoneNumber,
|
|
phoneNumber,
|
|
|
companyName,
|
|
companyName,
|
|
|
firstName,
|
|
firstName,
|
|
|
lastName,
|
|
lastName,
|
|
|
- mail,
|
|
|
|
|
|
|
+ password,
|
|
|
|
|
+ mail
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
return {
|
|
return {
|
|
|
- success: true,
|
|
|
|
|
- message: "Kayıt başarılı",
|
|
|
|
|
- statusCode: 201,
|
|
|
|
|
|
|
+ message: "Registration successful",
|
|
|
|
|
+ code: 201
|
|
|
};
|
|
};
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
export default register;
|
|
export default register;
|