diff --git a/package-lock.json b/package-lock.json
index 3183772..d385a23 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,11 +14,15 @@
"@types/express": "^4.17.13",
"@types/jsonwebtoken": "^8.5.8",
"@types/nodemailer": "^6.4.4",
+ "@types/redis": "^4.0.11",
"argon2": "^0.28.5",
"dotenv": "^16.0.0",
"express": "^4.17.3",
"jsonwebtoken": "^8.5.1",
+ "nodemailer": "^6.7.2",
"prisma": "^3.10.0",
+ "promisify": "^0.0.3",
+ "redis": "^4.0.4",
"ts-node": "^10.5.0",
"typescript": "^4.5.5"
},
@@ -131,6 +135,65 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
+ "node_modules/@node-redis/bloom": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@node-redis/bloom/-/bloom-1.0.1.tgz",
+ "integrity": "sha512-mXEBvEIgF4tUzdIN89LiYsbi6//EdpFA7L8M+DHCvePXg+bfHWi+ct5VI6nHUFQE5+ohm/9wmgihCH3HSkeKsw==",
+ "peerDependencies": {
+ "@node-redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@node-redis/client": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@node-redis/client/-/client-1.0.4.tgz",
+ "integrity": "sha512-IM/NRAqg7MvNC3bIRQipXGrEarunrdgvrbAzsd3ty93LSHi/M+ybQulOERQi8a3M+P5BL8HenwXjiIoKm6ml2g==",
+ "dependencies": {
+ "cluster-key-slot": "1.1.0",
+ "generic-pool": "3.8.2",
+ "redis-parser": "3.0.0",
+ "yallist": "4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@node-redis/client/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/@node-redis/graph": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@node-redis/graph/-/graph-1.0.0.tgz",
+ "integrity": "sha512-mRSo8jEGC0cf+Rm7q8mWMKKKqkn6EAnA9IA2S3JvUv/gaWW/73vil7GLNwion2ihTptAm05I9LkepzfIXUKX5g==",
+ "peerDependencies": {
+ "@node-redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@node-redis/json": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@node-redis/json/-/json-1.0.2.tgz",
+ "integrity": "sha512-qVRgn8WfG46QQ08CghSbY4VhHFgaTY71WjpwRBGEuqGPfWwfRcIf3OqSpR7Q/45X+v3xd8mvYjywqh0wqJ8T+g==",
+ "peerDependencies": {
+ "@node-redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@node-redis/search": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@node-redis/search/-/search-1.0.3.tgz",
+ "integrity": "sha512-rsrzkGWI84di/uYtEctS/4qLusWt0DESx/psjfB0TFpORDhe7JfC0h8ary+eHulTksumor244bXLRSqQXbFJmw==",
+ "peerDependencies": {
+ "@node-redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@node-redis/time-series": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@node-redis/time-series/-/time-series-1.0.2.tgz",
+ "integrity": "sha512-HGQ8YooJ8Mx7l28tD7XjtB3ImLEjlUxG1wC1PAjxu6hPJqjPshUZxAICzDqDjtIbhDTf48WXXUcx8TQJB1XTKA==",
+ "peerDependencies": {
+ "@node-redis/client": "^1.0.0"
+ }
+ },
"node_modules/@phc/format": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz",
@@ -273,6 +336,15 @@
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
},
+ "node_modules/@types/redis": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/@types/redis/-/redis-4.0.11.tgz",
+ "integrity": "sha512-bI+gth8La8Wg/QCR1+V1fhrL9+LZUSWfcqpOj2Kc80ZQ4ffbdL173vQd5wovmoV9i071FU9oP2g6etLuEwb6Rg==",
+ "deprecated": "This is a stub types definition. redis provides its own type definitions, so you do not need this installed.",
+ "dependencies": {
+ "redis": "*"
+ }
+ },
"node_modules/@types/serve-static": {
"version": "1.13.10",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
@@ -825,6 +897,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/cluster-key-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz",
+ "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -1476,6 +1556,14 @@
"node": ">=8"
}
},
+ "node_modules/generic-pool": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz",
+ "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/get-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
@@ -2452,6 +2540,14 @@
}
}
},
+ "node_modules/nodemailer": {
+ "version": "6.7.3",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz",
+ "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/nodemon": {
"version": "1.19.4",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz",
@@ -2787,6 +2883,14 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
+ "node_modules/promisify": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/promisify/-/promisify-0.0.3.tgz",
+ "integrity": "sha1-dU22HynuZHarVDxFtGTSH171VoY=",
+ "dependencies": {
+ "when": ""
+ }
+ },
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -2894,6 +2998,38 @@
"node": ">=0.10"
}
},
+ "node_modules/redis": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/redis/-/redis-4.0.4.tgz",
+ "integrity": "sha512-KaM1OAj/nGrSeybmmOWSMY0LXTGT6FVWgUZZrd2MYzXKJ+VGtqVaciGQeNMfZiQX+kDM8Ke4uttb54m2rm6V0A==",
+ "dependencies": {
+ "@node-redis/bloom": "1.0.1",
+ "@node-redis/client": "1.0.4",
+ "@node-redis/graph": "1.0.0",
+ "@node-redis/json": "1.0.2",
+ "@node-redis/search": "1.0.3",
+ "@node-redis/time-series": "1.0.2"
+ }
+ },
+ "node_modules/redis-errors": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
+ "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/redis-parser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
+ "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=",
+ "dependencies": {
+ "redis-errors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/regex-not": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
@@ -3877,6 +4013,11 @@
"webidl-conversions": "^3.0.0"
}
},
+ "node_modules/when": {
+ "version": "3.7.8",
+ "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
+ "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I="
+ },
"node_modules/which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@@ -4025,6 +4166,54 @@
}
}
},
+ "@node-redis/bloom": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@node-redis/bloom/-/bloom-1.0.1.tgz",
+ "integrity": "sha512-mXEBvEIgF4tUzdIN89LiYsbi6//EdpFA7L8M+DHCvePXg+bfHWi+ct5VI6nHUFQE5+ohm/9wmgihCH3HSkeKsw==",
+ "requires": {}
+ },
+ "@node-redis/client": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@node-redis/client/-/client-1.0.4.tgz",
+ "integrity": "sha512-IM/NRAqg7MvNC3bIRQipXGrEarunrdgvrbAzsd3ty93LSHi/M+ybQulOERQi8a3M+P5BL8HenwXjiIoKm6ml2g==",
+ "requires": {
+ "cluster-key-slot": "1.1.0",
+ "generic-pool": "3.8.2",
+ "redis-parser": "3.0.0",
+ "yallist": "4.0.0"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+ },
+ "@node-redis/graph": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@node-redis/graph/-/graph-1.0.0.tgz",
+ "integrity": "sha512-mRSo8jEGC0cf+Rm7q8mWMKKKqkn6EAnA9IA2S3JvUv/gaWW/73vil7GLNwion2ihTptAm05I9LkepzfIXUKX5g==",
+ "requires": {}
+ },
+ "@node-redis/json": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@node-redis/json/-/json-1.0.2.tgz",
+ "integrity": "sha512-qVRgn8WfG46QQ08CghSbY4VhHFgaTY71WjpwRBGEuqGPfWwfRcIf3OqSpR7Q/45X+v3xd8mvYjywqh0wqJ8T+g==",
+ "requires": {}
+ },
+ "@node-redis/search": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@node-redis/search/-/search-1.0.3.tgz",
+ "integrity": "sha512-rsrzkGWI84di/uYtEctS/4qLusWt0DESx/psjfB0TFpORDhe7JfC0h8ary+eHulTksumor244bXLRSqQXbFJmw==",
+ "requires": {}
+ },
+ "@node-redis/time-series": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@node-redis/time-series/-/time-series-1.0.2.tgz",
+ "integrity": "sha512-HGQ8YooJ8Mx7l28tD7XjtB3ImLEjlUxG1wC1PAjxu6hPJqjPshUZxAICzDqDjtIbhDTf48WXXUcx8TQJB1XTKA==",
+ "requires": {}
+ },
"@phc/format": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz",
@@ -4150,6 +4339,14 @@
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
},
+ "@types/redis": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/@types/redis/-/redis-4.0.11.tgz",
+ "integrity": "sha512-bI+gth8La8Wg/QCR1+V1fhrL9+LZUSWfcqpOj2Kc80ZQ4ffbdL173vQd5wovmoV9i071FU9oP2g6etLuEwb6Rg==",
+ "requires": {
+ "redis": "*"
+ }
+ },
"@types/serve-static": {
"version": "1.13.10",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
@@ -4591,6 +4788,11 @@
"integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
"dev": true
},
+ "cluster-key-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz",
+ "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw=="
+ },
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -5110,6 +5312,11 @@
}
}
},
+ "generic-pool": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz",
+ "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg=="
+ },
"get-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
@@ -5883,6 +6090,11 @@
"whatwg-url": "^5.0.0"
}
},
+ "nodemailer": {
+ "version": "6.7.3",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz",
+ "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g=="
+ },
"nodemon": {
"version": "1.19.4",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz",
@@ -6140,6 +6352,14 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
+ "promisify": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/promisify/-/promisify-0.0.3.tgz",
+ "integrity": "sha1-dU22HynuZHarVDxFtGTSH171VoY=",
+ "requires": {
+ "when": ""
+ }
+ },
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -6228,6 +6448,32 @@
"readable-stream": "^2.0.2"
}
},
+ "redis": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/redis/-/redis-4.0.4.tgz",
+ "integrity": "sha512-KaM1OAj/nGrSeybmmOWSMY0LXTGT6FVWgUZZrd2MYzXKJ+VGtqVaciGQeNMfZiQX+kDM8Ke4uttb54m2rm6V0A==",
+ "requires": {
+ "@node-redis/bloom": "1.0.1",
+ "@node-redis/client": "1.0.4",
+ "@node-redis/graph": "1.0.0",
+ "@node-redis/json": "1.0.2",
+ "@node-redis/search": "1.0.3",
+ "@node-redis/time-series": "1.0.2"
+ }
+ },
+ "redis-errors": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
+ "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60="
+ },
+ "redis-parser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
+ "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=",
+ "requires": {
+ "redis-errors": "^1.0.0"
+ }
+ },
"regex-not": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
@@ -6992,6 +7238,11 @@
"webidl-conversions": "^3.0.0"
}
},
+ "when": {
+ "version": "3.7.8",
+ "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
+ "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I="
+ },
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index e197618..80808c2 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -16,6 +16,7 @@ model User {
passwordHash String
passwordSalt String
role Role @default(USER)
+ status Status @default(UNVERIFIED)
organization Organization @relation(fields: [organizationId], references: [id])
organizationId Int
orders Order[]
@@ -64,3 +65,8 @@ enum Role {
USER
ADMIN
}
+enum Status {
+ UNVERIFIED
+ VERIFIED
+ ENABLED
+}
\ No newline at end of file
diff --git a/src/controller/auth.controller.ts b/src/controller/auth.controller.ts
index e8f3b14..c200ac4 100644
--- a/src/controller/auth.controller.ts
+++ b/src/controller/auth.controller.ts
@@ -1,9 +1,13 @@
import express from "express";
import { Request, Response } from "express";
import prisma from "../lib/prisma.lib";
-import { Role } from "@prisma/client";
+import { Role, Status } from "@prisma/client";
import { createDefaultError, createDefaultSucces } from "../lib/standardResponse";
import argon2 from "argon2";
+import jwt from "jsonwebtoken";
+import { emailClient } from "../lib/redis.lib";
+
+const JWT_SECRET = process.env.jwtsecret || "secret";
interface registerBody {
name: string;
@@ -22,8 +26,6 @@ const ROLES: readonly string[] = [Role.ADMIN, Role.USER];
export const register = async (req: Request, res: Response) => {
const { name, password, role, organization } = req.body || {};
- console.log(name);
-
if (
!(
typeof name === "string" &&
@@ -36,7 +38,6 @@ export const register = async (req: Request, res: Response) => {
createDefaultError("Request body does not match required parameters", {
name: "string",
password: "string",
- role: "USER | ADMIN",
organization: "int",
})
);
@@ -48,12 +49,19 @@ export const register = async (req: Request, res: Response) => {
return res.status(404).json(createDefaultError(`Could not find organization with id ${organization}`, {}));
}
+ if (role ? ("USER" as Role) === Role.ADMIN : Role) {
+ if (req.auth?.role !== Role.ADMIN) {
+ return res.status(401).json(createDefaultError(`Unauthorized`, {}));
+ }
+ }
+
const user = await prisma.user.create({
data: {
email: name,
passwordSalt: "salty",
passwordHash: hash,
role: role as Role,
+ status: role === Role.ADMIN ? Status.UNVERIFIED : Status.ENABLED,
organization: { connect: { id: organization } || undefined },
},
select: {
@@ -63,5 +71,39 @@ export const register = async (req: Request, res: Response) => {
},
});
+ (await emailClient).set(name, "salty");
+
res.status(201).json(createDefaultSucces("User created succesfully", user));
};
+
+export const authenthicate = async (req: Request, res: Response) => {
+ const { name, password } = req.body || {};
+
+ if (!(typeof name === "string" && typeof password === "string")) {
+ return res.status(400).json(
+ createDefaultError("Request body does not match required parameters", {
+ name: "string",
+ password: "string",
+ })
+ );
+ }
+
+ const hash = await argon2.hash("salty" + password + "salty");
+
+ const user = await prisma.user.findUnique({ where: { email: name } });
+
+ if (!user) {
+ return res.status(403).json(createDefaultError("Username or Password wrong", {}));
+ }
+
+ if (user.passwordHash !== hash) {
+ return res.status(403).json(createDefaultError("Username or Password wrong", {}));
+ }
+
+ const userjwt: authJwt = {
+ id: user.id,
+ role: user.role,
+ };
+
+ req.headers.authorization = jwt.sign(userjwt, JWT_SECRET);
+};
diff --git a/src/controller/testcontroller.controller.ts b/src/controller/testcontroller.controller.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/src/lib/redis.lib.ts b/src/lib/redis.lib.ts
new file mode 100644
index 0000000..45901d7
--- /dev/null
+++ b/src/lib/redis.lib.ts
@@ -0,0 +1,17 @@
+import redis, { createClient } from "redis";
+import { promisify } from "util";
+
+function createAsyncClient(client: redis.RedisClientType) {
+ return {
+ get: promisify(client.get).bind(client),
+ set: promisify(client.set).bind(client),
+ };
+}
+
+/*----E-mail verify----*/
+
+const email: redis.RedisClientType = createClient({
+ url: "redis://localhost:6379",
+});
+
+export const emailClient = createAsyncClient(email);
diff --git a/src/middleware/auth.middle.ts b/src/middleware/auth.middle.ts
index 6b871b7..d3ca6b5 100644
--- a/src/middleware/auth.middle.ts
+++ b/src/middleware/auth.middle.ts
@@ -1,8 +1,11 @@
+///
+
import { NextFunction, Request, Response } from "express";
import { createDefaultError } from "../lib/standardResponse";
import jwt, { JwtPayload } from "jsonwebtoken";
import { authJwt } from "../controller/auth.controller";
import prisma from "../lib/prisma.lib";
+import { emailClient } from "../lib/redis.lib";
const verifyAuthorizationFormat = (authorization: string) => /^Bearer .+$/.test(authorization);
@@ -10,6 +13,46 @@ const getBearerToken = (authorization: string) => authorization.slice(7);
const JWT_SECRET = process.env.jwtsecret || "secret";
+export const getAuthenthication = async (req: Request, res: Response, next: NextFunction) => {
+ const { authorization } = req.headers;
+
+ if (!authorization) {
+ next();
+ return;
+ }
+
+ if (!verifyAuthorizationFormat(authorization)) {
+ return res.status(400).json(createDefaultError("Malformed Bearer Token", { format: "Bearer " }));
+ }
+
+ let payload_: string | JwtPayload;
+
+ try {
+ payload_ = jwt.verify(getBearerToken(authorization), JWT_SECRET);
+ } catch (e) {
+ return res.status(403).json(createDefaultError("The Token could not be verified, it might be expiered", null));
+ }
+
+ const payload = payload_ as authJwt;
+
+ const { id } = payload;
+
+ const user = await prisma.user.findUnique({
+ where: { id },
+ select: {
+ role: true,
+ },
+ });
+
+ req.auth = {
+ isAuthenthicated: true,
+ id,
+ role: user?.role || "user",
+ };
+
+ next();
+};
+
export const requireAuthentication = async (req: Request, res: Response, next: NextFunction) => {
const { authorization } = req.headers;
@@ -43,7 +86,7 @@ export const requireAuthentication = async (req: Request, res: Response, next: N
req.auth = {
isAuthenthicated: true,
id,
- role: user?.role || "user",
+ role: user?.role || "USER",
};
next();
diff --git a/src/middleware/testmiddleware.middle.ts b/src/middleware/testmiddleware.middle.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/src/routes/auth.route.ts b/src/routes/auth.route.ts
index 2aed2db..efa7ad2 100644
--- a/src/routes/auth.route.ts
+++ b/src/routes/auth.route.ts
@@ -1,8 +1,9 @@
import { Router } from "express";
import { register } from "../controller/auth.controller";
+import { getAuthenthication } from "../middleware/auth.middle";
const router = Router();
-router.post("/register", register);
+router.post("/register", getAuthenthication, register);
export default router;
diff --git a/src/routes/testrouter.route.ts b/src/routes/testrouter.route.ts
deleted file mode 100644
index e69de29..0000000