Skip to content

Adding likes backend #54

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

Open
wants to merge 45 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e64a817
adding comments to controllers and models
josephburgess Feb 6, 2023
39091ab
Added cypress:open script to package
tmccoy99 Feb 7, 2023
23cb109
test driving timestamps in postschema
josephburgess Feb 7, 2023
53f24b2
test driving user_id field for posts
josephburgess Feb 7, 2023
713cb90
creating post first test passed
tomrolfe20 Feb 7, 2023
e3be822
amending tests given that user_id is required
josephburgess Feb 7, 2023
4526e72
added a function to clear message after submit
tomrolfe20 Feb 7, 2023
2096ef2
added user id to posts
tomrolfe20 Feb 7, 2023
8c268e3
add navigation bar
terrybro66 Feb 7, 2023
ea10a6a
updating tests
josephburgess Feb 7, 2023
f9fa5a9
added tokens and id error
tomrolfe20 Feb 7, 2023
a46c813
Merge pull request #1 from tmccoy99/post-backend-schema-updates
orhankhanbayov Feb 7, 2023
9669235
Merge pull request #2 from tmccoy99/navbar
josephburgess Feb 7, 2023
b7c5d89
Added testing + return ID on submit
ShaunFlood Feb 7, 2023
52397db
Merge branch 'main' into addingCreatePostForm
ShaunFlood Feb 7, 2023
7af9656
Merge pull request #3 from tmccoy99/addingCreatePostForm
terrybro66 Feb 7, 2023
93bf24b
sanity check
orhankhanbayov Feb 7, 2023
d22d86c
one test failing
orhankhanbayov Feb 8, 2023
8aa94b3
all tests passing with new profile page controller and routes
orhankhanbayov Feb 8, 2023
47d9006
Adding reloading posts
tomrolfe20 Feb 8, 2023
6f510e4
improved test names for better readability in e2e tests
tomrolfe20 Feb 8, 2023
762447c
add styling to the navbar links
terrybro66 Feb 8, 2023
e911f16
Refactored tests to use cy.login() command
tmccoy99 Feb 8, 2023
5c9e0ff
Merge pull request #4 from tmccoy99/addingReloadPosts
tmccoy99 Feb 8, 2023
297d5c4
all tests passing
orhankhanbayov Feb 8, 2023
ab98880
adding missing image to repo
terrybro66 Feb 8, 2023
c15247c
changed profile page to account
orhankhanbayov Feb 8, 2023
f64f37b
Merge pull request #5 from tmccoy99/navbar-styling
orhankhanbayov Feb 8, 2023
b64caba
Got the god dam bug
tomrolfe20 Feb 8, 2023
cebd1f4
Merge branch 'main' into test
tomrolfe20 Feb 8, 2023
fa8eac1
Merge pull request #6 from tmccoy99/test
tmccoy99 Feb 8, 2023
5fb5bae
adding user image upload functionality
josephburgess Feb 8, 2023
c65f690
removing unneccessary line of code
josephburgess Feb 8, 2023
a8ae115
increasing filesize to 15mb
josephburgess Feb 8, 2023
e84fbbe
Merge branch 'main' into user-model-updates
josephburgess Feb 8, 2023
b177157
removing further redundant code
josephburgess Feb 8, 2023
99463ee
one more redundant require
josephburgess Feb 8, 2023
4ae7508
all tests passing for update and delete methods
orhankhanbayov Feb 9, 2023
723662d
Merge pull request #8 from tmccoy99/delete-update
josephburgess Feb 9, 2023
2ce2fe0
Merge branch 'main' into user-model-updates
ShaunFlood Feb 9, 2023
d716bf8
Merge pull request #7 from tmccoy99/user-model-updates
tomrolfe20 Feb 9, 2023
fc481f0
testing completed for likes
ShaunFlood Feb 9, 2023
5c5b289
First test for unlike
ShaunFlood Feb 10, 2023
deb6fb2
second test completed
ShaunFlood Feb 10, 2023
ef9efca
testing completed
ShaunFlood Feb 10, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified api/.DS_Store
Binary file not shown.
49 changes: 24 additions & 25 deletions api/app.js
Original file line number Diff line number Diff line change
@@ -1,36 +1,34 @@
const createError = require("http-errors");
const express = require("express");
const path = require("path");
const logger = require("morgan");
const JWT = require("jsonwebtoken");
const createError = require('http-errors');
const express = require('express');
const path = require('path');
const logger = require('morgan');
const JWT = require('jsonwebtoken');

const postsRouter = require("./routes/posts");
const tokensRouter = require("./routes/tokens");
const usersRouter = require("./routes/users");
const postsRouter = require('./routes/posts');
const tokensRouter = require('./routes/tokens');
const usersRouter = require('./routes/users');
const accountRouter = require('./routes/account');

