Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Code compiles and launches #1

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
@@ -1 +1,2 @@
**/node_modules
**/node_modules
database.sqlite
2 changes: 1 addition & 1 deletion .vscode/launch.json
Expand Up @@ -11,7 +11,7 @@
},
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"runtimeExecutable": "nodemon",
"runtimeExecutable": "node",
"restart": true,
"skipFiles": [
"<node_internals>/**"
Expand Down
2 changes: 1 addition & 1 deletion .vscode/task.json → .vscode/tasks.json
Expand Up @@ -2,7 +2,7 @@
"version": "2.0.0",
"tasks": [
{
"label": "frontend-serve",
"label": "npm: frontend-serve",
"type": "npm",
"script": "serve",
"path": "frontend/",
Expand Down
97 changes: 33 additions & 64 deletions backend/db.js
@@ -1,75 +1,44 @@
const sqlite3 = require("sqlite3").verbose();
const db = new sqlite3.Database(":memory:");

db.serialize(() => {
db.run(`
CREATE TABLE users (
id INTEGER PRIMARY KEY,
google_id TEXT UNIQUE,
facebook_id TEXT UNIQUE,
display_name TEXT
)
`);

db.run(`
CREATE TABLE todos (
id INTEGER PRIMARY KEY,
user_id INTEGER,
title TEXT,
description TEXT,
completed BOOLEAN,
FOREIGN KEY(user_id) REFERENCES users(id)
)
`);
const { Sequelize } = require("sequelize");
// Initialize Sequelize instance
const TodoModel = require("./models/todo");
const UserModel = require("./models/user");
const sequelize = new Sequelize({
dialect: "sqlite",
storage: "./database.sqlite",
});

const getUserById = (id) => {
return new Promise((resolve, reject) => {
db.get("SELECT * FROM users WHERE id = ?", [id], (err, row) => {
if (err) {
return reject(err);
}
resolve(row);
});
});
};

const findOrCreateUser = (profile) => {
return new Promise((resolve, reject) => {
const googleId = profile.provider === "google" ? profile.id : null;
const facebookId = profile.provider === "facebook" ? profile.id : null;
// Define models
const Todo = TodoModel(sequelize);
const User = UserModel(sequelize);

db.get(
"SELECT * FROM users WHERE google_id = ? OR facebook_id = ?",
[googleId, facebookId],
(err, row) => {
if (err) {
return reject(err);
}
// Define user model functions
async function getUserById(id) {
const user = await User.findByPk(id);
return user;
}

if (row) {
resolve(row);
} else {
db.run(
"INSERT INTO users (google_id, facebook_id, display_name) VALUES (?, ?, ?)",
[googleId, facebookId, profile.displayName],
function (err) {
if (err) {
return reject(err);
}
resolve(getUserById(this.lastID));
}
);
}
}
);
async function findOrCreateUser(profile) {
const [user, created] = await User.findOrCreate({
where: { googleId: profile.id },
defaults: { email: profile.emails[0].value, name: profile.displayName },
});
};
return user;
}

// Sync models with the database
sequelize.sync().then(() => {
console.log("Tables synced successfully.");
});

// Add your other database functions for todos below
function initialize() {
return Promise.resolve();
}

module.exports = {
sequelize,
User,
Todo,
getUserById,
findOrCreateUser,
// Export other database functions
initialize,
};
18 changes: 9 additions & 9 deletions backend/models/todo.js
@@ -1,24 +1,24 @@
const { DataTypes } = require("sequelize");
const sequelize = require("../db");

const Todo = sequelize.define(
"Todo",
{
const Todo = (sequelize) => {
return sequelize.define("Todo", {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
},
title: {
type: DataTypes.STRING,
allowNull: false,
},
description: {
type: DataTypes.TEXT,
allowNull: true,
},
completed: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false,
},
},
{ underscored: true }
);
});
}

module.exports = Todo;
51 changes: 26 additions & 25 deletions backend/models/user.js
@@ -1,30 +1,31 @@
const { DataTypes } = require("sequelize");
const sequelize = require("../db");

const User = sequelize.define(
"User",
{
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
const User = (sequelize) => {
return sequelize.define(
"User",
{
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
password: {
type: DataTypes.STRING,
allowNull: true,
},
googleId: {
type: DataTypes.STRING,
allowNull: true,
unique: true,
},
facebookId: {
type: DataTypes.STRING,
allowNull: true,
unique: true,
},
},
password: {
type: DataTypes.STRING,
allowNull: true,
},
googleId: {
type: DataTypes.STRING,
allowNull: true,
unique: true,
},
facebookId: {
type: DataTypes.STRING,
allowNull: true,
unique: true,
},
},
{ underscored: true }
);
{ underscored: true }
);
}

module.exports = User;
2 changes: 1 addition & 1 deletion backend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 12 additions & 13 deletions backend/package.json
Expand Up @@ -4,21 +4,20 @@
"description": "Backend for the Todo App",
"main": "app.js",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
"start": "node app.js",
"dev": "node app.js"
},
"dependencies": {
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"express": "^4.17.1",
"express-session": "^1.17.2",
"passport": "^0.4.1",
"passport-facebook": "^3.0.0",
"passport-google-oauth20": "^2.0.0",
"sqlite3": "^5.0.2"
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"express": "^4.17.1",
"express-session": "^1.17.2",
"passport": "^0.4.1",
"passport-facebook": "^3.0.0",
"passport-google-oauth20": "^2.0.0",
"sqlite3": "^5.1.6"
},
"devDependencies": {
"nodemon": "^2.0.15"
"nodemon": "^2.0.15"
}
}

}
1 change: 1 addition & 0 deletions frontend/src/assets/logo.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion frontend/src/components/Splash.vue
Expand Up @@ -2,7 +2,7 @@
<v-container fluid fill-height class="splash-screen">
<v-row align="center" justify="center">
<v-col>
<v-img :src="require('@/assets/logo.png')" contain max-width="200"></v-img>
<v-img :src="require('@/assets/logo.svg')" contain max-width="200"></v-img>
<h1 class="text-center">Todo App</h1>
</v-col>
</v-row>
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/router/index.js
Expand Up @@ -2,9 +2,9 @@ import Vue from "vue";
import VueRouter from "vue-router";
import store from "@/store";

import Splash from "@/views/Splash.vue";
import Login from "@/views/Login.vue";
import Logout from "@/views/Logout.vue";
import Splash from "@/components/Splash.vue";
import Login from "@/components/Login.vue";
import Logout from "@/components/Logout.vue";
import TodoList from "@/components/TodoList.vue";

Vue.use(VueRouter);
Expand Down