deps: ember-cli-mirage@0.2.0

- remove lodash from bower
- move all resources to /mirage instead of /app/mirage
- update endpoints to use ORM
- general cleanup
This commit is contained in:
Austin Burdine 2017-01-02 11:49:44 -07:00 committed by Kevin Ansfield
parent 21180c467c
commit abfcc4f7ff
52 changed files with 522 additions and 581 deletions

View File

@ -1,58 +0,0 @@
import Mirage from 'ember-cli-mirage';
import {paginatedResponse} from '../utils';
export default function mockInvites(server) {
server.get('/invites/', function (db, request) {
let response = paginatedResponse('invites', db.invites, request);
return response;
});
server.get('/invites/:id', function (db, request) {
let {id} = request.params;
let invite = db.invites.find(id);
if (!invite) {
return new Mirage.Response(404, {}, {
errors: [{
errorType: 'NotFoundError',
message: 'Invite not found.'
}]
});
} else {
return {invites: [invite]};
}
});
server.post('/invites/', function (db, request) {
let [attrs] = JSON.parse(request.requestBody).invites;
let [oldInvite] = db.invites.where({email: attrs.email});
if (oldInvite) {
// resend - server deletes old invite and creates a new one with new ID
attrs.id = db.invites[db.invites.length - 1].id + 1;
db.invites.remove(oldInvite.id);
}
/* eslint-disable camelcase */
attrs.token = `${db.invites.length}-token`;
attrs.expires = moment.utc().add(1, 'day').unix();
attrs.created_at = moment.utc().format();
attrs.created_by = 1;
attrs.updated_at = moment.utc().format();
attrs.updated_by = 1;
attrs.status = 'sent';
/* eslint-enable camelcase */
let invite = db.invites.insert(attrs);
return {
invites: [invite]
};
});
server.del('/invites/:id/', function (db, request) {
db.invites.remove(request.params.id);
return new Mirage.Response(204, {}, {});
});
}

View File

@ -1,61 +0,0 @@
import Mirage from 'ember-cli-mirage';
import {isBlank} from 'ember-utils';
import {paginatedResponse} from '../utils';
export default function mockPosts(server) {
server.post('/posts/', function (db, request) {
let [attrs] = JSON.parse(request.requestBody).posts;
let post;
if (isBlank(attrs.slug) && !isBlank(attrs.title)) {
attrs.slug = attrs.title.dasherize();
}
// NOTE: this does not use the post factory to fill in blank fields
post = db.posts.insert(attrs);
return {
posts: [post]
};
});
server.get('/posts/', function (db, request) {
// TODO: handle status/staticPages/author params
let response = paginatedResponse('posts', db.posts, request);
return response;
});
server.get('/posts/:id/', function (db, request) {
let {id} = request.params;
let post = db.posts.find(id);
if (!post) {
return new Mirage.Response(404, {}, {
errors: [{
errorType: 'NotFoundError',
message: 'Post not found.'
}]
});
} else {
return {posts: [post]};
}
});
server.put('/posts/:id/', function (db, request) {
let {id} = request.params;
let [attrs] = JSON.parse(request.requestBody).posts;
delete attrs.id;
let post = db.posts.update(id, attrs);
return {
posts: [post]
};
});
server.del('/posts/:id/', function (db, request) {
db.posts.remove(request.params.id);
return new Mirage.Response(204, {}, {});
});
}

View File

@ -1,12 +0,0 @@
export default function mockRoles(server) {
server.get('/roles/', function (db, request) {
if (request.queryParams.permissions === 'assign') {
let roles = db.roles.find([1, 2, 3]);
return {roles};
}
return {
roles: db.roles
};
});
}

View File

@ -1,46 +0,0 @@
export default function mockSettings(server) {
server.get('/settings/', function (db, request) {
let filters = request.queryParams.type.split(',');
let settings = [];
filters.forEach((filter) => {
settings.pushObjects(db.settings.where({type: filter}));
});
return {
settings,
meta: {
filters: {
type: request.queryParams.type
}
}
};
});
server.put('/settings/', function (db, request) {
let newSettings = JSON.parse(request.requestBody).settings;
newSettings.forEach((newSetting) => {
db.settings.update({key: newSetting.key}, newSetting);
});
let [activeTheme] = db.settings.where({key: 'activeTheme'});
let [availableThemes] = db.settings.where({key: 'availableThemes'});
availableThemes.value.forEach((theme) => {
if (theme.name === activeTheme.value) {
theme.active = true;
} else {
theme.active = false;
}
});
db.settings.remove({key: 'availableThemes'});
db.settings.insert(availableThemes);
return {
meta: {},
settings: db.settings
};
});
}

View File