const app = express();

// setup for receiving JSON
app.use(express.json())
app.use(express.json());

app.use(logger("dev"));
app.use(logger('dev'));
app.use(express.json());
app.use(express.static(path.join(__dirname, "public")));
app.use(express.static(path.join(__dirname, 'public')));

// middleware function to check for valid tokens
const tokenChecker = (req, res, next) => {

let token;
const authHeader = req.get("Authorization")

if(authHeader) {
token = authHeader.slice(7)
const authHeader = req.get('Authorization');
if (authHeader) {
token = authHeader.slice(7);
}

JWT.verify(token, process.env.JWT_SECRET, (err, payload) => {
if(err) {
console.log(err)
res.status(401).json({message: "auth error"});
if (err) {
console.log(err);
res.status(401).json({ message: 'auth error' });
} else {
req.user_id = payload.user_id;
next();
Expand All @@ -39,9 +37,10 @@ const tokenChecker = (req, res, next) => {
};

// route setup
app.use("/posts", tokenChecker, postsRouter);
app.use("/tokens", tokensRouter);
app.use("/users", usersRouter);
app.use('/posts', tokenChecker, postsRouter);
app.use('/tokens', tokensRouter);
app.use('/users', usersRouter);
app.use('/account', tokenChecker, accountRouter);

// catch 404 and forward to error handler
app.use((req, res, next) => {
Expand All @@ -52,10 +51,10 @@ app.use((req, res, next) => {
app.use((err, req, res) => {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get("env") === "development" ? err : {};
res.locals.error = req.app.get('env') === 'development' ? err : {};

// respond with details of the error
res.status(err.status || 500).json({message: 'server error'})
res.status(err.status || 500).json({ message: 'server error' });
});

module.exports = app;
39 changes: 19 additions & 20 deletions api/bin/www
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,29 @@
* Module dependencies.
*/

var app = require("../app");
var debug = require("debug")("acebook:server");
var http = require("http");
var mongoose = require("mongoose");

var app = require('../app');
var debug = require('debug')('acebook:server');
var http = require('http');
var mongoose = require('mongoose');
/**
* Get port from environment and store in Express.
*/

var port = normalizePort(process.env.PORT || "8080");
app.set("port", port);
var port = normalizePort(process.env.PORT || '8080');
app.set('port', port);

/**
* Connect to MongoDB
**/

var mongoDbUrl = process.env.MONGODB_URL || "mongodb://0.0.0.0/acebook";
var mongoDbUrl = process.env.MONGODB_URL || 'mongodb://0.0.0.0/acebook';
mongoose.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});

var db = mongoose.connection;
db.on("error", console.error.bind(console, "MongoDB connection error:"));
db.on('error', console.error.bind(console, 'MongoDB connection error:'));

/**
* Create HTTP server.
Expand All @@ -40,8 +39,8 @@ var server = http.createServer(app);
*/

server.listen(port);
server.on("error", onError);
server.on("listening", onListening);
server.on('error', onError);
server.on('listening', onListening);

/**
* Normalize a port into a number, string, or false.
Expand All @@ -68,20 +67,20 @@ function normalizePort(val) {
*/

function onError(error) {
if (error.syscall !== "listen") {
if (error.syscall !== 'listen') {
throw error;
}

var bind = typeof port === "string" ? "Pipe " + port : "Port " + port;
var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port;

// handle specific listen errors with friendly messages
switch (error.code) {
case "EACCES":
console.error(bind + " requires elevated privileges");
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case "EADDRINUSE":
console.error(bind + " is already in use");
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
Expand All @@ -95,7 +94,7 @@ function onError(error) {

function onListening() {
var addr = server.address();
var bind = typeof addr === "string" ? "pipe " + addr : "port " + addr.port;
console.log("Now listening on " + bind);
debug("Listening on " + bind);
var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port;
console.log('Now listening on ' + bind);
debug('Listening on ' + bind);
}
21 changes: 21 additions & 0 deletions api/controllers/account.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const { collection } = require("../models/post");
const Post = require("../models/post");
const TokenGenerator = require("../models/token_generator");

const AccountController = {
Index: (req, res) => {
Post.find({ user_id: req.user_id }, async (err, posts) => {
if (err) {
// res.status(401).json({ message: "Bad request" });
throw err;
} else {
const token = await TokenGenerator.jsonwebtoken(req.user_id);

res.status(200).json({ posts: posts, token: token });
// res.status(200).json({ message: "ok" });
}
});
},
};

module.exports = AccountController;
64 changes: 59 additions & 5 deletions api/controllers/posts.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ const PostsController = {
if (err) {
throw err;
}
const token = await TokenGenerator.jsonwebtoken(req.user_id)

const token = await TokenGenerator.jsonwebtoken(req.user_id);

res.status(200).json({ posts: posts, token: token });
});
},
Expand All @@ -17,11 +19,63 @@ const PostsController = {
if (err) {
throw err;
}
const token = await TokenGenerator.jsonwebtoken(req.user_id);

const token = await TokenGenerator.jsonwebtoken(req.user_id)
res.status(201).json({ message: 'OK', token: token });
res.status(201).json({ message: "OK", token: token });
});
},
};

module.exports = PostsController;
Delete: (req, res) => {
Post.deleteOne({ _id: req.body._id }, async (err) => {
if (err) {
throw err;
} else {
const token = await TokenGenerator.jsonwebtoken(req.user_id);

res.status(204).json({ message: "OK", token: token });
}
});
},
Update: (req, res) => {
Post.updateOne(
{ _id: req.body._id, message: req.body.message },
async (err) => {
if (err) {
throw err;
} else {
const token = await TokenGenerator.jsonwebtoken(req.user_id);
res.status(204).json({ message: "OK", token: token });
}
}
);
},
Likes: (req, res) => {
Post.updateOne(
{ _id: req.body._id },
{ $addToSet: { likes: req.body._user_id } }, //addToSet searches the array and if it matches it doesn't push
async (err) => {
if (err) {
throw err;
} else {
const token = await TokenGenerator.jsonwebtoken(req.user_id);
res.status(204).json({ message: "OK", token: token });
}
}
);
},
Unlikes: (req, res) => {
Post.updateOne(
{ _id: req.body._id },
{ $pull: { likes: req.body._user_id } }, //addToSet searches the array and if it matches it doesn't push
async (err) => {
if (err) {
throw err;
} else {
const token = await TokenGenerator.jsonwebtoken(req.user_id);
res.status(204).json({ message: "OK", token: token });
}
}
);
},
}
module.exports = PostsController;
20 changes: 10 additions & 10 deletions api/controllers/tokens.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
const User = require("../models/user");
const TokenGenerator = require("../models/token_generator")
const User = require('../models/user');
const TokenGenerator = require('../models/token_generator');

const SessionsController = {

Create: (req, res) => {
const email = req.body.email;
const password = req.body.password;

User.findOne({ email: email }).then(async (user) => {
// checks credentials
if (!user) {
console.log("auth error: user not found")
res.status(401).json({ message: "auth error" });
console.log('auth error: user not found');
res.status(401).json({ message: 'auth error' });
} else if (user.password !== password) {
console.log("auth error: passwords do not match")
res.status(401).json({ message: "auth error" });
console.log('auth error: passwords do not match');
res.status(401).json({ message: 'auth error' });
} else {
const token = await TokenGenerator.jsonwebtoken(user.id)
res.status(201).json({ token: token, message: "OK" });
const token = await TokenGenerator.jsonwebtoken(user.id);
res.status(201).json({ token: token, message: 'OK', user_id: user.id });
}
});
}
},
};

module.exports = SessionsController;
14 changes: 11 additions & 3 deletions api/controllers/users.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
const User = require("../models/user");
const User = require('../models/user');

const UsersController = {
Create: (req, res) => {
const user = new User(req.body);
const user = new User({
email: req.body.email,
password: req.body.password,
});

if (req.file) {
user.image = req.file.buffer;
}

user.save((err) => {
if (err) {
res.status(400).json({message: 'Bad request'})
res.status(400).json({ message: 'Bad request' });
} else {
res.status(201).json({ message: 'OK' });
}
Expand Down
2 changes: 1 addition & 1 deletion api/jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
module.exports = {
// All imported modules in your tests should be mocked automatically
// automock: false,

maxWorkers: 1,
// Stop running tests after `n` failures
// bail: 0,

Expand Down
25 changes: 20 additions & 5 deletions api/models/post.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,24 @@
const mongoose = require("mongoose");
const { ObjectID } = require('mongodb');
const mongoose = require('mongoose');

const PostSchema = new mongoose.Schema({
message: String
});
/**
* create a schema for Posts
* it contains a list of the fields that you wish to have in the data
* e.g. message: {type: String, required: true}
*/
const PostSchema = new mongoose.Schema(
{
user_id: {
type: mongoose.Types.ObjectId,
ref: 'User',
required: true,
},
message: { type: String, required: true },
likes: [{type: mongoose.Types.ObjectId, ref:'User'}]
},
{ timestamps: true }
);

const Post = mongoose.model("Post", PostSchema);
const Post = mongoose.model('Post', PostSchema);

module.exports = Post;
Loading