Add apilog route and remove unused files

This commit is contained in:
newtbot 2024-01-29 03:40:49 +08:00
parent 9c5aaed414
commit 8836a3cfd4
6 changed files with 48 additions and 477 deletions

View File

@ -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);
});
});

View 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 };

View File

@ -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'));

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

View File

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

View File

@ -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') %>