diff --git a/functions/handlers/post.js b/functions/handlers/post.js index a57cfe1..b431e0a 100644 --- a/functions/handlers/post.js +++ b/functions/handlers/post.js @@ -1,6 +1,8 @@ /* eslint-disable prefer-arrow-callback */ /* eslint-disable promise/always-return */ const admin = require('firebase-admin'); +const { db } = require('../util/admin'); + exports.putPost = (req, res) => { const newPost = { @@ -39,11 +41,11 @@ exports.getallPostsforUser = (req, res) => { return res.status(200).json(posts); }) .then(function() { - res.status(200).send("Successfully retrieved all user's posts from database."); - return; + return res.status(200).json("Successfully retrieved all user's posts from database."); + }) .catch(function(err) { - res.status(500).send("Failed to retrieve user's posts from database.", err); + return res.status(500).json("Failed to retrieve user's posts from database.", err); }); }; @@ -58,14 +60,93 @@ exports.getallPosts = (req, res) => { return res.status(200).json(posts); }) .then(function() { - res.status(200).send("Successfully retrieved every post from database."); - return; + return res.status(200).json("Successfully retrieved every post from database."); }) .catch(function(err) { - res.status(500).send("Failed to retrieve posts from database.", err); + return res.status(500).json("Failed to retrieve posts from database.", err); }); }; +exports.likePost = (req, res) => { + let postData; + const likeDoc = admin.firestore().collection('likes').where('userHandle', '==', req.user.handle) + .where('postId', '==', req.params.postId).limit(1); + + const postDoc = db.doc(`/posts/${req.params.postId}`); + + postDoc.get() + .then((doc) => { + if(doc.exists) { + postData = doc.data(); + return likeDoc.get(); + } + else + { + return res.status(404).json({error: 'Post not found'}); + } + }) + .then((data) => { + if (data.empty) { + return admin.firestore().collection('likes').add({ + postId : req.params.postId, + userHandle: req.user.handle + + }) + .then(() => { + postData.likeCount++; + return postDoc.update({likeCount : postData.likeCount}) + }) + .then(() => { + return res.status(200).json(postData); + }) + } + }) + .catch((err) => { + return res.status(500).json({error: 'Something is wrong'}); + }) + +} + +exports.unlikePost = (req, res) => { + + let postData; + const likeDoc = admin.firestore().collection('likes').where('userHandle', '==', req.user.handle) + .where('postId', '==', req.params.postId).limit(1); + + const postDoc = db.doc(`/posts/${req.params.postId}`); + + postDoc.get() + .then((doc) => { + if(doc.exists) { + postData = doc.data(); + return likeDoc.get(); + } + else + { + return res.status(404).json({error: 'Post not found'}); + } + }) + .then((data) => { + return db + .doc(`/likes/${data.docs[0].id}`) + .delete() + .then(() => { + postData.likeCount--; + return postDoc.update({ likeCount: postData.likeCount }); + }) + .then(() => { + res.status(200).json(postData); + }); + + }) + .catch((err) => { + console.error(err); + return res.status(500).json({error: 'Something is wrong'}); + }) + +} + + exports.getFilteredPosts = (req, res) => { admin.firestore().collection('posts').where('userHandle', '==', 'new user').where('microBlogTopics', '==') }; diff --git a/functions/index.js b/functions/index.js index f05c7b8..2dd66ae 100644 --- a/functions/index.js +++ b/functions/index.js @@ -58,7 +58,7 @@ app.get("/getUserHandles", fbAuth, getUserHandles); /*------------------------------------------------------------------* * handlers/post.js * *------------------------------------------------------------------*/ -const { getallPostsforUser, getallPosts, putPost } = require("./handlers/post"); +const { getallPostsforUser, getallPosts, putPost, likePost, unlikePost} = require("./handlers/post"); app.get("/getallPostsforUser", fbAuth, getallPostsforUser); @@ -67,6 +67,9 @@ app.get("/getallPosts", getallPosts); // Adds one post to the database app.post("/putPost", fbAuth, putPost); +app.get("/like/:postId", fbAuth, likePost); +app.get("/unlike/:postId", fbAuth, unlikePost); + /*------------------------------------------------------------------* * handlers/topic.js * *------------------------------------------------------------------*/ diff --git a/twistter-frontend/package.json b/twistter-frontend/package.json index f7dd12f..a0cec16 100644 --- a/twistter-frontend/package.json +++ b/twistter-frontend/package.json @@ -41,5 +41,5 @@ "last 1 safari version" ] }, - "proxy": "https://us-central1-twistter-e4649.cloudfunctions.net/api" + "proxy": "http://localhost:5001/twistter-e4649/us-central1/api" } diff --git a/twistter-frontend/src/pages/Home.js b/twistter-frontend/src/pages/Home.js index cee0a93..fb28409 100644 --- a/twistter-frontend/src/pages/Home.js +++ b/twistter-frontend/src/pages/Home.js @@ -17,7 +17,10 @@ import noImage from '../images/no-img.png'; import Writing_Microblogs from '../Writing_Microblogs'; class Home extends Component { - state = {}; + state = { + + }; + componentDidMount() { axios @@ -31,8 +34,9 @@ class Home extends Component { .catch(err => console.log(err)); } + render() { - let authenticated = this.props.user.authenticated; + let authenticated = this.props.user.authenticated; let postMarkup = this.state.posts ? ( this.state.posts.map(post => @@ -50,9 +54,10 @@ class Home extends Component { {post.microBlogTitle} {post.body}
- Topics: {post.microBlogTopics} + Topics: {post.microBlogTopics}
Likes {post.likeCount} Comments {post.commentCount} + ) @@ -96,6 +101,7 @@ class Home extends Component { } } + const mapStateToProps = (state) => ({ user: state.user }) @@ -104,4 +110,55 @@ Home.propTypes = { user: PropTypes.object.isRequired } +class Like extends Component { + + constructor(props) { + super(props) + this.state = { + like: false + } + + this.handleClick = this.handleClick.bind(this); + } + + handleClick(){ + + this.setState({ + like: !this.state.like + }); + + if(this.state.like == false) + { + + axios.get(`/like/${this.props.microBlog}`) + .then((res) => { + console.log(res.data); + }) + .catch((err) => { + console.log(err); + }) + } + else + { + axios.get(`/unlike/${this.props.microBlog}`) + .then((res) => { + console.log(res.data); + }) + .catch((err) => { + console.log(err); + }) + } + + } + render() { + const label = this.state.like ? 'Unlike' : 'Like' + return( +
+ +
+ ) + } + +} + export default connect(mapStateToProps)(Home); \ No newline at end of file