From 6c562ee7f63b6935f3523b8aad94b1e5664c8653 Mon Sep 17 00:00:00 2001 From: ruihildt Date: Wed, 31 Jul 2019 20:38:48 +0200 Subject: [PATCH] Setup table migration and update schemas/endpoints --- .gitignore | 6 +- README.md | 38 +++++----- data/dbConfig.js | 8 ++ ...eateUsersSessionsAndDailyAveragesTables.js | 73 +++++++++++++++++++ index.js | 4 +- knexfile.js | 64 ++++++++++++++++ 6 files changed, 171 insertions(+), 22 deletions(-) create mode 100644 data/dbConfig.js create mode 100644 data/migrations/01-createUsersSessionsAndDailyAveragesTables.js create mode 100644 knexfile.js diff --git a/.gitignore b/.gitignore index 6c922fd..9cc338a 100644 --- a/.gitignore +++ b/.gitignore @@ -61,4 +61,8 @@ typings/ .next # VS Code settings -.vscode \ No newline at end of file +.vscode + +# Databases +data/sleep-tracker.db3 +data/test.db3 \ No newline at end of file diff --git a/README.md b/README.md index 0aae009..c789638 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Sleep Tracker is intended for anyone interested in improving their sleep and hea ## Database Schemas -### Users `users` +### Users Schema `users` | field | data type | metadata | | :--------| :--------------- | :-------------------------------------------------- | | id | unsigned integer | primary key, auto-increments, generated by database | @@ -26,35 +26,35 @@ Sleep Tracker is intended for anyone interested in improving their sleep and hea | username | string | required | | password | string | required | -### Sleep Sessions `sessions` - +### Sleep Sessions Schema `sessions` | field | data type | metadata | | :------------ | :--------------- | :-------------------------------------------------- | | id | unsigned integer | primary key, auto-increments, generated by database | | user_id | unsigned integer | foreign key referencing `users.id`, required | | bed_time | unsigned integer | timestamp with date, required | | wake_time | unsigned integer | timestamp with date, required | -| bed_tiredness | unsigned integer | between 1-5, | -| wake_mood | unsigned integer | between 1-5, | -| day_mood | unsigned integer | between 1-5, | +| bed_tiredness | unsigned integer | | +| wake_mood | unsigned integer | | +| day_mood | unsigned integer | | -### Average Mood per Sleep Session `moods` -| field | data type | metadata | -| :------------- | :--------------- | :--------------------------------------------------- | -| id | unsigned integer | primary key, auto-increments, generated by database | -| session_date | unsigned integer | foreign key referencing `sessions.wake_time` | -| sleep_duration | unsigned integer | | -| average_mood | float | average of bed_tiredness/wake_mood/day_mood | +### Average Mood per Sleep Session Schema `dailyAverages` +| field | data type | metadata | +| :------------- | :--------------- | :-------------------------------------------------- | +| id | unsigned integer | primary key, auto-increments, generated by database | +| session_user | unsigned integer | foreign key referencing `sessions.user_id` | +| session_date | unsigned integer | foreign key referencing `sessions.wake_time` | +| sleep_duration | unsigned integer | | +| average_mood | float | | ## API Endpoints - `POST /api/users` - add a new user - `GET /api/users/:id` - fetch a user - `PUT /api/users/:id` - update a user -- `GET /api/sessions` - fetch list of all sessions -- `POST /api/sessions` - add a session -- `GET /api/sessions/:id` - get a single session by id -- `PUT /api/sessions/:id` - update a session by user id -- `DELETE /api/sessions/:id` - delete a session by user id +- `GET /api/users/:id/sessions` - fetch list of all sessions by user id +- `POST /api/users/:id/sessions` - add a session y user id +- `GET /api/users/:id/sessions/:id` - fetch a single session by id +- `PUT /api/users/:id/sessions/:id` - update a session by id +- `DELETE /api/users/:id/sessions/:id` - delete a session by id -- `GET /api/moods/:id` - fetch a list of last 30 moods by user id \ No newline at end of file +- `GET /api/dailyaverages/:id` - fetch a list of last 30 daily averages by user id \ No newline at end of file diff --git a/data/dbConfig.js b/data/dbConfig.js new file mode 100644 index 0000000..97968b8 --- /dev/null +++ b/data/dbConfig.js @@ -0,0 +1,8 @@ +require("dotenv").config(); + +const knex = require('knex'); +const config = require('../knexfile'); + +const environment = process.env.DB_ENV || 'development'; + +module.exports = knex(config[environment]); diff --git a/data/migrations/01-createUsersSessionsAndDailyAveragesTables.js b/data/migrations/01-createUsersSessionsAndDailyAveragesTables.js new file mode 100644 index 0000000..b3acc8d --- /dev/null +++ b/data/migrations/01-createUsersSessionsAndDailyAveragesTables.js @@ -0,0 +1,73 @@ + +exports.up = function(knex) { + return knex.schema + + .createTable('users', tbl => { + tbl + .increments(); + tbl + .string('email') + .notNullable() + .unique(); + tbl + .string('username') + .notNullable() + .unique(); + tbl + .string('password') + .notNullable(); + }) + + .createTable('sessions', tbl => { + tbl + .increments(); + tbl + .integer('user_id') + .unsigned() + .notNullable() + .references('users.id') + .onUpdate('CASCADE') + .onDelete('CASCADE'); + tbl + .datetime('bed_time') + .notNullable(); + tbl + .datetime('wake_time'); + tbl + .integer('bed_tiredness') + .unsigned(); + tbl + .integer('wake_mood') + .unsigned(); + }) + + .createTable('dailyAverages', tbl => { + tbl + .increments(); + tbl + .integer('session_user') + .unsigned() + .notNullable() + .references('sessions.user_id') + .onUpdate('CASCADE') + .onDelete('CASCADE'); + tbl + .datetime('session_date') + .notNullable() + .references('sessions.wake_time') + .onUpdate('CASCADE') + .onDelete('CASCADE'); + tbl + .integer('sleep_duration') + .unsigned(); + tbl + .float('average_mood'); + }) +}; + +exports.down = function(knex) { + return knex.schema + .dropTableIfExists('dailyAverages') + .dropTableIfExists('sessions') + .dropTableIfExists('users'); +}; diff --git a/index.js b/index.js index afd162e..46a93a6 100644 --- a/index.js +++ b/index.js @@ -7,8 +7,8 @@ server.get("/", (req, res) => { }); }); -const PORT = process.env.PORT; +const PORT = process.env.PORT || 4000; server.listen(PORT, () => { console.log(`Listening on port ${PORT}...`); -}); \ No newline at end of file +}); diff --git a/knexfile.js b/knexfile.js new file mode 100644 index 0000000..e1c743d --- /dev/null +++ b/knexfile.js @@ -0,0 +1,64 @@ +require("dotenv").config(); + +module.exports = { + + development: { + client: "sqlite3", + useNullAsDefault: true, + connection: { + filename: "./data/sleep-tracker.db3" + }, + pool: { + afterCreate: (conn, done) => { + conn.run("PRAGMA foreign_keys = ON", done); + } + }, + migrations: { + directory: "./data/migrations" + }, + seeds: { + directory: "./data/seeds" + } + }, + + testing: { + client: "sqlite3", + useNullAsDefault: true, + connection: { + filename: "./data/test.db3" + }, + pool: { + afterCreate: (conn, done) => { + conn.run("PRAGMA foreign_keys = ON", done); + } + }, + migrations: { + directory: "./data/migrations" + }, + seeds: { + directory: "./data/seeds" + } + }, + + production: { + client: "postgresql", + useNullAsDefault: true, + connection: { + database: process.env.PROD_DB, + user: process.env.PROD_DB_USERNAME, + password: process.env.PROD_DB_PASSWORD + }, + pool: { + afterCreate: (conn, done) => { + conn.run("PRAGMA foreign_keys = ON", done); + } + }, + migrations: { + directory: "./data/migrations" + }, + seeds: { + directory: "./data/seeds" + } + } + +};