Skip to content

Commit 3b00000

Browse files
committed
add new endpoints
1 parent 08616b7 commit 3b00000

File tree

9 files changed

+174
-63
lines changed

9 files changed

+174
-63
lines changed

backend/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.now

backend/database/mock.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ module.exports = {
6969
device: 'Chrome 85.0, macOS 10.14',
7070
page: 'https://feedbacker.com/pricing',
7171
createdAt: new Date('2020-05-23').getTime()
72+
},
73+
{
74+
text: 'Tava bom, agora parece que piorou',
75+
fingerprint: '490135491',
76+
id: 'eab759f8-f238-4ff9-ae91-ee1558982329',
77+
apiKey: 'fcd5015c-10d3-4e9c-b395-ec7ed8850165',
78+
type: 'ISSUE',
79+
device: 'Chrome 85.0, macOS 10.14',
80+
page: 'https://feedbacker.com/pricing',
81+
createdAt: new Date('2020-05-23').getTime()
7282
}
7383
]
7484
}

backend/handlers/feedbacks.js

Lines changed: 62 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,32 @@ function CreateFeedbackHandler (db) {
6565
}
6666

6767
async function getFeedbacks (ctx) {
68-
let {
69-
type,
70-
limit = 5,
71-
offset = 0
72-
} = ctx.query
73-
let feedbacks = await db.readAll('feedbacks')
68+
const { type } = ctx.query
69+
let offset = ctx.query.offset ? Number(ctx.query.offset) : 0
70+
let limit = ctx.query.limit ? Number(ctx.query.limit) : 5
71+
72+
let [
73+
user,
74+
feedbacks
75+
] = await Promise.all([
76+
db.readOneById('users', ctx.state.user.id),
77+
db.readAll('feedbacks')
78+
])
79+
80+
if (!user) {
81+
ctx.status = 401
82+
ctx.body = { error: 'Unauthorized' }
83+
return
84+
}
7485

7586
feedbacks = feedbacks.filter((feedback) => {
76-
return feedback.apiKey === ctx.state.user.apiKey
87+
return feedback.apiKey === user.apiKey
7788
})
89+
const total = feedbacks.length
7890

7991
if (type) {
8092
feedbacks = feedbacks.filter((feedback) => {
81-
return feedback.type === type
93+
return feedback.type === String(type).toUpperCase()
8294
})
8395
}
8496

@@ -89,40 +101,61 @@ function CreateFeedbackHandler (db) {
89101
offset = limit
90102
}
91103

92-
feedbacks = feedbacks.slice(offset, limit)
104+
feedbacks = feedbacks.slice(offset, feedbacks.length).slice(0, limit)
93105

94106
ctx.status = 200
95-
ctx.body = feedbacks || []
107+
ctx.body = {
108+
results: feedbacks || [],
109+
pagination: { offset, limit, total }
110+
}
96111
}
97112

98-
async function getFeedbacksByFingerprint (ctx) {
99-
const { fingerprint } = ctx.request.query
100-
const feedbacks = await db.readAll('feedbacks')
101-
const feedbacksFiltered = feedbacks.map((feedback) => {
102-
return feedback.fingerprint === fingerprint
113+
async function getSummary (ctx) {
114+
let [
115+
user,
116+
feedbacks
117+
] = await Promise.all([
118+
db.readOneById('users', ctx.state.user.id),
119+
db.readAll('feedbacks')
120+
])
121+
122+
if (!user) {
123+
ctx.status = 401
124+
ctx.body = { error: 'Unauthorized. User not found with this token' }
125+
return
126+
}
127+
128+
feedbacks = feedbacks.filter((feedback) => {
129+
return feedback.apiKey === user.apiKey
103130
})
104131

105-
ctx.status = 200
106-
ctx.body = feedbacksFiltered || []
107-
}
132+
let all = 0
133+
let issue = 0
134+
let idea = 0
135+
let other = 0
136+
137+
feedbacks.forEach((feedback) => {
138+
all++
139+
140+
if (feedback.type === 'ISSUE') {
141+
issue++
142+
}
143+
if (feedback.type === 'IDEA') {
144+
idea++
145+
}
146+
if (feedback.type === 'OTHER') {
147+
other++
148+
}
149+
})
108150

109-
async function getFeedbackById (ctx) {
110-
const { id } = ctx.params
111-
const feedback = await db.readOneById('feedback', id)
112-
if (!feedback) {
113-
ctx.status = 404
114-
ctx.body = { error: 'Feedback not found' }
115-
return
116-
}
117151
ctx.status = 200
118-
ctx.body = feedback
152+
ctx.body = { all, issue, idea, other }
119153
}
120154

121155
return {
122156
create,
123157
getFeedbacks,
124-
getFeedbacksByFingerprint,
125-
getFeedbackById
158+
getSummary
126159
}
127160
}
128161

backend/handlers/users.js

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -70,25 +70,8 @@ function CreateUserHandler (db) {
7070
ctx.body = { error: 'User not created' }
7171
}
7272

73-
async function getOneById (ctx) {
74-
const { id } = ctx.params
75-
const user = await db.readOneById('users', id)
76-
if (!user) {
77-
ctx.status = 404
78-
ctx.body = { error: 'User not found' }
79-
return
80-
}
81-
82-
ctx.status = 200
83-
ctx.body = {
84-
...user,
85-
password: '*****'
86-
}
87-
}
88-
8973
return {
9074
create,
91-
getOneById,
9275
generateApiKey,
9376
getLoggerUser
9477
}

backend/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ router.get('/users/me', authMiddleware, usersHandler.getLoggerUser)
3434
router.post('/users/me/apikey', authMiddleware, usersHandler.generateApiKey)
3535
router.get('/feedbacks', authMiddleware, feedbacksHandler.getFeedbacks)
3636
router.post('/feedbacks', authMiddleware, feedbacksHandler.create)
37-
router.get('/feedbacks/:id', authMiddleware, feedbacksHandler.getFeedbackById)
37+
router.get('/feedbacks/summary', authMiddleware, feedbacksHandler.getSummary)
3838
app.use(router.routes())
3939
app.use(router.allowedMethods())
4040
app.listen(PORT, () => {
4141
console.log(`Server running http://localhost:${PORT}`)
4242
})
43+
44+
module.exports = app

backend/package-lock.json

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

backend/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "backend",
33
"version": "1.0.0",
4-
"description": "",
4+
"description": "Backend pré-pronto do curso treinamento de Vue.js 3",
55
"main": "index.js",
66
"scripts": {
77
"start": "JWT_SECRET=sssshhhh node index.js",
@@ -14,6 +14,7 @@
1414
"license": "ISC",
1515
"dependencies": {
1616
"@koa/cors": "^3.1.0",
17+
"@vercel/node": "^1.8.5",
1718
"jsonwebtoken": "^8.5.1",
1819
"koa": "^2.13.0",
1920
"koa-bodyparser": "^4.3.0",

backend/vercel.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"version": 2,
3+
"builds": [
4+
{
5+
"src": "index.js",
6+
"use": "@vercel/node"
7+
}
8+
],
9+
"routes": [
10+
{
11+
"src": "/(.*)",
12+
"dest": "/"
13+
}
14+
]
15+
}

0 commit comments

Comments
 (0)