Skip to content

Commit d1c70aa

Browse files
committed
dia 5 - a milha extra
1 parent be5bd35 commit d1c70aa

26 files changed

+386
-64
lines changed

mobile/src/pages/Detail/index.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ interface Data {
2828
whatsapp: string;
2929
city: string;
3030
uf: string;
31+
image_url: string;
3132
};
3233
items: { title: string }[];
3334
}
@@ -73,7 +74,7 @@ const Detail = () => {
7374
<Image
7475
style={styles.pointImage}
7576
source={{
76-
uri: data.point.image,
77+
uri: data.point.image_url,
7778
}}
7879
/>
7980

mobile/src/pages/Points/index.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ interface Point {
2929
image: string;
3030
latitude: number;
3131
longitude: number;
32+
image_url: string;
3233
}
3334

3435
interface Params {
@@ -144,7 +145,7 @@ const Points = () => {
144145
<Image
145146
style={styles.mapMarkerImage}
146147
source={{
147-
uri: point.image,
148+
uri: point.image_url,
148149
}}
149150
/>
150151
<Text style={styles.mapMarkerTitle}>{point.name}</Text>

server/package.json

+4
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@
1212
"author": "",
1313
"license": "MIT",
1414
"dependencies": {
15+
"@types/hapi__joi": "^17.1.2",
16+
"celebrate": "^12.1.1",
1517
"cors": "^2.8.5",
1618
"express": "^4.17.1",
1719
"knex": "^0.21.1",
20+
"multer": "^1.4.2",
1821
"sqlite3": "^4.2.0"
1922
},
2023
"devDependencies": {
2124
"@types/cors": "^2.8.6",
2225
"@types/express": "^4.17.6",
26+
"@types/multer": "^1.4.3",
2327
"ts-node": "^8.10.2",
2428
"ts-node-dev": "^1.0.0-pre.44",
2529
"typescript": "^3.9.3"

server/src/config/multer.ts

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import multer from "multer";
2+
import path from "path";
3+
import crypto from "crypto";
4+
5+
export default {
6+
storage: multer.diskStorage({
7+
destination: path.resolve(__dirname, "..", "..", "uploads"),
8+
filename(request, file, callback) {
9+
const hash = crypto.randomBytes(6).toString("hex");
10+
const filename = `${hash}-${file.originalname}`;
11+
callback(null, filename);
12+
},
13+
}),
14+
};

server/src/controllers/PointsController.ts

+44-28
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,52 @@
1-
import { Request, Response } from 'express';
2-
import knex from '../database/connection';
1+
import { Request, Response } from "express";
2+
import knex from "../database/connection";
33

44
class PointsController {
55
async index(request: Request, response: Response) {
66
const { city, uf, items } = request.query;
77

88
const parsedItems = String(items)
9-
.split(',')
9+
.split(",")
1010
.map((item) => Number(item.trim()));
1111

12-
const points = await knex('points')
13-
.join('point_items', 'points.id', '=', 'point_items.point_id')
14-
.whereIn('point_items.item_id', parsedItems)
15-
.where('city', String(city))
16-
.where('uf', String(uf))
12+
const points = await knex("points")
13+
.join("point_items", "points.id", "=", "point_items.point_id")
14+
.whereIn("point_items.item_id", parsedItems)
15+
.where("city", String(city))
16+
.where("uf", String(uf))
1717
.distinct()
18-
.select('points.*');
18+
.select("points.*");
1919

20-
return response.json(points);
20+
const serializedPoints = points.map((item) => {
21+
return {
22+
...points,
23+
image_url: `http://192.168.0.13:3333/uploads/${item.image}`,
24+
};
25+
});
26+
27+
return response.json(serializedPoints);
2128
}
2229

2330
async show(request: Request, response: Response) {
2431
const { id } = request.params;
2532

26-
const point = await knex('points').where('id', id).first();
33+
const point = await knex("points").where("id", id).first();
2734

2835
if (!point) {
29-
return response.status(400).json({ message: 'Point not found.' });
36+
return response.status(400).json({ message: "Point not found." });
3037
}
3138

32-
const items = await knex('items')
33-
.join('point_items', 'items.id', '=', 'point_items.item_id')
34-
.where('point_items.point_id', id)
35-
.select('items.title');
39+
const items = await knex("items")
40+
.join("point_items", "items.id", "=", "point_items.item_id")
41+
.where("point_items.point_id", id)
42+
.select("items.title");
43+
44+
const serializedPoint = {
45+
...point,
46+
image_url: `http://192.168.0.13:3333/uploads/${point.image}`,
47+
};
3648

37-
return response.json({ point, items });
49+
return response.json({ point: serializedPoint, items });
3850
}
3951

4052
async create(request: Request, response: Response) {
@@ -49,11 +61,12 @@ class PointsController {
4961
items,
5062
} = request.body;
5163

64+
console.log(request.body);
65+
5266
const trx = await knex.transaction();
5367

5468
const point = {
55-
image:
56-
'https://images.unsplash.com/photo-1542838132-92c53300491e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=400&q=60',
69+
image: request.file.filename,
5770
name,
5871
email,
5972
whatsapp,
@@ -63,18 +76,21 @@ class PointsController {
6376
uf,
6477
};
6578

66-
const insertedIds = await trx('points').insert(point);
79+
const insertedIds = await trx("points").insert(point);
6780

6881
const point_id = insertedIds[0];
6982

70-
const pointItems = items.map((item_id: number) => {
71-
return {
72-
item_id,
73-
point_id,
74-
};
75-
});
76-
77-
await trx('point_items').insert(pointItems);
83+
const pointItems = items
84+
.split(",")
85+
.map((item: string) => Number(item.trim()))
86+
.map((item_id: number) => {
87+
return {
88+
item_id,
89+
point_id,
90+
};
91+
});
92+
93+
await trx("point_items").insert(pointItems);
7894

7995
await trx.commit();
8096

server/src/database/database.sqlite

0 Bytes
Binary file not shown.

server/src/routes.ts

+34-9
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,43 @@
1-
import express from 'express'
2-
3-
import PointsController from './controllers/PointsController';
4-
import ItemsController from './controllers/ItemsController';
1+
import express from "express";
2+
import { celebrate, Joi } from "celebrate";
3+
import multer from "multer";
4+
import multerConfig from "./config/multer";
5+
import PointsController from "./controllers/PointsController";
6+
import ItemsController from "./controllers/ItemsController";
57

68
const routes = express();
9+
const upload = multer(multerConfig);
710

811
const pointsController = new PointsController();
9-
const itemsController = new ItemsController()
12+
const itemsController = new ItemsController();
1013

11-
routes.get('/items', itemsController.index)
14+
/** Items */
15+
routes.get("/items", itemsController.index);
1216

17+
/** Points */
18+
routes.get("/points", pointsController.index);
19+
routes.get("/points/:id", pointsController.show);
1320

14-
routes.post('/points', pointsController.create);
15-
routes.get('/points', pointsController.index)
16-
routes.get('/points/:id', pointsController.show);
21+
/** Create Point */
22+
routes.post(
23+
"/points",
24+
upload.single("image"),
25+
celebrate(
26+
{
27+
body: Joi.object().keys({
28+
name: Joi.string().required(),
29+
email: Joi.string().required().email(),
30+
whatsapp: Joi.number().required(),
31+
latitude: Joi.number().required(),
32+
longitude: Joi.number().required(),
33+
city: Joi.string().required(),
34+
uf: Joi.string().required().max(2),
35+
items: Joi.string().required(),
36+
}),
37+
},
38+
{ abortEarly: false }
39+
),
40+
pointsController.create
41+
);
1742

1843
export default routes;

server/src/server.ts

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
import express from 'express';
2-
import routes from './routes';
3-
import path from 'path'
4-
import cors from 'cors';
1+
import express from "express";
2+
import routes from "./routes";
3+
import path from "path";
4+
import cors from "cors";
5+
import { errors } from "celebrate";
56

6-
const app = express()
7+
const app = express();
78

89
app.use(cors());
9-
app.use(express.json())
10+
app.use(express.json());
1011
app.use(routes);
1112

12-
app.use('/uploads', express.static(path.resolve(__dirname, '..', 'uploads')))
13+
app.use("/uploads", express.static(path.resolve(__dirname, "..", "uploads")));
1314

14-
app.listen(3333)
15+
app.use(errors());
16+
17+
app.listen(3333);
40.9 KB
Loading
40.9 KB
Loading
40.9 KB
Loading
40.9 KB
Loading
40.9 KB
Loading
40.9 KB
Loading
40.9 KB
Loading
40.9 KB
Loading
40.9 KB
Loading
40.9 KB
Loading
40.9 KB
Loading
40.9 KB
Loading

0 commit comments

Comments
 (0)