Skip to content

Commit 0c5e195

Browse files
committed
dia 2 - olhando as oportunidades
1 parent 767246c commit 0c5e195

21 files changed

+1592
-27
lines changed

server/.editorconfig

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
root = true
2+
3+
[*]
4+
end_of_line = lf
5+
indent_style = space
6+
indent_size = 2
7+
charset = utf-8
8+
trim_trailing_whitespace = true
9+
insert_final_newline = true

server/knexfile.ts

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const path = require('path');
2+
3+
module.exports = {
4+
client: 'sqlite3',
5+
connection: {
6+
filename: path.resolve(__dirname, 'src', 'database', 'database.sqlite')
7+
},
8+
migrations: {
9+
directory: path.resolve(__dirname, 'src', 'database', 'migrations')
10+
},
11+
seeds: {
12+
directory: path.resolve(__dirname, 'src', 'database', 'seeds')
13+
},
14+
useNullAsDefault: true,
15+
};

server/package.json

+8-2
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,21 @@
44
"description": "Next Level Week - Ecoleta - Thiago Marinho at @Rocketseat",
55
"main": "index.js",
66
"scripts": {
7-
"dev": "ts-node-dev src/server.ts"
7+
"dev": "ts-node-dev --transpileOnly --ignore-watch node_modules src/server.ts",
8+
"knex:migrate": "knex --knexfile knexfile.ts migrate:latest",
9+
"knex:seed": "knex --knexfile knexfile.ts seed:run"
810
},
911
"keywords": [],
1012
"author": "",
1113
"license": "MIT",
1214
"dependencies": {
13-
"express": "^4.17.1"
15+
"cors": "^2.8.5",
16+
"express": "^4.17.1",
17+
"knex": "^0.21.1",
18+
"sqlite3": "^4.2.0"
1419
},
1520
"devDependencies": {
21+
"@types/cors": "^2.8.6",
1622
"@types/express": "^4.17.6",
1723
"ts-node": "^8.10.2",
1824
"ts-node-dev": "^1.0.0-pre.44",
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Request, Response } from 'express';
2+
import knex from '../database/connection';
3+
4+
class ItemsController {
5+
6+
async index(request:Request, response: Response){
7+
const items = await knex('items').select('*')
8+
9+
const serializedItems = items.map(item => {
10+
return {
11+
id: item.id,
12+
title: item.title,
13+
image_url: `http://localhost:3333/uploads/${item.image}`,
14+
}
15+
})
16+
17+
return response.json(serializedItems)
18+
}
19+
20+
}
21+
22+
export default ItemsController;
+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import { Request, Response } from 'express';
2+
import knex from '../database/connection';
3+
4+
class PointsController {
5+
async index(request: Request, response: Response) {
6+
const { city, uf, items } = request.query;
7+
8+
const parsedItems = String(items)
9+
.split(',')
10+
.map((item) => Number(item.trim()));
11+
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))
17+
.distinct()
18+
.select('points.*');
19+
20+
return response.json(points);
21+
}
22+
23+
async show(request: Request, response: Response) {
24+
const { id } = request.params;
25+
26+
const point = await knex('points').where('id', id).first();
27+
28+
if (!point) {
29+
return response.status(400).json({ message: 'Point not found.' });
30+
}
31+
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');
36+
37+
return response.json({ point, items });
38+
}
39+
40+
async create(request: Request, response: Response) {
41+
const {
42+
name,
43+
email,
44+
whatsapp,
45+
latitude,
46+
longitude,
47+
city,
48+
uf,
49+
items,
50+
} = request.body;
51+
52+
const trx = await knex.transaction();
53+
54+
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',
57+
name,
58+
email,
59+
whatsapp,
60+
latitude,
61+
longitude,
62+
city,
63+
uf,
64+
};
65+
66+
const insertedIds = await trx('points').insert(point);
67+
68+
const point_id = insertedIds[0];
69+
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);
78+
79+
await trx.commit();
80+
81+
return response.json({
82+
id: point_id,
83+
...point,
84+
});
85+
}
86+
}
87+
88+
export default PointsController;

