├── .babelrc ├── .env ├── .gitignore ├── README.md ├── package-lock.json ├── package.json └── src ├── App.js ├── Controller ├── CategoryController.js ├── ClientController.js ├── DeliveryController.js ├── LoginController.js ├── OrdersController.js ├── ProductController.js ├── RegisterController.js └── UserController.js ├── Database └── mysql.js ├── Index.js ├── Lib ├── JwToken.js ├── Multer.js └── ValidateToken.js ├── Middleware ├── ValidateToken.js └── ValidatedAuth.js ├── Mysql ├── Frave-Food - DataBase.sql └── SP - Frave Food.sql ├── Router ├── Auth.routes.js ├── Category.routes.js ├── Order.routes.js ├── Product.routes.js └── User.routes.js ├── Sockets └── SocketOrderDelivery.js └── Uploads ├── Products ├── image-1629821931703.jpg ├── image-1629821931706.jpg ├── image-1629821931725.png ├── image-1629870138806.jpg ├── image-1629870138818.jpg ├── image-1629870138832.jpg ├── image-1629870179668.jpg ├── image-1629870179673.jpg ├── image-1629870179686.jpg ├── image-1629870261705.jpg ├── image-1629870261720.jpg ├── image-1629870261732.jpg ├── image-1629870352860.jpg ├── image-1629870352878.jpg ├── image-1629870352886.jpg ├── image-1629870430590.jpg ├── image-1629870430603.jpg ├── image-1629870531950.jpg ├── image-1629870531968.jpg ├── image-1629870531978.jpg ├── image-1629870638087.jpg ├── image-1629870638103.jpg ├── image-1629870638120.jpg ├── image-1629870722097.jpg ├── image-1629870722142.jpg ├── image-1629870722161.jpg ├── image-1629870861987.jpg ├── image-1629870861988.jpg ├── image-1629870861994.jpg ├── image-1629870963870.jpg ├── image-1629870963885.jpg ├── image-1629870963896.jpg ├── image-1629871015857.jpg ├── image-1629871015882.jpg ├── image-1629871015906.jpg ├── image-1629871040124.jpg ├── image-1629871040218.jpg ├── image-1629871040235.jpg ├── image-1629871070269.jpg ├── image-1629871070286.jpg ├── image-1629871070308.jpg ├── image-1629871097906.jpg ├── image-1629871097926.jpg ├── image-1629871097936.jpg ├── image-1629871136311.jpg ├── image-1629871136326.jpg ├── image-1629871137001.jpg ├── image-1632453837379.jpg ├── image-1632453837395.jpg ├── image-1632453837414.jpg ├── image-1632461845545.jpg ├── image-1632461845580.jpg └── image-1632461845632.jpg └── Profile ├── image-1632700696972.png ├── image-1632717633130.png └── image-1632722489167.png /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/env" 4 | ] 5 | } -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | 2 | APP_PORT=7070 3 | 4 | DB_DATABASE=frave_food 5 | DB_USERNAME=root 6 | DB_PASSWORD= 7 | 8 | APP_KEY_JWT=Fr@v3D3v3l0p3er2021#%&#"Restaurant!"#%&//((#$%$!$&/%&/%"#$"!"#$&$"#$&/djw-KEY -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .vscode/ 3 | .babelrc 4 | 5 | .env 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Frave Developer - Frave Food Delivery 2 | 3 | 4 | ## Installation 5 | 6 | 7 | **Mysql** 8 | - Go to folder -> src/Mysql/ where you will the Script for the creation of the Database and the Stored procedures 9 | 10 | **NodeJs** 11 | 12 | ```sh 13 | npm install 14 | ``` 15 | 16 | **ENV** 17 | - APP_PORT 18 | - APP_KEY_JWT 19 | 20 | 21 | ## Flutter 22 | - https://github.com/Frave07/Flutter-Delivery-App -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "restaurant", 3 | "version": "1.0.0", 4 | "description": "Restaurant Backend ", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "babel-node src/index.js", 8 | "dev": "nodemon src/index.js --exec babel-node" 9 | }, 10 | "author": "Frave Developer", 11 | "license": "ISC", 12 | "dependencies": { 13 | "bcrypt": "^5.0.1", 14 | "express": "^4.17.1", 15 | "express-validator": "^6.12.1", 16 | "fs-extra": "^10.0.0", 17 | "jsonwebtoken": "^8.5.1", 18 | "multer": "^1.4.3", 19 | "mysql": "^2.18.1", 20 | "socket.io": "^2.4.1" 21 | }, 22 | "devDependencies": { 23 | "@babel/cli": "^7.14.8", 24 | "@babel/core": "^7.14.8", 25 | "@babel/node": "^7.14.9", 26 | "@babel/preset-env": "^7.14.9", 27 | "dotenv": "^10.0.0", 28 | "nodemon": "^2.0.12" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import path from 'path'; 3 | import { config } from 'dotenv'; 4 | 5 | import { createServer } from "http"; 6 | import Server from "socket.io"; 7 | import { socketOrderDelivery } from './Sockets/SocketOrderDelivery'; 8 | 9 | import routeAuth from './Router/Auth.routes'; 10 | import routerUser from './Router/User.routes'; 11 | import routerProduct from './Router/Product.routes'; 12 | import routerCategory from './Router/Category.routes'; 13 | import routerOrder from './Router/Order.routes'; 14 | 15 | 16 | config(); 17 | 18 | const app = express(); 19 | 20 | // CONFIG SOCKET 21 | const httpServer = createServer(app); 22 | const io = new Server(httpServer); 23 | socketOrderDelivery(io); 24 | 25 | 26 | app.use( express.json() ); 27 | app.use( express.urlencoded({ extended: false })); 28 | 29 | app.use('/api', routeAuth); 30 | app.use('/api', routerUser); 31 | app.use('/api', routerProduct); 32 | app.use('/api', routerCategory); 33 | app.use('/api', routerOrder); 34 | 35 | 36 | app.use( express.static( path.join( __dirname, 'Uploads/Profile' ))); 37 | app.use( express.static( path.join( __dirname, 'Uploads/Products' ))); 38 | 39 | 40 | export default httpServer; -------------------------------------------------------------------------------- /src/Controller/CategoryController.js: -------------------------------------------------------------------------------- 1 | import { response } from 'express'; 2 | import pool from '../Database/mysql'; 3 | 4 | export const addCategories = async (req, res = response) => { 5 | 6 | try { 7 | 8 | const { category, description } = req.body; 9 | 10 | await pool.query(`CALL SP_ADD_CATEGORY(?,?);`, [ category, description ]); 11 | 12 | res.json({ 13 | resp: true, 14 | msg : 'Category added successfully', 15 | }); 16 | 17 | } catch (e) { 18 | return res.status(500).json({ 19 | resp: false, 20 | msg : e 21 | }); 22 | } 23 | } 24 | 25 | export const getAllCategories = async ( req, res = response ) => { 26 | 27 | try { 28 | 29 | const category = await pool.query('SELECT * FROM categories'); 30 | 31 | res.json({ 32 | resp: true, 33 | msg : 'All Categories', 34 | categories: category 35 | }); 36 | 37 | } catch (e) { 38 | return res.status(500).json({ 39 | resp: false, 40 | msg : e 41 | }); 42 | } 43 | 44 | } 45 | 46 | -------------------------------------------------------------------------------- /src/Controller/ClientController.js: -------------------------------------------------------------------------------- 1 | import { response } from 'express'; 2 | import pool from '../Database/mysql'; 3 | 4 | 5 | export const getListOrdersForClient = async (req, res = response) => { 6 | 7 | try { 8 | 9 | const listdb = await pool.query(`CALL SP_ORDERS_FOR_CLIENT(?);`, [req.uid]); 10 | 11 | res.json({ 12 | resp: true, 13 | msg : 'List orders for client', 14 | ordersClient: listdb[0] 15 | }); 16 | 17 | } catch (e) { 18 | return res.status(500).json({ 19 | resp: false, 20 | msg : e 21 | }); 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /src/Controller/DeliveryController.js: -------------------------------------------------------------------------------- 1 | import { response } from 'express'; 2 | import pool from '../Database/mysql'; 3 | 4 | export const getAllDelivery = async ( req, res = response ) => { 5 | 6 | try { 7 | 8 | let deliverydb = await pool.query(`CALL SP_ALL_DELIVERYS();`); 9 | 10 | res.json({ 11 | resp: true, 12 | msg : 'Get All Delivery', 13 | delivery: deliverydb[0] 14 | }); 15 | 16 | } catch (e) { 17 | return res.status(500).json({ 18 | resp: false, 19 | msg : e 20 | }); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/Controller/LoginController.js: -------------------------------------------------------------------------------- 1 | import { response } from 'express'; 2 | import bcrypt from 'bcrypt'; 3 | import pool from '../Database/mysql'; 4 | import { generateJsonWebToken } from '../Lib/JwToken'; 5 | 6 | 7 | export const loginController = async ( req, res = response ) => { 8 | 9 | try { 10 | 11 | const { email, password } = req.body; 12 | 13 | const validatedEmail = await pool.query('SELECT email FROM users WHERE email = ?', [ email ]); 14 | 15 | if( validatedEmail.length == 0 ){ 16 | return res.status(400).json({ 17 | resp: false, 18 | msg : 'Wrong Credentials' 19 | }); 20 | } 21 | 22 | const userdb = await pool.query(`CALL SP_LOGIN(?);`, [email]); 23 | 24 | const user = userdb[0][0]; 25 | 26 | if( !await bcrypt.compareSync( password, user.passwordd )){ 27 | return res.status(401).json({ 28 | resp: false, 29 | msg : 'Wrong Credentials' 30 | }); 31 | } 32 | 33 | let token = await generateJsonWebToken( user.uid ); 34 | 35 | res.json({ 36 | resp: true, 37 | msg : 'Welcome to Frave Restaurant', 38 | user: { 39 | uid: user.uid, 40 | firstName: user.firstName, 41 | lastName: user.lastName, 42 | image: user.image, 43 | email: user.email, 44 | rol_id: user.rol_id, 45 | notification_token: user.notification_token 46 | }, 47 | token 48 | }); 49 | 50 | 51 | } catch (e) { 52 | return res.status(500).json({ 53 | resp: false, 54 | msg : e 55 | }); 56 | } 57 | 58 | 59 | } 60 | 61 | 62 | export const renewTokenLogin = async ( req, res = response ) => { 63 | 64 | try { 65 | 66 | const token = await generateJsonWebToken( req.uid ); 67 | 68 | const userdb = await pool.query(`CALL SP_RENEWTOKENLOGIN(?);`, [ req.uid ]); 69 | 70 | const user = userdb[0][0]; 71 | 72 | res.json({ 73 | resp: true, 74 | msg : 'Welcome to Frave Restaurant', 75 | user: { 76 | uid: user.uid, 77 | firstName: user.firstName, 78 | lastName: user.lastName, 79 | image: user.image, 80 | phone: user.phone, 81 | email: user.email, 82 | rol_id: user.rol_id, 83 | notification_token: user.notification_token 84 | }, 85 | token 86 | }); 87 | 88 | } catch (e) { 89 | res.status(500).json({ 90 | resp: false, 91 | msg : e 92 | }); 93 | } 94 | 95 | } -------------------------------------------------------------------------------- /src/Controller/OrdersController.js: -------------------------------------------------------------------------------- 1 | import { response } from 'express'; 2 | import pool from '../Database/mysql'; 3 | 4 | 5 | export const addNewOrders = async (req, res = response ) => { 6 | 7 | try { 8 | 9 | const { uidAddress, total, typePayment, products } = req.body; 10 | 11 | const orderdb = await pool.query('INSERT INTO orders (client_id, address_id, amount, pay_type) VALUES (?,?,?,?)', [ req.uid, uidAddress, total, typePayment ]); 12 | 13 | products.forEach(o => { 14 | pool.query('INSERT INTO orderDetails (order_id, product_id, quantity, price) VALUES (?,?,?,?)', [ orderdb.insertId, o.uidProduct, o.quantity, o.quantity * o.price ]); 15 | }); 16 | 17 | res.json({ 18 | resp: true, 19 | msg : 'New Order added successfully' 20 | }); 21 | 22 | } catch (e) { 23 | return res.status(500).json({ 24 | resp: false, 25 | msg : e 26 | }); 27 | } 28 | 29 | } 30 | 31 | export const getOrdersByStatus = async (req, res = response ) => { 32 | 33 | try { 34 | 35 | const ordersdb = await pool.query(`CALL SP_ALL_ORDERS_STATUS(?);`, [ req.params.statusOrder ]); 36 | 37 | res.json({ 38 | resp: true, 39 | msg : 'Orders by ' + req.params.statusOrder, 40 | ordersResponse : ordersdb[0] 41 | }); 42 | 43 | } catch (e) { 44 | return res.status(500).json({ 45 | resp: false, 46 | msg : e 47 | }); 48 | } 49 | 50 | } 51 | 52 | export const getDetailsOrderById = async ( req, res = response ) => { 53 | 54 | try { 55 | 56 | const detailOrderdb = await pool.query(`CALL SP_ORDER_DETAILS(?);`, [ req.params.idOrderDetails ]); 57 | 58 | res.json({ 59 | resp: true, 60 | msg : 'Order details by ' + req.params.idOrderDetails, 61 | detailsOrder: detailOrderdb[0] 62 | }); 63 | 64 | } catch (e) { 65 | return res.status(500).json({ 66 | resp: false, 67 | msg : e 68 | }); 69 | } 70 | 71 | } 72 | 73 | export const updateStatusToDispatched = async ( req, res = response ) => { 74 | 75 | try { 76 | 77 | const { idDelivery, idOrder } = req.body; 78 | 79 | await pool.query('UPDATE orders SET status = ?, delivery_id = ? WHERE id = ?', [ 'DISPATCHED', idDelivery, idOrder ]); 80 | 81 | res.json({ 82 | resp: true, 83 | msg : 'Order DISPATCHED' 84 | }); 85 | 86 | } catch (e) { 87 | return res.status(500).json({ 88 | resp: false, 89 | msg : e 90 | }); 91 | } 92 | 93 | } 94 | 95 | export const getOrdersByDelivery = async ( req, res = response ) => { 96 | 97 | try { 98 | 99 | const ordersDeliverydb = await pool.query(`CALL SP_ORDERS_BY_DELIVERY(?,?);`, [ req.uid, req.params.statusOrder ]); 100 | 101 | res.json({ 102 | resp: true, 103 | msg : 'All Orders By Delivery', 104 | ordersResponse : ordersDeliverydb[0] 105 | }); 106 | 107 | } catch (e) { 108 | return res.status(500).json({ 109 | resp: false, 110 | msg : e 111 | }); 112 | } 113 | 114 | } 115 | 116 | export const updateStatusToOntheWay = async ( req, res = response ) => { 117 | 118 | try { 119 | 120 | const { latitude, longitude } = req.body; 121 | 122 | await pool.query('UPDATE orders SET status = ?, latitude = ?, longitude = ? WHERE id = ?', ['ON WAY', latitude, longitude, req.params.idOrder ]); 123 | 124 | res.json({ 125 | resp: true, 126 | msg : 'ON WAY' 127 | }); 128 | 129 | } catch (e) { 130 | return res.status(500).json({ 131 | resp: false, 132 | msg : e 133 | }); 134 | } 135 | 136 | } 137 | 138 | export const updateStatusToDelivered = async ( req, res = response ) => { 139 | 140 | try { 141 | 142 | await pool.query('UPDATE orders SET status = ? WHERE id = ?', ['DELIVERED', req.params.idOrder ]); 143 | 144 | res.json({ 145 | resp: true, 146 | msg : 'ORDER DELIVERED' 147 | }); 148 | 149 | } catch (e) { 150 | return res.status(500).json({ 151 | resp: false, 152 | msg : e 153 | }); 154 | } 155 | 156 | } -------------------------------------------------------------------------------- /src/Controller/ProductController.js: -------------------------------------------------------------------------------- 1 | import { response } from 'express'; 2 | import pool from '../Database/mysql'; 3 | 4 | 5 | export const addNewProduct = async (req, res = response) => { 6 | 7 | try { 8 | 9 | const { name, description, price, category } = req.body; 10 | 11 | const rows = await pool.query('INSERT INTO products (nameProduct, description, price, category_id) VALUE (?,?,?,?)', [name, description, price, category]); 12 | 13 | req.files.forEach(image => { 14 | pool.query('INSERT INTO imageProduct (picture, product_id) value (?,?)', [ image.filename, rows.insertId ]); 15 | }); 16 | 17 | res.json({ 18 | resp: true, 19 | msg : 'Product added Successfully' 20 | }); 21 | 22 | } catch (e) { 23 | return res.status(500).json({ 24 | resp: false, 25 | msg : e 26 | }); 27 | } 28 | 29 | } 30 | 31 | export const getProductsTopHome = async (req, res = response) => { 32 | 33 | try { 34 | 35 | const productsdb = await pool.query(`CALL SP_GET_PRODUCTS_TOP();`); 36 | 37 | res.json({ 38 | resp: true, 39 | msg : 'Top 10 Products', 40 | productsdb: productsdb[0] 41 | }); 42 | 43 | 44 | } catch (e) { 45 | return res.status(500).json({ 46 | resp: false, 47 | msg : e 48 | }); 49 | } 50 | } 51 | 52 | export const getImagesProducts = async ( req, res = response ) => { 53 | 54 | try { 55 | 56 | const imageProductdb = await pool.query('SELECT * FROM imageProduct WHERE product_id = ?', [ req.params.id ]); 57 | 58 | res.json({ 59 | resp: true, 60 | msg : 'Get Images Products', 61 | imageProductdb: imageProductdb 62 | }); 63 | 64 | } catch (e) { 65 | return res.status(500).json({ 66 | resp: false, 67 | msg : e 68 | }); 69 | } 70 | 71 | } 72 | 73 | export const searchProductForName = async (req, res = response) => { 74 | 75 | try { 76 | 77 | const productdb = await pool.query(`CALL SP_SEARCH_PRODUCT(?);`, [ req.params.nameProduct ]); 78 | 79 | res.json({ 80 | resp: true, 81 | msg : 'Search products', 82 | productsdb: productdb[0] 83 | }); 84 | 85 | } catch (e) { 86 | return res.status(500).json({ 87 | resp: false, 88 | msg : e 89 | }); 90 | } 91 | 92 | } 93 | 94 | export const searchProductsForCategory = async (req, res = response) => { 95 | 96 | try { 97 | 98 | const productdb = await pool.query(`CALL SP_SEARCH_FOR_CATEGORY(?);`, [req.params.idCategory]); 99 | 100 | res.json({ 101 | resp: true, 102 | msg : 'list Products for id Category', 103 | productsdb : productdb[0] 104 | }); 105 | 106 | } catch (e) { 107 | return res.status(500).json({ 108 | resp: false, 109 | msg : e 110 | }); 111 | } 112 | 113 | } 114 | 115 | export const listProductsAdmin = async (req, res = response) => { 116 | 117 | try { 118 | 119 | const productsdb = await pool.query(`CALL SP_LIST_PRODUCTS_ADMIN();`); 120 | 121 | res.json({ 122 | resp: true, 123 | msg : 'Top 10 Products', 124 | productsdb: productsdb[0] 125 | }); 126 | 127 | 128 | } catch (e) { 129 | return res.status(500).json({ 130 | resp: false, 131 | msg : e 132 | }); 133 | } 134 | } 135 | 136 | export const updateStatusProduct = async (req, res = response) => { 137 | 138 | try { 139 | 140 | const { status, idProduct } = req.body; 141 | 142 | await pool.query('UPDATE products SET status = ? WHERE id = ?', [ parseInt(status), parseInt(idProduct) ]); 143 | 144 | res.json({ 145 | resp: true, 146 | msg : 'Product updated' 147 | }); 148 | 149 | } catch (e) { 150 | return res.status(500).json({ 151 | resp: false, 152 | msg : e 153 | }); 154 | } 155 | 156 | } 157 | 158 | export const deleteProduct = async (req, res = response ) => { 159 | 160 | try { 161 | 162 | await pool.query('DELETE FROM imageProduct WHERE product_id = ?', [ req.params.idProduct ]); 163 | await pool.query('DELETE FROM products WHERE id = ?', [ req.params.idProduct ]); 164 | 165 | res.json({ 166 | resp: true, 167 | msg : 'Product deleted successfully' 168 | }); 169 | 170 | } catch (e) { 171 | return res.status(500).json({ 172 | resp: false, 173 | msg : e 174 | }); 175 | } 176 | 177 | } -------------------------------------------------------------------------------- /src/Controller/RegisterController.js: -------------------------------------------------------------------------------- 1 | import { response } from 'express'; 2 | import bcrypt from 'bcrypt'; 3 | import pool from '../Database/mysql'; 4 | 5 | 6 | export const registerClient = async ( req, res = response ) => { 7 | 8 | const { firstname, lastname, phone, email, password, notification_token } = req.body; 9 | const imagePath = req.file.filename; 10 | 11 | try { 12 | 13 | let salt = bcrypt.genSaltSync(); 14 | const pass = bcrypt.hashSync( password, salt ); 15 | 16 | const validatedEmail = await pool.query('SELECT email FROM users WHERE email = ?', [email]); 17 | 18 | if( validatedEmail.length > 0 ){ 19 | return res.status(401).json({ 20 | resp: false, 21 | msg : 'Email already exists' 22 | }); 23 | } 24 | 25 | await pool.query(`CALL SP_REGISTER(?,?,?,?,?,?,?,?);`, [firstname, lastname, phone, imagePath, email, pass, 2, notification_token]); 26 | 27 | res.json({ 28 | resp: true, 29 | msg : 'Client successfully registered', 30 | }); 31 | 32 | 33 | 34 | } catch (err) { 35 | return res.status(500).json({ 36 | resp: false, 37 | msg : err 38 | }); 39 | } 40 | 41 | } 42 | 43 | 44 | export const registerDelivery = async (req, res = response) => { 45 | 46 | try { 47 | 48 | const { firstname, lastname, phone, email, password, notification_token } = req.body; 49 | const imagePath = req.file.filename; 50 | 51 | const validatedEmail = await pool.query('SELECT email FROM users WHERE email = ?', [email]); 52 | 53 | if( validatedEmail.length > 0 ){ 54 | return res.status(401).json({ 55 | resp: false, 56 | msg : 'Email already exists' 57 | }); 58 | } 59 | 60 | let salt = bcrypt.genSaltSync(); 61 | const pass = bcrypt.hashSync( password, salt ); 62 | 63 | await pool.query(`CALL SP_REGISTER(?,?,?,?,?,?,?,?);`, [firstname, lastname, phone, imagePath, email, pass, 3, notification_token]); 64 | 65 | res.json({ 66 | resp: true, 67 | msg : 'Devlivery successfully registered', 68 | }); 69 | 70 | 71 | } catch (e) { 72 | return res.status(500).json({ 73 | resp: false, 74 | msg : e 75 | }); 76 | } 77 | 78 | 79 | } 80 | 81 | -------------------------------------------------------------------------------- /src/Controller/UserController.js: -------------------------------------------------------------------------------- 1 | import { response } from 'express'; 2 | import bcrypt from 'bcrypt'; 3 | import pool from '../Database/mysql'; 4 | import fs from 'fs-extra'; 5 | import path from 'path'; 6 | 7 | export const getUserById = async (req, res = response) => { 8 | 9 | try { 10 | 11 | const uid = req.uid; 12 | 13 | const query = await pool.query(`CALL SP_USER_BY_ID(?);`, [uid]); 14 | 15 | res.json({ 16 | resp: true, 17 | msg : 'Get profile', 18 | user: query[0][0] 19 | }); 20 | 21 | } catch (e) { 22 | return res.status(500).json({ 23 | resp: false, 24 | msg : e 25 | }); 26 | } 27 | 28 | } 29 | 30 | 31 | export const editProfile = async ( req, res = response ) => { 32 | 33 | try { 34 | 35 | const { firstname, lastname, phone } = req.body; 36 | 37 | await pool.query(`CALL SP_UPDATE_PROFILE(?,?,?,?);`, [req.uid, firstname, lastname, phone]); 38 | 39 | res.json({ 40 | resp: true, 41 | msg : 'Updated Profile' 42 | }); 43 | 44 | } catch (e) { 45 | return res.status(500).json({ 46 | resp: false, 47 | msg : e 48 | }); 49 | } 50 | 51 | } 52 | 53 | 54 | export const getUserUpdated = async ( req, res = response ) => { 55 | 56 | try { 57 | 58 | const userdb = await pool.query(`CALL SP_USER_UPDATED(?);`, [ req.uid ]); 59 | 60 | const user = userdb[0][0]; 61 | 62 | res.json({ 63 | resp: true, 64 | msg : 'User updated', 65 | user: { 66 | firstName: user.firstName, 67 | lastName: user.lastName, 68 | image: user.image, 69 | email: user.email, 70 | rol_id: user.rol_id 71 | }, 72 | }); 73 | 74 | } catch (e) { 75 | return res.status(500).json({ 76 | resp: false, 77 | msg : e 78 | }); 79 | } 80 | 81 | } 82 | 83 | 84 | export const changePassword = async ( req, res = response ) => { 85 | 86 | try { 87 | 88 | const { currentPassword, newPassword } = req.body; 89 | 90 | const passworddb = await pool.query('SELECT passwordd FROM users WHERE persona_id = ?', [req.uid]); 91 | 92 | if( !await bcrypt.compareSync( currentPassword, passworddb[0].passwordd )){ 93 | return res.status(401).json({ 94 | resp: false, 95 | msg : 'Passwords do not match' 96 | }); 97 | } 98 | 99 | let salt = bcrypt.genSaltSync(); 100 | const pass = bcrypt.hashSync( newPassword, salt ); 101 | 102 | await pool.query('UPDATE users SET passwordd = ? WHERE persona_id = ?', [ pass, req.uid ]); 103 | 104 | res.json({ 105 | resp: true, 106 | msg: 'Password Changed' 107 | }); 108 | 109 | } catch (e) { 110 | return res.status(500).json({ 111 | resp: false, 112 | msg : e 113 | }); 114 | } 115 | 116 | } 117 | 118 | 119 | export const changeImageProfile = async (req, res = response) => { 120 | 121 | try { 122 | 123 | const imagePath = req.file.filename; 124 | 125 | const imagedb = await pool.query('SELECT image FROM person WHERE uid = ?', [ req.uid ]); 126 | 127 | await fs.unlink( path.resolve('src/Uploads/Profile/'+imagedb[0].image)); 128 | 129 | await pool.query('UPDATE person SET image = ? WHERE uid = ?', [ imagePath, req.uid ]); 130 | 131 | res.json({ 132 | resp: true, 133 | msg : 'Picture changed' 134 | }); 135 | 136 | } catch (e) { 137 | return res.status(500).json({ 138 | resp: false, 139 | msg : e 140 | }); 141 | } 142 | 143 | } 144 | 145 | 146 | export const getAddressesUser = async (req, res = response ) => { 147 | 148 | try { 149 | 150 | const addressesdb = await pool.query('SELECT id, street, reference, Latitude, Longitude FROM addresses WHERE persona_id = ?', [req.uid]); 151 | 152 | res.json({ 153 | resp: true, 154 | msg : 'List the Addresses', 155 | listAddresses : addressesdb 156 | }); 157 | 158 | } catch (e) { 159 | return res.status(500).json({ 160 | resp: false, 161 | msg : e 162 | }); 163 | } 164 | 165 | } 166 | 167 | 168 | export const deleteStreetAddress = async (req, res = response ) => { 169 | 170 | try { 171 | 172 | await pool.query('DELETE FROM addresses WHERE id = ? AND persona_id = ?', [ req.params.idAddress , req.uid ]); 173 | 174 | res.json({ 175 | resp: true, 176 | msg : 'Street Address deleted' 177 | }); 178 | 179 | } catch (e) { 180 | return res.status(500).json({ 181 | resp: false, 182 | msg : e 183 | }); 184 | } 185 | } 186 | 187 | 188 | export const addStreetAddress = async ( req, res = response ) => { 189 | 190 | try { 191 | 192 | const { street, reference, latitude, longitude } = req.body; 193 | 194 | await pool.query('INSERT INTO addresses (street, reference, Latitude, Longitude, persona_id) VALUE (?,?,?,?,?)', [ street, reference, latitude, longitude, req.uid ]); 195 | 196 | res.json({ 197 | resp: true, 198 | msg : 'Street Address added successfully' 199 | }); 200 | 201 | } catch (e) { 202 | return res.status(500).json({ 203 | resp: false, 204 | msg : e 205 | }); 206 | } 207 | 208 | } 209 | 210 | 211 | export const getAddressOne = async (req, res = response) => { 212 | 213 | try { 214 | 215 | const addressdb = await pool.query('SELECT * FROM addresses WHERE persona_id = ? ORDER BY id DESC LIMIT 1', [ req.uid ]); 216 | 217 | res.json({ 218 | resp: true, 219 | msg : 'One Address', 220 | address: addressdb[0] 221 | }); 222 | 223 | } catch (e) { 224 | return res.status(500).json({ 225 | resp: false, 226 | msg : e 227 | }); 228 | } 229 | } 230 | 231 | export const updateNotificationToken = async (req, res = response ) => { 232 | 233 | try { 234 | 235 | const { nToken } = req.body; 236 | 237 | await pool.query('UPDATE users SET notification_token = ? WHERE persona_id = ?', [ nToken, req.uid ]); 238 | 239 | res.json({ 240 | resp: true, 241 | msg : 'Token updated' 242 | }); 243 | 244 | } catch (e) { 245 | return res.status(500).json({ 246 | resp : false, 247 | msg : e 248 | }); 249 | } 250 | 251 | } 252 | 253 | export const getAdminNotificationToken = async (req, res = response ) => { 254 | 255 | try { 256 | 257 | const admisdb = await pool.query('SELECT notification_token FROM users WHERE rol_id = 1'); 258 | 259 | let tokens = []; 260 | 261 | admisdb.forEach( t => { 262 | tokens.push(t.notification_token); 263 | }); 264 | 265 | res.json(tokens); 266 | 267 | } catch (e) { 268 | return res.status(501).json({ 269 | resp: false, 270 | msg : e 271 | }); 272 | } 273 | 274 | } 275 | 276 | export const updateDeliveryToClient = async( req, res = response ) => { 277 | 278 | try { 279 | 280 | await pool.query('UPDATE users SET rol_id = ? WHERE persona_id = ?', [ 2, req.params.idPerson ]); 281 | 282 | res.json({ 283 | resp: true, 284 | msg : 'Delivery To Client' 285 | }); 286 | 287 | } catch (e) { 288 | return res.status(501).json({ 289 | resp: false, 290 | msg : e 291 | }); 292 | } 293 | 294 | } -------------------------------------------------------------------------------- /src/Database/mysql.js: -------------------------------------------------------------------------------- 1 | import mysql from 'mysql'; 2 | import { promisify } from 'util'; 3 | 4 | const pool = mysql.createPool({ 5 | host: 'localhost', 6 | user: 'root', 7 | password: "", 8 | database: 'frave_food' 9 | }); 10 | 11 | pool.getConnection((err, connection) => { 12 | 13 | if( err ){ 14 | if( err.code === 'PROTOCOL_CONNECTION_LOST' ) console.log('DATABASE CONNECTION WAS CLOSED'); 15 | if( err.code === 'ER_CON_COUNT_ERROR' ) console.log('DATABASE HAS TO MANY CONNECTIONS'); 16 | if( err.code === 'ECONNREFUSED' ) console.log('DATABASE CONNECTION WAS REFUSED'); 17 | } 18 | 19 | if( connection ) connection.release(); 20 | 21 | console.log('DataBase is connected to '+ process.env.DB_DATABASE); 22 | return; 23 | }); 24 | 25 | pool.query = promisify( pool.query ); 26 | 27 | 28 | export default pool; -------------------------------------------------------------------------------- /src/Index.js: -------------------------------------------------------------------------------- 1 | import http from './App'; 2 | 3 | 4 | http.listen( process.env.APP_PORT, () => console.log('Server on port ' + process.env.APP_PORT)); -------------------------------------------------------------------------------- /src/Lib/JwToken.js: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken'; 2 | 3 | export const generateJsonWebToken = ( uidPerson ) => { 4 | 5 | return new Promise(( resolve, reject ) => { 6 | 7 | const payload = { uidPerson }; 8 | 9 | jwt.sign( payload, process.env.APP_KEY_JWT, { 10 | expiresIn: '12h' 11 | }, (err, token) => { 12 | 13 | if( !err ) resolve ( token ); 14 | else reject( 'Error Generate a Token' ); 15 | }); 16 | 17 | }); 18 | 19 | } -------------------------------------------------------------------------------- /src/Lib/Multer.js: -------------------------------------------------------------------------------- 1 | import multer from 'multer'; 2 | import path from 'path'; 3 | 4 | var storageProfile = multer.diskStorage({ 5 | 6 | destination: ( req, res, cb ) => { 7 | cb( null, 'src/Uploads/Profile') 8 | }, 9 | filename: (req, file, cb) => { 10 | cb( null, file.fieldname + '-' + Date.now() + path.extname( file.originalname )) 11 | } 12 | 13 | }); 14 | 15 | export const upLoadsProfile = multer({ storage: storageProfile }); 16 | 17 | 18 | var storageProducts = multer.diskStorage({ 19 | 20 | destination: ( req, res, cb ) => { 21 | cb( null, 'src/Uploads/Products') 22 | }, 23 | filename: (req, file, cb) => { 24 | cb( null, file.fieldname + '-' + Date.now() + path.extname( file.originalname )) 25 | } 26 | 27 | }); 28 | 29 | export const upLoadsProducts = multer({ storage: storageProducts }); -------------------------------------------------------------------------------- /src/Lib/ValidateToken.js: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken'; 2 | 3 | export default ValidatedToken = ( req, res, next ) => { 4 | 5 | let token = req.header('xx-token'); 6 | 7 | if( !token ){ 8 | return res.status(401).json({ 9 | resp: false, 10 | msg : 'There is not Token in the request' 11 | }); 12 | } 13 | 14 | try { 15 | 16 | const { uidPerson } = jwt.verify( token, process.env.APP_KEY_JWT ); 17 | 18 | req.uidPerson = uidPerson; 19 | 20 | next(); 21 | 22 | } catch (err) { 23 | return res.status(401).json({ 24 | resp: false, 25 | msg : err 26 | }); 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /src/Middleware/ValidateToken.js: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken'; 2 | 3 | 4 | export const verifyToken = ( req, res, next ) => { 5 | 6 | try { 7 | 8 | let token = req.header('xx-token'); 9 | 10 | if( !token ){ 11 | return res.status(401).json({ 12 | resp: false, 13 | msg : 'There is not Token in the request' 14 | }); 15 | } 16 | 17 | const { uidPerson } = jwt.verify( token, process.env.APP_KEY_JWT ); 18 | 19 | req.uid = uidPerson; 20 | 21 | next(); 22 | 23 | } catch (e) { 24 | return res.status(500).json({ 25 | resp: false, 26 | msg : e.message, 27 | user: { uid: 0, firstName: '', lastName: '', image: '', email: '', rol_id: 0 }, 28 | token: '' 29 | }); 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /src/Middleware/ValidatedAuth.js: -------------------------------------------------------------------------------- 1 | import { validationResult } from 'express-validator'; 2 | 3 | export default validationRequest = ( req, res, next ) => { 4 | 5 | const errors = validationResult( req ) ; 6 | 7 | if( !errors.isEmpty ){ 8 | 9 | return res.status(400).json({ 10 | resp: false, 11 | errors : errors.mapped() 12 | }); 13 | } 14 | next(); 15 | } -------------------------------------------------------------------------------- /src/Mysql/Frave-Food - DataBase.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE frave_food; 2 | 3 | USE frave_food; 4 | 5 | CREATE TABLE roles 6 | ( 7 | id INT PRIMARY KEY AUTO_INCREMENT, 8 | rol VARCHAR(50) NOT NULL, 9 | description VARCHAR(100) NOT NULL, 10 | state BOOL DEFAULT 1 11 | ); 12 | 13 | INSERT INTO roles (rol, description) VALUES ('Admin', 'Admin'), ('Client', 'Client'), ('Delivery', 'Delivery'); 14 | 15 | CREATE TABLE Person 16 | ( 17 | uid INT PRIMARY KEY AUTO_INCREMENT, 18 | firstName VARCHAR(50) NULL, 19 | lastName VARCHAR(50) NULL, 20 | phone VARCHAR(11) NULL, 21 | image VARCHAR(250) NULL, 22 | state BOOL DEFAULT 1, 23 | created DATETIME DEFAULT NOW() 24 | ); 25 | 26 | CREATE TABLE addresses 27 | ( 28 | id INT PRIMARY KEY AUTO_INCREMENT, 29 | street VARCHAR(100) NULL, 30 | reference VARCHAR(100) NULL, 31 | Latitude VARCHAR(50) NULL, 32 | Longitude VARCHAR(50) NULL, 33 | persona_id INT NOT NULL, 34 | FOREIGN KEY (persona_id) REFERENCES Person(uid) 35 | ); 36 | 37 | CREATE TABLE users 38 | ( 39 | id INT PRIMARY KEY AUTO_INCREMENT, 40 | users VARCHAR(50) NOT NULL, 41 | email VARCHAR(100) NOT NULL, 42 | passwordd VARCHAR(100) NOT NULL, 43 | persona_id INT NOT NULL, 44 | rol_id INT NOT NULL, 45 | notification_token VARCHAR(255) NULL, 46 | UNIQUE KEY (email), 47 | FOREIGN KEY (persona_id) REFERENCES Person(uid), 48 | FOREIGN KEY (rol_id) REFERENCES roles(id) 49 | ); 50 | 51 | 52 | CREATE TABLE categories 53 | ( 54 | id INT PRIMARY KEY AUTO_INCREMENT, 55 | category VARCHAR(50) NOT NULL, 56 | description VARCHAR(100) NULL 57 | ); 58 | 59 | 60 | CREATE TABLE products 61 | ( 62 | id INT PRIMARY KEY AUTO_INCREMENT, 63 | nameProduct VARCHAR(50) NOT NULL, 64 | description VARCHAR(200) NULL, 65 | price DOUBLE(11,2) NOT NULL, 66 | status BOOL DEFAULT 1, 67 | category_id INT NOT NULL, 68 | 69 | FOREIGN KEY (category_id) REFERENCES categories(id) 70 | ); 71 | 72 | CREATE TABLE imageProduct 73 | ( 74 | id INT PRIMARY KEY AUTO_INCREMENT, 75 | picture VARCHAR(255) NULL, 76 | product_id INT NOT NULL, 77 | 78 | FOREIGN KEY (product_id) REFERENCES products(id) 79 | ); 80 | 81 | CREATE TABLE orders 82 | ( 83 | id INT PRIMARY KEY AUTO_INCREMENT, 84 | client_id INT NOT NULL, 85 | delivery_id INT NULL, 86 | address_id INT NOT NULL, 87 | latitude VARCHAR(50) NULL, 88 | longitude VARCHAR(50) NULL, 89 | status VARCHAR(50) DEFAULT "PAID OUT", 90 | receipt VARCHAR(100), 91 | amount DOUBLE(11,2), 92 | pay_type VARCHAR(50) NOT NULL, 93 | currentDate DATETIME DEFAULT NOW(), 94 | 95 | FOREIGN KEY (client_id) REFERENCES Person(uid), 96 | FOREIGN KEY (delivery_id) REFERENCES Person(uid), 97 | FOREIGN KEY (address_id) REFERENCES addresses(id) 98 | ); 99 | 100 | 101 | CREATE TABLE orderDetails 102 | ( 103 | id INT PRIMARY KEY AUTO_INCREMENT, 104 | order_id INT NOT NULL, 105 | product_id INT NOT NULL, 106 | quantity INT NOT NULL, 107 | price DOUBLE(11,2) NOT NULL, 108 | FOREIGN KEY(order_id) REFERENCES orders(id), 109 | FOREIGN KEY(product_id) REFERENCES Products(id) 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 | 144 | 145 | 146 | 147 | 148 | 149 | -------------------------------------------------------------------------------- /src/Mysql/SP - Frave Food.sql: -------------------------------------------------------------------------------- 1 | 2 | 3 | /*--------------------------------------------------------------------------------------------------------------------------------------------*/ 4 | /*-----------------------------------------------------------Storage Procedure----------------------------------------------------------------*/ 5 | /*--------------------------------------------------------------------------------------------------------------------------------------------*/ 6 | USE frave_food; 7 | 8 | DELIMITER // 9 | CREATE PROCEDURE SP_REGISTER(IN firstName VARCHAR(50), IN lastName VARCHAR(50), IN phone VARCHAR(11), IN image VARCHAR(250), IN email VARCHAR(100), IN pass VARCHAR(100), IN rol INT, IN nToken VARCHAR(255)) 10 | BEGIN 11 | INSERT INTO Person (firstName, lastName, phone, image) VALUE (firstName, lastName, phone, image); 12 | 13 | INSERT INTO users (users, email, passwordd, persona_id, rol_id, notification_token) VALUE (firstName, email, pass, LAST_INSERT_ID(), rol, nToken); 14 | END// 15 | 16 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 17 | 18 | DELIMITER // 19 | CREATE PROCEDURE SP_LOGIN(IN email VARCHAR(100)) 20 | BEGIN 21 | SELECT p.uid, p.firstName, p.lastName, p.image, u.email, u.passwordd, u.rol_id, u.notification_token FROM person p 22 | INNER JOIN users u ON p.uid = u.persona_id 23 | WHERE u.email = email AND p.state = TRUE; 24 | END// 25 | 26 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 27 | 28 | DELIMITER // 29 | CREATE PROCEDURE SP_RENEWTOKENLOGIN(IN uid INT ) 30 | BEGIN 31 | SELECT p.uid, p.firstName, p.lastName, p.image, p.phone, u.email, u.rol_id, u.notification_token FROM person p 32 | INNER JOIN users u ON p.uid = u.persona_id 33 | WHERE p.uid = uid AND p.state = TRUE; 34 | END// 35 | 36 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 37 | 38 | DELIMITER // 39 | CREATE PROCEDURE SP_ADD_CATEGORY(IN category VARCHAR(50), IN description VARCHAR(100)) 40 | BEGIN 41 | INSERT INTO categories (category, description) VALUE (category, description); 42 | END// 43 | 44 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 45 | 46 | DELIMITER // 47 | CREATE PROCEDURE SP_USER_BY_ID(IN ID INT) 48 | BEGIN 49 | SELECT p.uid, p.firstName, p.lastName, p.phone, p.image, u.email, u.rol_id, u.notification_token FROM person p 50 | INNER JOIN users u ON p.uid = u.persona_id 51 | WHERE p.uid = 1 AND p.state = TRUE; 52 | END// 53 | 54 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 55 | 56 | DELIMITER // 57 | CREATE PROCEDURE SP_UPDATE_PROFILE(IN ID INT, IN firstName VARCHAR(50), IN lastName VARCHAR(50), IN phone VARCHAR(11)) 58 | BEGIN 59 | UPDATE person 60 | SET firstName = firstName, 61 | lastName = lastName, 62 | phone = phone 63 | WHERE person.uid = ID; 64 | END// 65 | 66 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 67 | 68 | DELIMITER // 69 | CREATE PROCEDURE SP_USER_UPDATED(IN ID INT) 70 | BEGIN 71 | SELECT p.firstName, p.lastName, p.image, u.email, u.rol_id FROM person p 72 | INNER JOIN users u ON p.uid = u.persona_id 73 | WHERE p.uid = 1 AND p.state = TRUE; 74 | END// 75 | 76 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 77 | 78 | DELIMITER // 79 | CREATE PROCEDURE SP_GET_PRODUCTS_TOP() 80 | BEGIN 81 | SELECT pro.id, pro.nameProduct, pro.description, pro.price, pro.status, ip.picture, c.category, c.id AS category_id FROM products pro 82 | INNER JOIN categories c ON pro.category_id = c.id 83 | INNER JOIN imageProduct ip ON pro.id = ip.product_id 84 | INNER JOIN ( SELECT product_id, MIN(id) AS id_image FROM imageProduct GROUP BY product_id) p3 ON ip.product_id = p3.product_id AND ip.id = p3.id_image 85 | LIMIT 10; 86 | END// 87 | 88 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 89 | 90 | DELIMITER // 91 | CREATE PROCEDURE SP_SEARCH_PRODUCT(IN nameProduct VARCHAR(100)) 92 | BEGIN 93 | SELECT pro.id, pro.nameProduct, pro.description, pro.price, pro.status, ip.picture, c.category, c.id AS category_id FROM products pro 94 | INNER JOIN categories c ON pro.category_id = c.id 95 | INNER JOIN imageProduct ip ON pro.id = ip.product_id 96 | INNER JOIN ( SELECT product_id, MIN(id) AS id_image FROM imageProduct GROUP BY product_id) p3 ON ip.product_id = p3.product_id AND ip.id = p3.id_image 97 | WHERE pro.nameProduct LIKE CONCAT('%', nameProduct , '%'); 98 | END// 99 | 100 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 101 | 102 | DELIMITER // 103 | CREATE PROCEDURE SP_SEARCH_FOR_CATEGORY(IN IDCATEGORY INT) 104 | BEGIN 105 | SELECT pro.id, pro.nameProduct, pro.description, pro.price, pro.status, ip.picture, c.category, c.id AS category_id FROM products pro 106 | INNER JOIN categories c ON pro.category_id = c.id 107 | INNER JOIN imageProduct ip ON pro.id = ip.product_id 108 | INNER JOIN ( SELECT product_id, MIN(id) AS id_image FROM imageProduct GROUP BY product_id) p3 ON ip.product_id = p3.product_id AND ip.id = p3.id_image 109 | WHERE pro.category_id = IDCATEGORY; 110 | END// 111 | 112 | 113 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 114 | 115 | DELIMITER // 116 | CREATE PROCEDURE SP_LIST_PRODUCTS_ADMIN() 117 | BEGIN 118 | SELECT pro.id, pro.nameProduct, pro.description, pro.price, pro.status, ip.picture, c.category, c.id AS category_id FROM products pro 119 | INNER JOIN categories c ON pro.category_id = c.id 120 | INNER JOIN imageProduct ip ON pro.id = ip.product_id 121 | INNER JOIN ( SELECT product_id, MIN(id) AS id_image FROM imageProduct GROUP BY product_id) p3 ON ip.product_id = p3.product_id AND ip.id = p3.id_image; 122 | END// 123 | 124 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 125 | 126 | DELIMITER // 127 | CREATE PROCEDURE SP_ALL_ORDERS_STATUS(IN statuss VARCHAR(30)) 128 | BEGIN 129 | SELECT o.id AS order_id, o.delivery_id, CONCAT(pe.firstName, " ", pe.lastName) AS delivery, pe.image AS deliveryImage, o.client_id, CONCAT(p.firstName, " ", p.lastName) AS cliente, p.image AS clientImage, p.phone AS clientPhone, o.address_id, a.street, a.reference, a.Latitude, a.Longitude, o.status, o.pay_type, o.amount, o.currentDate 130 | FROM orders o 131 | INNER JOIN person p ON o.client_id = p.uid 132 | INNER JOIN addresses a ON o.address_id = a.id 133 | LEFT JOIN person pe ON o.delivery_id = pe.uid 134 | WHERE o.`status` = statuss; 135 | END// 136 | 137 | 138 | 139 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 140 | 141 | DELIMITER // 142 | CREATE PROCEDURE SP_ORDER_DETAILS(IN IDORDER INT) 143 | BEGIN 144 | SELECT od.id, od.order_id, od.product_id, p.nameProduct, ip.picture, od.quantity, od.price AS total 145 | FROM orderdetails od 146 | INNER JOIN products p ON od.product_id = p.id 147 | INNER JOIN imageProduct ip ON p.id = ip.product_id 148 | INNER JOIN ( SELECT product_id, MIN(id) AS id_image FROM imageProduct GROUP BY product_id) p3 ON ip.product_id = p3.product_id AND ip.id = p3.id_image 149 | WHERE od.order_id = IDORDER; 150 | END// 151 | 152 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 153 | 154 | DELIMITER // 155 | CREATE PROCEDURE SP_ALL_DELIVERYS() 156 | BEGIN 157 | SELECT p.uid AS person_id, CONCAT(p.firstName, ' ', p.lastName) AS nameDelivery, p.phone, p.image, u.notification_token FROM person p 158 | INNER JOIN users u ON p.uid = u.persona_id 159 | WHERE u.rol_id = 3 AND p.state = 1; 160 | END// 161 | 162 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 163 | 164 | 165 | DELIMITER // 166 | CREATE PROCEDURE SP_ORDERS_BY_DELIVERY(IN ID INT, IN statuss VARCHAR(30)) 167 | BEGIN 168 | SELECT o.id AS order_id, o.delivery_id, o.client_id, CONCAT(p.firstName, " ", p.lastName) AS cliente, p.image AS clientImage, p.phone AS clientPhone, o.address_id, a.street, a.reference, a.Latitude, a.Longitude, o.status, o.pay_type, o.amount, o.currentDate 169 | FROM orders o 170 | INNER JOIN person p ON o.client_id = p.uid 171 | INNER JOIN addresses a ON o.address_id = a.id 172 | WHERE o.status = statuss AND o.delivery_id = ID; 173 | END// 174 | 175 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 176 | 177 | 178 | DELIMITER // 179 | CREATE PROCEDURE SP_ORDERS_FOR_CLIENT(IN ID INT) 180 | BEGIN 181 | SELECT o.id, o.client_id, o.delivery_id, ad.reference, ad.Latitude AS latClient, ad.Longitude AS lngClient ,CONCAT(p.firstName, ' ', p.lastName)AS delivery, p.phone AS deliveryPhone, p.image AS imageDelivery, o.address_id, o.latitude, o.longitude, o.`status`, o.amount, o.pay_type, o.currentDate 182 | FROM orders o 183 | LEFT JOIN person p ON p.uid = o.delivery_id 184 | INNER JOIN addresses ad ON o.address_id = ad.id 185 | WHERE o.client_id = ID 186 | ORDER BY o.id DESC; 187 | END// 188 | 189 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 190 | /*---------------------------------------------------DATA TEST-----------------------------------------------------*/ 191 | /*---------------------------------------------------------------------------------------------------------------------------------------*/ 192 | 193 | /*ADMIN - 1 | CLIENT - 2 | DELIVERY - 3*/ 194 | 195 | /*USER ADMIN DEFAULT*/ 196 | CALL SP_REGISTER('Frave', 'Developer', '986587000', 'without-image.png', 'frave@frave.com', '$2b$10$loiXWqS2XD3Xa5rPwShlwu9tcX3QQYwMHtXNVU0yIrIDQiHigybUC', 1, ''); 197 | 198 | 199 | CALL SP_ADD_CATEGORY('Drinks', 'Description Drinks'); 200 | CALL SP_ADD_CATEGORY('Fast Food','Fast Food Description'); 201 | CALL SP_ADD_CATEGORY('Soda','Soda Description'); 202 | CALL SP_ADD_CATEGORY('Juices','Jucies description'); 203 | CALL SP_ADD_CATEGORY('Pizza','pizza description'); 204 | CALL SP_ADD_CATEGORY('Snacks','Snacks Description'); 205 | CALL SP_ADD_CATEGORY('Salad','Salad Description'); 206 | CALL SP_ADD_CATEGORY('Ice Cream','Ice Cream description'); 207 | 208 | 209 | INSERT INTO products (nameProduct, description, price, category_id) VALUES 210 | ('Heineken', 'heineken Beer heineken Beer heineken Beer heineken Beer heineken Beer heineken Beer heineken Beer heineke', 15, 1), 211 | ('Corona', 'Corona description', 16, 1), 212 | ('Coca Cola', 'Coca Cola description', 5, 3), 213 | ('Pepsi', 'Pepsi description', 7, 3), 214 | ('Sprite', 'Sprite Description', 7, 3), 215 | ('Fanta', 'Fanta Description', 6, 3), 216 | ('Inka cola', 'Inka Cola Description', 9, 3), 217 | ('Hamburguesas', 'Hamburguesas description', 23, 2), 218 | ('Pizza', 'Pizza description', 8.5, 2), 219 | ('Fast food', 'Fast food description', 35, 2), 220 | ('Salad 1', 'Salad 1 description', 45, 7), 221 | ('Salad 2', 'Salad 2 description', 38, 7), 222 | ('Salad 3', 'Salad 3 description', 28, 7), 223 | ('Salad 4', 'Salad 4 description', 39, 7), 224 | ('Salad 5', 'Salad 5 description', 59, 7), 225 | ('Pizza two', 'Pizza two description', 59, 2); 226 | 227 | INSERT INTO imageProduct (picture, product_id) VALUES 228 | ('image-1629821931703.jpg', 1),('image-1629821931725.png', 1),('image-1629821931706.jpg', 1), 229 | ('image-1629870138818.jpg', 2),('image-1629870138832.jpg', 2),('image-1629870138806.jpg', 2), 230 | ('image-1629870179686.jpg', 3),('image-1629870179668.jpg', 3),('image-1629870179673.jpg', 3), 231 | ('image-1629870261732.jpg', 4),('image-1629870261705.jpg', 4),('image-1629870261720.jpg', 4), 232 | ('image-1629870352886.jpg', 5),('image-1629870352860.jpg', 5),('image-1629870352878.jpg', 5), 233 | ('image-1629870430590.jpg', 6),('image-1629870430603.jpg', 6), 234 | ('image-1629870531978.jpg', 7),('image-1629870531950.jpg', 7),('image-1629870531968.jpg', 7), 235 | ('image-1629870638120.jpg', 8),('image-1629870638087.jpg', 8),('image-1629870638103.jpg', 8), 236 | ('image-1629870722161.jpg', 9),('image-1629870722097.jpg', 9),('image-1629870722142.jpg', 9), 237 | ('image-1629870861994.jpg', 10),('image-1629870861987.jpg', 10),('image-1629870861988.jpg', 10), 238 | ('image-1629870963896.jpg', 11),('image-1629870963870.jpg', 11),('image-1629870963885.jpg', 11), 239 | ('image-1629871015906.jpg', 12),('image-1629871015857.jpg', 12),('image-1629871015882.jpg', 12), 240 | ('image-1629871040235.jpg', 13),('image-1629871040124.jpg', 13),('image-1629871040218.jpg', 13), 241 | ('image-1629871070308.jpg', 14),('image-1629871070269.jpg', 14),('image-1629871070286.jpg', 14), 242 | ('image-1629871097936.jpg', 15),('image-1629871097906.jpg', 15),('image-1629871097926.jpg', 15), 243 | ('image-1629871137001.jpg', 16),('image-1629871136311.jpg', 16),('image-1629871136326.jpg', 16); 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | -------------------------------------------------------------------------------- /src/Router/Auth.routes.js: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | import { verifyToken } from '../Middleware/ValidateToken'; 3 | import * as login from '../Controller/LoginController'; 4 | 5 | const router = Router(); 6 | 7 | 8 | router.post('/login-email-id', login.loginController); 9 | router.get('/renew-token-login', verifyToken ,login.renewTokenLogin); 10 | 11 | 12 | 13 | export default router; -------------------------------------------------------------------------------- /src/Router/Category.routes.js: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | import * as category from '../Controller/CategoryController'; 3 | import { getAllDelivery } from '../Controller/DeliveryController'; 4 | import { verifyToken } from '../Middleware/ValidateToken'; 5 | 6 | const router = Router(); 7 | 8 | 9 | router.post('/add-categories', verifyToken, category.addCategories); 10 | router.get('/get-all-categories', verifyToken, category.getAllCategories ); 11 | router.get('/get-all-delivery', verifyToken, getAllDelivery); 12 | 13 | export default router; -------------------------------------------------------------------------------- /src/Router/Order.routes.js: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | import * as orders from '../Controller/OrdersController'; 3 | import * as client from '../Controller/ClientController'; 4 | import { verifyToken } from '../Middleware/ValidateToken'; 5 | 6 | const router = Router(); 7 | 8 | 9 | router.post('/add-new-orders', verifyToken, orders.addNewOrders ); 10 | router.get('/get-orders-by-status/:statusOrder', verifyToken, orders.getOrdersByStatus ); 11 | router.get('/get-details-order-by-id/:idOrderDetails', verifyToken, orders.getDetailsOrderById ); 12 | router.put('/update-status-order-dispatched', verifyToken, orders.updateStatusToDispatched ); 13 | router.get('/get-all-orders-by-delivery/:statusOrder', verifyToken, orders.getOrdersByDelivery ); 14 | router.put('/update-status-order-on-way/:idOrder', verifyToken, orders.updateStatusToOntheWay ); 15 | router.put('/update-status-order-delivered/:idOrder', verifyToken, orders.updateStatusToDelivered ); 16 | 17 | router.get('/get-list-orders-for-client', verifyToken, client.getListOrdersForClient); 18 | 19 | 20 | export default router; -------------------------------------------------------------------------------- /src/Router/Product.routes.js: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | 3 | import * as product from '../Controller/ProductController'; 4 | import { upLoadsProducts } from '../Lib/Multer'; 5 | import { verifyToken } from '../Middleware/ValidateToken'; 6 | 7 | const router = Router(); 8 | 9 | 10 | router.post('/add-new-products', [ verifyToken, upLoadsProducts.array('image') ], product.addNewProduct); 11 | router.get('/get-products-top-home', verifyToken, product.getProductsTopHome); 12 | router.get('/get-images-products/:id', verifyToken, product.getImagesProducts ); 13 | router.get('/search-product-for-name/:nameProduct', verifyToken, product.searchProductForName ); 14 | router.get('/search-product-for-category/:idCategory', verifyToken, product.searchProductsForCategory ); 15 | router.get('/list-porducts-admin', verifyToken, product.listProductsAdmin ); 16 | router.put('/update-status-product', verifyToken, product.updateStatusProduct); 17 | router.delete('/delete-product/:idProduct', verifyToken, product.deleteProduct); 18 | 19 | 20 | export default router; -------------------------------------------------------------------------------- /src/Router/User.routes.js: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | import { verifyToken } from '../Middleware/ValidateToken'; 3 | import * as register from '../Controller/RegisterController'; 4 | import * as user from '../Controller/UserController'; 5 | import { upLoadsProfile } from '../Lib/Multer'; 6 | 7 | const router = Router(); 8 | 9 | 10 | router.post('/register-client', upLoadsProfile.single('image'), register.registerClient ); 11 | router.post('/register-delivery', [ verifyToken, upLoadsProfile.single('image') ], register.registerDelivery ); 12 | 13 | router.get('/get-user-by-id', verifyToken, user.getUserById); 14 | router.put('/edit-profile', verifyToken, user.editProfile); 15 | router.get('/get-user-updated', verifyToken, user.getUserUpdated); 16 | router.put('/change-password', verifyToken, user.changePassword); 17 | router.put('/change-image-profile', [verifyToken, upLoadsProfile.single('image')] , user.changeImageProfile ); 18 | router.get('/get-addresses', verifyToken, user.getAddressesUser ); 19 | router.delete('/delete-street-address/:idAddress', verifyToken, user.deleteStreetAddress ); 20 | router.post('/add-new-address', verifyToken, user.addStreetAddress ); 21 | router.get('/get-address', verifyToken, user.getAddressOne ); 22 | router.put('/update-notification-token', verifyToken, user.updateNotificationToken ); 23 | router.get('/get-admins-notification-token', verifyToken , user.getAdminNotificationToken ); 24 | router.put('/update-delivery-to-client/:idPerson', verifyToken, user.updateDeliveryToClient ); 25 | 26 | export default router; -------------------------------------------------------------------------------- /src/Sockets/SocketOrderDelivery.js: -------------------------------------------------------------------------------- 1 | 2 | export const socketOrderDelivery = (io) => { 3 | 4 | const nameSpaceOrders = io.of('/orders-delivery-socket'); 5 | 6 | nameSpaceOrders.on('connection', socket => { 7 | 8 | console.log('USER CONECTED'); 9 | 10 | socket.on('position', (data) => { 11 | 12 | // console.log(`DATA FLUTTER ${JSON.stringify(data)}`); 13 | 14 | nameSpaceOrders.emit(`position/${data.idOrder}`, { latitude: data.latitude, longitude: data.longitude }); 15 | 16 | }); 17 | 18 | socket.on('disconnect', (data) => { 19 | console.log('USER DISCONNECT'); 20 | }); 21 | 22 | }); 23 | 24 | } 25 | 26 | -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629821931703.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629821931703.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629821931706.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629821931706.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629821931725.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629821931725.png -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870138806.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870138806.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870138818.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870138818.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870138832.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870138832.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870179668.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870179668.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870179673.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870179673.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870179686.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870179686.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870261705.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870261705.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870261720.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870261720.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870261732.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870261732.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870352860.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870352860.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870352878.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870352878.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870352886.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870352886.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870430590.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870430590.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870430603.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870430603.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870531950.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870531950.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870531968.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870531968.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870531978.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870531978.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870638087.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870638087.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870638103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870638103.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870638120.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870638120.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870722097.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870722097.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870722142.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870722142.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870722161.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870722161.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870861987.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870861987.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870861988.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870861988.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870861994.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870861994.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870963870.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870963870.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870963885.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870963885.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629870963896.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629870963896.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871015857.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871015857.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871015882.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871015882.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871015906.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871015906.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871040124.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871040124.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871040218.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871040218.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871040235.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871040235.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871070269.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871070269.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871070286.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871070286.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871070308.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871070308.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871097906.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871097906.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871097926.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871097926.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871097936.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871097936.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871136311.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871136311.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871136326.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871136326.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1629871137001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1629871137001.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1632453837379.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1632453837379.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1632453837395.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1632453837395.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1632453837414.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1632453837414.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1632461845545.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1632461845545.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1632461845580.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1632461845580.jpg -------------------------------------------------------------------------------- /src/Uploads/Products/image-1632461845632.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Products/image-1632461845632.jpg -------------------------------------------------------------------------------- /src/Uploads/Profile/image-1632700696972.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Profile/image-1632700696972.png -------------------------------------------------------------------------------- /src/Uploads/Profile/image-1632717633130.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Profile/image-1632717633130.png -------------------------------------------------------------------------------- /src/Uploads/Profile/image-1632722489167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frave07/Backend-Delivery-App-Flutter/992762da5214b1515966e48b9a14a4986cde87c7/src/Uploads/Profile/image-1632722489167.png --------------------------------------------------------------------------------