Add apilog route and remove unused files
This commit is contained in:
parent
9c5aaed414
commit
8836a3cfd4
@ -1,162 +0,0 @@
|
|||||||
const buttons = document.querySelectorAll('.button-container button');
|
|
||||||
const ctx = document.getElementById('dataChart').getContext('2d');
|
|
||||||
|
|
||||||
// Initial dataset (AQI)
|
|
||||||
const initialData = {
|
|
||||||
labels: ['', 'Jan 22 11:00 PM', '', '', 'Jan 23 2:00 AM', '', '', 'Jan 23 5:00 AM', '', '', 'Jan 23 8:00 AM', '',],
|
|
||||||
datasets: [{
|
|
||||||
label: 'AQI',
|
|
||||||
data: [50, 60, 60, 80, 30, 60, 54, 60, 43, 30, 60, 60],
|
|
||||||
backgroundColor: 'green',
|
|
||||||
borderColor: 'green',
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
|
|
||||||
const chart = new Chart(ctx, {
|
|
||||||
type: 'bar',
|
|
||||||
data: initialData,
|
|
||||||
options: {
|
|
||||||
responsive: true,
|
|
||||||
title: {
|
|
||||||
display: true,
|
|
||||||
text: 'HISTORICAL'
|
|
||||||
},
|
|
||||||
subtitle: {
|
|
||||||
display: true,
|
|
||||||
text: 'Historic air quality graph for Singapore'
|
|
||||||
},
|
|
||||||
legend: {
|
|
||||||
display: false
|
|
||||||
},
|
|
||||||
tooltips: {
|
|
||||||
mode: 'index',
|
|
||||||
intersect: false,
|
|
||||||
callbacks: {
|
|
||||||
label: function (tooltipItem, data) {
|
|
||||||
const label = data.labels[tooltipItem.index];
|
|
||||||
return label + ': ' + data.datasets[0].data[tooltipItem.index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
scales: {
|
|
||||||
xAxes: [{
|
|
||||||
barPercentage: 0.6,
|
|
||||||
categoryPercentage: 0.7,
|
|
||||||
ticks: {
|
|
||||||
autoSkip: true,
|
|
||||||
},
|
|
||||||
maxRotation: 0,
|
|
||||||
minRotation: 0
|
|
||||||
}],
|
|
||||||
yAxes: [{
|
|
||||||
title: {
|
|
||||||
display: true,
|
|
||||||
text: 'Value'
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Function to update chart data based on the selected button
|
|
||||||
const updateChart = (data) => {
|
|
||||||
chart.data = data;
|
|
||||||
chart.update();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Event listener for button clicks
|
|
||||||
buttons.forEach(button => {
|
|
||||||
button.addEventListener('click', () => {
|
|
||||||
// Implement logic to switch data based on clicked button
|
|
||||||
const buttonId = button.id.toLowerCase();
|
|
||||||
let newData;
|
|
||||||
|
|
||||||
// Example: Switch data based on button clicked
|
|
||||||
switch (buttonId) {
|
|
||||||
case 'aqibutton':
|
|
||||||
newData = {
|
|
||||||
labels: ['', 'Jan 22 11:00 PM', '', '', 'Jan 23 2:00 AM', '', '', 'Jan 23 5:00 AM', '', '', 'Jan 23 8:00 AM', '',],
|
|
||||||
datasets: [{
|
|
||||||
label: 'AQI',
|
|
||||||
data: [50, 60, 60, 80, 30, 60, 54, 60, 43, 30, 60, 60],
|
|
||||||
backgroundColor: 'green',
|
|
||||||
borderColor: 'green',
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'tempbutton':
|
|
||||||
newData = {
|
|
||||||
labels: ['Jan 22 11:00 PM', 'Jan 23 12:00 AM', 'Jan 23 1:00 AM', 'Jan 23 2:00 AM'],
|
|
||||||
datasets: [{
|
|
||||||
label: 'Temperature',
|
|
||||||
data: [25, 30, 40, 35],
|
|
||||||
backgroundColor: 'green',
|
|
||||||
borderColor: 'green',
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case 'humbutton':
|
|
||||||
newData = {
|
|
||||||
labels: ['Jan 22 11:00 PM', 'Jan 23 12:00 AM', 'Jan 23 1:00 AM', 'Jan 23 2:00 AM'],
|
|
||||||
datasets: [{
|
|
||||||
label: 'Humidity',
|
|
||||||
data: [25, 30, 40, 35],
|
|
||||||
backgroundColor: 'green',
|
|
||||||
borderColor: 'green',
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case 'o3button':
|
|
||||||
newData = {
|
|
||||||
labels: ['Jan 22 11:00 PM', 'Jan 23 12:00 AM', 'Jan 23 1:00 AM', 'Jan 23 2:00 AM'],
|
|
||||||
datasets: [{
|
|
||||||
label: 'O3',
|
|
||||||
data: [25, 30, 40, 35],
|
|
||||||
backgroundColor: 'green',
|
|
||||||
borderColor: 'green',
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case 'no2button':
|
|
||||||
newData = {
|
|
||||||
labels: ['Jan 22 11:00 PM', 'Jan 23 12:00 AM', 'Jan 23 1:00 AM', 'Jan 23 2:00 AM'],
|
|
||||||
datasets: [{
|
|
||||||
label: 'NO2',
|
|
||||||
data: [25, 30, 40, 35],
|
|
||||||
backgroundColor: 'green',
|
|
||||||
borderColor: 'green',
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case 'so2button':
|
|
||||||
newData = {
|
|
||||||
labels: ['Jan 22 11:00 PM', 'Jan 23 12:00 AM', 'Jan 23 1:00 AM', 'Jan 23 2:00 AM'],
|
|
||||||
datasets: [{
|
|
||||||
label: 'SO2',
|
|
||||||
data: [25, 30, 40, 35],
|
|
||||||
backgroundColor: 'green',
|
|
||||||
borderColor: 'green',
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case 'cobutton':
|
|
||||||
newData = {
|
|
||||||
labels: ['Jan 22 11:00 PM', 'Jan 23 12:00 AM', 'Jan 23 1:00 AM', 'Jan 23 2:00 AM'],
|
|
||||||
datasets: [{
|
|
||||||
label: 'CO',
|
|
||||||
data: [25, 30, 40, 35],
|
|
||||||
backgroundColor: 'green',
|
|
||||||
borderColor: 'green',
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
newData = initialData; // Default to initial data (AQI)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateChart(newData);
|
|
||||||
});
|
|
||||||
});
|
|
11
consumerWebsite/functions/apilog.js
Normal file
11
consumerWebsite/functions/apilog.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
const { api_log_Model } = require("../database/model/apiLogModel");
|
||||||
|
const {Op} = require("sequelize");
|
||||||
|
|
||||||
|
async function getAllLog(){
|
||||||
|
return await api_log_Model.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = { getAllLog };
|
@ -18,6 +18,9 @@ router.use('/sensor', [auth, APIlogger], require('./sensor.js'));
|
|||||||
//sensor data route
|
//sensor data route
|
||||||
router.use('/sensor-data', [auth, APIlogger], require('./sensorData.js'));
|
router.use('/sensor-data', [auth, APIlogger], require('./sensorData.js'));
|
||||||
|
|
||||||
|
//apilog route
|
||||||
|
router.use('/apilog', [APIlogger], require('./apilog.js'));
|
||||||
|
|
||||||
//latest sensor data to display on dashboard
|
//latest sensor data to display on dashboard
|
||||||
router.use('/latest-sensor-data', [APIlogger], require('./latestsensorData.js'));
|
router.use('/latest-sensor-data', [APIlogger], require('./latestsensorData.js'));
|
||||||
|
|
||||||
|
34
consumerWebsite/routes/apilog.js
Normal file
34
consumerWebsite/routes/apilog.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
//functions if needed
|
||||||
|
const {
|
||||||
|
getAllLog
|
||||||
|
} = require("../functions/apilog.js");
|
||||||
|
|
||||||
|
const express = require("express");
|
||||||
|
const router = express.Router();
|
||||||
|
|
||||||
|
//get all
|
||||||
|
router.get("/", async (req, res, next) => {
|
||||||
|
let Res = await getAllLog();
|
||||||
|
res.json(Res);
|
||||||
|
});
|
||||||
|
|
||||||
|
//get by route name?
|
||||||
|
router.get("/route/:name", async (req, res, next) => {
|
||||||
|
});
|
||||||
|
|
||||||
|
//get ny status?
|
||||||
|
router.get("/status/:status", async (req, res, next) => {
|
||||||
|
});
|
||||||
|
|
||||||
|
//by method
|
||||||
|
router.get("/method/:method", async (req, res, next) => {
|
||||||
|
});
|
||||||
|
|
||||||
|
//by ip
|
||||||
|
router.get("/ip/:ip", async (req, res, next) => {
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = router;
|
277
example.html
277
example.html
@ -1,277 +0,0 @@
|
|||||||
<%- include('top') %>
|
|
||||||
<style>
|
|
||||||
#sensorDataAverage {
|
|
||||||
padding-top: 2.5em;
|
|
||||||
padding-bottom: 2.5em;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
|
|
||||||
<div class="row" id="sensorDataAverage" jq-repeat='sensorDataAverage'>
|
|
||||||
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div id="workerStatusCard" class="card shadow-lg">
|
|
||||||
<h5 class="card-header">
|
|
||||||
Air Quality Index
|
|
||||||
</h5>
|
|
||||||
<div class="card-body">
|
|
||||||
Average: {{average.aqi}}
|
|
||||||
<br />
|
|
||||||
latest: {{latest.aqi}}
|
|
||||||
</div>
|
|
||||||
<div class="card-footer">
|
|
||||||
<button type="button" class="btn btn-success">
|
|
||||||
Learn More
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div id="workerStatusCard" class="card shadow-lg">
|
|
||||||
<h5 class="card-header">
|
|
||||||
Humidity
|
|
||||||
</h5>
|
|
||||||
<div class="card-body">
|
|
||||||
Average: {{average.humidity}}
|
|
||||||
<br />
|
|
||||||
latest: {{latest.humidity}}
|
|
||||||
</div>
|
|
||||||
<div class="card-footer">
|
|
||||||
<button type="button" class="btn btn-success">
|
|
||||||
Learn More
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div id="workerStatusCard" class="card shadow-lg">
|
|
||||||
<h5 class="card-header">
|
|
||||||
Temperature
|
|
||||||
</h5>
|
|
||||||
<div class="card-body">
|
|
||||||
Average: {{average.temperature}}
|
|
||||||
<br />
|
|
||||||
latest: {{latest.temperature}}
|
|
||||||
</div>
|
|
||||||
<div class="card-footer">
|
|
||||||
<button type="button" class="btn btn-success">
|
|
||||||
Learn More
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div id="workerStatusCard" class="card shadow-lg">
|
|
||||||
<h5 class="card-header">
|
|
||||||
Wind Speed
|
|
||||||
</h5>
|
|
||||||
<div class="card-body">
|
|
||||||
Average: {{average.windspeed}}
|
|
||||||
<br />
|
|
||||||
latest: {{latest.windspeed}}
|
|
||||||
</div>
|
|
||||||
<div class="card-footer">
|
|
||||||
<button type="button" class="btn btn-success">
|
|
||||||
Learn More
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row" jq-repeat-defualt='sensorDataAverage'>
|
|
||||||
Loading...
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
function extractNumbers(str) {
|
|
||||||
if(typeof str === 'number') return str;
|
|
||||||
return str.match(/\d+/)[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
function calculateAverage(numbers) {
|
|
||||||
if (numbers.length === 0) return 0
|
|
||||||
const sum = numbers.reduce((acc, num) => acc + num, 0);
|
|
||||||
return sum / numbers.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
const values = {
|
|
||||||
aqi: [],
|
|
||||||
humidity: [],
|
|
||||||
temperature: [],
|
|
||||||
windspeed: [],
|
|
||||||
};
|
|
||||||
|
|
||||||
function parseRowToTemplace(row){
|
|
||||||
|
|
||||||
values.aqi.unshift(extractNumbers(row.measurement.o3))
|
|
||||||
values.humidity.unshift(extractNumbers(row.measurement.humidity))
|
|
||||||
values.temperature.unshift(extractNumbers(row.measurement.temperature))
|
|
||||||
values.windspeed.unshift(extractNumbers(row.measurement.windspeed))
|
|
||||||
|
|
||||||
return {
|
|
||||||
average: {
|
|
||||||
aqi: parseInt(calculateAverage(values.aqi)),
|
|
||||||
humidity: parseInt(calculateAverage(values.humidity)),
|
|
||||||
temperature: parseInt(calculateAverage(values.temperature)),
|
|
||||||
windspeed: parseInt(calculateAverage(values.windspeed)),
|
|
||||||
},
|
|
||||||
latest: {
|
|
||||||
aqi: values.humidity[0],
|
|
||||||
humidity: values.humidity[0],
|
|
||||||
temperature: values.humidity[0],
|
|
||||||
windspeed: values.windspeed[0],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$(document).ready(async function () {
|
|
||||||
app.api.get('sensor-data/data?order=DESC&limit=40', function(error, data){
|
|
||||||
for(let row of data){
|
|
||||||
$.scope.sensorDataAverage.update(parseRowToTemplace(row));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
app.socket.on('sensorData:new', function(row){
|
|
||||||
$.scope.sensorDataAverage.update(parseRowToTemplace(row));
|
|
||||||
})
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<%- include('bot') %>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Location</td>
|
|
||||||
<td>JSON</td>
|
|
||||||
<td>Location</td>
|
|
||||||
<td>(Required) Location Example: curl https://api.teeseng.uk/api/v0/sensor/new
|
|
||||||
-H "Authorization: provide
|
|
||||||
your API key here" -d '{"location": "11"}'</td>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="overflow-hidden content-section" id="content-get-api">
|
|
||||||
<div class="api-keys-header">
|
|
||||||
<h2>API Keys</h2>
|
|
||||||
<button class="generate-key-button">Generate Key</button>
|
|
||||||
<p>
|
|
||||||
You can generate API Keys here:
|
|
||||||
</p>
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Name</th>
|
|
||||||
<th>Public Key</th>
|
|
||||||
<th>Private Key</th>
|
|
||||||
<th>Key Type</th>
|
|
||||||
<th>Created</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>API Key</td>
|
|
||||||
<td>GR234-We34</td>
|
|
||||||
<td>greR-234-fEG</td>
|
|
||||||
<td>Type</td>
|
|
||||||
<td>2024-01-22</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="overflow-hidden content-section" id="content-errors">
|
|
||||||
<h2>Errors</h2>
|
|
||||||
<p>
|
|
||||||
The Westeros API uses the following error codes:
|
|
||||||
</p>
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Error Code</th>
|
|
||||||
<th>Meaning</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>X000</td>
|
|
||||||
<td>
|
|
||||||
Some parameters are missing. This error appears when you don't pass every mandatory
|
|
||||||
parameters.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>403</td>
|
|
||||||
<td>
|
|
||||||
Unknown or unvalid <code class="higlighted">secret_key</code>. This error appears if
|
|
||||||
you use an unknow API key or if your API key expired.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>500</td>
|
|
||||||
<td>
|
|
||||||
Unvalid <code class="higlighted">secret_key</code> No API key was supplied. Invalid
|
|
||||||
request.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>X003</td>
|
|
||||||
<td>
|
|
||||||
Unknown or unvalid user <code class="higlighted">token</code>. This error appears if
|
|
||||||
you use an unknow user <code class="higlighted">token</code> or if the user <code
|
|
||||||
class="higlighted">token</code> expired.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="overflow-hidden content-section" id="content-get-api">
|
|
||||||
<div class="api-keys-header">
|
|
||||||
<h2>API Keys</h2>
|
|
||||||
<button class="generate-key-button">Generate Key</button>
|
|
||||||
<p>
|
|
||||||
You can generate API Keys here:
|
|
||||||
</p>
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Name</th>
|
|
||||||
<th>Public Key</th>
|
|
||||||
<th>Private Key</th>
|
|
||||||
<th>Key Type</th>
|
|
||||||
<th>Created</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>API Key</td>
|
|
||||||
<td>GR234-We34</td>
|
|
||||||
<td>greR-234-fEG</td>
|
|
||||||
<td>Type</td>
|
|
||||||
<td>2024-01-22</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="api-keys-header">
|
|
||||||
<h2>API Keys</h2>
|
|
||||||
<p>
|
|
||||||
You can generate API Keys here:
|
|
||||||
</p>
|
|
||||||
<form action="token/new" onsubmit="formAJAX(this)" class="api-form">
|
|
||||||
<div class="card-header shadow actionMessage" style="display:none"></div>
|
|
||||||
<input type="email" name="email" id="email" required pattern="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
|
|
||||||
<div style="margin-top: 10px;"></div> <!-- Adjust margin-top value as needed -->
|
|
||||||
<input type="submit" value="Generate Key">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
@ -1,38 +0,0 @@
|
|||||||
<%- include('top') %>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
#sensorDataList {
|
|
||||||
padding-top: 2.5em;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<ul id="sensorDataList">
|
|
||||||
<li jq-repeat='sensorData'>
|
|
||||||
sensorId: {{ sensorid }}
|
|
||||||
location: {{ locationid }}
|
|
||||||
created: {{ createdAt }}
|
|
||||||
<br />
|
|
||||||
co: {{ measurement.co }}
|
|
||||||
humidity: {{ measurement.humidity }}
|
|
||||||
no2: {{ measurement.no2 }}
|
|
||||||
o3: {{ measurement.o3 }}
|
|
||||||
psi: {{ measurement.psi }}
|
|
||||||
so2: {{ measurement.so2 }}
|
|
||||||
temperature: {{ measurement.temperature }}
|
|
||||||
windspeed: {{ measurement.windspeed }}
|
|
||||||
<hr />
|
|
||||||
</li>
|
|
||||||
<li jq-repeat-defualt='sensorData'>
|
|
||||||
Loading...
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(async function () {
|
|
||||||
app.api.get('sensor-data/data?order=DESC&limit=6', function(error, data){
|
|
||||||
$.scope.sensorData.push(...data);
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<%- include('bot') %>
|
|
Loading…
x
Reference in New Issue
Block a user