time based on periods rather than timestamps
This commit is contained in:
@@ -16,8 +16,8 @@ CREATE TABLE Rooms (
|
|||||||
|
|
||||||
CREATE TABLE TimeSlots (
|
CREATE TABLE TimeSlots (
|
||||||
Id INTEGER PRIMARY KEY ASC AUTOINCREMENT,
|
Id INTEGER PRIMARY KEY ASC AUTOINCREMENT,
|
||||||
TimeStart TEXT,
|
Period INTEGER,
|
||||||
TimeEnd TEXT,
|
Day INTEGER,
|
||||||
Room INTEGER,
|
Room INTEGER,
|
||||||
FOREIGN KEY(Room) REFERENCES Rooms(Id)
|
FOREIGN KEY(Room) REFERENCES Rooms(Id)
|
||||||
);
|
);
|
||||||
Binary file not shown.
@@ -5,8 +5,38 @@ import bcrypt from "bcrypt";
|
|||||||
import Database from "better-sqlite3";
|
import Database from "better-sqlite3";
|
||||||
|
|
||||||
Date.prototype.addHours= function(h){
|
Date.prototype.addHours= function(h){
|
||||||
this.setTime(this.getTime() + (h*60*60*1000));
|
this.setTime(this.getTime() + (h*60*60*1000));
|
||||||
return this;
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function getPeriod() {
|
||||||
|
const now = new Date();
|
||||||
|
let hours = now.getHours();
|
||||||
|
let minutes = now.getMinutes();
|
||||||
|
if ((hours == 8) || (hours == 9 && minutes < 45)) {
|
||||||
|
// P1
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if ((hours == 9 && minutes >= 45) || (hours < 11 && minutes < 5)) {
|
||||||
|
// P2 / Break
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
if ((hours == 11 && minutes >= 5) || (hours == 12 && minutes < 5)) {
|
||||||
|
// P3
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
if ((hours == 12 && minutes >= 5) || (hours == 13 && minutes < 5)) {
|
||||||
|
// P4
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
if ((hours == 13 && minutes >= 5) || (hours == 15 && minutes < 15)) {
|
||||||
|
// Lunch to P5
|
||||||
|
return 5;
|
||||||
|
} else {
|
||||||
|
// too early / late
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const app = e();
|
const app = e();
|
||||||
@@ -21,24 +51,35 @@ app.get('/', (req, res) => {
|
|||||||
res.send("Nothing Here");
|
res.send("Nothing Here");
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/currentRooms', (req, res) => {
|
app.get('/getPeriod', (req, res) => {
|
||||||
// req has no data
|
// req has nothing
|
||||||
|
// res has current period
|
||||||
|
res.status(200).json({period: getPeriod()});
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post('/currentRooms', (req, res) => {
|
||||||
|
// req has day
|
||||||
// res has all room at current time
|
// res has all room at current time
|
||||||
console.log("currentRooms");
|
console.log("currentRooms");
|
||||||
const today = new Date();
|
const currentPeriod = getPeriod();
|
||||||
let stmt = db.prepare(`SELECT * FROM TimeSlots INNER JOIN Rooms ON Rooms.Id=TimeSlots.Room WHERE TimeEnd BETWEEN '${today.toISOString()}' AND '${today.addHours(1).toISOString()}';`);
|
if (currentPeriod == -1) {
|
||||||
|
res.status(418).send("Not in school");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const today = req.body.day;
|
||||||
|
let stmt = db.prepare(`SELECT * FROM TimeSlots INNER JOIN Rooms ON Rooms.Id=TimeSlots.Room WHERE Period BETWEEN ${currentPeriod - 1} AND ${currentPeriod + 1} AND Day=${today};`);
|
||||||
let records = stmt.all();
|
let records = stmt.all();
|
||||||
res.status(200).json({records: records});
|
res.status(200).json({records: records});
|
||||||
});
|
});
|
||||||
|
|
||||||
app.post('/addTimeSlot', (req, res) => {
|
app.post('/addTimeSlot', (req, res) => {
|
||||||
// req has roomid userid starttime and end time
|
// req has roomid userid period and day
|
||||||
// res has success or faliure
|
// res has success or faliure
|
||||||
console.log("addTimeSlot");
|
console.log("addTimeSlot");
|
||||||
const body = req.body;
|
const body = req.body;
|
||||||
let roomid = parseInt(body.roomid);
|
let roomid = parseInt(body.roomid);
|
||||||
let userid = parseInt(body.userid);
|
let userid = parseInt(body.userid);
|
||||||
let stmt = db.prepare(`INSERT INTO TimeSlots (TimeStart, TimeEnd, Room) VALUES ('${body.startTime}', '${body.endTime}', ${roomid});`);
|
let stmt = db.prepare(`INSERT INTO TimeSlots (Period, Day, Room) VALUES (${body.period}, ${body.day}, ${roomid});`);
|
||||||
stmt.run();
|
stmt.run();
|
||||||
stmt = db.prepare(`UPDATE Users SET Submissions = Submissions + 1 WHERE Id=${userid};`);
|
stmt = db.prepare(`UPDATE Users SET Submissions = Submissions + 1 WHERE Id=${userid};`);
|
||||||
stmt.run();
|
stmt.run();
|
||||||
@@ -54,7 +95,7 @@ app.post('/addRoom', (req, res) => {
|
|||||||
let stmt = db.prepare(`SELECT * FROM Rooms WHERE RoomName='${name}'`);
|
let stmt = db.prepare(`SELECT * FROM Rooms WHERE RoomName='${name}'`);
|
||||||
let storedRecord = stmt.get();
|
let storedRecord = stmt.get();
|
||||||
if (storedRecord) {
|
if (storedRecord) {
|
||||||
res.status(400).send("room already exists");
|
res.status(418).send("room already exists");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
stmt = db.prepare(`INSERT INTO Rooms (RoomName) VALUES (${name})`);
|
stmt = db.prepare(`INSERT INTO Rooms (RoomName) VALUES (${name})`);
|
||||||
@@ -81,7 +122,7 @@ app.post('/createUser', async (req, res) => {
|
|||||||
let stmt = db.prepare(`SELECT * FROM Users WHERE Email='${body.email}';`);
|
let stmt = db.prepare(`SELECT * FROM Users WHERE Email='${body.email}';`);
|
||||||
let storedRecord = stmt.get();
|
let storedRecord = stmt.get();
|
||||||
if (storedRecord) {
|
if (storedRecord) {
|
||||||
res.status(400).send("account with that email already exists");
|
res.status(418).send("account with that email already exists");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const generatedHash = await bcrypt.hash(body.pass, 10);
|
const generatedHash = await bcrypt.hash(body.pass, 10);
|
||||||
@@ -100,7 +141,7 @@ app.post('/login', async (req, res) => {
|
|||||||
let stmt = db.prepare(`SELECT Pass FROM Users WHERE Email='${body.email}';`);
|
let stmt = db.prepare(`SELECT Pass FROM Users WHERE Email='${body.email}';`);
|
||||||
let storedHash = stmt.get();
|
let storedHash = stmt.get();
|
||||||
if (!storedHash) {
|
if (!storedHash) {
|
||||||
res.status(400).send("problem with email");
|
res.status(418).send("problem with email");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (await bcrypt.compare(body.pass, storedHash.Pass)){
|
if (await bcrypt.compare(body.pass, storedHash.Pass)){
|
||||||
@@ -108,7 +149,7 @@ app.post('/login', async (req, res) => {
|
|||||||
const uid = stmt.get();
|
const uid = stmt.get();
|
||||||
res.status(200).send({uid: uid});
|
res.status(200).send({uid: uid});
|
||||||
} else {
|
} else {
|
||||||
res.status(400).send("incorrect password");
|
res.status(418).send("incorrect password");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ CREATE TABLE Rooms (
|
|||||||
|
|
||||||
CREATE TABLE TimeSlots (
|
CREATE TABLE TimeSlots (
|
||||||
Id INTEGER PRIMARY KEY ASC AUTOINCREMENT,
|
Id INTEGER PRIMARY KEY ASC AUTOINCREMENT,
|
||||||
TimeStart TEXT,
|
Period INTEGER,
|
||||||
TimeEnd TEXT,
|
Day INTEGER,
|
||||||
Room INTEGER,
|
Room INTEGER,
|
||||||
FOREIGN KEY(Room) REFERENCES Rooms(Id)
|
FOREIGN KEY(Room) REFERENCES Rooms(Id)
|
||||||
);`);
|
);`);
|
||||||
@@ -17,7 +17,7 @@ onBeforeMount(async () => {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Login v-if="page == 0" @next-page="page++"/>
|
<Login v-if="page == 0" @next-page="page++"/>
|
||||||
<HomePage v-if="page == 1" @add-slot="page++"/>
|
<HomePage v-else-if="page == 1" @add-slot="page++"/>
|
||||||
<AddTimeSlot v-if="page == 2" @go-home="page--" @add-room="page++"/>
|
<AddTimeSlot v-else-if="page == 2" @go-home="page--" @add-room="page++"/>
|
||||||
<AddRoom v-if="page == 3" @go-back="page--"/>
|
<AddRoom v-else-if="page == 3" @go-back="page--"/>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -5,8 +5,9 @@ const emit = defineEmits(['goHome', 'addRoom']);
|
|||||||
const rooms = ref();
|
const rooms = ref();
|
||||||
|
|
||||||
const room = ref();
|
const room = ref();
|
||||||
const startTime = ref();
|
const weekNumber = ref<number>(1);
|
||||||
const endTime = ref();
|
const day = ref<number>(1);
|
||||||
|
const period = ref<number>(1);
|
||||||
|
|
||||||
onBeforeMount(async () => {
|
onBeforeMount(async () => {
|
||||||
let res = await fetch("http://localhost:3000/getRooms", {
|
let res = await fetch("http://localhost:3000/getRooms", {
|
||||||
@@ -20,7 +21,7 @@ async function addTimeSlot(e: SubmitEvent) {
|
|||||||
let uid = await cookieStore.get("userId");
|
let uid = await cookieStore.get("userId");
|
||||||
await fetch("http://localhost:3000/addTimeSlot", {
|
await fetch("http://localhost:3000/addTimeSlot", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({ roomid: room.value.Id, userid: uid?.value, startTime: startTime.value, endTime: endTime.value }),
|
body: JSON.stringify({ roomid: room.value.Id, userid: uid?.value, day: (day.value * weekNumber.value), period: period.value }),
|
||||||
headers: new Headers({'content-type': 'application/json'})
|
headers: new Headers({'content-type': 'application/json'})
|
||||||
});
|
});
|
||||||
emit('goHome');
|
emit('goHome');
|
||||||
@@ -36,10 +37,12 @@ async function addTimeSlot(e: SubmitEvent) {
|
|||||||
<option v-for="item in rooms.records" :value="item">{{ item.RoomName }}</option>
|
<option v-for="item in rooms.records" :value="item">{{ item.RoomName }}</option>
|
||||||
</select><br>
|
</select><br>
|
||||||
<button @click="$emit('addRoom')">Add room?</button><br>
|
<button @click="$emit('addRoom')">Add room?</button><br>
|
||||||
<label for="start" >Start Time</label><br>
|
<label for="week">Week number</label><br>
|
||||||
<input type="datetime-local" id="start" v-model="startTime" /><br>
|
<input type="number" id="week" v-model="weekNumber" min="1" max="2"/><br>
|
||||||
<label for="end">End Time</label><br>
|
<label for="day">Day</label><br>
|
||||||
<input type="datetime-local" id="end" v-model="endTime" /><br>
|
<input type="number" id="day" v-model="day" min="1" max="5"/><br>
|
||||||
|
<label for="period">Period</label><br>
|
||||||
|
<input type="number" id="period" v-model="period" min="1" max="5"/><br>
|
||||||
<button type="submit">Add</button>
|
<button type="submit">Add</button>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
@@ -2,25 +2,48 @@
|
|||||||
import { onBeforeMount, ref } from 'vue';
|
import { onBeforeMount, ref } from 'vue';
|
||||||
|
|
||||||
const rooms = ref();
|
const rooms = ref();
|
||||||
|
const showRooms = ref<boolean>(false);
|
||||||
|
const weekNumber = ref<number>(1);
|
||||||
|
|
||||||
|
async function getData() {
|
||||||
|
showRooms.value = false;
|
||||||
|
const today = new Date();
|
||||||
|
if (today.getDay() == 0 || today.getDay() == 6) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const day = today.getDay() * weekNumber.value;
|
||||||
|
const res = await fetch("http://localhost:3000/currentRooms", {
|
||||||
|
method: "POST",
|
||||||
|
body: JSON.stringify({day: day}),
|
||||||
|
headers: new Headers({'content-type': 'application/json'})
|
||||||
|
});
|
||||||
|
if (res.ok) {
|
||||||
|
rooms.value = await res.json();
|
||||||
|
showRooms.value = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log(await res.text());
|
||||||
|
}
|
||||||
|
|
||||||
defineEmits(['addSlot']);
|
defineEmits(['addSlot']);
|
||||||
onBeforeMount(async () => {
|
onBeforeMount(async () => {
|
||||||
const res = await fetch("http://localhost:3000/currentRooms", {
|
await getData();
|
||||||
method: "GET"
|
|
||||||
});
|
|
||||||
rooms.value = await res.json();
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<header>
|
<header>
|
||||||
<h1>What's free in my free?</h1>
|
<h1>What's free in my free?</h1>
|
||||||
<button @click="$emit('addSlot')">Add new slot</button>
|
<button @click="$emit('addSlot')">Add new slot</button> <br>
|
||||||
|
<select v-model="weekNumber" @change="getData">
|
||||||
|
<option :value="1">1</option>
|
||||||
|
<option :value="2">2</option>
|
||||||
|
</select>
|
||||||
</header>
|
</header>
|
||||||
<article v-if="rooms">
|
<article>
|
||||||
<h2>Free Rooms:</h2>
|
<h2>Free Rooms:</h2>
|
||||||
<p v-if="rooms.records.length == 0">No free rooms right now</p>
|
<p v-if="!showRooms">No free rooms right now</p>
|
||||||
<ul v-for="slot in rooms.records">
|
<ul v-else v-for="slot in rooms.records">
|
||||||
<li>Room: {{ slot.RoomName }}, from {{ slot.TimeStart.toString().split("T")[1] }} til {{ slot.TimeEnd.toString().split("T")[1] }}</li>
|
<li>Room: {{ slot.RoomName }}, in {{ slot.Period }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</article>
|
</article>
|
||||||
</template>
|
</template>
|
||||||
Reference in New Issue
Block a user