@ -1,53 +0,0 @@
import Mirage from 'ember-cli-mirage';
import {isBlank} from 'ember-utils';
import {paginatedResponse} from '../utils';
export default function mockTags(server) {
server.post('/tags/', function (db, request) {
let [attrs] = JSON.parse(request.requestBody).tags;
let tag;
if (isBlank(attrs.slug) && !isBlank(attrs.name)) {
attrs.slug = attrs.name.dasherize();
}
// NOTE: this does not use the tag factory to fill in blank fields
tag = db.tags.insert(attrs);
return {
tag
};
});
server.get('/tags/', function (db, request) {
let response = paginatedResponse('tags', db.tags, request);
// TODO: remove post_count unless requested?
return response;
});
server.get('/tags/slug/:slug/', function (db, request) {
let [tag] = db.tags.where({slug: request.params.slug});
// TODO: remove post_count unless requested?
return {
tag
};
});
server.put('/tags/:id/', function (db, request) {
let {id} = request.params;
let [attrs] = JSON.parse(request.requestBody).tags;
let record = db.tags.update(id, attrs);
return {
tag: record
};
});
server.del('/tags/:id/', function (db, request) {
db.tags.remove(request.params.id);
return new Mirage.Response(204, {}, {});
});
}

View File

@ -1,85 +0,0 @@
/* eslint-disable camelcase */
import Mirage from 'ember-cli-mirage';
import {isBlank} from 'ember-utils';
import {assign} from 'ember-platform';
const userPostsCount = function userPostsCount(user, db) {
let posts = db.posts.where({author_id: user.id});
return posts.length;
};
export default function mockUsers(server) {
server.post('/users/', function (db, request) {
let [attrs] = JSON.parse(request.requestBody).users;
let user;
if (!isBlank(attrs.email)) {
attrs.slug = attrs.email.split('@')[0].dasherize();
}
// NOTE: this does not use the user factory to fill in blank fields
user = db.users.insert(attrs);
return {
users: [user]
};
});
// /users/me = Always return the user with ID=1
server.get('/users/me', function (db) {
return {
users: [db.users.find(1)]
};
});
server.get('/users/', 'users');
server.get('/users/slug/:slug/', function (db, request) {
let [user] = db.users.where({slug: request.params.slug});
if (request.queryParams.include.match(/count\.posts/)) {
let postCount = userPostsCount(user, db);
user = assign(user, {count: {posts: postCount}});
}
return {
users: [user]
};
});
server.del('/users/:id/', function (db, request) {
db.users.remove(request.params.id);
return new Mirage.Response(204, {}, {});
});
server.get('/users/:id', function (db, request) {
let user = db.users.find(request.params.id);
if (request.queryParams.include.match(/count\.posts/)) {
let postCount = userPostsCount(user, db);
user = assign(user, {count: {posts: postCount}});
}
return {
users: [user]
};
});
server.put('/users/:id/', function (db, request) {
let {id} = request.params;
if (id === 'password') {
return {
password: [{message: 'Password changed successfully.'}]
};
} else {
let [attrs] = JSON.parse(request.requestBody).users;
let record = db.users.update(id, attrs);
return {
user: record
};
}
});
}

View File

@ -1,6 +0,0 @@
module.exports = {
rules: {
'brace-style': 'off',
'camelcase': 'off'
}
};

View File

@ -1,13 +0,0 @@
import Mirage from 'ember-cli-mirage';
export default Mirage.Factory.extend({
token(i) { return `${i}-token`; },
email(i) { return `invited-user-${i}@example.com`; },
expires() { return moment.utc().add(1, 'day').unix(); },
created_at() { return moment.utc().format(); },
created_by() { return 1; },
updated_at() { return moment.utc().format(); },
updated_by() { return 1; },
status() { return 'sent'; },
role_id() { return 1; }
});

View File

@ -1,24 +0,0 @@
import Mirage, {faker} from 'ember-cli-mirage';
export default Mirage.Factory.extend({
uuid(i) { return `post-${i}`; },
title(i) { return `Post ${i}`; },
description(i) { return `Title for post ${i}.`; },
slug(i) { return `post-${i}`; },
markdown(i) { return `Markdown for post ${i}.`; },
html(i) { return `HTML for post ${i}.`; },
image(i) { return `/content/images/2015/10/post-${i}.jpg`; },
featured() { return false; },
page() { return false; },
status(i) { return faker.list.cycle('draft', 'published', 'scheduled')(i); },
meta_description(i) { return `Meta description for post ${i}.`; },
meta_title(i) { return `Meta Title for post ${i}`; },
author_id() { return 1; },
updated_at() { return '2015-10-19T16:25:07.756Z'; },
updated_by() { return 1; },
published_at() { return '2015-12-19T16:25:07.000Z'; },
published_by() { return 1; },
created_at() { return '2015-09-11T09:44:29.871Z'; },
created_by() { return 1; },
tags() { return []; }
});

View File

@ -1,10 +0,0 @@
import Mirage from 'ember-cli-mirage';
export default Mirage.Factory.extend({
created_at() { return '2013-11-25T14:48:11.000Z'; },
created_by() { return 1; },
description(i) { return `Role ${i}`; },
name() { return ''; },
updated_at() { return '2013-11-25T14:48:11.000Z'; },
updated_by() { return 1; }
});

View File

