|
|
@@ -1,5 +1,108 @@
|
|
|
-const register = async () => {
|
|
|
- return "";
|
|
|
+import crypto from "crypto";
|
|
|
+import {
|
|
|
+ User
|
|
|
+} from "../../../models/User";
|
|
|
+import {
|
|
|
+ RegisterInput, RegisterResult
|
|
|
+} 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: ""
|
|
|
+ };
|
|
|
};
|
|
|
|
|
|
-export default register;
|
|
|
+export const register = async (input: RegisterInput): Promise<RegisterResult> => {
|
|
|
+ const {
|
|
|
+ firstName, lastName, companyName, mail, phoneNumber, password
|
|
|
+ } = input;
|
|
|
+
|
|
|
+ if (!isValidEmail(mail)) {
|
|
|
+ return {
|
|
|
+ success: false, message: "Geçersiz email formatı" , statusCode: 400
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ 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 existingUser = await User.findOne({
|
|
|
+ mail
|
|
|
+ });
|
|
|
+
|
|
|
+ if (existingUser) {
|
|
|
+ return {
|
|
|
+ success: false, message: "Bu email zaten kayıtlı" , statusCode: 409
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ const existingPhone = await User.findOne({
|
|
|
+ phoneNumber
|
|
|
+ });
|
|
|
+
|
|
|
+ if (existingPhone) {
|
|
|
+ return {
|
|
|
+ success: false, message: "Bu telefon numarası zaten kayıtlı" , statusCode: 409
|
|
|
+ };
|
|
|
+ }
|
|
|
+ const hashedPassword = crypto.createHash("md5").update(password).digest("hex");
|
|
|
+
|
|
|
+ await User.create({
|
|
|
+ fullName: `${firstName} ${lastName}`,
|
|
|
+ firstName,
|
|
|
+ lastName,
|
|
|
+ companyName,
|
|
|
+ mail,
|
|
|
+ phoneNumber,
|
|
|
+ password: hashedPassword,
|
|
|
+ });
|
|
|
+
|
|
|
+ return {
|
|
|
+ success: true,
|
|
|
+ message: "Kayıt başarılı",
|
|
|
+ statusCode: 201
|
|
|
+ };
|
|
|
+};
|
|
|
+export default register;
|