Skip to content
This repository has been archived by the owner on Feb 2, 2025. It is now read-only.

Commit

Permalink
feat: adding fifth day content
Browse files Browse the repository at this point in the history
-> Back-end and database completed

- Knowledge Acquired -
--NodeJS / Express -> More export/require functionalities / dev hacks
--HTTP Requests -> Get / Post details / req.body / req.query details
--Database SQLite -> Sqlite-async dependency / Running queries from JS
  • Loading branch information
K-Schaeffer committed Aug 7, 2020
1 parent 722a9e6 commit bc4da45
Show file tree
Hide file tree
Showing 13 changed files with 756 additions and 105 deletions.
451 changes: 425 additions & 26 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
"homepage": "https://github.com/K-Schaeffer/NLW-2#readme",
"dependencies": {
"express": "^4.17.1",
"nunjucks": "^3.2.2"
"nunjucks": "^3.2.2",
"sqlite-async": "^1.1.0"
},
"devDependencies": {
"nodemon": "^2.0.4"
Expand Down
28 changes: 17 additions & 11 deletions public/styles/partials/page-study.css
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,18 @@
background: var(--color-secondary-dark);
}

#page-study main .no-results {
max-width: 300px;
margin: 12rem auto;
text-align: center;
color: var(--color-text-complement);
}

@media (min-width: 700px) {
#page-study #container {
max-width: 100vw;
}

.teacher-item header,
.teacher-item footer {
padding: 32px;
Expand All @@ -144,17 +151,17 @@
}

#page-study main {
padding: 32px 0;
max-width: 740px;
margin: 0 auto;
padding: 32px 0;
max-width: 740px;
margin: 0 auto;
}

#search-teachers .select-block {
margin-bottom: 0;
margin-bottom: 0;
}

.teacher-item > p {
padding: 0 32px;
padding: 0 32px;
}

.teacher-item footer p strong {
Expand All @@ -163,13 +170,12 @@
}

.teacher-item footer .button {
width: 245px;
font-size: 16px;
justify-content: center;
width: 245px;
font-size: 16px;
justify-content: center;
}

.teacher-item footer .button img {
margin-right: 16px;
margin-right: 16px;
}

}
68 changes: 68 additions & 0 deletions src/database/createProffy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
module.exports = async (database, { proffyValue, classValue, classScheduleValues }) => {
// Proffys table INSERT
const insertedProffy = await database.run(`
INSERT INTO proffys (
name,
avatar,
whatsapp,
bio
) VALUES (
"${proffyValue.name}",
"${proffyValue.avatar}",
"${proffyValue.whatsapp}",
"${proffyValue.bio}"
);
`);

const proffy_id = insertedProffy.lastID;

// Classes table INSERT
const insertedClass = await database.run(`
INSERT INTO classes (
subject,
cost,
proffy_id
) VALUES (
"${classValue.subject}",
"${classValue.cost}",
"${proffy_id}"
);
`);

const class_id = insertedClass.lastID;

// ClassSchedule table INSERT
const insertedClassesSchedule = classScheduleValues.map((classScheduleValue) => {
return database.run(`
INSERT INTO class_schedule (
class_id,
weekday,
time_from,
time_to
) VALUES (
"${class_id}",
"${classScheduleValue.weekday}",
"${classScheduleValue.time_from}",
"${classScheduleValue.time_to}"
);
`);
});

await Promise.all(insertedClassesSchedule);

};















Binary file added src/database/database.sqlite
Binary file not shown.
30 changes: 30 additions & 0 deletions src/database/db.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const db = require('sqlite-async');

module.exports = db.open(__dirname + '/database.sqlite').then((database) => {
// Creating tables
return database.exec(`
CREATE TABLE IF NOT EXISTS proffys (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
avatar TEXT,
whatsapp TEXT,
bio TEXT
);
CREATE TABLE IF NOT EXISTS classes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
subject INTEGER,
cost TEXT,
proffy_id INTEGER
);
CREATE TABLE IF NOT EXISTS class_schedule (
id INTEGER PRIMARY KEY AUTOINCREMENT,
class_id INTEGER,
weekday INTEGER,
time_from INTEGER,
time_to INTEGER
);
`);
});