@ -1,11 +0,0 @@
import Mirage from 'ember-cli-mirage';
export default Mirage.Factory.extend({
key(i) { return `setting-${i}`; },
value() { return null; },
type() { return 'blog'; },
created_at() { return '2015-01-12T18:29:01.000Z'; },
created_by() { return 1; },
updated_at() { return '2015-10-27T17:39:58.288Z'; },
updated_by() { return 1; }
});

View File

@ -1,21 +0,0 @@
import Mirage from 'ember-cli-mirage';
export default Mirage.Factory.extend({
created_at() { return '2015-09-11T09:44:29.871Z'; },
created_by() { return 1; },
description(i) { return `Description for tag ${i}.`; },
visibility() { return 'public'; },
image(i) { return `/content/images/2015/10/tag-${i}.jpg`; },
meta_description(i) { return `Meta description for tag ${i}.`; },
meta_title(i) { return `Meta Title for tag ${i}`; },
name(i) { return `Tag ${i}`; },
parent() { return null; },
slug(i) { return `tag-${i}`; },
updated_at() { return '2015-10-19T16:25:07.756Z'; },
updated_by() { return 1; },
count() {
return {
posts: 1
};
}
});

View File

@ -1,25 +0,0 @@
import Mirage from 'ember-cli-mirage';
export default Mirage.Factory.extend({
accessibility() { return null; },
bio() { return null; },
cover() { return null; },
created_at() { return '2015-09-02T13:41:50.000Z'; },
created_by() { return null; },
email(i) { return `user-${i}@example.com`; },
image() { return '//www.gravatar.com/avatar/3ae045bc198a157401827c8455cd7c99?s=250&d=mm&r=x'; },
language() { return 'en_US'; },
last_login() { return '2015-11-02T16:12:05.000Z'; },
location() { return null; },
meta_description() { return null; },
meta_title() { return null; },
name(i) { return `User ${i}`; },
slug(i) { return `user-${i}`; },
status() { return 'active'; },
tour() { return null; },
updated_at() { return '2015-11-02T16:12:05.000Z'; },
updated_by() { return '2015-09-02T13:41:50.000Z'; },
website() { return 'http://example.com'; },
roles() { return []; }
});

View File

@ -1,60 +0,0 @@
import Mirage from 'ember-cli-mirage';
export function paginatedResponse(modelName, allModels, request) {
let page = +request.queryParams.page || 1;
let limit = request.queryParams.limit || 15;
let pages, models, next, prev;
allModels = allModels || [];
if (limit === 'all') {
models = allModels;
pages = 1;
} else {
limit = +limit;
let start = (page - 1) * limit;
let end = start + limit;
models = allModels.slice(start, end);
pages = Math.ceil(allModels.length / limit);
if (start > 0) {
prev = page - 1;
}
if (end < allModels.length) {
next = page + 1;
}
}
return {
meta: {
pagination: {
page,
limit,
pages,
total: allModels.length,
next: next || null,
prev: prev || null
}
},
[modelName]: models
};
}
export function maintenanceResponse() {
return new Mirage.Response(503, {}, {
errors: [{
errorType: 'Maintenance'
}]
});
}
export function versionMismatchResponse() {
return new Mirage.Response(400, {}, {
errors: [{
errorType: 'VersionMismatchError'
}]
});
}

View File

@ -14,7 +14,6 @@
"jquery.simulate.drag-sortable": "0.1.0",
"jqueryui-touch-punch": "furf/jquery-ui-touch-punch#4bc009145202d9c7483ba85f3a236a8f3470354d",
"keymaster": "1.6.3",
"lodash": "3.7.0",
"normalize.css": "3.0.3",
"pretender": "1.1.0",
"rangyinputs": "1.2.0",

View File

@ -93,7 +93,6 @@ module.exports = function (defaults) {
},
codemirror: codemirrorAssets(),
'jquery-deparam': {
enabled: EmberApp.env() === 'test',
import: ['jquery-deparam.js']
},
moment: {

5
mirage/.eslintrc.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
rules: {
'brace-style': 'off'
}
};

View File

