time based on periods rather than timestamps

This commit is contained in:
2026-03-19 17:43:00 +00:00
parent 6d5807befc
commit d15980bb52
7 changed files with 102 additions and 35 deletions

View File

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

View File

@@ -9,6 +9,36 @@ 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();
const port = 3000; const port = 3000;
const db = new Database("./database.db"); const db = new Database("./database.db");
@@ -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");
} }
}); });

View File

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

View File

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

View File

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

View File

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