diff --git a/functions/handlers/post.js b/functions/handlers/post.js index a57cfe1..af1b854 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 = { @@ -12,7 +14,8 @@ exports.putPost = (req, res) => { createdAt: new Date().toISOString(), likeCount: 0, commentCount: 0, - microBlogTopics: req.body.microBlogTopics + microBlogTopics: req.body.microBlogTopics, + quoteBody: null }; admin.firestore().collection('posts').add(newPost) @@ -30,6 +33,7 @@ exports.putPost = (req, res) => { exports.getallPostsforUser = (req, res) => { var post_query = admin.firestore().collection("posts").where("userHandle", "==", req.user.handle); + post_query.get() .then(function(myPosts) { let posts = []; @@ -39,11 +43,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 +62,236 @@ 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.quoteWithPost = (req, res) => { + + let quoteData; + const quoteDoc = admin.firestore().collection('quote'). + 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) { + quoteData = doc.data(); + return quoteDoc.get(); + } + else + { + return res.status(404).json({error: 'Post not found'}); + } + }) + .then((data) => { + if(data.empty) { + return admin.firestore().collection('quote').add({ + quoteId : req.params.postId, + userHandle : req.user.handle, + quoteBody : req.body.quoteBody + }) + .then(() => { + const post = { + body: quoteData.body, + userHandle : req.user.handle, + quoteBody: req.body.quoteBody, + createdAt : new Date().toISOString(), + userImage: req.body.userImage, + likeCount: 0, + commentCount: 0, + userID: req.user.uid, + microBlogTitle: quoteData.microBlogTitle, + microBlogTopics: quoteData.microBlogTopics, + quoteId: req.params.postId + } + return admin.firestore().collection('posts').add(post) + .then((doc) => { + doc.update({postId: doc.id}) + const resPost = post; + resPost.postId = doc.id; + return res.status(200).json(resPost); + }) + }) + } + else { + return res.status(400).json({ error: 'Post has already been quoted.' }); + } + }) + .catch((err) => { + return res.status(500).json({error: err}); + + }) + +} + +exports.quoteWithoutPost = (req, res) => { + let quoteData; + const quoteDoc = admin.firestore().collection('quote'). + 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) { + quoteData = doc.data(); + return quoteDoc.get(); + } + else + { + return res.status(404).json({error: 'Post not found'}); + } + }) + .then((data) => { + if(data.empty) { + return admin.firestore().collection('quote').add({ + quoteId : req.params.postId, + userHandle : req.user.handle, + quoteBody: null + }) + .then(() => { + const post = { + userHandle : req.user.handle, + body: quoteData.body, + quoteBody: null, + createdAt : new Date().toISOString(), + likeCount: 0, + commentCount: 0, + userID: req.user.uid, + userImage: req.body.userImage, + microBlogTitle: quoteData.microBlogTitle, + microBlogTopics: quoteData.microBlogTopics, + quoteId: req.params.postId + } + return admin.firestore().collection('posts').add(post) + .then((doc) => { + doc.update({postId: doc.id}) + const resPost = post; + resPost.postId = doc.id; + return res.status(200).json(resPost); + }) + + + + }) + } + else { + return res.status(400).json({ error: 'Post has already been quoted.' }); + } + }) + .catch((err) => { + return res.status(500).json({error: 'Something is wrong'}); + + }) + +} + +exports.checkforLikePost = (req, res) => { + const likedPostDoc = admin.firestore().collection('likes').where('userHandle', '==', req.user.handle) + .where('postId', '==', req.params.postId).limit(1); + let result; + + likedPostDoc.get() + .then((data) => { + if (data.empty) { + result = false; + return res.status(200).json(result); + } + else + { + result = true; + return res.status(200).json(result); + } + }) +} + +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 4626e47..ee203eb 100644 --- a/functions/index.js +++ b/functions/index.js @@ -70,7 +70,7 @@ app.post("/removeSub", fbAuth, removeSub); /*------------------------------------------------------------------* * handlers/post.js * *------------------------------------------------------------------*/ -const { getallPostsforUser, getallPosts, putPost } = require("./handlers/post"); +const { getallPostsforUser, getallPosts, putPost, likePost, unlikePost, quoteWithPost, quoteWithoutPost, checkforLikePost} = require("./handlers/post"); app.get("/getallPostsforUser", fbAuth, getallPostsforUser); @@ -79,6 +79,15 @@ 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); +app.get("/checkforLikePost/:postId", fbAuth, checkforLikePost); + +app.post("/quoteWithPost/:postId", fbAuth, quoteWithPost); +app.post("/quoteWithoutPost/:postId", fbAuth, quoteWithoutPost); + + + /*------------------------------------------------------------------* * 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 956ccf0..f08543e 100644 --- a/twistter-frontend/src/pages/Home.js +++ b/twistter-frontend/src/pages/Home.js @@ -11,13 +11,18 @@ import CardContent from "@material-ui/core/CardContent"; import Typography from "@material-ui/core/Typography"; // component -import "../App.css"; -import logo from "../images/twistter-logo.png"; -import noImage from "../images/no-img.png"; -import Writing_Microblogs from "../Writing_Microblogs"; +import '../App.css'; +import logo from '../images/twistter-logo.png'; +import noImage from '../images/no-img.png'; +import Writing_Microblogs from '../Writing_Microblogs'; +import ReactModal from 'react-modal'; + class Home extends Component { - state = {}; + state = { + + }; + componentDidMount() { axios @@ -31,9 +36,10 @@ class Home extends Component { .catch(err => console.log(err)); } + render() { - let authenticated = this.props.user.authenticated; - + let authenticated = this.props.user.authenticated; + let username = this.props.user.credentials.handle; let postMarkup = this.state.posts ? ( this.state.posts.map(post => ( @@ -52,18 +58,16 @@ class Home extends Component { {post.createdAt}
- - {post.microBlogTitle} - + {post.microBlogTitle} + {post.quoteBody} +
{post.body}
- - Topics: {post.microBlogTopics} - + Topics: {post.microBlogTopics}
- - Likes {post.likeCount} Comments {post.commentCount} - + {/* Likes {post.likeCount} */} + +
)) @@ -114,7 +118,217 @@ class Home extends Component { } } -const mapStateToProps = state => ({ +class Quote extends Component { + constructor(props) { + super(props); + this.state = { + characterCount: 250, + showModal: false, + value: "" + } + + this.handleSubmitWithoutPost = this.handleSubmitWithoutPost.bind(this); + this.handleOpenModal = this.handleOpenModal.bind(this); + this.handleCloseModal = this.handleCloseModal.bind(this); + this.handleSubmit = this.handleSubmit.bind(this); + } + + handleSubmitWithoutPost(event) { + const post = { + + userImage: "bing-url", + } + const headers = { + headers: { "Content-Type": "application/json" } + }; + axios.post(`/quoteWithoutPost/${this.props.microblog}`, post, headers) + .then((res) => { + + console.log(res.data); + }) + .catch(err => { + + console.error(err); + }); + event.preventDefault(); + } + + handleOpenModal() { + this.setState({ showModal: true }); + } + + handleCloseModal() { + this.setState({ showModal: false }); + } + + handleChangeforPost(event) { + this.setState({ value: event.target.value }); + } + + handleChangeforCharacterCount(event) { + const charCount = event.target.value.length; + const charRemaining = 250 - charCount; + this.setState({ characterCount: charRemaining }); + } + + handleSubmit(event) { + const quotedPost = { + quoteBody: this.state.value, + userImage: "bing-url", + }; + const headers = { + headers: { "Content-Type": "application/json" } + }; + axios.post(`/quoteWithPost/${this.props.microblog}`, quotedPost, headers) + .then((res) => { + + console.log(res.data); + }) + .catch(err => { + + console.error(err); + }); + event.preventDefault(); + this.setState({ showModal: false, characterCount: 250, value: "" }); + } + + render() { + return ( +
+ + +
+
+