@ -52,7 +52,7 @@ export function testConfig() {
/* Notifications -------------------------------------------------------- */
this.get('/notifications/', 'notifications');
this.get('/notifications/');
/* Apps - Slack Test Notification --------------------------------------------------------- */

View File

@ -1,16 +1,16 @@
/* eslint-disable camelcase */
import Mirage from 'ember-cli-mirage';
import {Response} from 'ember-cli-mirage';
import {isBlank} from 'ember-utils';
import $ from 'jquery';
export default function mockAuthentication(server) {
server.post('/authentication/token', function (db, request) {
let params = $.deparam(request.requestBody);
server.post('/authentication/token', function ({roles, users}, {requestBody}) {
let params = $.deparam(requestBody);
if (params.grant_type === 'authorization_code') {
// OAuth sign-in
if (!db.users.length) {
let [role] = db.roles.where({name: 'Owner'});
if (!users.all().models.length) {
let role = roles.findBy({name: 'Owner'});
server.create('user', {email: 'oauthtest@example.com', roles: [role]});
}
@ -30,13 +30,13 @@ export default function mockAuthentication(server) {
}
});
server.post('/authentication/passwordreset', function (db, request) {
server.post('/authentication/passwordreset', function (schema, request) {
let {passwordreset} = JSON.parse(request.requestBody);
// eslint-disable-next-line ember-suave/prefer-destructuring
let email = passwordreset[0].email;
if (email === 'unknown@example.com') {
return new Mirage.Response(404, {}, {
return new Response(404, {}, {
errors: [
{
message: 'There is no user with that email address.',
@ -53,10 +53,10 @@ export default function mockAuthentication(server) {
}
});
server.get('/authentication/invitation/', function (db, request) {
server.get('/authentication/invitation/', function (schema, request) {
let {email} = request.queryParams;
let [invite] = db.invites.where({email});
let user = db.users.find(invite.created_by);
let invite = schema.invites.findBy({email});
let user = schema.users.find(invite.createdBy);
let valid = !!invite;
let invitedBy = user && user.name;
@ -70,14 +70,13 @@ export default function mockAuthentication(server) {
/* Setup ---------------------------------------------------------------- */
server.post('/authentication/setup', function (db, request) {
server.post('/authentication/setup', function ({roles, users}, request) {
let [attrs] = JSON.parse(request.requestBody).setup;
let [role] = db.roles.where({name: 'Owner'});
let user;
let role = roles.findBy({name: 'Owner'});
// create owner role unless already exists
if (!role) {
role = db.roles.insert({name: 'Owner'});
role = roles.create({name: 'Owner'});
}
attrs.roles = [role];
@ -85,14 +84,8 @@ export default function mockAuthentication(server) {
attrs.slug = attrs.email.split('@')[0].dasherize();
}
// NOTE: this does not use the user factory to fill in blank fields
user = db.users.insert(attrs);
delete user.roles;
return {
users: [user]
};
// NOTE: server does not use the user factory to fill in blank fields
return users.create(attrs);
});
server.get('/authentication/setup/', function () {

View File

@ -1,7 +1,7 @@
import {isEmpty} from 'ember-utils';
export default function mockConfiguration(server) {
server.get('/configuration/', function (db) {
server.get('/configuration/', function ({db}) {
if (isEmpty(db.configurations)) {
server.loadFixtures('configurations');
}
@ -11,7 +11,11 @@ export default function mockConfiguration(server) {
};
});
server.get('/configuration/timezones/', function (db) {
server.get('/configuration/timezones/', function ({db}) {
if (isEmpty(db.timezones)) {
server.loadFixtures('timezones');
}
return {
configuration: [{
timezones: db.timezones

41
mirage/config/invites.js Normal file
View File

@ -0,0 +1,41 @@
import {Response} from 'ember-cli-mirage';
import {paginatedResponse} from '../utils';
export default function mockInvites(server) {
server.get('/invites/', paginatedResponse('invites'));
server.get('/invites/:id', function (schema, request) {
let {id} = request.params;
let invite = schema.invites.find(id);
return invite || new Response(404, {}, {
errors: [{
errorType: 'NotFoundError',
message: 'Invite not found.'
}]
});
});
server.post('/invites/', function ({invites}) {
let attrs = this.normalizedRequestAttrs();
let oldInvite = invites.findBy({email: attrs.email});
if (oldInvite) {
oldInvite.destroy();
}
/* eslint-disable camelcase */
attrs.token = `${invites.all().models.length}-token`;
attrs.expires = moment.utc().add(1, 'day').unix();
attrs.created_at = moment.utc().format();
attrs.created_by = 1;
attrs.updated_at = moment.utc().format();
attrs.updated_by = 1;
attrs.status = 'sent';
/* eslint-enable camelcase */
return invites.create(attrs);
});
server.del('/invites/:id/');
}

36
mirage/config/posts.js Normal file
View File

@ -0,0 +1,36 @@
import {Response} from 'ember-cli-mirage';
import {isBlank} from 'ember-utils';
import {paginatedResponse} from '../utils';
import {dasherize} from 'ember-string';
export default function mockPosts(server) {
server.post('/posts', function ({posts}) {
let attrs = this.normalizedRequestAttrs();
if (isBlank(attrs.slug) && !isBlank(attrs.title)) {
attrs.slug = dasherize(attrs.title);
}
// NOTE: this does not use the post factory to fill in blank fields
return posts.create(attrs);
});
// TODO: handle status/staticPages/author params
server.get('/posts/', paginatedResponse('posts'));
server.get('/posts/:id/', function ({posts}, {params}) {
let {id} = params;
let post = posts.find(id);
return post || new Response(404, {}, {
errors: [{
errorType: 'NotFoundError',
message: 'Post not found.'
}]
});
});
server.put('/posts/:id/');
server.del('/posts/:id/');
}

9
mirage/config/roles.js Normal file
View File

@ -0,0 +1,9 @@
export default function mockRoles(server) {
server.get('/roles/', function ({roles}, {queryParams}) {
if (queryParams.permissions === 'assign') {
return roles.find([1, 2, 3]);
}
return roles.all();
});
}

53
mirage/config/settings.js Normal file
View File

@ -0,0 +1,53 @@
export default function mockSettings(server) {
// These endpoints use the raw database & fixtures without going
// through the ORM at all (meaning no setting model). This is due
// to https://github.com/samselikoff/ember-cli-mirage/issues/943
// as far as can be determined.
// potential TODO: update once the above issue is fixed? We don't really
// gain anything from using the ORM for settings so it may not be a good idea
server.get('/settings/', function ({db}, {queryParams}) {
let {type} = queryParams;
let filters = type.split(',');
let settings = [];
if (!db.settings) {
server.loadFixtures('settings');
}
filters.forEach((type) => {
settings.pushObjects(db.settings.where({type}));
});
return {
settings,
meta: {filters: {type}}
};
});
server.put('/settings/', function ({db}, {requestBody}) {
let newSettings = JSON.parse(requestBody).settings;
newSettings.forEach((newSetting) => {
let {key} = newSetting;
db.settings.update({key}, newSetting);
});
let [activeTheme] = db.settings.where({key: 'activeTheme'});
let [availableThemes] = db.settings.where({key: 'availableThemes'});
availableThemes.value.forEach((theme) => {
if (theme.name === activeTheme.value) {
theme.active = true;
} else {
theme.active = false;
}
});
db.settings.update({key: 'availableThemes'}, availableThemes);
return {
meta: {},
settings: db.settings
};
});
}

View File

@ -1,11 +1,7 @@
import Ember from 'ember';
const {
String: {dasherize}
} = Ember;
import {dasherize} from 'ember-string';
export default function mockSlugs(server) {
server.get('/slugs/post/:slug/', function (db, request) {
server.get('/slugs/post/:slug/', function (schema, request) {
return {
slugs: [
{slug: dasherize(decodeURIComponent(request.params.slug))}
@ -13,7 +9,7 @@ export default function mockSlugs(server) {
};
});
server.get('/slugs/user/:slug/', function (db, request) {
server.get('/slugs/user/:slug/', function (schema, request) {
return {
slugs: [
{slug: dasherize(decodeURIComponent(request.params.slug))}

View File

@ -1,19 +1,16 @@
/* eslint-disable camelcase */
import Mirage from 'ember-cli-mirage';
import {Response} from 'ember-cli-mirage';
import {paginatedResponse} from '../utils';
export default function mockSubscribers(server) {
server.get('/subscribers/', function (db, request) {
let response = paginatedResponse('subscribers', db.subscribers, request);
return response;
});
server.get('/subscribers/', paginatedResponse('subscribers'));
server.post('/subscribers/', function (db, request) {
server.post('/subscribers/', function ({subscribers}, request) {
let [attrs] = JSON.parse(request.requestBody).subscribers;
let [subscriber] = db.subscribers.where({email: attrs.email});
let subscriber = subscribers.findBy({email: attrs.email});
if (subscriber) {
return new Mirage.Response(422, {}, {
return new Response(422, {}, {
errors: [{
errorType: 'ValidationError',
message: 'Email already exists.',
@ -24,29 +21,11 @@ export default function mockSubscribers(server) {
attrs.created_at = new Date();
attrs.created_by = 0;
subscriber = db.subscribers.insert(attrs);
return {
subscriber
};
return subscribers.create(attrs);
}
});
server.put('/subscribers/:id/', function (db, request) {
let {id} = request.params;
let [attrs] = JSON.parse(request.requestBody).subscribers;
let subscriber = db.subscribers.update(id, attrs);
return {
subscriber
};
});
server.del('/subscribers/:id/', function (db, request) {
db.subscribers.remove(request.params.id);
return new Mirage.Response(204, {}, {});
});
server.put('/subscribers/:id/');
server.post('/subscribers/csv/', function () {
// NB: we get a raw FormData object with no way to inspect it in Chrome
@ -65,4 +44,6 @@ export default function mockSubscribers(server) {
}
};
});
server.del('/subscribers/:id/');
}

27
mirage/config/tags.js Normal file
View File

@ -0,0 +1,27 @@
import {dasherize} from 'ember-string';
import {isBlank} from 'ember-utils';
import {paginatedResponse} from '../utils';
export default function mockTags(server) {
server.post('/tags/', function ({tags}, {requestBody}) {
let [attrs] = JSON.parse(requestBody).tags;
if (isBlank(attrs.slug) && !isBlank(attrs.name)) {
attrs.slug = dasherize(attrs.name);
}
// NOTE: this does not use the tag factory to fill in blank fields
return tags.create(attrs);
});
server.get('/tags/', paginatedResponse('tags'));
server.get('/tags/slug/:slug/', function ({tags}, {params: {slug}}) {
// TODO: remove post_count unless requested?
return tags.findBy({slug});
});
server.put('/tags/:id/');
server.del('/tags/:id/');
}

View File

@ -1,9 +1,9 @@
import Mirage from 'ember-cli-mirage';
import {Response} from 'ember-cli-mirage';
let themeCount = 1;
export default function mockThemes(server) {
server.post('/themes/upload/', function (db) {
server.post('/themes/upload/', function ({db}) {
let [availableThemes] = db.settings.where({key: 'availableThemes'});
// pretender/mirage doesn't currently process FormData so we can't use
// any info passed in through the request
@ -19,24 +19,22 @@ export default function mockThemes(server) {
themeCount++;
availableThemes.value.pushObject(theme);
db.settings.remove({key: 'availableThemes'});
db.settings.insert(availableThemes);
db.settings.update({key: 'availableThemes'}, availableThemes);
return {
themes: [theme]
};
});
server.del('/themes/:theme/', function (db, request) {
server.del('/themes/:theme/', function ({db}, {params}) {
let [availableThemes] = db.settings.where({key: 'availableThemes'});
availableThemes.value = availableThemes.value.filter((theme) => {
return theme.name !== request.params.theme;
return theme.name !== params.theme;
});
db.settings.remove({key: 'availableThemes'});
db.settings.insert(availableThemes);
db.settings.update({key: 'availableThemes'}, availableThemes);
return new Mirage.Response(204, {}, null);
return new Response(204, {}, null);
});
}

36
mirage/config/users.js Normal file
View File

@ -0,0 +1,36 @@
export default function mockUsers(server) {
// /users/me = Always return the user with ID=1
server.get('/users/me/', function ({users}) {
return users.find(1);
});
server.get('/users/');
server.get('/users/slug/:slug/', function ({users}, {params, queryParams}) {
let user = users.findBy({slug: params.slug});
user.postCount = queryParams.include.match(/count\.posts/);
return user;
});
server.get('/users/:id', function ({users}, {params, queryParams}) {
let user = users.find(params.id);
user.postCount = queryParams.include.match(/count\.posts/);
return user;
});
server.put('/users/:id/', function ({users}, {params}) {
let {id} = params;
if (id === 'password') {
return {
password: [{message: 'Password changed successfully.'}]
};
} else {
let attrs = this.normalizedRequestAttrs();
return users.find(id).update(attrs);
}
});
server.del('/users/:id/');
}

View File

@ -0,0 +1,13 @@
import {Factory} from 'ember-cli-mirage';
export default Factory.extend({
token(i) { return `${i}-token`; },
email(i) { return `invited-user-${i}@example.com`; },
expires() { return moment.utc().add(1, 'day').unix(); },
createdAt() { return moment.utc().format(); },
createdBy() { return 1; },
updatedAt() { return moment.utc().format(); },
updatedBy() { return 1; },
status() { return 'sent'; },
roleId() { return 1; }
});

View File

@ -1,6 +1,6 @@
import Mirage from 'ember-cli-mirage';
import {Factory} from 'ember-cli-mirage';
export default Mirage.Factory.extend({
export default Factory.extend({
dismissible: true,
message: 'This is an alert',
status: 'alert',

24
mirage/factories/post.js Normal file
View File

@ -0,0 +1,24 @@
import {Factory, faker} from 'ember-cli-mirage';
export default Factory.extend({
uuid(i) { return `post-${i}`; },
title(i) { return `Post ${i}`; },
description(i) { return `Title for post ${i}.`; },
slug(i) { return `post-${i}`; },
markdown(i) { return `Markdown for post ${i}.`; },
html(i) { return `HTML for post ${i}.`; },
image(i) { return `/content/images/2015/10/post-${i}.jpg`; },
featured: false,
page: false,
status(i) { return faker.list.cycle('draft', 'published', 'scheduled')(i); },
metaDescription(i) { return `Meta description for post ${i}.`; },
metaTitle(i) { return `Meta Title for post ${i}`; },
authorId: 1,
updatedAt: '2015-10-19T16:25:07.756Z',
updatedBy: 1,
publishedAt: '2015-12-19T16:25:07.000Z',
publishedBy: 1,
createdAt: '2015-09-11T09:44:29.871Z',
createdBy: 1,
tags: []
});

10
mirage/factories/role.js Normal file
View File

@ -0,0 +1,10 @@
import {Factory} from 'ember-cli-mirage';
export default Factory.extend({
createdAt: '2013-11-25T14:48:11.000Z',
createdBy: 1,
description(i) { return `Role ${i}`; },
name: '',
updatedAt: '2013-11-25T14:48:11.000Z',
updatedBy: 1
});

View File

@ -1,4 +1,4 @@
import Mirage, {faker} from 'ember-cli-mirage';
import {Factory, faker} from 'ember-cli-mirage';
let randomDate = function randomDate(start = moment().subtract(30, 'days').toDate(), end = new Date()) {
return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
@ -6,14 +6,13 @@ let randomDate = function randomDate(start = moment().subtract(30, 'days').toDat
let statuses = ['pending', 'subscribed'];
/* eslint-disable camelcase, brace-style */
export default Mirage.Factory.extend({
export default Factory.extend({
name() { return `${faker.name.firstName()} ${faker.name.lastName()}`; },
email() { return faker.internet.email(); },
email: faker.internet.email,
status() { return statuses[Math.floor(Math.random() * statuses.length)]; },
created_at() { return randomDate(); },
updated_at: null,
created_by: 0,
updated_by: null,
unsubscribed_at: null
createdAt() { return randomDate(); },
updatedAt: null,
createdBy: 0,
updatedBy: null,
unsubscribedAt: null
});

21
mirage/factories/tag.js Normal file
View File

@ -0,0 +1,21 @@
import {Factory} from 'ember-cli-mirage';
export default Factory.extend({
createdAt: '2015-09-11T09:44:29.871Z',
createdBy: 1,
description(i) { return `Description for tag ${i}.`; },
visibility: 'public',
image(i) { return `/content/images/2015/10/tag-${i}.jpg`; },
metaDescription(i) { return `Meta description for tag ${i}.`; },
metaTitle(i) { return `Meta Title for tag ${i}`; },
name(i) { return `Tag ${i}`; },
parent: null,
slug(i) { return `tag-${i}`; },
updatedAt: '2015-10-19T16:25:07.756Z',
updatedBy: 1,
count() {
return {
posts: 1
};
}
});

24
mirage/factories/user.js Normal file
View File

@ -0,0 +1,24 @@
import {Factory} from 'ember-cli-mirage';
export default Factory.extend({
accessibility: null,
bio: null,
cover: null,
createdAt: '2015-09-02T13:41:50.000Z',
createdBy: null,
email(i) { return `user-${i}@example.com`; },
image: '//www.gravatar.com/avatar/3ae045bc198a157401827c8455cd7c99?s=250&d=mm&r=x',
language: 'en_US',
lastLogin: '2015-11-02T16:12:05.000Z',
location: null,
metaDescription: null,
metaTitle: null,
name(i) { return `User ${i}`; },
slug(i) { return `user-${i}`; },
status: 'active',
tour: null,
updatedAt: '2015-11-02T16:12:05.000Z',
updatedBy: '2015-09-02T13:41:50.000Z',
website: 'http://example.com',
roles: []
});

View File

@ -1,9 +1,9 @@
/* eslint-disable camelcase */
export default [
{
id: 1,
created_at: '2015-09-11T09:44:30.805Z',
created_by: 1,
id: 1,
key: 'title',
type: 'blog',
updated_at: '2015-10-04T16:26:05.195Z',
@ -11,9 +11,9 @@ export default [
value: 'Test Blog'
},
{
id: 2,
created_at: '2015-09-11T09:44:30.806Z',
created_by: 1,
id: 2,
key: 'description',
type: 'blog',
updated_at: '2015-10-04T16:26:05.198Z',
@ -51,9 +51,9 @@ export default [
updated_by: 1
},
{
id: 6,
created_at: '2015-09-11T09:44:30.809Z',
created_by: 1,
id: 6,
key: 'postsPerPage',
type: 'blog',
updated_at: '2015-10-04T16:26:05.211Z',
@ -91,9 +91,9 @@ export default [
updated_by: 1
},
{
id: 10,
created_at: '2015-09-11T09:44:30.809Z',
created_by: 1,
id: 10,
key: 'ghost_head',
type: 'blog',
updated_at: '2015-09-23T13:32:49.858Z',
@ -101,9 +101,9 @@ export default [
value: ''
},
{
id: 11,
created_at: '2015-09-11T09:44:30.809Z',
created_by: 1,
id: 11,
key: 'ghost_foot',
type: 'blog',
updated_at: '2015-09-23T13:32:49.858Z',
@ -121,9 +121,9 @@ export default [
updated_by: 1
},
{
id: 13,
created_at: '2015-09-11T09:44:30.810Z',
created_by: 1,
id: 13,
key: 'navigation',
type: 'blog',
updated_at: '2015-09-23T13:32:49.868Z',
@ -134,9 +134,9 @@ export default [
])
},
{
id: 14,
created_at: '2015-09-11T09:44:30.810Z',
created_by: 1,
id: 14,
key: 'isPrivate',
type: 'blog',
updated_at: '2015-09-23T13:32:49.868Z',
@ -144,9 +144,9 @@ export default [
value: false
},
{
id: 15,
created_at: '2015-09-11T09:44:30.810Z',
created_by: 1,
id: 15,
key: 'password',
type: 'blog',
updated_at: '2015-09-23T13:32:49.868Z',
@ -154,9 +154,9 @@ export default [
value: ''
},
{
id: 16,
created_at: '2016-05-05T15:04:03.115Z',
created_by: 1,
id: 17,
key: 'slack',
type: 'blog',
updated_at: '2016-05-05T18:33:09.168Z',
@ -164,9 +164,9 @@ export default [
value: '[{"url":""}]'
},
{
id: 17,
created_at: '2016-05-05T15:40:12.133Z',
created_by: 1,
id: 23,
key: 'facebook',
type: 'blog',
updated_at: '2016-05-08T15:20:25.953Z',
@ -174,9 +174,9 @@ export default [
value: 'test'
},
{
id: 18,
created_at: '2016-05-05T15:40:12.134Z',
created_by: 1,
id: 24,
key: 'twitter',
type: 'blog',
updated_at: '2016-05-08T15:20:25.954Z',
@ -184,9 +184,9 @@ export default [
value: '@test'
},
{
id: 19,
created_at: '2015-09-11T09:44:30.810Z',
created_by: 1,
id: 16,
key: 'activeTimezone',
type: 'blog',
updated_at: '2015-09-23T13:32:49.868Z',
@ -194,8 +194,8 @@ export default [
value: 'Etc/UTC'
},
{
id: 20,
key: 'availableThemes',
id: 18,
value: [
{
name: 'casper',

4
mirage/models/invite.js Normal file
View File

@ -0,0 +1,4 @@
import {Model} from 'ember-cli-mirage';
export default Model.extend({
});

View File

@ -0,0 +1,4 @@
import {Model} from 'ember-cli-mirage';
export default Model.extend({
});

3
mirage/models/post.js Normal file
View File

@ -0,0 +1,3 @@
import {Model} from 'ember-cli-mirage';
export default Model.extend();

4
mirage/models/role.js Normal file
View File

@ -0,0 +1,4 @@
import {Model} from 'ember-cli-mirage';
export default Model.extend({
});

View File

@ -0,0 +1,4 @@
import {Model} from 'ember-cli-mirage';
export default Model.extend({
});

4
mirage/models/tag.js Normal file
View File

@ -0,0 +1,4 @@
import {Model} from 'ember-cli-mirage';
export default Model.extend({
});

10
mirage/models/user.js Normal file
View File

@ -0,0 +1,10 @@
import {Model, hasMany} from 'ember-cli-mirage';
export default Model.extend({
// used by the serializer to determine whether
// or not to include the post count
postCount: false,
roles: hasMany(),
posts: hasMany()
});

View File

@ -0,0 +1,36 @@
import {RestSerializer, Collection} from 'ember-cli-mirage';
import {pluralize} from 'ember-cli-mirage/utils/inflector';
import {underscore} from 'ember-string';
export default RestSerializer.extend({
keyForAttribute(attr) {
return underscore(attr);
},
serialize(object, request) {
// Ember expects pluralized responses for the post, user, and invite models,
// and this shortcut will ensure that those models are pluralized
if (this.isModel(object) && ['post', 'user', 'invite'].includes(object.modelName)) {
object = new Collection(object.modelName, [object]);
}
let json = RestSerializer.prototype.serialize.call(this, object, request);
if (this.isCollection(object) && object.meta) {
json.meta = object.meta;
}
return json;
},
// POST and PUT request send data in pluralized attributes for all models,
// so we extract it here - this allows #normalizedRequestAttrs to work
// in route functions
normalize(body, modelName) {
// sometimes mirage doesn't include a modelName, so we extrapolate it from
// the first element of Object.keys
modelName = pluralize(modelName) || Object.keys(body)[0];
let [attributes] = body[modelName] || [{}];
return {data: {attributes}};
}
});

View File

@ -0,0 +1,27 @@
import BaseSerializer from './application';
import {RestSerializer} from 'ember-cli-mirage';
export default BaseSerializer.extend({
serialize(object, request) {
if (this.isCollection(object)) {
return BaseSerializer.prototype.serialize.apply(this, arguments);
}
let {user} = RestSerializer.prototype.serialize.call(this, object, request);
if (object.postCount) {
let posts = object.posts.models.length;
user.count = {posts};
}
let roles = BaseSerializer.prototype.serialize.call(this, object.roles, request);
let [role] = roles.roles;
if (role) {
user.roles = [role];
}
return {users: [user]};
}
});

62
mirage/utils.js Normal file
View File

@ -0,0 +1,62 @@
/* eslint-disable max-statements-per-line */
import {Response} from 'ember-cli-mirage';
export function paginatedResponse(modelName) {
return function (schema, request) {
let page = +request.queryParams.page || 1;
let limit = request.queryParams.limit || 15;
let pages, next, prev, models;
let allModels = this.serialize(schema[modelName].all())[modelName];
if (limit === 'all') {
pages = 1;
} else {
limit = +limit;
let start = (page - 1) * limit;
let end = start + limit;
pages = Math.ceil(allModels.length / limit);
models = allModels.slice(start, end);
if (start > 0) {
prev = page - 1;
}
if (end < allModels.length) {
next = page + 1;
}
}
return {
meta: {
pagination: {
page,
limit,
pages,
total: allModels.length,
next: next || null,
prev: prev || null
}
},
[modelName]: models || allModels
};
};
}
export function maintenanceResponse() {
return new Response(503, {}, {
errors: [{
errorType: 'Maintenance'
}]
});
}
export function versionMismatchResponse() {
return new Response(400, {}, {
errors: [{
errorType: 'VersionMismatchError'
}]
});
}

View File

@ -50,7 +50,7 @@
"ember-cli-fastclick": "1.3.0",
"ember-cli-htmlbars": "1.1.1",
"ember-cli-htmlbars-inline-precompile": "0.3.6",
"ember-cli-mirage": "0.1.14",
"ember-cli-mirage": "0.2.4",
"ember-cli-mocha": "0.13.1",
"ember-cli-node-assets": "0.1.6",
"ember-cli-pretender": "1.0.1",