Skip to content

Commit bea340d

Browse files
get, create, update, delete for qr codes (#226)
* get * create * update * update * delete * readme * dishid * dishID * rename * fix: addressed comments * fix readme * fix: reformat code --------- Co-authored-by: armaankatyal <armaankatyal3@gmail.com>
1 parent 43bae36 commit bea340d

File tree

12 files changed

+406
-9
lines changed

12 files changed

+406
-9
lines changed

backend/README.md

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ The dish routes are defined in the `src/routes/dish.ts` file. The routes are mou
124124
}
125125
```
126126
127-
- #### POST `/api/dish/condition?qid=`
127+
- #### POST `/api/dish/condition?id=`
128128
This route will update the condition for the dish.
129129
130130
headers:
@@ -135,8 +135,7 @@ The dish routes are defined in the `src/routes/dish.ts` file. The routes are mou
135135
136136
query:
137137
```
138-
qid: qr_code of the dish to be returned
139-
id: id of the dish to be returned (required if qid is not provided)
138+
id: id of the dish
140139
```
141140
142141
body:
@@ -202,3 +201,66 @@ the user routes are defined in the `src/routes/user.ts` file. The routes are mou
202201
}
203202
```
204203
notes: when type is set to role, role property is required and only admin can update the role.
204+
205+
### QR Codes
206+
the qr code routes are defined in the `src/routes/qrCode.ts` file. The routes are mounted on the `/qrcode` path. The routes are:
207+
208+
- #### GET `/api/qrcode?qid=`
209+
This route returns all the qr codes in the database only if the user is admin.
210+
211+
headers:
212+
```
213+
x-api-key: preset constant api key
214+
session-token: generated sessionCookie from firebase after login
215+
```
216+
query:
217+
```
218+
qid: return the qr code with this qid
219+
```
220+
221+
- #### POST `/api/qrcode/create`
222+
Create a qr code with the given request body only if user is admin
223+
224+
headers:
225+
```
226+
x-api-key: preset constant api key
227+
session-token: generated sessionCookie from firebase after login
228+
```
229+
230+
body:
231+
```
232+
qrCode: {
233+
qid: number, * required
234+
dishId: string, * required
235+
}
236+
```
237+
238+
- #### POST `/api/qrcode/update`
239+
Update an existing qr code with the given request body only if user is admin
240+
241+
headers:
242+
```
243+
x-api-key: preset constant api key
244+
session-token: generated sessionCookie from firebase after login
245+
```
246+
247+
body:
248+
```
249+
qrCode: {
250+
qid: number, * required
251+
dishId: string, * required
252+
}
253+
```
254+
255+
- #### DELETE `/api/qrcode?qid=`
256+
This route deletes the qr code with the given qid only if the user is admin.
257+
258+
headers:
259+
```
260+
x-api-key: preset constant api key
261+
session-token: generated sessionCookie from firebase after login
262+
```
263+
query:
264+
```
265+
qid: delete the qr code with this qid
266+
```

backend/src/app.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { transactionsRouter } from './routes/transactions'
77
import { userRouter } from './routes/users'
88
import { authRouter } from './routes/auth'
99
import cookieParser from 'cookie-parser'
10+
import { qrCodeRouter } from './routes/qrCode'
1011

1112
const app = express()
1213
dotenv.config()
@@ -40,5 +41,6 @@ app.use('/api/auth', authRouter)
4041
app.use('/api/dish', dishRouter)
4142
app.use('/api/transactions', transactionsRouter)
4243
app.use('/api/users', userRouter)
44+
app.use('/api/qrcode', qrCodeRouter)
4345

4446
export { app }

backend/src/controllers/dish.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
import { CustomRequest } from '../middlewares/auth'
1717
import Logger from '../utils/logger'
1818
import { verifyIfUserAdmin } from '../services/users'
19-
import { getTransaction, registerTransaction, getTransactionByDishId } from '../services/transactions'
19+
import { getTransaction, registerTransaction, getTransactionBydishId } from '../services/transactions'
2020
import { getQrCode } from '../services/qrCode'
2121
import { db } from '../services/firebase'
2222
import nodeConfig from 'config'
@@ -335,7 +335,7 @@ export const returnDish = async (req: Request, res: Response) => {
335335
return res.status(400).json({ error: 'operation_not_allowed', message: 'Dish not borrowed' })
336336
}
337337