server/src/database/connection.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import knex from 'knex';
2+
import path from 'path';
3+
4+
const connection = knex({
5+
client: 'sqlite3',
6+
connection: {
7+
filename: path.resolve(__dirname, 'database.sqlite')
8+
},
9+
useNullAsDefault: true
10+
});
11+
12+
export default connection

server/src/database/database.sqlite

28 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import Knex from 'knex';
2+
3+
export async function up(knex: Knex) {
4+
return knex.schema.createTable('points', table => {
5+
table.increments('id').primary();
6+
table.string('image').notNullable();
7+
table.string('email').notNullable();
8+
table.string('name').notNullable();
9+
table.string('whatsapp').notNullable();
10+
table.decimal('latitude').notNullable();
11+
table.decimal('longitude ').notNullable();
12+
table.string('city').notNullable();
13+
table.string('uf', 2).notNullable();
14+
})
15+
}
16+
17+
export async function down(knex: Knex) {
18+
return knex.schema.dropTable('points')
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import Knex from 'knex';
2+
3+
export async function up(knex: Knex) {
4+
return knex.schema.createTable('items', table => {
5+
table.increments('id').primary();
6+
table.string('image').notNullable();
7+
table.string('title').notNullable();
8+
})
9+
}
10+
11+
export async function down(knex: Knex) {
12+
return knex.schema.dropTable('items')
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import Knex from 'knex';
2+
3+
export async function up(knex: Knex) {
4+
return knex.schema.createTable('point_items', table => {
5+
table.increments('id').primary();
6+
table.integer('point_id').notNullable().references('id').inTable('points')
7+
table.integer('item_id').notNullable().references('id').inTable('items')
8+
})
9+
}
10+
11+
export async function down(knex: Knex) {
12+
return knex.schema.dropTable('point_items')
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import Knex from 'knex'
2+
3+
export async function seed(knex:Knex) {
4+
5+
await knex('items').insert([
6+
{ title: 'Lâmpadas', image: 'lampadas.svg'},
7+
{ title: 'Pilhas e baterias', image: 'baterias.svg'},
8+
{ title: 'Papéis e Papelão', image: 'papeis-papelao.svg'},
9+
{ title: 'Resíduos Eletrônicos', image: 'eletronicos.svg'},
10+
{ title: 'Resíduos Orgânicos', image: 'organicos.svg'},
11+
{ title: 'Óleo de Cozinha', image: 'oleo.svg'},
12+
]);
13+
14+
}

server/src/routes.ts

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import express from 'express'
2+
3+
import PointsController from './controllers/PointsController';
4+
import ItemsController from './controllers/ItemsController';
5+
6+
const routes = express();
7+
8+
const pointsController = new PointsController();
9+
const itemsController = new ItemsController()
10+
11+
routes.get('/items', itemsController.index)
12+
13+
14+
routes.post('/points', pointsController.create);
15+
routes.get('/points', pointsController.index)
16+
routes.get('/points/:id', pointsController.show);
17+
18+
export default routes;

server/src/server.js

-6
This file was deleted.

server/src/server.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import express from 'express';
2+
import routes from './routes';
3+
import path from 'path'
4+
import cors from 'cors';
25

36
const app = express()
47

5-
app.get('/users', (request, response) => {
6-
7-
console.log('Listagem de usuários')
8-
response.json(['Diego', 'Robson', 'Cleiton', 'Thiago'])
9-
})
8+
app.use(cors());
9+
app.use(express.json())
10+
app.use(routes);
1011

12+
app.use('/uploads', express.static(path.resolve(__dirname, '..', 'uploads')))
1113

12-
app.listen(3333)
14+
app.listen(3333)

server/uploads/baterias.svg

+9
Loading

server/uploads/eletronicos.svg

+23
Loading

server/uploads/lampadas.svg

+15
Loading

0 commit comments

Comments
 (0)