First commit
This commit is contained in:
commit
5a8e65a471
55
index.js
Normal file
55
index.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
const { launchWeb } = require('./web.js');
|
||||||
|
const { EventEmitter } = require('events');
|
||||||
|
const Sequelize = require('sequelize');
|
||||||
|
|
||||||
|
const sequelize = new Sequelize("database", "user", "password", {
|
||||||
|
host: "localhost",
|
||||||
|
dialect: "sqlite",
|
||||||
|
logging: false,
|
||||||
|
storage: "database.sqlite",
|
||||||
|
});
|
||||||
|
|
||||||
|
const contactsDB = sequelize.define("contacts", {
|
||||||
|
phone: {
|
||||||
|
type: Sequelize.STRING,
|
||||||
|
primaryKey: true,
|
||||||
|
},
|
||||||
|
firstName: {
|
||||||
|
type: Sequelize.STRING,
|
||||||
|
},
|
||||||
|
lastName: {
|
||||||
|
type: Sequelize.STRING,
|
||||||
|
},
|
||||||
|
called: {
|
||||||
|
type: Sequelize.INTEGER,// 0: not called - 1: called - 2: ongoing call (- 3: no response ?)
|
||||||
|
defaultValue: false,
|
||||||
|
},
|
||||||
|
vote: {
|
||||||
|
type: Sequelize.BOOLEAN,
|
||||||
|
defaultValue: false,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
contactsDB.sync();
|
||||||
|
|
||||||
|
global.database = {};
|
||||||
|
global.database.contacts = contactsDB
|
||||||
|
|
||||||
|
const submitEvent = new EventEmitter();
|
||||||
|
launchWeb(submitEvent);
|
||||||
|
|
||||||
|
submitEvent.on('call', async (call) => {
|
||||||
|
let vote;
|
||||||
|
if(call.vote) {
|
||||||
|
console.log(`${call.phone} va voter`);
|
||||||
|
vote = 1;
|
||||||
|
} else {
|
||||||
|
console.log(`${call.phone} ne va pas voter`);
|
||||||
|
vote = 0;
|
||||||
|
}
|
||||||
|
await global.database.contacts.update({ vote: vote }, { where: { phone: call.phone } })
|
||||||
|
});
|
||||||
|
submitEvent.on('add', (request) => {
|
||||||
|
console.log(request);
|
||||||
|
});
|
||||||
|
|
16
package.json
Normal file
16
package.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "autocallmenu",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Website for automatic phone number displaying from a database",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "Ninjdai",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.2",
|
||||||
|
"sequelize": "^6.35.1",
|
||||||
|
"sqlite3": "^5.1.6"
|
||||||
|
}
|
||||||
|
}
|
0
src/database/addUser.js
Normal file
0
src/database/addUser.js
Normal file
13
src/database/getUser.js
Normal file
13
src/database/getUser.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
async function getRandomUser() {
|
||||||
|
const user = await global.database.contacts.findOne({ where: { called: 0}});
|
||||||
|
if (!user || user == 0) return false;
|
||||||
|
await global.database.contacts.update({ called: 2 }, { where: { phone: user.dataValues.phone}});
|
||||||
|
const count = await global.database.contacts.count({ where: {called: 0} });
|
||||||
|
return {
|
||||||
|
name: `${user.dataValues.firstName} ${user.dataValues.lastName}`,
|
||||||
|
phone: user.dataValues.phone,
|
||||||
|
count: count,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getRandomUser };
|
19
src/html/callHTML.js
Normal file
19
src/html/callHTML.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
function generateCallHTML(phoneNumber, name, callcount) {
|
||||||
|
const head = `<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><link rel="stylesheet" type="text/css" href="/assets/css/form.css" /><title>AutoCallMenu</title></head>`;
|
||||||
|
const form = `
|
||||||
|
<form action="/inputs/call" method="post">
|
||||||
|
<input type="hidden" name="phone" value="${phoneNumber}">
|
||||||
|
<label class="switch">
|
||||||
|
<input type="checkbox" name="vote">
|
||||||
|
<span class="slider round"></span>
|
||||||
|
</label>
|
||||||
|
<label for="vote">Vote ?</label>
|
||||||
|
<br>
|
||||||
|
<button class="submit" type="submit">CONFIRMER</button>
|
||||||
|
</form>
|
||||||
|
`;
|
||||||
|
const body = `<body><h1>Bienvenue :3</h1><h2>Appel: ${name} - ${phoneNumber}</h2><p>${callcount} appels restants</p>${form}</body>`;
|
||||||
|
return `<!DOCTYPE html><html>${head}${body}</html>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { generateCallHTML };
|
41
web.js
Normal file
41
web.js
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
const express = require('express');
|
||||||
|
const { readFile } = require('fs').promises;
|
||||||
|
const { generateCallHTML } = require('./src/html/callHTML.js');
|
||||||
|
const { getRandomUser } = require('./src/database/getUser.js');
|
||||||
|
|
||||||
|
function launchWeb(submitEvent){
|
||||||
|
const app = express();
|
||||||
|
|
||||||
|
app.use(express.json()); // Used to parse JSON bodies
|
||||||
|
app.use(express.urlencoded({ extended: false })); //Parse URL-encoded bodies
|
||||||
|
|
||||||
|
app.use('/assets', express.static('./www/assets'))
|
||||||
|
|
||||||
|
app.get('/', async (request, response) => {
|
||||||
|
response.send(await readFile('./www/index.html', 'utf8'));
|
||||||
|
});
|
||||||
|
app.get('/call', async (request, response) => {
|
||||||
|
response.send(await generateCallResponse());
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post('/inputs/call', async (request, response) => {
|
||||||
|
submitEvent.emit('call', request.body);
|
||||||
|
response.send(await generateCallResponse());
|
||||||
|
});
|
||||||
|
app.post('/inputs/add', async (request, response) => {
|
||||||
|
submitEvent.emit('add', request);
|
||||||
|
});
|
||||||
|
|
||||||
|
const PORT = process.env.PORT || 3000;
|
||||||
|
app.listen(PORT, () => { console.log(`App available at http://localhost:${PORT}`) });
|
||||||
|
};
|
||||||
|
|
||||||
|
async function generateCallResponse(){
|
||||||
|
const user = await getRandomUser();
|
||||||
|
let callHTML;
|
||||||
|
if(user) callHTML = generateCallHTML( user.phone, user.name, user.count );
|
||||||
|
else callHTML = `Plus d'utilisateur à appeler !`;
|
||||||
|
return callHTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { launchWeb };
|
73
www/assets/css/form.css
Normal file
73
www/assets/css/form.css
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
.switch {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 60px;
|
||||||
|
height: 34px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.switch input {
|
||||||
|
opacity: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider {
|
||||||
|
position: absolute;
|
||||||
|
cursor: pointer;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: #ccc;
|
||||||
|
-webkit-transition: .4s;
|
||||||
|
transition: .4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider:before {
|
||||||
|
position: absolute;
|
||||||
|
content: "";
|
||||||
|
height: 26px;
|
||||||
|
width: 26px;
|
||||||
|
left: 4px;
|
||||||
|
bottom: 4px;
|
||||||
|
background-color: white;
|
||||||
|
-webkit-transition: .4s;
|
||||||
|
transition: .4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:checked + .slider {
|
||||||
|
background-color: #2196F3;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:focus + .slider {
|
||||||
|
box-shadow: 0 0 1px #2196F3;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:checked + .slider:before {
|
||||||
|
-webkit-transform: translateX(26px);
|
||||||
|
-ms-transform: translateX(26px);
|
||||||
|
transform: translateX(26px);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Rounded sliders */
|
||||||
|
.slider.round {
|
||||||
|
border-radius: 34px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.round:before {
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit {
|
||||||
|
background-color: #04AA6D;
|
||||||
|
color: white;
|
||||||
|
padding: 14px 20px;
|
||||||
|
margin: 8px 0;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
40
www/assets/js/form.js
Normal file
40
www/assets/js/form.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
//Get the form element by id
|
||||||
|
const callForm = document.getElementById("call-form");
|
||||||
|
|
||||||
|
callForm.addEventListener("submit", async (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
let form = e.currentTarget;
|
||||||
|
let url = form.action;
|
||||||
|
try {
|
||||||
|
let formData = new FormData(form);
|
||||||
|
console.log(form)
|
||||||
|
console.log(formData)
|
||||||
|
let responseData = await postFormFieldsAsJson({ url, formData });
|
||||||
|
let { serverDataResponse } = responseData;
|
||||||
|
console.log(serverDataResponse);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
async function postFormFieldsAsJson({ url, formData }) {
|
||||||
|
let formDataObject = Object.fromEntries(formData.entries());
|
||||||
|
let formDataJsonString = JSON.stringify(formDataObject);
|
||||||
|
let fetchOptions = {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Accept: "application/json",
|
||||||
|
},
|
||||||
|
body: formDataJsonString,
|
||||||
|
};
|
||||||
|
console.log(fetchOptions);
|
||||||
|
|
||||||
|
let res = await fetch(url, fetchOptions);
|
||||||
|
|
||||||
|
if (!res.ok) {
|
||||||
|
let error = await res.text();
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
return res.json();
|
||||||
|
}
|
13
www/index.html
Normal file
13
www/index.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||||
|
<title>AutoCallMenu</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Bienvenue :3</h1>
|
||||||
|
<a href="/call"><p>Accéder aux téléphones</p></a>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user