Implemented basic messages api

This commit is contained in:
Chris Blanchard 2015-12-28 13:21:35 +00:00
parent 67e24897d1
commit 6d75b29edc
3 changed files with 150 additions and 25 deletions

View File

@ -1,10 +1,12 @@
"use strict";
var path = require("path");
var winston = require("winston");
var config = require("./config.js");
var Gather = require("../lib/gather/gather_singleton");
var cors = require("cors");
const path = require("path");
const winston = require("winston");
const config = require("./config.js");
const Gather = require("../lib/gather/gather_singleton");
const mongoose = require("mongoose");
const Message = mongoose.model("Message");
const cors = require("cors");
module.exports = app => {
app.use(cors());
@ -29,12 +31,43 @@ module.exports = app => {
});
app.get("/messages", (request, response) => {
if (request.is("json")) {
// To Implement
response.end("")
} else {
response.render("messages.hbs");
}
response.format({
json: function() {
const limit = parseInt(request.query.limit, 10) || 250;
const page = parseInt(request.query.page, 10) || 0;
let query = {};
let searchTerm = request.query.query;
if (searchTerm) {
query = {
$text: {
$search: searchTerm
}
};
}
Message
.find(query)
.limit(limit)
.skip(page * limit)
.sort({createdAt: -1})
.exec((error, messages) => {
if (error) {
winston.error(error);
return response.status(500).json({
message: "An error occurred",
error: JSON.stringify(error)
});
}
response.status(200).json({
messages: messages,
page: page,
limit: limit
});
});
},
default: function() {
response.render("messages.hbs");
}
})
});
app.get("*", (request, response) => {

View File

@ -15,8 +15,7 @@ var messageSchema = new Schema({
messageSchema.index({ createdAt: -1 });
messageSchema.index({ deleted: 1, createdAt: -1 });
// Instance Methods
messageSchema.index({ content: "text", "author.username": "text" });
messageSchema.methods.toJson = function () {
return {

View File

@ -1,33 +1,126 @@
"use strict";
var helper = require("./helpers/index.js");
var request = require("supertest");
var assert = require("chai").assert;
var app = helper.app;
const async = require("async");
const request = require("supertest");
const assert = require("chai").assert;
const helper = require("./helpers/index.js");
const Message = helper.Message;
const app = helper.app;
let user, messages;
describe("Messages", () => {
before(done => {
user = helper.createUser();
helper.clearDb(done);
});
beforeEach(done => {
done();
messages = [];
async.timesSeries(6, (n, next) => {
Message.create({
author: {
username: user.username,
avatar: user.avatar
},
content: "Message " + n
}, (error, message) => {
if (error) return next(error);
messages.push(message);
next();
});
}, done);
});
afterEach(done => {
done();
helper.clearDb(done);
});
describe("#Index", () => {
describe("JSON Api", () => {
it ("returns most recent messages");
it ("is sensitive to limit");
it ("returns most recent messages", done => {
request(app)
.get("/messages")
.set("Accept", "application/json")
.expect("Content-Type", /json/)
.expect(200)
.end((error, response) => {
if (error) return done(error);
let result = response.body;
assert.equal(result.messages.length, 6);
assert.equal(result.limit, 250);
assert.equal(result.page, 0);
done();
});
});
it ("is sensitive to limit", done => {
request(app)
.get("/messages")
.query({
limit: 1
})
.set("Accept", "application/json")
.expect("Content-Type", /json/)
.expect(200)
.end((error, response) => {
if (error) return done(error);
let result = response.body;
assert.equal(result.messages.length, 1);
assert.equal(result.limit, 1);
assert.equal(result.page, 0);
assert.equal(result.messages[0].content, "Message 5");
done();
});
});
it ("returns a maximum of last 250 messages");
it ("is sensitive to pagination");
it ("is sensitive to user");
it ("is sensitive to search terms");
it ("is sensitive to pagination", done => {
request(app)
.get("/messages")
.query({
limit: 1,
page: 2
})
.set("Accept", "application/json")
.expect("Content-Type", /json/)
.expect(200)
.end((error, response) => {
if (error) return done(error);
let result = response.body;
assert.equal(result.messages.length, 1);
assert.equal(result.limit, 1);
assert.equal(result.page, 2);
assert.equal(result.messages[0].content, "Message 3");
done();
});
});
it ("is sensitive to search terms", done => {
request(app)
.get("/messages")
.query({
query: "5"
})
.set("Accept", "application/json")
.expect("Content-Type", /json/)
.expect(200)
.end((error, response) => {
if (error) return done(error);
let result = response.body;
assert.equal(result.messages.length, 1);
assert.equal(result.limit, 250);
assert.equal(result.page, 0);
assert.equal(result.messages[0].content, "Message 5");
done();
});
});
});
describe("HTML Browser", () => {
it ("renders message browser", done => {
request(app)
.get("/messages")
.set("Accept", "text/html; charset=utf-8")
.expect('Content-Type', /html/)
.expect("Content-Type", /html/)
.expect(200)
.end((error, response) => {
if (error) return done(error);