mysql-endpoint-express
Version:
MySQL Connection on Express JS (Api Endpoint)
138 lines (125 loc) • 4.46 kB
JavaScript
require('dotenv').config();
const express = require('express');
const mysql = require('mysql');
const app = express();
app.use(express.json());
const connection = mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE
});
connection.connect();
app.use((req, res, next) => {
const allowedOrigin = process.env.ALLOWED_ORIGIN;
const allowedMethods = process.env.ALLOWED_METHODS;
const allowedHeaders = process.env.ALLOWED_HEADERS;
res.setHeader('Access-Control-Allow-Origin', allowedOrigin);
res.setHeader('Access-Control-Allow-Methods', allowedMethods);
res.setHeader('Access-Control-Allow-Headers', allowedHeaders);
next();
});
const checkRole = (allowedRoles) => {
return (req, res, next) => {
const role = req.headers.role;
if (allowedRoles.includes(role) || !role) {
next();
} else {
res.status(403).send('Forbidden');
}
};
};
app.get('/api', checkRole([process.env.PREFIX_ROLE]), (req, res) => {
connection.query('SHOW TABLES', (error, tables) => {
if (error) throw error;
const tableNames = tables.map(table => table[`Tables_in_${connection.config.database}`]);
const data = {};
tableNames.forEach(table => {
connection.query(`SELECT * FROM ${table}`, (error, results) => {
if (error) throw error;
data[table] = results;
if (Object.keys(data).length === tableNames.length) {
res.json(data);
}
});
});
});
});
app.get('/api/:table', checkRole([process.env.PREFIX_ROLE]), (req, res) => {
const { table } = req.params;
connection.query(`SELECT * FROM ${table}`, (error, results) => {
if (error) {
res.status(500).send('Error retrieving data from database');
} else {
res.status(200).json(results);
}
});
});
app.post('/api/:table', checkRole([process.env.PREFIX_ROLE]), (req, res) => {
const { table } = req.params;
const data = req.body;
connection.query(`INSERT INTO ${table} SET ?`, data, (error, results) => {
if (error) {
res.status(500).send('Error creating data in database');
} else {
res.status(201).send('Data created successfully');
}
});
});
app.put('/api/:table/:id', checkRole([process.env.PREFIX_ROLE]), (req, res) => {
const { table, id } = req.params;
const data = req.body;
connection.query(`SHOW KEYS FROM ${table} WHERE Key_name = 'PRIMARY'`, (error, results) => {
if (error) {
console.log(error);
res.status(500).send('Error retrieving primary key information');
} else {
if (results.length > 0) {
const primaryKeyColumn = results[0].Column_name;
connection.query(`UPDATE ${table} SET ? WHERE ${primaryKeyColumn} = ?`, [data, id], (error, results) => {
if (error) {
console.log(error);
res.status(500).send('Error updating data in database');
} else {
res.status(200).send('Data updated successfully');
}
});
} else {
res.status(404).send('Primary key not found in table');
}
}
});
});
app.delete('/api/:table/:id', checkRole([process.env.PREFIX_ROLE]), (req, res) => {
const { table, id } = req.params;
connection.query(`SHOW KEYS FROM ${table} WHERE Key_name = 'PRIMARY'`, (error, results) => {
if (error) {
console.log(error);
res.status(500).send('Error retrieving primary key information');
} else {
if (results.length > 0) {
const primaryKeyColumn = results[0].Column_name;
connection.query(`DELETE FROM ${table} WHERE ${primaryKeyColumn} = ?`, [id], (error, deleteResult) => {
if (error) {
console.log(error);
res.status(500).send('Error deleting data from database');
} else {
res.status(200).send('Data deleted successfully');
}
});
} else {
res.status(404).send('Primary key not found in table');
}
}
});
});
app.get('/', (req, res) => {
res.status(200).send('Server Running, Go ../api');
});
app.get('*', (req, res) => {
res.status(404).send('Data not found');
});
app.listen(process.env.DB_PORT, () => {
console.log('Server is running on port ' + process.env.DB_PORT);
});
module.exports = app;