/
index.ts
143 lines (124 loc) · 3.17 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/** @module Route.Workspace */
import { Request, Response } from 'express'
import { IDataBaseEntry } from '@/database/index.d'
import { session } from '../session'
import { checkWorkspaceAuth } from '../auth'
import { error } from '../error'
import WorkspaceLib from '@/lib/workspace'
export interface IAddBody {
name: string
}
export interface IUpdateBody {
workspace: {
id: string
}
data: IDataBaseEntry[]
}
export interface IDeleteBody {
id: string
}
/**
* Check add body
* @param body Body
*/
const checkAddBody = (body: IAddBody): void => {
if (!body?.name || typeof body.name !== 'string')
throw error(400, 'Missing data in your request (body: { name(string) })')
}
/**
* Check update body
* @param body Body
*/
const checkUpdateBody = (body: IUpdateBody): void => {
if (
!body?.workspace?.id ||
typeof body.workspace.id !== 'string' ||
!body.data ||
!Array.isArray(body.data)
)
throw error(
400,
'Missing data in your request (body: { workspace: { id(uuid) }, data(array) })'
)
}
/**
* Check delete body
* @param body Body
*/
const checkDeleteBody = (body: IDeleteBody): void => {
if (!body?.id || typeof body.id !== 'string')
throw error(400, 'Missing data in your request (body: { id(uuid) })')
}
/**
* Workspace API
* @param req Request
* @param res Response
*/
const route = async (req: Request, res: Response): Promise<void> => {
try {
// Check session
const sessionId = await session(req)
switch (req.method) {
case 'GET': {
// Get
try {
const workspaces = await WorkspaceLib.getByUser({ id: sessionId })
res.status(200).json({ workspaces })
} catch (err: any) {
throw error(500, err.message)
}
break
}
case 'POST': {
// Check
checkAddBody(req.body)
// Add
try {
const newWorkspace = await WorkspaceLib.add(
{ id: sessionId },
req.body
)
res.status(200).json(newWorkspace)
} catch (err: any) {
throw error(500, err.message)
}
break
}
case 'PUT': {
// Check
checkUpdateBody(req.body)
const { workspace, data } = req.body
// Check authorization
await checkWorkspaceAuth({ id: sessionId }, { id: workspace.id })
// Update
try {
await WorkspaceLib.update(workspace, data)
res.status(200).end()
} catch (err: any) {
throw error(500, err.message)
}
break
}
case 'DELETE': {
// Check
checkDeleteBody(req.body)
// Check authorization
await checkWorkspaceAuth({ id: sessionId }, req.body)
// Delete
try {
await WorkspaceLib.del({ id: sessionId }, req.body)
res.status(200).end()
} catch (err: any) {
throw error(500, err.message)
}
break
}
default:
// Unauthorized method
throw error(402, 'Method ' + req.method + ' not allowed')
}
} catch (err: any) {
res.status(err.status).json({ error: true, message: err.message })
}
}
export default route