14 changes: 14 additions & 0 deletions src/database/fake_data.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Data collections
const proffys = [
{
name: "Kauan Schaeffer",
avatar: "https://avatars0.githubusercontent.com/u/37464395?s=460&u=463274b9ecfdf58b59713229addaf5545c0c034c&v=4",
whatsapp: "4199999999",
bio: "Amante da busca constante pelo saber.<br><br>Apaixonado pela filosofia e suas reflexões, sempre buscando escrever e refletir acerca de questões epistemológicas, metafísicas, antropológicas e axiológicas.",
subject: "Filosofia",
cost: "1,00",
weekday: [0],
time_from: [720],
time_to: [940]
}
]
57 changes: 57 additions & 0 deletions src/database/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
const db = require('./db');
const createProffy = require('./createProffy');

db.then(async (database) => {
// Data
proffyValue = {
name: 'Kauan Schaeffer',
avatar: 'https://avatars0.githubusercontent.com/u/37464395?s=460&u=463274b9ecfdf58b59713229addaf5545c0c034c&v=4',
whatsapp: '4199999999',
bio: 'Amante da busca constante pelo saber.<br><br>Apaixonado pela filosofia e suas reflexões, sempre buscando escrever e refletir acerca de questões epistemológicas, metafísicas, antropológicas e axiológicas.'
}

classValue = {
subject: 4,
cost: '1',
}

classScheduleValues = [
{
weekday: 1,
time_from: 720,
time_to: 940
},
{
weekday: 3,
time_from: 520,
time_to: 1220
}
]

// Insert
// await createProffy(database, { proffyValue, classValue, classScheduleValues });

// Select All
const proffysSelect = await database.all("SELECT * FROM proffys");
//console.log(proffysSelect);

// Select proffy with class
const proffyAndClassesSelect = await database.all(`
SELECT classes.*, proffys.*
FROM proffys
JOIN classes ON (classes.proffy_id = proffys.id)
WHERE classes.proffy_id = 1;
`);
//console.log(proffyAndClassesSelect);

const classesScheduleSelect = await database.all(`
SELECT *
FROM class_schedule
WHERE class_schedule.class_id = 1
AND class_schedule.weekday = "3"
AND class_schedule.time_from <= "620"
AND class_schedule.time_to > "620";
`);
console.log(classesScheduleSelect);

});
96 changes: 96 additions & 0 deletions src/pages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
const Database = require('./database/db');

const { subjects, weekdays, getSubject, convertHoursToMinutes } = require('./utils/format'); // Object disruption so I dont need to call it from a variable

// Pages functionalities
function pageLanding(req, res) {
return res.render("index.html");
}

async function pageStudy(req, res) {
const filters = req.query;

if (!filters.subject || !filters.weekday || !filters.time) {
return res.render("study.html", { filters, subjects, weekdays });
}

const timeToMinutes = convertHoursToMinutes(filters.time);
const query = `
SELECT classes.*, proffys.*
FROM proffys
JOIN classes ON (classes.proffy_id = proffys.id)
WHERE EXISTS(
SELECT *
FROM class_schedule
WHERE class_schedule.class_id = classes.id
AND class_schedule.weekday = ${filters.weekday}
AND class_schedule.time_from <= ${timeToMinutes}
AND class_schedule.time_to > ${timeToMinutes}
)
AND classes.subject = '${filters.subject}';
`;

try {
const db = await Database;
const proffys = await db.all(query);

proffys.map((proffy) => {
proffy.subject = getSubject(proffy.subject);
});

return res.render("study.html", { proffys, filters, subjects, weekdays });

} catch (error) {
console.log(error);
}

}

function pageGiveClasses(req, res) {
return res.render("give-classes.html", { subjects, weekdays });
}

async function saveGiveClasses(req, res) {
const createProffy = require('./database/createProffy');

const proffyValue = {
name: req.body.name,
avatar: req.body.avatar,
whatsapp: req.body.whatsapp,
bio: req.body.bio
};

const classValue = {
subject: req.body.subject,
cost: req.body.cost
}

const classScheduleValues = req.body.weekday.map((weekday, index) => {
return {
weekday,
time_from: convertHoursToMinutes(req.body.time_from[index]),
time_to: convertHoursToMinutes(req.body.time_to[index])
}
});

try {
const db = await Database;
await createProffy(db, { proffyValue, classValue, classScheduleValues });

let queryString = "?subject=" + req.body.subject;
queryString += "&weekday=" + req.body.weekday[0];
queryString += "&time=" + req.body.time_from[0];
return res.redirect("/study" + queryString);
} catch (error) {
console.log(error);
}

}

module.exports = {
pageLanding,
pageStudy,
pageGiveClasses,
saveGiveClasses
};

Loading

0 comments on commit bc4da45

Please sign in to comment.