338-
ongoingTransaction = await getTransactionByDishId(userClaims, id!)
338+
ongoingTransaction = await getTransactionBydishId(userClaims, id!)
339339
if (!ongoingTransaction) {
340340
Logger.error({
341341
module: 'dish.controller',

backend/src/controllers/qrCode.ts

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
import { Request, Response } from 'express'
2+
import { verifyIfUserAdmin } from '../services/users'
3+
import Logger from '../utils/logger'
4+
import { CustomRequest } from '../middlewares/auth'
5+
import { createQrCodeInDatabase, deleteQrCodeFromDatabase, getAllQrCodes, getQrCode } from '../services/qrCode'
6+
7+
export const getQrCodes = async (req: Request, res: Response) => {
8+
let userClaims = (req as CustomRequest).firebase
9+
let qid = req.query['qid']?.toString()
10+
11+
if (!qid) {
12+
// check if user is admin
13+
// if yes, return all qr codes
14+
15+
if (!verifyIfUserAdmin(userClaims)) {
16+
Logger.error({
17+
module: 'qrCode.controller',
18+
message: 'User is not admin',
19+
statusCode: 403,
20+
})
21+
return res.status(403).json({ error: 'forbidden' })
22+
}
23+
24+
let codes = await getAllQrCodes()
25+
26+
Logger.info({
27+
module: 'qrCode.controller',
28+
function: 'getQrCodes',
29+
message: 'retrieved all qr codes',
30+
status: 200,
31+
})
32+
33+
return res.status(200).json({ qrCodes: codes })
34+
}
35+
36+
// return qr code by qid
37+
try {
38+
let qrCode = await getQrCode(qid.toString())
39+
if (!qrCode) {
40+
Logger.error({
41+
message: 'qr code does not exist',
42+
statusCode: 404,
43+
module: 'qrCode.controller',
44+
function: 'getQRCodes',
45+
})
46+
return res.status(400).json({ error: 'qr_code_not_found' })
47+
}
48+
Logger.info({
49+
message: 'retrieved qrCode',
50+
module: 'qrCode.controller',
51+
function: 'getQRCodes',
52+
})
53+
return res.status(200).json({ qrCode: qrCode })
54+
} catch (error: any) {
55+
Logger.error({
56+
message: 'Error when retrieving qr code',
57+
error,
58+
statusCode: 500,
59+
module: 'qrCode.controller',
60+
function: 'getQRCodes',
61+
})
62+
return res.status(500).json({ error: 'internal_server_error', message: error.message })
63+
}
64+
}
65+
66+
export const createQrCode = async (req: Request, res: Response) => {
67+
let userClaims = (req as CustomRequest).firebase
68+
if (!verifyIfUserAdmin(userClaims)) {
69+
Logger.error({
70+
module: 'qrCode.controller',
71+
message: 'User is not admin',
72+
statusCode: 403,
73+
})
74+
return res.status(403).json({ error: 'forbidden' })
75+
}
76+
77+
try {
78+
let qrCode = await createQrCodeInDatabase(req.body.qrCode, false)
79+
return res.status(201).json({ qrCode })
80+
} catch (error: any) {
81+
Logger.error({
82+
module: 'qrCode.controller',
83+
error,
84+
message: 'Error when creating qr code in database',
85+
statusCode: 500,
86+
})
87+
return res.status(500).json({ error: 'internal_server_error', message: error.message })
88+
}
89+
}
90+
91+
export const updateQrCode = async (req: Request, res: Response) => {
92+
let userClaims = (req as CustomRequest).firebase
93+
if (!verifyIfUserAdmin(userClaims)) {
94+
Logger.error({
95+
module: 'qrCode.controller',
96+
message: 'User is not admin',
97+
statusCode: 403,
98+
})
99+
return res.status(403).json({ error: 'forbidden' })
100+
}
101+
102+
// check if qrcode exists
103+
let existingQrCode = await getQrCode(req.body.qrCode.qid.toString())
104+
if (!existingQrCode) {
105+
Logger.error({
106+
module: 'qrCode.services',
107+
message: 'qrCode does not exist',
108+
status: 500,
109+
})
110+
return res.status(500).json({ error: 'internal_server_error', message: 'qr code does not exist' })
111+
}
112+
113+
try {
114+
let qrCode = await createQrCodeInDatabase(req.body.qrCode, true)
115+
return res.status(200).json({ qrCode })
116+
} catch (error: any) {
117+
Logger.error({
118+
module: 'qrCode.controller',
119+
error,
120+
message: 'Error when creating qr code in database',
121+
statusCode: 500,
122+
})
123+
return res.status(500).json({ error: 'internal_server_error', message: error.message })
124+
}
125+
}
126+
127+
export const deleteQrCode = async (req: Request, res: Response) => {
128+
let userClaims = (req as CustomRequest).firebase
129+
if (!verifyIfUserAdmin(userClaims)) {
130+
Logger.error({
131+
module: 'qrCode.controller',
132+
message: 'User is not admin',
133+
statusCode: 403,
134+
})
135+
return res.status(403).json({ error: 'forbidden' })
136+
}
137+
138+
let qid = req.query['qid']?.toString()
139+
if (!qid) {
140+
Logger.error({
141+
module: 'qrCOde.controller',
142+
message: 'No qid provided',
143+
statusCode: 400,
144+
})
145+
return res.status(400).json({ error: 'bad_request' })
146+
}
147+
148+
try {
149+
await deleteQrCodeFromDatabase(qid)
150+
return res.status(200).json({ message: 'deleted qr code' })
151+
} catch (error: any) {
152+
Logger.error({
153+
module: 'qrCode.controller',
154+
error,
155+
message: 'Error when creating qr code in database',
156+
statusCode: 500,
157+
})
158+
return res.status(500).json({ error: 'internal_server_error', message: error.message })
159+
}
160+
}

backend/src/models/qrCode.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export type QrCode = {
2+
qid: number
3+
dishId: string
4+
}

backend/src/routes/qrCode.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import express from 'express'
2+
import { verifyApiKey, verifyFirebaseToken } from '../middlewares/auth'
3+
import { createQrCode, deleteQrCode, getQrCodes, updateQrCode } from '../controllers/qrCode'
4+
5+
const router = express.Router()
6+
7+
router.get('/', verifyApiKey, verifyFirebaseToken, getQrCodes)
8+
router.post('/create', verifyApiKey, verifyFirebaseToken, createQrCode)
9+
router.post('/update', verifyApiKey, verifyFirebaseToken, updateQrCode)
10+
router.post('/delete', verifyApiKey, verifyFirebaseToken, deleteQrCode)
11+
12+
export { router as qrCodeRouter }

0 commit comments

Comments
 (0)