mirror of
https://github.com/wassname/talk.git
synced 2026-07-11 03:02:55 +08:00
Merge branch 'stream-endpoint' into comment-post-api
This commit is contained in:
@@ -6,5 +6,6 @@ const express = require('express');
|
||||
const app = express();
|
||||
|
||||
app.use('/api/v1', require('./routes/api'));
|
||||
app.use('/client/', express.static('./dist'));
|
||||
|
||||
module.exports = app;
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
<html>
|
||||
<head>
|
||||
</head>
|
||||
<body>
|
||||
<div style="margin-left:auto; margin-right:auto; width:500px">
|
||||
<h1>Lorem ipsum</h1>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut lobortis sollicitudin eros a ornare. Curabitur dignissim vestibulum massa non rhoncus. Cras laoreet ante vel nunc hendrerit, ac imperdiet neque egestas. Suspendisse aliquet iaculis fermentum. Pellentesque interdum nec elit sed tincidunt. Donec volutpat, tellus posuere laoreet consequat, mi lacus laoreet massa, sed vehicula mauris velit non lectus. Integer non enim nec neque congue faucibus porttitor sit amet dui.</p>
|
||||
<p>Nunc pharetra orci id diam feugiat, vitae rutrum magna efficitur. Morbi porttitor blandit lorem, et facilisis tellus luctus at. Morbi tincidunt eget nisl id placerat. Nullam consectetur quam vel mauris lacinia, non consectetur est faucibus. Duis cursus auctor nulla nec sagittis. Aenean sem erat, ultrices a hendrerit consectetur, accumsan non lorem. Integer ac neque sed magna sodales vulputate at quis neque. Praesent eget ornare lacus. Donec ultricies, dolor eget commodo faucibus, arcu velit ullamcorper tellus, in cursus tellus elit sed urna. Suspendisse in consequat magna. Duis vel ullamcorper tortor, vel cursus libero. Proin et nisi luctus ligula faucibus luctus. Morbi pulvinar, justo ac feugiat elementum, libero tellus congue justo, pharetra ultrices felis felis id leo. Integer mattis quam tempus libero porta, ac pretium ligula elementum.</p>
|
||||
<div id='coralStreamEmbed'></div>
|
||||
<script type='text/javascript' src='http://pym.nprapps.org/pym.v1.min.js'></script>
|
||||
<script>
|
||||
var pymParent = new pym.Parent('coralStreamEmbed', 'index.html', {});
|
||||
pymParent.onMessage('height', function(height) {document.querySelector('#coralStreamEmbed iframe').height = height + 'px'})</script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -14,7 +14,7 @@ import Flag from '../../coral-plugin-flags/FlagButton'
|
||||
import {ReplyBox, ReplyButton} from '../../coral-plugin-replies'
|
||||
import Pym from 'pym.js'
|
||||
|
||||
const {addItem, updateItem, postItem, getItemsQuery, postAction, appendItemRelated} = itemActions
|
||||
const {addItem, updateItem, postItem, getStream, postAction, appendItemArray} = itemActions
|
||||
const {addNotification, clearNotification} = notificationActions
|
||||
const {setLoggedInUser} = authActions
|
||||
|
||||
@@ -38,8 +38,8 @@ const {setLoggedInUser} = authActions
|
||||
postItem: (data, type, id) => {
|
||||
return dispatch(postItem(data, type, id))
|
||||
},
|
||||
getItemsQuery: (rootId) => {
|
||||
return dispatch(getItemsQuery(rootId))
|
||||
getStream: (rootId) => {
|
||||
return dispatch(getStream(rootId))
|
||||
},
|
||||
addNotification: (type, text) => {
|
||||
return dispatch(addNotification(type, text))
|
||||
@@ -53,8 +53,8 @@ const {setLoggedInUser} = authActions
|
||||
postAction: (item, action, user) => {
|
||||
return dispatch(postAction(item, action, user))
|
||||
},
|
||||
appendItemRelated: (item, property, value) => {
|
||||
return dispatch(appendItemRelated(item, property, value))
|
||||
appendItemArray: (item, property, value) => {
|
||||
return dispatch(appendItemArray(item, property, value))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -72,7 +72,7 @@ class CommentStream extends Component {
|
||||
// Set up messaging between embedded Iframe an parent component
|
||||
// Using recommended Pym init code which violates .eslint standards
|
||||
new Pym.Child({ polling: 500 })
|
||||
this.props.getItemsQuery('assetTest')
|
||||
this.props.getStream('assetTest')
|
||||
}
|
||||
|
||||
render () {
|
||||
@@ -97,60 +97,58 @@ class CommentStream extends Component {
|
||||
|
||||
const rootItemId = 'assetTest'
|
||||
const rootItem = this.props.items[rootItemId]
|
||||
console.log(this.props.items);
|
||||
return <div>
|
||||
{
|
||||
rootItem ?
|
||||
<div>
|
||||
<div id="commentBox">
|
||||
<Count
|
||||
item_id={rootItemId}
|
||||
id={rootItemId}
|
||||
items={this.props.items}/>
|
||||
<CommentBox
|
||||
addNotification={this.props.addNotification}
|
||||
postItem={this.props.postItem}
|
||||
appendItemRelated={this.props.appendItemRelated}
|
||||
appendItemArray={this.props.appendItemArray}
|
||||
updateItem={this.props.updateItem}
|
||||
item_id={rootItemId}/>
|
||||
id={rootItemId}/>
|
||||
</div>
|
||||
{
|
||||
rootItem.related.comment.map((commentId) => {
|
||||
rootItem.comments.map((commentId) => {
|
||||
const comment = this.props.items[commentId]
|
||||
return <div className="comment">
|
||||
<hr aria-hidden={true}/>
|
||||
<PubDate created_at={comment.created_at}/>
|
||||
<Content content={comment.data.content}/>
|
||||
<Content content={comment.body}/>
|
||||
<div className="commentActions">
|
||||
<Flag
|
||||
addNotification={this.props.addNotification}
|
||||
item_id={commentId}
|
||||
id={commentId}
|
||||
flag={comment.flag}
|
||||
postAction={this.props.postAction}
|
||||
currentUser={this.props.auth.user}/>
|
||||
<ReplyButton
|
||||
updateItem={this.props.updateItem}
|
||||
item_id={commentId}/>
|
||||
id={commentId}/>
|
||||
</div>
|
||||
<ReplyBox
|
||||
addNotification={this.props.addNotification}
|
||||
postItem={this.props.postItem}
|
||||
appendItemRelated={this.props.appendItemRelated}
|
||||
appendItemArray={this.props.appendItemArray}
|
||||
updateItem={this.props.updateItem}
|
||||
item_id={commentId}
|
||||
id={commentId}
|
||||
showReply={comment.showReply}/>
|
||||
{
|
||||
comment.related &&
|
||||
comment.related.child &&
|
||||
comment.related.child.map((replyId) => {
|
||||
comment.children &&
|
||||
comment.children.map((replyId) => {
|
||||
let reply = this.props.items[replyId]
|
||||
return <div className="reply">
|
||||
<hr aria-hidden={true}/>
|
||||
<PubDate created_at={reply.created_at}/>
|
||||
<Content content={reply.data.content}/>
|
||||
<Content content={reply.body}/>
|
||||
<div className="replyActions">
|
||||
<Flag
|
||||
addNotificiation={this.props.addNotification}
|
||||
item_id={replyId}
|
||||
id={replyId}
|
||||
flag={reply.flag}
|
||||
postAction={this.props.postAction}
|
||||
currentUser={this.props.auth.user}/>
|
||||
|
||||
@@ -8,7 +8,7 @@ module.exports = {
|
||||
devtool: 'source-map',
|
||||
entry: [
|
||||
'babel-polyfill',
|
||||
'./src/app'
|
||||
path.join(__dirname, 'src', 'app')
|
||||
],
|
||||
output: {
|
||||
path: path.join(__dirname, '..', '..','dist', 'coral-embed-stream'),
|
||||
@@ -23,13 +23,13 @@ module.exports = {
|
||||
},
|
||||
plugins: [
|
||||
new Copy([{
|
||||
from: './index.html'
|
||||
from: path.join(__dirname, 'index.html')
|
||||
},
|
||||
{
|
||||
from: './style/default.css'
|
||||
from: path.join(__dirname, 'style', 'default.css')
|
||||
},
|
||||
{
|
||||
from: './public/',
|
||||
from: path.join(__dirname, 'public'),
|
||||
to: './'
|
||||
},
|
||||
{
|
||||
|
||||
@@ -10,7 +10,6 @@ import mocks from '../../mocks.json'
|
||||
export const ADD_ITEM = 'ADD_ITEM'
|
||||
export const UPDATE_ITEM = 'UPDATE_ITEM'
|
||||
export const APPEND_ITEM_ARRAY = 'APPEND_ITEM_ARRAY'
|
||||
export const APPEND_ITEM_RELATED = 'APPEND_ITEM_RELATED'
|
||||
|
||||
/**
|
||||
* Action creators
|
||||
@@ -26,13 +25,13 @@ export const APPEND_ITEM_RELATED = 'APPEND_ITEM_RELATED'
|
||||
*/
|
||||
|
||||
export const addItem = (item) => {
|
||||
if (!item.item_id) {
|
||||
if (!item.id) {
|
||||
console.warn('addItem called without an item id.')
|
||||
}
|
||||
return {
|
||||
type: ADD_ITEM,
|
||||
item: item,
|
||||
item_id: item.item_id
|
||||
id: item.id
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,36 +40,26 @@ export const addItem = (item) => {
|
||||
* Useful for item-level toggles, etc.
|
||||
*
|
||||
* @params
|
||||
* item_id - the id of the item to be posted
|
||||
* id - the id of the item to be posted
|
||||
* property - the property to be updated
|
||||
* value - the value that the property should be set to
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
export const updateItem = (item_id, property, value) => {
|
||||
export const updateItem = (id, property, value) => {
|
||||
return {
|
||||
type: UPDATE_ITEM,
|
||||
item_id,
|
||||
id,
|
||||
property,
|
||||
value
|
||||
}
|
||||
}
|
||||
|
||||
export const appendItemArray = (item_id, property, value) => {
|
||||
export const appendItemArray = (id, property, value) => {
|
||||
return {
|
||||
type: APPEND_ITEM_ARRAY,
|
||||
item_id,
|
||||
property,
|
||||
value
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export const appendItemRelated = (item_id, property, value) => {
|
||||
return {
|
||||
type: APPEND_ITEM_RELATED,
|
||||
item_id,
|
||||
id,
|
||||
property,
|
||||
value
|
||||
}
|
||||
@@ -89,26 +78,50 @@ export const appendItemRelated = (item_id, property, value) => {
|
||||
* @dispatches
|
||||
* A set of items to the item store
|
||||
*/
|
||||
export function getItemsQuery (rootId) {
|
||||
export function getStream (assetId) {
|
||||
return (dispatch) => {
|
||||
// return fetch('/v1/exec/view/' + rootId)
|
||||
// .then(
|
||||
// response => {
|
||||
// return response.ok ? response.json() : Promise.reject(response.status + ' ' + response.statusText)
|
||||
// }
|
||||
// )
|
||||
// .then((json) => {
|
||||
// let items = json.results[0].Docs
|
||||
// for (var i = 0; i < items.length; i++) {
|
||||
// dispatch(addItem(items[i]))
|
||||
// }
|
||||
// return (items)
|
||||
// })
|
||||
console.log('Loading mock data', mocks);
|
||||
let mockData = mocks.query
|
||||
for (var i=0; i < mockData.length; i++ ) {
|
||||
dispatch(addItem(mockData[i]))
|
||||
}
|
||||
return fetch('/api/v1/stream?asset_id='+assetId)
|
||||
.then(
|
||||
response => {
|
||||
return response.ok ? response.json() : Promise.reject(response.status + ' ' + response.statusText)
|
||||
}
|
||||
)
|
||||
.then((json) => {
|
||||
|
||||
/* Sort comments by date*/
|
||||
let rootComments = []
|
||||
let childComments = {}
|
||||
const sorted = json.sort((a,b) => b.created_at - a.created_at)
|
||||
sorted.reduce((prev, item) => {
|
||||
dispatch(addItem(item))
|
||||
|
||||
/* Check for root and child comments. */
|
||||
if (
|
||||
item.type === 'comment' &&
|
||||
item.asset_id === assetId &&
|
||||
!item.parent_id) {
|
||||
rootComments.push(item.id)
|
||||
} else if (
|
||||
item.type === 'comment' &&
|
||||
item.asset_id === assetId
|
||||
) {
|
||||
let children = childComments[item.parent_id] || []
|
||||
childComments[item.parent_id] = children.concat(item.id)
|
||||
}
|
||||
}, {})
|
||||
|
||||
dispatch(addItem({
|
||||
id: assetId,
|
||||
comments: rootComments
|
||||
}))
|
||||
|
||||
const keys = Object.keys(childComments)
|
||||
for (var i=0; i < keys.length; i++ ) {
|
||||
dispatch(updateItem(keys[i], 'children', childComments[keys[i]]))
|
||||
}
|
||||
|
||||
return (json)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,21 +171,16 @@ export function getItemsArray (ids) {
|
||||
* The newly put item to the item store
|
||||
*/
|
||||
|
||||
export function postItem (data, type, id) {
|
||||
export function postItem (item, type, id) {
|
||||
return (dispatch) => {
|
||||
let item = {
|
||||
type,
|
||||
data,
|
||||
version: 1
|
||||
}
|
||||
if (id) {
|
||||
item.item_id = id
|
||||
item.id = id
|
||||
}
|
||||
let options = {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(item)
|
||||
}
|
||||
return fetch('/v1/item', options)
|
||||
return fetch('api/v1/' + type, options)
|
||||
.then(
|
||||
response => {
|
||||
return response.ok ? response.json()
|
||||
@@ -180,9 +188,8 @@ export function postItem (data, type, id) {
|
||||
}
|
||||
)
|
||||
.then((json) => {
|
||||
// Patch until ID is returned from backend
|
||||
dispatch(addItem(json))
|
||||
return json.item_id
|
||||
return json.id
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -194,7 +201,7 @@ export function postItem (data, type, id) {
|
||||
* Posts an action to an item
|
||||
*
|
||||
* @params
|
||||
* item_id - the id of the item on which the action is taking place
|
||||
* id - the id of the item on which the action is taking place
|
||||
* action - the name of the action
|
||||
* user - the user performing the action
|
||||
* host - the coral host
|
||||
@@ -204,13 +211,19 @@ export function postItem (data, type, id) {
|
||||
*
|
||||
*/
|
||||
|
||||
export function postAction (item, action, user) {
|
||||
export function postAction (id, type, user_id) {
|
||||
return (dispatch) => {
|
||||
let options = {
|
||||
method: 'POST'
|
||||
const action = {
|
||||
type,
|
||||
user_id
|
||||
}
|
||||
dispatch(appendItemArray(item, action, user))
|
||||
return fetch('/v1/action/' + action + '/user/' + user + '/on/item/' + item, options)
|
||||
const options = {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(action)
|
||||
}
|
||||
|
||||
dispatch(appendItemArray(id, type, user_id))
|
||||
return fetch('api/v1/comments/' + id + '/actions', options)
|
||||
.then(
|
||||
response => {
|
||||
return response.ok ? response.text()
|
||||
|
||||
@@ -8,18 +8,13 @@ const initialState = fromJS({})
|
||||
export default (state = initialState, action) => {
|
||||
switch (action.type) {
|
||||
case actions.ADD_ITEM:
|
||||
return state.set(action.item_id, fromJS(action.item))
|
||||
return state.set(action.id, fromJS(action.item))
|
||||
case actions.UPDATE_ITEM:
|
||||
return state.updateIn([action.item_id, 'data', action.property], () =>
|
||||
return state.updateIn([action.id, action.property], () =>
|
||||
fromJS(action.value)
|
||||
)
|
||||
case actions.APPEND_ITEM_ARRAY:
|
||||
return state.updateIn([action.item_id, 'data', action.property], (prop) => {
|
||||
return prop ? prop.push(action.value) : fromJS([action.value])
|
||||
}
|
||||
)
|
||||
case actions.APPEND_ITEM_RELATED:
|
||||
return state.updateIn([action.item_id, 'related', action.property], (prop) => {
|
||||
return state.updateIn([action.id, action.property], (prop) => {
|
||||
return prop ? prop.push(action.value) : fromJS([action.value])
|
||||
}
|
||||
)
|
||||
|
||||
@@ -2,16 +2,16 @@ import React from 'react'
|
||||
|
||||
const name = 'coral-plugin-comment-count'
|
||||
|
||||
const CommentCount = ({items, item_id}) => {
|
||||
const CommentCount = ({items, id}) => {
|
||||
let count = 0
|
||||
if (items[item_id]) {
|
||||
count += items[item_id].related.comment.length
|
||||
if (items[id]) {
|
||||
count += items[id].comments.length
|
||||
}
|
||||
const itemKeys = Object.keys(items)
|
||||
for (var i=0; i < itemKeys.length; i++) {
|
||||
const item = items[itemKeys[i]]
|
||||
if (item.type === 'comment' && item.related && item.related.child) {
|
||||
count += item.related.child.length
|
||||
if (item.type === 'comment' && item.children) {
|
||||
count += item.children.length
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,22 +18,22 @@ class CommentBox extends Component {
|
||||
}
|
||||
|
||||
postComment = () => {
|
||||
const {postItem, updateItem, item_id, reply, addNotification, appendItemRelated} = this.props
|
||||
const {postItem, updateItem, item_id, reply, addNotification, appendItemArray} = this.props
|
||||
let comment = {
|
||||
content: this.state.content
|
||||
}
|
||||
let related
|
||||
if (reply) {
|
||||
comment.parent_id = item_id
|
||||
related = 'child'
|
||||
related = 'children'
|
||||
} else {
|
||||
comment.asset_id = item_id
|
||||
related = 'comment'
|
||||
related = 'comments'
|
||||
}
|
||||
updateItem(item_id, 'showReply', false)
|
||||
postItem(comment, 'comment')
|
||||
postItem(comment, 'comments')
|
||||
.then((id) => {
|
||||
appendItemRelated(item_id, related, id)
|
||||
appendItemArray(item_id, related, id)
|
||||
addNotification('success', 'Your comment has been posted.')
|
||||
}).catch((err) => console.error(err))
|
||||
this.setState({content: ''})
|
||||
|
||||
@@ -11,7 +11,7 @@ const ReplyBox = (props) => <div
|
||||
item_id = {props.item_id}
|
||||
postItem = {props.postItem}
|
||||
addNotification = {props.addNotification}
|
||||
appendItemRelated = {props.appendItemRelated}
|
||||
appendItemArray = {props.appendItemArray}
|
||||
updateItem = {props.updateItem}
|
||||
comments = {props.child}
|
||||
reply = {true}/>
|
||||
|
||||
+10
-1
@@ -13,7 +13,6 @@ const ActionSchema = new Schema({
|
||||
item_id: String,
|
||||
user_id: String
|
||||
},{
|
||||
_id: false,
|
||||
timestamps: {
|
||||
createdAt: 'created_at',
|
||||
updatedAt: 'updated_at'
|
||||
@@ -28,6 +27,16 @@ ActionSchema.statics.findById = function(id) {
|
||||
return Action.findOne({id});
|
||||
};
|
||||
|
||||
/**
|
||||
* Finds users in an array of ids.
|
||||
* @param {String} ids array of user identifiers (uuid)
|
||||
*/
|
||||
ActionSchema.statics.findByItemIdArray = function(item_ids) {
|
||||
return Action.find({
|
||||
'item_id': {$in: item_ids}
|
||||
});
|
||||
};
|
||||
|
||||
const Action = mongoose.model('Action', ActionSchema);
|
||||
|
||||
module.exports = Action;
|
||||
|
||||
+10
-1
@@ -30,12 +30,21 @@ const CommentSchema = new Schema({
|
||||
|
||||
/**
|
||||
* Finds a comment by the id.
|
||||
* @param {String} id identifier of the comment (uuid)
|
||||
* @param {String} asset_id identifier of comment (uuid)
|
||||
*/
|
||||
CommentSchema.statics.findById = function(id) {
|
||||
return Comment.findOne({id});
|
||||
};
|
||||
|
||||
/**
|
||||
* Finds a comment by the asset_id.
|
||||
* @param {String} asset_id identifier of the asset which owns this comment (uuid)
|
||||
*/
|
||||
CommentSchema.statics.findByAssetId = function(asset_id) {
|
||||
return Comment.find({asset_id});
|
||||
};
|
||||
|
||||
|
||||
const Comment = mongoose.model('Comment', CommentSchema);
|
||||
|
||||
module.exports = Comment;
|
||||
|
||||
+16
-7
@@ -1,4 +1,3 @@
|
||||
'use strict';
|
||||
|
||||
const mongoose = require('../mongoose');
|
||||
const uuid = require('uuid');
|
||||
@@ -12,12 +11,12 @@ const UserProfileSchema = new Schema({
|
||||
},
|
||||
display_name: String,
|
||||
auth_user_id: String
|
||||
},{
|
||||
_id: false,
|
||||
timestamps: {
|
||||
createdAt: 'created_at',
|
||||
updatedAt: 'updated_at'
|
||||
}
|
||||
// },{
|
||||
// _id: false,
|
||||
// timestamps: {
|
||||
// createdAt: 'created_at',
|
||||
// updatedAt: 'updated_at'
|
||||
// }
|
||||
});
|
||||
|
||||
/**
|
||||
@@ -28,6 +27,16 @@ UserProfileSchema.statics.findById = function(id) {
|
||||
return UserProfile.findOne({id});
|
||||
};
|
||||
|
||||
/**
|
||||
* Finds users in an array of idd.
|
||||
* @param {String} idd array of user identifiers (uuid)
|
||||
*/
|
||||
UserProfileSchema.statics.findByIdArray = function(ids) {
|
||||
return UserProfile.find({
|
||||
'id': {$in: ids}
|
||||
});
|
||||
};
|
||||
|
||||
// TO DO: methods
|
||||
// modifications to user as statics
|
||||
// find by auth user id
|
||||
|
||||
+5
-2
@@ -5,9 +5,11 @@
|
||||
"main": "app.js",
|
||||
"scripts": {
|
||||
"start": "./bin/www",
|
||||
"build": "webpack --config ./client/coral-embed-stream/webpack.config.js",
|
||||
"lint": "eslint .",
|
||||
"pretest": "npm install",
|
||||
"test": "mocha tests",
|
||||
"test": "mocha tests --recursive",
|
||||
"test-watch": "mocha tests --recursive -w",
|
||||
"embed-start": "node client/coral-embed-stream/dev-server.js"
|
||||
},
|
||||
"config": {
|
||||
@@ -42,7 +44,8 @@
|
||||
"dependencies": {
|
||||
"debug": "^2.2.0",
|
||||
"express": "^4.14.0",
|
||||
"mongoose": "^4.6.5"
|
||||
"mongoose": "^4.6.5",
|
||||
"uuid": "^2.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-core": "6.14.0",
|
||||
|
||||
@@ -3,6 +3,7 @@ const express = require('express');
|
||||
const router = express.Router();
|
||||
|
||||
router.use('/comments', require('./comments'));
|
||||
router.use('/stream', require('./stream'));
|
||||
router.use('/settings', require('./settings'));
|
||||
router.use('/queue', require('./queue'));
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
const express = require('express');
|
||||
const Comment = require('../../../models/comment');
|
||||
const User = require('../../../models/user');
|
||||
const Action = require('../../../models/action');
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/', (req, res, next) => {
|
||||
const comments = Comment.findByAssetId(req.query.asset_id) || [];
|
||||
const users = User.findByIdArray(comments.map((comment) => comment.author_id));
|
||||
const actions = Action.findByItemIdArray(comments.map((comment) => comment.id));
|
||||
res.json(comments.concat(users).concat(actions)).catch(next);
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"env": {
|
||||
"es6": true,
|
||||
"node": true
|
||||
},
|
||||
"extends": "eslint:recommended",
|
||||
"rules": {
|
||||
no-undef: [1]
|
||||
}
|
||||
}
|
||||
+3
-1
@@ -1,10 +1,12 @@
|
||||
/* eslint-env node, mocha */
|
||||
'use strict';
|
||||
|
||||
// require('./utils/mongoose')
|
||||
const expect = require('chai').expect;
|
||||
|
||||
|
||||
describe('Comment', () => {
|
||||
describe.only('#add', () => {
|
||||
describe('#add', () => {
|
||||
it('should add a comment', () => {
|
||||
expect(0).to.be.equal(0);
|
||||
});
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/* eslint-env node, mocha */
|
||||
|
||||
require('../utils/mongoose');
|
||||
const Action = require('../../models/action');
|
||||
const expect = require('chai').expect;
|
||||
|
||||
describe('Action: models', () => {
|
||||
var mockActions;
|
||||
beforeEach(() => {
|
||||
return Action.create([{
|
||||
action_type: 'flag',
|
||||
item_id: '123'
|
||||
},{
|
||||
action_type: 'like',
|
||||
item_id: '789'
|
||||
},{
|
||||
action_type: 'flag',
|
||||
item_id: '456'
|
||||
}]).then((actions) => {
|
||||
mockActions = actions;
|
||||
});
|
||||
});
|
||||
|
||||
describe('#findById()', () => {
|
||||
it('should find an action by id', () => {
|
||||
return Action.findById(mockActions[0].id).then((result) => {
|
||||
expect(result).to.have.property('action_type')
|
||||
.and.to.equal('flag');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('#findByItemIdArray()', () => {
|
||||
it('should find an array of actions from an array of item_ids', () => {
|
||||
return Action.findByItemIdArray(['123','456']).then((result) => {
|
||||
expect(result).to.have.length(2);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,46 @@
|
||||
/* eslint-env node, mocha */
|
||||
|
||||
require('../utils/mongoose');
|
||||
const Comment = require('../../models/comment');
|
||||
const expect = require('chai').expect;
|
||||
|
||||
describe('Comment: models', () => {
|
||||
var mockComments;
|
||||
beforeEach(() => {
|
||||
return Comment.create([{
|
||||
body: 'comment 1',
|
||||
asset_id: '123'
|
||||
},{
|
||||
body: 'comment 2',
|
||||
asset_id: '123'
|
||||
},{
|
||||
body: 'comment 3',
|
||||
asset_id: '456'
|
||||
}]).then((comments) => {
|
||||
mockComments = comments;
|
||||
});
|
||||
});
|
||||
|
||||
describe('#findById()', () => {
|
||||
it('should find a comment by id', () => {
|
||||
return Comment.findById(mockComments[0].id).then((result) => {
|
||||
expect(result).to.have.property('body')
|
||||
.and.to.equal('comment 1');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('#findByAssetId()', () => {
|
||||
it('should find an array of comments by asset id', () => {
|
||||
return Comment.findByAssetId('123').then((result) => {
|
||||
expect(result).to.have.length(2);
|
||||
expect(result[0]).to.have.property('body')
|
||||
.and.to.equal('comment 1');
|
||||
expect(result[1]).to.have.property('body')
|
||||
.and.to.equal('comment 2');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// });
|
||||
});
|
||||
@@ -0,0 +1,40 @@
|
||||
/* eslint-env node, mocha */
|
||||
|
||||
require('../utils/mongoose');
|
||||
const User = require('../../models/user');
|
||||
const expect = require('chai').expect;
|
||||
|
||||
describe('User: models', () => {
|
||||
var mockUsers;
|
||||
beforeEach(() => {
|
||||
return User.create([{
|
||||
display_name: 'Stampi',
|
||||
},{
|
||||
display_name: 'Sockmonster',
|
||||
},{
|
||||
display_name: 'Marvel',
|
||||
}]).then((users) => {
|
||||
mockUsers = users;
|
||||
});
|
||||
});
|
||||
|
||||
describe('#findById()', () => {
|
||||
it('should find a user by id', () => {
|
||||
return User.findById(mockUsers[0].id).then((result) => {
|
||||
expect(result).to.have.property('display_name')
|
||||
.and.to.equal('Stampi');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('#findByIdArray()', () => {
|
||||
it('should find an array of users from an array of ids', () => {
|
||||
const ids = mockUsers.map((user) => user.id)
|
||||
return User.findByIdArray(ids).then((result) => {
|
||||
expect(result).to.have.length(3);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// });
|
||||
});
|
||||
@@ -0,0 +1,60 @@
|
||||
require('../../../utils/mongoose');
|
||||
const Action = require('../../../../models/action');
|
||||
const User = require('../../../../models/user');
|
||||
const Comment = require('../../../../models/comment');
|
||||
const expect = require('chai').expect;
|
||||
const streamRoutes = require('../../../../routes/api/stream');
|
||||
|
||||
describe('api/stream: routes', () => {
|
||||
const comments = [{
|
||||
id: 'abc',
|
||||
body: 'comment 1',
|
||||
asset_id: 'asset',
|
||||
author_id: '123'
|
||||
},{
|
||||
id: 'def',
|
||||
body: 'comment 2',
|
||||
asset_id: 'asset',
|
||||
author_id: '456'
|
||||
},{
|
||||
id: 'hij',
|
||||
body: 'comment 3',
|
||||
asset_id: '456'
|
||||
}]
|
||||
|
||||
const users = [{
|
||||
id: '123',
|
||||
display_name: 'John',
|
||||
},{
|
||||
id: '456',
|
||||
display_name: 'Paul',
|
||||
}]
|
||||
|
||||
const actions = [{
|
||||
action_type: 'flag',
|
||||
item_id: 'abc'
|
||||
},{
|
||||
action_type: 'like',
|
||||
item_id: 'hij'
|
||||
}]
|
||||
|
||||
beforeEach(() => {
|
||||
return Comment.create(comments).then(() => {
|
||||
return User.create(users)
|
||||
}).then(() => {
|
||||
return Action.create(actions)
|
||||
})
|
||||
})
|
||||
|
||||
it('should return a stream with comments, users and actions', () => {
|
||||
streamRoutes('./')({
|
||||
query: {
|
||||
asset_id: 'asset'
|
||||
}
|
||||
}, {
|
||||
json: (data) => {
|
||||
expect(data).to.equal(1);
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,34 @@
|
||||
// Modified from https://github.com/elliotf/mocha-mongoose
|
||||
|
||||
var mongoose = require('mongoose');
|
||||
|
||||
|
||||
// ensure the NODE_ENV is set to 'test'
|
||||
// this is helpful when you would like to change behavior when testing
|
||||
process.env.NODE_ENV = 'test';
|
||||
|
||||
beforeEach(function (done) {
|
||||
function clearDB() {
|
||||
for (var i in mongoose.connection.collections) {
|
||||
mongoose.connection.collections[i].remove(function() {});
|
||||
}
|
||||
return done();
|
||||
}
|
||||
|
||||
|
||||
if (mongoose.connection.readyState === 0) {
|
||||
mongoose.connect('coral-talk-test', function (err) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
return clearDB();
|
||||
});
|
||||
} else {
|
||||
return clearDB();
|
||||
}
|
||||
});
|
||||
|
||||
after(function (done) {
|
||||
mongoose.disconnect();
|
||||
return done();
|
||||
});
|
||||
Reference in New Issue
Block a user