Skip to content

Commit c4c8ecc

Browse files
committed
auth: checkpoint
1 parent 99e2ba0 commit c4c8ecc

9 files changed

Lines changed: 287 additions & 27 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ tsconfig.lsif.json
99
*.lsif
1010
*.db
1111
.vscode/
12-
.env
12+
.env
13+
.pnpm-debug.log

server/package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66
"dev": "ts-node ./src/index.ts"
77
},
88
"dependencies": {
9-
"@prisma/client": "^3.12.0",
10-
"express": "^4.17.3"
9+
"@prisma/client": "^3.14.0",
10+
"dotenv": "^16.0.1",
11+
"express": "^4.17.3",
12+
"jsonwebtoken": "^8.5.1"
1113
},
1214
"devDependencies": {
1315
"@types/express": "^4.17.13",
16+
"@types/jsonwebtoken": "^8.5.8",
1417
"@types/node": "^17.0.23",
1518
"esbuild": "^0.14.34",
16-
"prisma": "^3.12.0",
19+
"prisma": "^3.14.0",
1720
"ts-node": "^10.7.0",
1821
"typescript": "^4.6.3"
1922
}

server/pnpm-lock.yaml

Lines changed: 106 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/prisma/schema.prisma

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ datasource db {
1414

1515
model User {
1616
id Int @id @default(autoincrement())
17-
username String
1817
password String
19-
email String
18+
email String @unique
2019
devices Device[]
2120
changes Change[]
2221
createdAt DateTime @default(now())

server/src/db.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,22 @@ import { PrismaClient } from "@prisma/client";
22

33
const db = new PrismaClient();
44

5+
/**
6+
* Exclude keys from user
7+
*
8+
* ts```
9+
* const user = await prisma.user.findUnique({ where: 1 })
10+
* const userWithoutPassword = exclude(user, 'password')
11+
* ```
12+
*/
13+
export function exclude<User, Key extends keyof User>(
14+
user: User,
15+
...keys: Key[]
16+
): Omit<User, Key> {
17+
for (let key of keys) {
18+
delete user[key]
19+
}
20+
return user
21+
}
22+
523
export default db;

server/src/helpers/jwt.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import jwt, { JwtPayload } from 'jsonwebtoken'
2+
import { Token } from '../types'
3+
4+
export const issueAccessToken = (payload: {[key: string]: string | number}) => issueToken(payload, process.env.JWT_ACCESS_TOKEN as string, 10 * 60 * 1000) // 10 mins
5+
export const issueRefreshToken = (payload: {[key: string]: string | number}) => issueToken(payload, process.env.JWT_ACCESS_TOKEN as string, 14 * 24 * 60 * 60 * 1000) // 14 days
6+
export const verifyAccessToken = (token: string) => verifyToken(token, process.env.JWT_ACCESS_TOKEN as string)
7+
export const verifyRefreshToken = (token: string) => verifyToken(token, process.env.JWT_ACCESS_TOKEN as string)
8+
9+
export async function issueToken(payload: {[key: string]: string | number}, secret: string, expiresIn: number): Promise<Token> {
10+
try {
11+
const token = await jwt.sign(payload, secret, { expiresIn });
12+
const expirationDateValue = (addSeconds(new Date(), expiresIn/1000)).valueOf();
13+
14+
const fullToken = { token, expiresIn, expirationDateValue };
15+
return Promise.resolve(fullToken);
16+
}
17+
catch(error) {
18+
return Promise.reject(error);
19+
}
20+
}
21+
22+
export async function verifyToken(token: string, secret: string): Promise<JwtPayload | string> {
23+
try {
24+
const parsedToken = await jwt.verify(token, secret, {});
25+
return Promise.resolve(parsedToken);
26+
}
27+
catch(error) {
28+
return Promise.reject(error);
29+
}
30+
}
31+
32+
export function addSeconds(date: Date, seconds=0) {
33+
const newDate = new Date(date.valueOf());
34+
newDate.setSeconds(newDate.getSeconds() + seconds);
35+
return newDate;
36+
}
37+
38+
export function addDays(date: Date, days=0) {
39+
const newDate = new Date(date.valueOf());
40+
newDate.setDate(newDate.getDate() + days);
41+
return newDate;
42+
}

server/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import dotenv from "dotenv"
2+
dotenv.config()
3+
14
import express from "express";
25

36
const PORT = process.env.PORT || 3001;

0 commit comments

Comments
 (0)