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
|
||||
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
|
||||
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