├── .gitignore
├── .travis.yml
├── public
├── bootstrap-2.3.1
│ ├── img
│ │ ├── glyphicons-halflings.png
│ │ └── glyphicons-halflings-white.png
│ ├── css
│ │ ├── bootstrap-responsive.min.css
│ │ └── bootstrap-responsive.css
│ └── js
│ │ └── bootstrap.min.js
└── stylesheets
│ └── style.css
├── test
├── test-acl-permission.js
├── test.js
└── all.js
├── package.json
├── routes
├── page.js
├── user.js
├── coupon.js
├── folder.js
├── notify.js
├── order.js
├── status.js
├── acl-role.js
├── category.js
├── currency.js
├── item.js
├── property.js
├── service.js
├── session.js
├── user-acl.js
├── acl-resource.js
├── item-coupon.js
├── order-coupon.js
├── order-item.js
├── user-profile.js
├── acl-permission.js
├── item-property.js
├── order-service.js
├── package-level.js
├── property-type.js
├── service-coupon.js
├── subscription.js
├── merchant-gateway.js
├── order-status-history.js
├── order-subscription.js
├── subscription-coupon.js
└── service-package-level.js
├── models
├── PropertyType.js
├── Status.js
├── OrderItem.js
├── AclResource.js
├── AclPermission.js
├── OrderCoupon.js
├── PackageLevel.js
├── AclRole.js
├── Currency.js
├── PropertyValue.js
├── Folder.js
├── ItemProperty.js
├── ServiceCoupon.js
├── ItemCoupon.js
├── OrderStatusHistory.js
├── SubscriptionCoupon.js
├── Session.js
├── SubscriptionService.js
├── Property.js
├── ServicePackageLevel.js
├── MerchantGateway.js
├── SubscriptionPackageLevel.js
├── Category.js
├── UserAcl.js
├── Notify.js
├── UserProfile.js
├── OrderSubscription.js
├── Page.js
├── OrderService.js
├── Coupon.js
├── Service.js
├── Subscription.js
├── User.js
├── Order.js
└── Item.js
├── app.js
├── README.md
└── lib
└── crud.js
/.gitignore:
--------------------------------------------------------------------------------
1 | _config.js
2 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "0.11"
4 | - "0.10"
5 | - "0.8"
6 | - "0.6"
7 |
--------------------------------------------------------------------------------
/public/bootstrap-2.3.1/img/glyphicons-halflings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zrecore/zrecore-js/HEAD/public/bootstrap-2.3.1/img/glyphicons-halflings.png
--------------------------------------------------------------------------------
/public/bootstrap-2.3.1/img/glyphicons-halflings-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zrecore/zrecore-js/HEAD/public/bootstrap-2.3.1/img/glyphicons-halflings-white.png
--------------------------------------------------------------------------------
/test/test-acl-permission.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created with JetBrains WebStorm.
3 | * User: aalbino
4 | * Date: 5/27/13
5 | * Time: 12:14 PM
6 | * To change this template use File | Settings | File Templates.
7 | */
8 |
--------------------------------------------------------------------------------
/public/stylesheets/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 50px;
3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
4 | }
5 |
6 | /*HTML 5 compat*/
7 | header, section, article, nav, footer, aside, hgroup{
8 | display: block;
9 | }
10 |
11 |
12 | a {
13 | color: #00B7FF;
14 | }
--------------------------------------------------------------------------------
/test/test.js:
--------------------------------------------------------------------------------
1 | var assert = require("assert");
2 | describe("Array", function () {
3 | describe('#indexOf()', function () {
4 | it ('should return -1 when the value is not present', function () {
5 | assert.equal(-1, [1,2,3].indexOf(5));
6 | assert.equal(-1, [1,2,3].indexOf(0));
7 | });
8 | });
9 | });
10 |
11 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zrecore",
3 | "version": "1.3.1",
4 | "repository": {
5 | "type": "git",
6 | "url": "https://github.com/zrecommerce/zrecore-js.git"
7 | },
8 | "main": "./app.js",
9 | "private": false,
10 | "scripts": {
11 | "start": "node app",
12 | "test": "node test/test.js"
13 | },
14 | "dependencies": {
15 | "restify": "2.x",
16 | "mongodb": "*",
17 | "mongoose": ">= 3.6.x",
18 | "socket.io": "*",
19 | "session": "*",
20 | "nodeunit": "*",
21 | "extend": "*",
22 | "underscore": "*",
23 | "bcrypt": "*"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/routes/page.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Page.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/user.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/User.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/coupon.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Coupon.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/folder.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Folder.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/notify.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Notify.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/order.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Order.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/status.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Status.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/acl-role.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/AclRole.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/category.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Category.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/currency.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Currency.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/item.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Item.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
25 |
--------------------------------------------------------------------------------
/routes/property.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Property.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/service.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Service.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/session.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Session.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/user-acl.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/UserAcl.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/acl-resource.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/AclResource.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/item-coupon.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/ItemCoupon.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/order-coupon.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/OrderCoupon.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/order-item.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/OrderItem.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/user-profile.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/UserProfile.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/acl-permission.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/AclPermission.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/item-property.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/ItemProperty.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/order-service.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/OrderService.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/package-level.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/PackageLevel.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/property-type.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/PropertyType.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/service-coupon.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/ServiceCoupon.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/subscription.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/Subscription.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/merchant-gateway.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/MerchantGateway.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/order-status-history.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/OrderStatusHistory.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/order-subscription.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/OrderSubscription.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/subscription-coupon.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/SubscriptionCoupon.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/routes/service-package-level.js:
--------------------------------------------------------------------------------
1 | var mModel = require('../models/ServicePackageLevel.js'),
2 | _ = require('underscore'),
3 | c = require('../lib/crud.js');
4 |
5 |
6 | exports.list = function (req, res, next) {
7 | return c.list(mModel, req, res, next);
8 | }
9 |
10 | exports.get = function (req, res, next) {
11 | return c.get(mModel, req, res, next);
12 | }
13 |
14 | exports.put = function (req, res, next) {
15 | return c.put(mModel, req, res, next);
16 | }
17 |
18 | exports.post = function (req, res, next) {
19 | return c.post(mModel, req, res, next);
20 | }
21 |
22 | exports.del = function (req, res, next) {
23 | return c.del(mModel, req, res, next);
24 | }
--------------------------------------------------------------------------------
/models/PropertyType.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var PropertyTypeSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "type": {
11 | "type": String,
12 | "required": true,
13 | "index": true
14 | },
15 |
16 | "timestamp_added": {
17 | "type": Date,
18 | "default": Date.now,
19 | "required": false,
20 | "index": true
21 | },
22 | "timestamp_modified": {
23 | "type": Date,
24 | "default": Date.now,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_deactivated": {
29 | "type": Date,
30 | "required": false,
31 | "index": true
32 | }
33 | }, {
34 | "autoIndex": false
35 | });
36 |
37 | //PropertyTypeSchema.index({ "type": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1 });
38 |
39 | module.exports = mongoose.model("PropertyType", PropertyTypeSchema);
40 |
--------------------------------------------------------------------------------
/models/Status.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var StatusSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "value": {
11 | "type": String,
12 | "required": true,
13 | "index": true
14 | },
15 | "timestamp_added": {
16 | "type": Date,
17 | "default": Date.now,
18 | "required": false,
19 | "index": true
20 | },
21 | "timestamp_modified": {
22 | "type": Date,
23 | "default": Date.now,
24 | "required": false,
25 | "index": true
26 | },
27 | "timestamp_deactivated": {
28 | "type": Date,
29 | "required": false,
30 | "index": true
31 | }
32 | }, {
33 | "autoIndex": false
34 | });
35 |
36 | StatusSchema.index({
37 | "value": 1
38 | }, {"unique": true});
39 | //StatusSchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
40 |
41 | module.exports = mongoose.model("Status", StatusSchema);
42 |
--------------------------------------------------------------------------------
/models/OrderItem.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var OrderItemSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "order_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Order"
15 | },
16 | "item_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "Item"
21 | },
22 | "timestamp_added": {
23 | "type": Date,
24 | "default": Date.now,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_modified": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_deactivated": {
35 | "type": Date,
36 | "required": false,
37 | "index": true
38 | }
39 | }, {
40 | "autoIndex": false
41 | });
42 |
43 | OrderItemSchema.index({
44 | "item_id": 1,
45 | "order_id": 1
46 | }, {"unique": 1});
47 |
48 | module.exports = mongoose.model("OrderItem", OrderItemSchema);
49 |
--------------------------------------------------------------------------------
/models/AclResource.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var AclResourceSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "resource_name": {
11 | "type": String,
12 | "required": true,
13 | "unique": true,
14 | "lowercase": true,
15 | "trim": true,
16 | "index": true
17 | },
18 | "is_active": {
19 | "type": Boolean,
20 | "required": true,
21 | "default": false,
22 | "index": true
23 | },
24 | "timestamp_added": {
25 | "type": Date,
26 | "default": Date.now,
27 | "required": false,
28 | "index": true
29 | },
30 | "timestamp_modified": {
31 | "type": Date,
32 | "default": Date.now,
33 | "required": false,
34 | "index": true
35 | },
36 | "timestamp_deactivated": {
37 | "type": Date,
38 | "required": false,
39 | "index": true
40 | }
41 | }, {
42 | "autoIndex": false
43 | });
44 |
45 | //AclResourceSchema.index({"resource_name": 1, "is_active": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
46 | module.exports = mongoose.model("AclResource", AclResourceSchema);
47 |
--------------------------------------------------------------------------------
/models/AclPermission.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var AclPermissionSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "permission_name": {
11 | "type": String,
12 | "required": true,
13 | "unique": true,
14 | "lowercase": true,
15 | "trim": true,
16 | "index": true
17 | },
18 | "is_active": {
19 | "type": Boolean,
20 | "required": true,
21 | "default": false,
22 | "index": true
23 | },
24 | "timestamp_added": {
25 | "type": Date,
26 | "default": Date.now,
27 | "required": false,
28 | "index": true
29 | },
30 | "timestamp_modified": {
31 | "type": Date,
32 | "default": Date.now,
33 | "required": false,
34 | "index": true
35 | },
36 | "timestamp_deactivated": {
37 | "type": Date,
38 | "required": false,
39 | "index": true
40 | }
41 | }, {
42 | "autoIndex": false
43 | });
44 |
45 | //AclPermissionSchema.index({"permission_name": 1, "is_active": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
46 | module.exports = mongoose.model("AclPermission", AclPermissionSchema);
47 |
--------------------------------------------------------------------------------
/models/OrderCoupon.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var OrderCouponSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "order_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Order"
15 | },
16 | "coupon_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "Coupon"
21 | },
22 | "timestamp_added": {
23 | "type": Date,
24 | "default": Date.now,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_modified": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_deactivated": {
35 | "type": Date,
36 | "required": false,
37 | "index": true
38 | }
39 | }, {
40 | "autoIndex": false
41 | });
42 |
43 | OrderCouponSchema.index({
44 | "order_id": 1,
45 | "coupon_id": 1
46 | }, {
47 | "unique": true
48 | });
49 |
50 | module.exports = mongoose.model("OrderCoupon", OrderCouponSchema);
51 |
--------------------------------------------------------------------------------
/models/PackageLevel.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var PackageLevelSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "name": {
11 | "type": String,
12 | "required": true,
13 | "index": true
14 | },
15 | "is_available": {
16 | "type": Boolean,
17 | "required": true,
18 | "default": false,
19 | "index": true
20 | },
21 | "timestamp_added": {
22 | "type": Date,
23 | "default": Date.now,
24 | "required": false,
25 | "index": true
26 | },
27 | "timestamp_modified": {
28 | "type": Date,
29 | "default": Date.now,
30 | "required": false,
31 | "index": true
32 | },
33 | "timestamp_deactivated": {
34 | "type": Date,
35 | "required": false,
36 | "index": true
37 | }
38 | }, {
39 | "autoIndex": false
40 | });
41 | //PackageLevelSchema.index({"is_available": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
42 | PackageLevelSchema.index({"name": 1}, {"unique": true});
43 |
44 | module.exports = mongoose.model("PackageLevel", PackageLevelSchema);
45 |
--------------------------------------------------------------------------------
/models/AclRole.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var AclRoleSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "role_name": {
11 | "type": String,
12 | "required": true,
13 | "unique": true,
14 | "lowercase": true,
15 | "trim": true
16 | },
17 | "is_active": {
18 | "type": Boolean,
19 | "required": true,
20 | "default": false,
21 | "index": true
22 | },
23 | "inherit_role_id": {
24 | "type": ObjectId,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_added": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_modified": {
35 | "type": Date,
36 | "default": Date.now,
37 | "required": false,
38 | "index": true
39 | },
40 | "timestamp_deactivated": {
41 | "type": Date,
42 | "required": false,
43 | "index": true
44 | }
45 | }, {
46 | "autoIndex": false
47 | });
48 |
49 | //AclRoleSchema.index({"role_name": 1, "is_active": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
50 | module.exports = mongoose.model("AclRole", AclRoleSchema);
51 |
--------------------------------------------------------------------------------
/models/Currency.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var CurrencySchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "code": {
11 | "type": String,
12 | "required": true,
13 | "unique": true
14 | },
15 | "name": {
16 | "type": String,
17 | "required": true,
18 | "unique": true
19 | },
20 | "is_default": {
21 | "type": Boolean,
22 | "default": false,
23 | "index": true
24 | },
25 | "timestamp_added": {
26 | "type": Date,
27 | "default": Date.now,
28 | "required": false,
29 | "index": true
30 | },
31 | "timestamp_modified": {
32 | "type": Date,
33 | "default": Date.now,
34 | "required": false,
35 | "index": true
36 | },
37 | "timestamp_deactivated": {
38 | "type": Date,
39 | "required": false,
40 | "index": true
41 | }
42 | }, {
43 | "autoIndex": false
44 | });
45 |
46 | //CurrencySchema.index({"code": 1, "name": 1, "is_default": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
47 | module.exports = mongoose.model("Currency", CurrencySchema);
48 |
--------------------------------------------------------------------------------
/models/PropertyValue.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var PropertyValueSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "text": {
11 | "type": String,
12 | "required": true,
13 | "index": true
14 | },
15 | "type_id": {
16 | "type": ObjectId,
17 | "required": true,
18 | "index": true,
19 | "ref": "PropertyType"
20 | },
21 |
22 | "timestamp_added": {
23 | "type": Date,
24 | "default": Date.now,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_modified": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_deactivated": {
35 | "type": Date,
36 | "required": false,
37 | "index": true
38 | }
39 | }, {
40 | "autoIndex": false
41 | });
42 |
43 | //PropertyValueSchema.index({ "type_id": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1 });
44 | PropertyValueSchema.index({"text": 1, "type_id": 1}, {"unique": true});
45 |
46 | module.exports = mongoose.model("PropertyValue", PropertyValueSchema);
47 |
--------------------------------------------------------------------------------
/models/Folder.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var FolderSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "name": {
11 | "type": String,
12 | "required": true,
13 | "unique": true
14 | },
15 | "slug": {
16 | "type": String,
17 | "required": true,
18 | "unique": true
19 | },
20 | "parent_id": {
21 | "type": ObjectId,
22 | "required": false,
23 | "index": true,
24 | "ref": "Folder"
25 | },
26 | "timestamp_added": {
27 | "type": Date,
28 | "default": Date.now,
29 | "required": false,
30 | "index": true
31 | },
32 | "timestamp_modified": {
33 | "type": Date,
34 | "default": Date.now,
35 | "required": false,
36 | "index": true
37 | },
38 | "timestamp_deactivated": {
39 | "type": Date,
40 | "required": false,
41 | "index": true
42 | }
43 | }, {
44 | "autoIndex": false
45 | });
46 |
47 | //FolderSchema.index({"name": 1, "slug": 1, "parent_id": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
48 | module.exports = mongoose.model("Folder", FolderSchema);
49 |
--------------------------------------------------------------------------------
/models/ItemProperty.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var ItemPropertySchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "item_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Item"
15 | },
16 | "property_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true
20 | },
21 | "timestamp_added": {
22 | "type": Date,
23 | "default": Date.now,
24 | "required": false,
25 | "index": true
26 | },
27 | "timestamp_modified": {
28 | "type": Date,
29 | "default": Date.now,
30 | "required": false,
31 | "index": true
32 | },
33 | "timestamp_deactivated": {
34 | "type": Date,
35 | "required": false,
36 | "index": true
37 | }
38 | }, {
39 | "autoIndex": false
40 | });
41 |
42 | ItemPropertySchema.index({
43 | "item_id": 1,
44 | "property_id": 1
45 | }, {
46 | "unique": true
47 | });
48 | //ItemPropertySchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
49 |
50 | module.exports = mongoose.model("ItemProperty", ItemPropertySchema);
51 |
--------------------------------------------------------------------------------
/models/ServiceCoupon.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var ServiceCouponSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "service_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Service"
15 | },
16 | "coupon_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "Coupon"
21 | },
22 | "timestamp_added": {
23 | "type": Date,
24 | "default": Date.now,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_modified": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_deactivated": {
35 | "type": Date,
36 | "required": false,
37 | "index": true
38 | }
39 | }, {
40 | "autoIndex": false
41 | });
42 |
43 |
44 | ServiceCouponSchema.index({"service_id": 1, "coupon_id": 1}, {"unique": true});
45 | //ServiceCouponSchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1})
46 |
47 | module.exports = mongoose.model("ServiceCoupon", ServiceCouponSchema);
48 |
--------------------------------------------------------------------------------
/models/ItemCoupon.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var ItemCouponSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "item_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Item"
15 | },
16 | "coupon_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "Coupon"
21 | },
22 | "timestamp_added": {
23 | "type": Date,
24 | "default": Date.now,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_modified": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_deactivated": {
35 | "type": Date,
36 | "required": false,
37 | "index": true
38 | }
39 | }, {
40 | "autoIndex": false
41 | });
42 |
43 | ItemCouponSchema.index({
44 | "item_id": 1,
45 | "coupon_id": 1
46 | }, {
47 | "unique": true
48 | });
49 | //ItemCouponSchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
50 |
51 | module.exports = mongoose.model("ItemCoupon", ItemCouponSchema);
52 |
--------------------------------------------------------------------------------
/models/OrderStatusHistory.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var OrderStatusHistorySchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "status_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Status"
15 | },
16 | "change_date": {
17 | "type": Date,
18 | "required": false,
19 | "index": true
20 | },
21 | "timestamp_added": {
22 | "type": Date,
23 | "default": Date.now,
24 | "required": false,
25 | "index": true
26 | },
27 | "timestamp_modified": {
28 | "type": Date,
29 | "default": Date.now,
30 | "required": false,
31 | "index": true
32 | },
33 | "timestamp_deactivated": {
34 | "type": Date,
35 | "required": false,
36 | "index": true
37 | }
38 | }, {
39 | "autoIndex": false
40 | });
41 |
42 | OrderStatusHistorySchema.index({
43 | "status_id": 1,
44 | "change_date": 1
45 | }, {
46 | "unique": true
47 | });
48 |
49 | //OrderStatusHistorySchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
50 |
51 | module.exports = mongoose.model("OrderStatusHistory", OrderStatusHistorySchema);
52 |
--------------------------------------------------------------------------------
/models/SubscriptionCoupon.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var SubscriptionCouponSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "subscription_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Subscription"
15 | },
16 | "coupon_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "Coupon"
21 | },
22 | "timestamp_added": {
23 | "type": Date,
24 | "default": Date.now,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_modified": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_deactivated": {
35 | "type": Date,
36 | "required": false,
37 | "index": true
38 | }
39 | }, {
40 | "autoIndex": false
41 | });
42 |
43 |
44 | SubscriptionCouponSchema.index({"subscription_id": 1, "coupon_id": 1}, {"unique": true});
45 | //SubscriptionCouponSchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
46 |
47 | module.exports = mongoose.model("SubscriptionCoupon", SubscriptionCouponSchema);
48 |
--------------------------------------------------------------------------------
/models/Session.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var SessionSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "token": {
11 | "type": String,
12 | "required": true,
13 | "index": true
14 | },
15 | "user_id": {
16 | "type": ObjectId,
17 | "required": false,
18 | "index": true,
19 | "ref": "User"
20 | },
21 | "ip": {
22 | "type": String,
23 | "required": true,
24 | "index": true
25 | },
26 | "timestamp_added": {
27 | "type": Date,
28 | "default": Date.now,
29 | "required": false,
30 | "index": true
31 | },
32 | "timestamp_modified": {
33 | "type": Date,
34 | "default": Date.now,
35 | "required": false,
36 | "index": true
37 | },
38 | "timestamp_deactivated": {
39 | "type": Date,
40 | "required": false,
41 | "index": true
42 | }
43 | }, {
44 | "autoIndex": false
45 | });
46 |
47 | SessionSchema.index({
48 | "token": 1,
49 | "ip": 1
50 | }, {"unique": true});
51 | //SessionSchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
52 |
53 | module.exports = mongoose.model("Session", SessionSchema);
54 |
--------------------------------------------------------------------------------
/models/SubscriptionService.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var SubscriptionServiceSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "subscription_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Subscription"
15 | },
16 | "service_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "Service"
21 | },
22 | "timestamp_added": {
23 | "type": Date,
24 | "default": Date.now,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_modified": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_deactivated": {
35 | "type": Date,
36 | "required": false,
37 | "index": true
38 | }
39 | }, {
40 | "autoIndex": false
41 | });
42 |
43 |
44 | SubscriptionServiceSchema.index({"subscription_id": 1, "service_id": 1}, {"unique": true});
45 | //SubscriptionServiceSchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
46 |
47 | module.exports = mongoose.model("SubscriptionService", SubscriptionServiceSchema);
48 |
--------------------------------------------------------------------------------
/models/Property.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var PropertySchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "name": {
11 | "type": String,
12 | "required": true,
13 | "index": true
14 | },
15 | "type_id": {
16 | "type": ObjectId,
17 | "required": false,
18 | "index": true,
19 | "ref": "PropertyType"
20 | },
21 | "is_required": {
22 | "type": Boolean,
23 | "required": true,
24 | "default": false,
25 | "index": true
26 | },
27 |
28 | "timestamp_added": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_modified": {
35 | "type": Date,
36 | "default": Date.now,
37 | "required": false,
38 | "index": true
39 | },
40 | "timestamp_deactivated": {
41 | "type": Date,
42 | "required": false,
43 | "index": true
44 | }
45 | }, {
46 | "autoIndex": false
47 | });
48 |
49 | //PropertySchema.index({ "name": 1, "type_id": 1, "is_required": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1 });
50 |
51 | module.exports = mongoose.model("Property", PropertySchema);
52 |
--------------------------------------------------------------------------------
/models/ServicePackageLevel.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var ServicePackageLevelSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "service_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Service"
15 | },
16 | "package_level_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "PackageLevel"
21 | },
22 | "timestamp_added": {
23 | "type": Date,
24 | "default": Date.now,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_modified": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_deactivated": {
35 | "type": Date,
36 | "required": false,
37 | "index": true
38 | }
39 | }, {
40 | "autoIndex": false
41 | });
42 |
43 |
44 | ServicePackageLevelSchema.index({"service_id": 1, "package_level_id": 1}, {"unique": true});
45 | //ServicePackageLevelSchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
46 |
47 | module.exports = mongoose.model("ServicePackageLevel", ServicePackageLevelSchema);
48 |
--------------------------------------------------------------------------------
/models/MerchantGateway.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var MerchantGatewaySchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "name": {
11 | "type": String,
12 | "required": true,
13 | "unique": true
14 | },
15 | "class": {
16 | "type": String,
17 | "required": true,
18 | "unique": true
19 | },
20 | "is_default": {
21 | "type": Boolean,
22 | "default": 0,
23 | "required": false,
24 | "index": true
25 | },
26 | "timestamp_added": {
27 | "type": Date,
28 | "default": Date.now,
29 | "required": false,
30 | "index": true
31 | },
32 | "timestamp_modified": {
33 | "type": Date,
34 | "default": Date.now,
35 | "required": false,
36 | "index": true
37 | },
38 | "timestamp_deactivated": {
39 | "type": Date,
40 | "required": false,
41 | "index": true
42 | }
43 | }, {
44 | "autoIndex": false
45 | });
46 |
47 | //MerchantGatewaySchema.index({
48 | // "name": 1,
49 | // "class": 1,
50 | // "is_default": 1,
51 | // "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1
52 | //});
53 |
54 | module.exports = mongoose.model("MerchantGateway", MerchantGatewaySchema);
55 |
--------------------------------------------------------------------------------
/models/SubscriptionPackageLevel.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var SubscriptionPackageLevelSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "subscription_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Subscription"
15 | },
16 | "package_level_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "PackageLevel"
21 | },
22 | "timestamp_added": {
23 | "type": Date,
24 | "default": Date.now,
25 | "required": false,
26 | "index": true
27 | },
28 | "timestamp_modified": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_deactivated": {
35 | "type": Date,
36 | "required": false,
37 | "index": true
38 | }
39 | }, {
40 | "autoIndex": false
41 | });
42 |
43 |
44 | SubscriptionPackageLevelSchema.index({"subscription_id": 1, "package_level_id": 1}, {"unique": true});
45 | //SubscriptionPackageLevelSchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
46 |
47 | module.exports = mongoose.model("SubscriptionPackageLevel", SubscriptionPackageLevelSchema);
48 |
--------------------------------------------------------------------------------
/models/Category.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var CategorySchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "name": {
11 | "type": String,
12 | "required": true,
13 | "unique": true,
14 | "trim": true
15 | },
16 | "slug": {
17 | "type": String,
18 | "required": true,
19 | "unique": true ,
20 | "index": true
21 | },
22 | "is_active": {
23 | "type": Boolean,
24 | "default": false,
25 | "index": true
26 | },
27 | "parent_id": {
28 | "type": ObjectId,
29 | "required": false,
30 | "index": true,
31 | "ref": "Category"
32 | },
33 | "timestamp_added": {
34 | "type": Date,
35 | "default": Date.now,
36 | "required": false,
37 | "index": true
38 | },
39 | "timestamp_modified": {
40 | "type": Date,
41 | "default": Date.now,
42 | "required": false,
43 | "index": true
44 | },
45 | "timestamp_deactivated": {
46 | "type": Date,
47 | "required": false,
48 | "index": true
49 | }
50 | }, {
51 | "autoIndex": false
52 | });
53 |
54 | //CategorySchema.index({"name": 1, "slug": 1, "parent_id": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
55 | module.exports = mongoose.model("Category", CategorySchema);
56 |
--------------------------------------------------------------------------------
/models/UserAcl.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var UserAclSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "user_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "User"
15 | },
16 | "resource_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "AclResource"
21 | },
22 | "permission_id": {
23 | "type": ObjectId,
24 | "required": true,
25 | "index": true,
26 | "ref": "AclPermission"
27 | },
28 | "timestamp_added": {
29 | "type": Date,
30 | "default": Date.now,
31 | "required": false,
32 | "index": true
33 | },
34 | "timestamp_modified": {
35 | "type": Date,
36 | "default": Date.now,
37 | "required": false,
38 | "index": true
39 | },
40 | "timestamp_deactivated": {
41 | "type": Date,
42 | "required": false,
43 | "index": true
44 | }
45 | }, {
46 | "autoIndex": false
47 | });
48 |
49 | UserAclSchema.index({
50 | "user_id": 1,
51 | "resource_id": 1,
52 | "permission_id": 1
53 | }, {"unique": true});
54 | //UserAclSchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
55 |
56 | module.exports = mongoose.model("UserAcl", UserAclSchema);
57 |
--------------------------------------------------------------------------------
/models/Notify.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var NotifySchema = new Schema({
6 |
7 | "id": {
8 | "type": ObjectId,
9 | "index": true
10 | },
11 | "name": {
12 | "type": String,
13 | "required": false
14 | },
15 | "email": {
16 | "type": String,
17 | "required": true,
18 | "index": true
19 | },
20 | "item_id": {
21 | "type": ObjectId,
22 | "required": false,
23 | "index": true,
24 | "ref": "Item"
25 | },
26 | "is_mailing_list": {
27 | "type": Boolean,
28 | "default": false,
29 | "required": false,
30 | "index": true
31 | },
32 | "is_active": {
33 | "type": Boolean,
34 | "default": true,
35 | "required": true,
36 | "index": true
37 | },
38 | "timestamp_added": {
39 | "type": Date,
40 | "default": Date.now,
41 | "required": false,
42 | "index": true
43 | },
44 | "timestamp_modified": {
45 | "type": Date,
46 | "default": Date.now,
47 | "required": false,
48 | "index": true
49 | },
50 | "timestamp_deactivated": {
51 | "type": Date,
52 | "required": false,
53 | "index": true
54 | }
55 | }, {
56 | "autoIndex": false
57 | });
58 |
59 | NotifySchema.index({"email": 1}, {"unique": true});
60 |
61 | module.exports = mongoose.model("Notify", NotifySchema);
--------------------------------------------------------------------------------
/models/UserProfile.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var UserProfileSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "user_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "ref": "User"
14 | },
15 | "about_me": {
16 | "type": String,
17 | "required": false
18 | },
19 | "facebook_handle": {
20 | "type": String,
21 | "required": false,
22 | "index": true
23 | },
24 | "twitter_handle": {
25 | "type": String,
26 | "required": false,
27 | "index": true
28 | },
29 | "timestamp_added": {
30 | "type": Date,
31 | "default": Date.now,
32 | "required": false,
33 | "index": true
34 | },
35 | "timestamp_modified": {
36 | "type": Date,
37 | "default": Date.now,
38 | "required": false,
39 | "index": true
40 | },
41 | "timestamp_deactivated": {
42 | "type": Date,
43 | "required": false,
44 | "index": true
45 | }
46 | }, {
47 | "autoIndex": false
48 | });
49 |
50 | UserProfileSchema.index({
51 | "user_id": 1
52 | }, {"unique": true});
53 | //UserProfileSchema.index({
54 | // "facebook_handle": 1, "twitter_handle": 1,
55 | // "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1
56 | //});
57 |
58 | module.exports = mongoose.model("UserProfile", UserProfileSchema);
59 |
--------------------------------------------------------------------------------
/test/all.js:
--------------------------------------------------------------------------------
1 | /**
2 | * acl-permission
3 | */
4 | //exports['test acl-permission'] = require('./test-acl-permission');
5 |
6 | /**
7 | * acl-resource
8 | */
9 | //exports['test /acl-resource'] = require('./test-acl-resource');
10 |
11 | /**
12 | * acl-role
13 | */
14 |
15 | /**
16 | * category
17 | */
18 |
19 | /**
20 | * comment
21 | */
22 |
23 | /**
24 | * coupon
25 | */
26 |
27 | /**
28 | * currency
29 | */
30 |
31 | /**
32 | * folder
33 | */
34 |
35 | /**
36 | * item
37 | */
38 |
39 | /**
40 | * item-coupon
41 | */
42 |
43 | /**
44 | * item-property
45 | */
46 |
47 | /**
48 | * merchant-gateway
49 | */
50 |
51 | /**
52 | * order
53 | */
54 |
55 | /**
56 | * order-coupon
57 | */
58 |
59 | /**
60 | * order-item
61 | */
62 |
63 | /**
64 | * order-service
65 | */
66 |
67 | /**
68 | * order-status-history
69 | */
70 |
71 | /**
72 | * order-subscription
73 | */
74 |
75 | /**
76 | * package-level
77 | */
78 |
79 | /**
80 | * page
81 | */
82 |
83 | /**
84 | * property
85 | */
86 |
87 | /**
88 | * property-type
89 | */
90 |
91 | /**
92 | * property-value
93 | */
94 |
95 | /**
96 | * service
97 | */
98 |
99 | /**
100 | * service-coupon
101 | */
102 |
103 | /**
104 | * service-package-level
105 | */
106 |
107 | /**
108 | * status
109 | */
110 |
111 | /**
112 | * subscription
113 | */
114 |
115 | /**
116 | * subscription-coupon
117 | */
118 |
119 | /**
120 | * subscription-package-level
121 | */
122 |
123 | /**
124 | * subscription-service
125 | */
126 |
127 | /**
128 | * user
129 | */
130 |
131 | /**
132 | * user-acl
133 | */
134 |
135 | /**
136 | * user-profile
137 | */
138 |
--------------------------------------------------------------------------------
/models/OrderSubscription.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var OrderSubscriptionSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "order_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Order"
15 | },
16 | "subscription_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "Subscription"
21 | },
22 | "subscription_price": {
23 | "type": Number,
24 | "required": true,
25 | "index": true
26 | },
27 | "subscription_start_date": {
28 | "type": Date,
29 | "required": true,
30 | "index": true
31 | },
32 | "subscription_end_date": {
33 | "type": Date,
34 | "required": true,
35 | "index": true
36 | },
37 | "timestamp_added": {
38 | "type": Date,
39 | "default": Date.now,
40 | "required": false,
41 | "index": true
42 | },
43 | "timestamp_modified": {
44 | "type": Date,
45 | "default": Date.now,
46 | "required": false,
47 | "index": true
48 | },
49 | "timestamp_deactivated": {
50 | "type": Date,
51 | "required": false,
52 | "index": true
53 | }
54 | }, {
55 | "autoIndex": false
56 | });
57 |
58 | OrderSubscriptionSchema.index({
59 | "order_id": 1,
60 | "subscription_id": 1
61 | }, {
62 | "unique": true
63 | });
64 | //OrderSubscriptionSchema.index({"timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1});
65 |
66 | module.exports = mongoose.model("OrderSubscription", OrderSubscriptionSchema);
67 |
--------------------------------------------------------------------------------
/models/Page.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var PageSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "folder_id": {
11 | "type": ObjectId,
12 | "required": false,
13 | "index": true,
14 | "ref": "Folder"
15 | },
16 | "user_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "User"
21 | },
22 | "title": {
23 | "type": String,
24 | "required": true,
25 | "index": true
26 | },
27 | "slug": {
28 | "type": String,
29 | "required": true,
30 | "index": true
31 | },
32 | "is_active": {
33 | "type": Boolean,
34 | "required": true,
35 | "default": false,
36 | "index": true
37 | },
38 | "excerpt": {
39 | "type": String,
40 | "required": true,
41 | "index": true
42 | },
43 | "content": {
44 | "type": String,
45 | "required": true
46 | },
47 |
48 | "timestamp_added": {
49 | "type": Date,
50 | "default": Date.now,
51 | "required": false,
52 | "index": true
53 | },
54 | "timestamp_modified": {
55 | "type": Date,
56 | "default": Date.now,
57 | "required": false,
58 | "index": true
59 | },
60 | "timestamp_deactivated": {
61 | "type": Date,
62 | "required": false,
63 | "index": true
64 | }
65 | }, {
66 | "autoIndex": false
67 | });
68 |
69 | //PageSchema.index({ "folder_id": 1, "user_id": 1, "is_active": 1, "excerpt": 1, "content": 1, "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1 });
70 | PageSchema.index({ "title": 1 }, { "unique": true });
71 | PageSchema.index({ "slug": 1 }, { "unique": true });
72 |
73 | module.exports = mongoose.model("Page", PageSchema);
74 |
--------------------------------------------------------------------------------
/models/OrderService.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var OrderServiceSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "service_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Service"
15 | },
16 | "order_id": {
17 | "type": ObjectId,
18 | "required": true,
19 | "index": true,
20 | "ref": "Order"
21 | },
22 | "price": {
23 | "type": Number,
24 | "required": true,
25 | "index": true
26 | },
27 | "units": {
28 | "type": Number,
29 | "required": true,
30 | "index": true
31 | },
32 |
33 | "start_date": {
34 | "type": Date,
35 | "default": Date.now,
36 | "required": true,
37 | "index": true
38 | },
39 | "end_date": {
40 | "type": Date,
41 | "default": Date.now,
42 | "required": true,
43 | "index": true
44 | },
45 | "timestamp_added": {
46 | "type": Date,
47 | "default": Date.now,
48 | "required": false,
49 | "index": true
50 | },
51 | "timestamp_modified": {
52 | "type": Date,
53 | "default": Date.now,
54 | "required": false,
55 | "index": true
56 | },
57 | "timestamp_deactivated": {
58 | "type": Date,
59 | "required": false,
60 | "index": true
61 | }
62 | }, {
63 | "autoIndex": false
64 | });
65 |
66 | //OrderServiceSchema.index({
67 | // "service_id": 1,
68 | // "order_id": 1,
69 | // "price": 1,
70 | // "units": 1,
71 | // "start_date": 1,
72 | // "end_date": 1,
73 | // "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1
74 | //});
75 | OrderServiceSchema.index({
76 | "service_id": 1, "order_id": 1
77 | }, {"unique": true});
78 |
79 | module.exports = mongoose.model("OrderService", OrderServiceSchema);
80 |
--------------------------------------------------------------------------------
/models/Coupon.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var CouponSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "code": {
11 | "type": String,
12 | "required": true,
13 | "unique": true
14 | },
15 | "start_date": {
16 | "type": Date,
17 | "required": true,
18 | "index": true
19 | },
20 | "end_date": {
21 | "type": Date,
22 | "required": false,
23 | "index": true
24 | },
25 | "is_active": {
26 | "type": Boolean,
27 | "default": false,
28 | "index": true
29 | },
30 | "item_price": {
31 | "type": Number,
32 | "required": true,
33 | "index": true
34 | },
35 | "service_price_per_unit": {
36 | "type": Number,
37 | "required": false,
38 | "index": true
39 | },
40 | "subscription_sign_up_fee": {
41 | "type": Number,
42 | "required": false,
43 | "index": true
44 | },
45 | "subscription_price_per_unit": {
46 | "type": Number,
47 | "required": false,
48 | "index": true
49 | },
50 | "timestamp_added": {
51 | "type": Date,
52 | "default": Date.now,
53 | "required": false,
54 | "index": true
55 | },
56 | "timestamp_modified": {
57 | "type": Date,
58 | "default": Date.now,
59 | "required": false,
60 | "index": true
61 | },
62 | "timestamp_deactivated": {
63 | "type": Date,
64 | "required": false,
65 | "index": true
66 | }
67 | }, {
68 | "autoIndex": false
69 | });
70 |
71 | //CouponSchema.index({
72 | // "code": 1, "start_date": 1, "end_date": 1, "item_price": 1, "service_price_per_unit": 1,
73 | // "subscription_sign_up_fee": 1, "subscription_price_per_unit": 1, "timestamp_added": 1, "timestamp_modified": 1,
74 | // "timestamp_deactivated": 1
75 | //});
76 | module.exports = mongoose.model("Coupon", CouponSchema);
77 |
--------------------------------------------------------------------------------
/models/Service.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var ServiceSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "currency_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Currency"
15 | },
16 | "requires_subscription": {
17 | "type": Boolean,
18 | "required": true,
19 | "default": false,
20 | "index": true
21 | },
22 | "name": {
23 | "type": String,
24 | "required": true,
25 | "index": true
26 | },
27 | "description": {
28 | "type": String,
29 | "required": true
30 | },
31 | "terms": {
32 | "type": String,
33 | "required": true
34 | },
35 | "price_per_unit": {
36 | "type": Number,
37 | "required": true,
38 | "index": true
39 | },
40 | "unit_of_measure": {
41 | "type": String,
42 | "required": true,
43 | "index": true
44 | },
45 | "unit_amount": {
46 | "type": Number,
47 | "required": true,
48 | "index": true
49 | },
50 | "is_on_site": {
51 | "type": Boolean,
52 | "required": true,
53 | "default": false,
54 | "index": true
55 | },
56 | "is_available": {
57 | "type": Boolean,
58 | "required": true,
59 | "default": 0,
60 | "index": true
61 | },
62 |
63 | "timestamp_added": {
64 | "type": Date,
65 | "default": Date.now,
66 | "required": false,
67 | "index": true
68 | },
69 | "timestamp_modified": {
70 | "type": Date,
71 | "default": Date.now,
72 | "required": false,
73 | "index": true
74 | },
75 | "timestamp_deactivated": {
76 | "type": Date,
77 | "required": false,
78 | "index": true
79 | }
80 | }, {
81 | "autoIndex": false
82 | });
83 |
84 | //ServiceSchema.index({
85 | // "currency_id": 1, "requires_subscription": 1, "name": 1, "description": 1, "terms": 1, "price_per_unit": 1,
86 | // "unit_of_measure": 1, "unit_amount": 1, "is_on_site": 1, "is_available": 1,
87 | // "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1
88 | //});
89 | ServiceSchema.index({"name": 1}, {"unique": true});
90 |
91 | module.exports = mongoose.model("Service", ServiceSchema);
92 |
--------------------------------------------------------------------------------
/models/Subscription.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var SubscriptionSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "currency_id": {
11 | "type": ObjectId,
12 | "required": true,
13 | "index": true,
14 | "ref": "Currency"
15 | },
16 | "name": {
17 | "type": String,
18 | "required": true,
19 | "index": true
20 | },
21 | "description": {
22 | "type": String,
23 | "required": true,
24 | "index": true
25 | },
26 | "terms": {
27 | "type": String,
28 | "required": true
29 | },
30 | "signup_fee": {
31 | "type": Number,
32 | "required": true,
33 | "index": true
34 | },
35 | "is_recurring": {
36 | "type": Boolean,
37 | "required": true,
38 | "default": false,
39 | "index": true
40 | },
41 | "recurs_every_amount": {
42 | "type": Number,
43 | "required": false,
44 | "index": true
45 | },
46 | "recurs_every_unit": {
47 | "type": String,
48 | "required": false,
49 | "index": true
50 | },
51 | "recurs_max_amount": {
52 | "type": Number,
53 | "required": false,
54 | "index": true
55 | },
56 | "price_per_unit": {
57 | "type": Number,
58 | "required": true,
59 | "index": true
60 | },
61 | "is_available": {
62 | "type": Boolean,
63 | "required": true,
64 | "default": false,
65 | "index": true
66 | },
67 | "timestamp_added": {
68 | "type": Date,
69 | "default": Date.now,
70 | "required": false,
71 | "index": true
72 | },
73 | "timestamp_modified": {
74 | "type": Date,
75 | "default": Date.now,
76 | "required": false,
77 | "index": true
78 | },
79 | "timestamp_deactivated": {
80 | "type": Date,
81 | "required": false,
82 | "index": true
83 | }
84 | }, {
85 | "autoIndex": false
86 | });
87 |
88 |
89 | //SubscriptionSchema.index({
90 | // "currency_id": 1, "signup_fee": 1, "is_recurring": 1, "recurs_every_amount": 1, "recurs_every_unit": 1,
91 | // "recurs_max_amount": 1, "price_per_unit": 1, "is_available": 1,
92 | // "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1
93 | //});
94 | SubscriptionSchema.index({
95 | "name": 1
96 | }, {"unique": true});
97 |
98 | module.exports = mongoose.model("Subscription", SubscriptionSchema);
99 |
--------------------------------------------------------------------------------
/models/User.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId,
4 | bcrypt = require('bcrypt'),
5 | SALT_WORK_FACTOR = 10;
6 |
7 | var UserSchema = new Schema({
8 | "id": {
9 | "type": ObjectId,
10 | "index": true
11 | },
12 | "acl_role_id": {
13 | "type": ObjectId,
14 | "required": true,
15 | "index": true,
16 | "ref": "AclRole"
17 | },
18 | "first_name": {
19 | "type": String,
20 | "required": true,
21 | "index": true
22 | },
23 | "last_name": {
24 | "type": String,
25 | "required": true,
26 | "index": true
27 | },
28 | "email": {
29 | "type": String,
30 | "required": true,
31 | "index": true
32 | },
33 | "handle": {
34 | "type": String,
35 | "required": true,
36 | "index": true
37 | },
38 | "is_active": {
39 | "type": Boolean,
40 | "default": false,
41 | "index": true
42 | },
43 |
44 | "password_hash": {
45 | "type": String,
46 | "required": true
47 | },
48 | "password_is_temporary": {
49 | "type": Boolean,
50 | "required": true,
51 | "default": true,
52 | "index": true
53 | },
54 | "timestamp_added": {
55 | "type": Date,
56 | "default": Date.now,
57 | "required": false,
58 | "index": true
59 | },
60 | "timestamp_modified": {
61 | "type": Date,
62 | "default": Date.now,
63 | "required": false,
64 | "index": true
65 | },
66 | "timestamp_deactivated": {
67 | "type": Date,
68 | "required": false,
69 | "index": true
70 | }
71 | }, {
72 | "autoIndex": false
73 | });
74 |
75 | UserSchema.pre('save', function(next) {
76 | var user = this;
77 |
78 | // only hash the password if it has been modified (or is new)
79 | if (!user.isModified('password_hash')) return next();
80 |
81 | // generate a salt
82 | bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
83 | if (err) return next(err);
84 |
85 | // hash the password using our new salt
86 | bcrypt.hash(user.password_hash, salt, function(err, hash) {
87 | if (err) return next(err);
88 |
89 | // override the cleartext password with the hashed one
90 | user.password_hash = hash;
91 | next();
92 | });
93 | });
94 | });
95 |
96 | UserSchema.methods.comparePassword = function(candidatePassword, cb) {
97 | bcrypt.compare(candidatePassword, this.password_hash, function(err, isMatch) {
98 | if (err) return cb(err);
99 | cb(null, isMatch);
100 | });
101 | };
102 |
103 | //UserSchema.index({
104 | // "acl_role_id": 1,
105 | // "first_name": 1,
106 | // "last_name": 1,
107 | // "email": 1,
108 | // "handle": 1,
109 | // "is_active": 1,
110 | // "password_hash": 1,
111 | // "password_is_temporary": 1,
112 | // "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1
113 | //});
114 |
115 | UserSchema.index({"email": 1}, {"unique": true});
116 | UserSchema.index({"handle": 1}, {"unique": true});
117 |
118 | module.exports = mongoose.model("User", UserSchema);
119 |
--------------------------------------------------------------------------------
/models/Order.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var OrderSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "amount_total": {
11 | "type": Number,
12 | "required": true,
13 | "index": true
14 | },
15 | "order_date": {
16 | "type": Date,
17 | "required": false,
18 | "index": true
19 | },
20 | "ip": {
21 | "type": String,
22 | "required": true,
23 | "index": true
24 | },
25 | "email": {
26 | "type": String,
27 | "required": true,
28 | "index": true
29 | },
30 | "address1": {
31 | "type": String,
32 | "required": true,
33 | "index": true
34 | },
35 | "address2": {
36 | "type": String,
37 | "required": false,
38 | "index": true
39 | },
40 | "city": {
41 | "type": String,
42 | "required": true,
43 | "index": true
44 | },
45 | "state": {
46 | "type": String,
47 | "required": true,
48 | "index": true
49 | },
50 | "postal_code": {
51 | "type": String,
52 | "required": true,
53 | "index": true
54 | },
55 | "country": {
56 | "type": String,
57 | "required": true,
58 | "index": true
59 | },
60 | "phone1": {
61 | "type": String,
62 | "required": false,
63 | "index": true
64 | },
65 | "phone2": {
66 | "type": String,
67 | "required": false,
68 | "index": true
69 | },
70 |
71 | "notes": {
72 | "type": String,
73 | "required": false
74 | },
75 | "creation_user_id": {
76 | "type": ObjectId,
77 | "required": false,
78 | "index": true,
79 | "ref": "User"
80 | },
81 | "modification_user_id": {
82 | "type": ObjectId,
83 | "required": false,
84 | "index": true
85 | },
86 |
87 | "currency_id": {
88 | "type": ObjectId,
89 | "required": true,
90 | "index": true
91 | },
92 | "status_history_id": {
93 | "type": ObjectId,
94 | "required": false,
95 | "index": true
96 | },
97 | "merchant_gateway_id": {
98 | "type": ObjectId,
99 | "required": false,
100 | "index": true,
101 | "ref": "MerchantGateway"
102 | },
103 |
104 | "merchant_key": {
105 | "type": String,
106 | "required": true,
107 | "index": true
108 | },
109 |
110 | "timestamp_added": {
111 | "type": Date,
112 | "default": Date.now,
113 | "required": false,
114 | "index": true
115 | },
116 | "timestamp_modified": {
117 | "type": Date,
118 | "default": Date.now,
119 | "required": false,
120 | "index": true
121 | },
122 | "timestamp_deactivated": {
123 | "type": Date,
124 | "required": false,
125 | "index": true
126 | }
127 | }, {
128 | "autoIndex": false
129 | });
130 |
131 | //OrderSchema.index({
132 | // "amount_total": 1,
133 | // "order_date": 1,
134 | // "ip": 1,
135 | // "email": 1,
136 | // "address1": 1,
137 | // "address2": 1,
138 | // "city": 1,
139 | // "state": 1,
140 | // "postal_code": 1,
141 | // "phone1": 1,
142 | // "phone2": 1,
143 | // "creation_user_id": 1,
144 | // "modification_user_id": 1,
145 | // "currency_id": 1,
146 | // "status_history_id": 1,
147 | // "merchant_gateway_id": 1,
148 | // "merchant_key": 1,
149 | // "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1
150 | //});
151 |
152 | module.exports = mongoose.model("Order", OrderSchema);
153 |
--------------------------------------------------------------------------------
/models/Item.js:
--------------------------------------------------------------------------------
1 | var mongoose = require("mongoose"),
2 | Schema = mongoose.Schema,
3 | ObjectId = Schema.ObjectId;
4 |
5 | var ItemSchema = new Schema({
6 | "id": {
7 | "type": ObjectId,
8 | "index": true
9 | },
10 | "name": {
11 | "type": String,
12 | "required": true,
13 | "unique": true
14 | },
15 | "slug": {
16 | "type": String,
17 | "required": true,
18 | "unique": true
19 | },
20 | "sku": {
21 | "type": String,
22 | "required": true,
23 | "unique": true
24 | },
25 | "description": {
26 | "type": String,
27 | "required": true
28 | },
29 | "price": {
30 | "type": Number,
31 | "required": true,
32 | "index": true
33 | },
34 | "currency_id": {
35 | "type": ObjectId,
36 | "required": true,
37 | "ref": "Currency"
38 | },
39 | "category_id": {
40 | "type": ObjectId,
41 | "required": true,
42 | "index": true,
43 | "ref": "Category"
44 | },
45 | "availability_date": {
46 | "type": Date,
47 | "required": true,
48 | "index": true
49 | },
50 | "finite_amount_available": {
51 | "type": Number,
52 | "required": false
53 | },
54 | "finite_unit_of_measure": {
55 | "type": String,
56 | "required": false,
57 | "index": true
58 | },
59 | "max_purchase_amount": {
60 | "type": Number,
61 | "required": false
62 | },
63 | "metric_unit_of_measure" : {
64 | "type": String,
65 | "required": false,
66 | "index": true
67 | },
68 | "metric_width": {
69 | "type": Number,
70 | "required": false,
71 | "index": true
72 | },
73 | "metric_height": {
74 | "type": Number,
75 | "required": false,
76 | "index": true
77 | },
78 | "metric_depth": {
79 | "type": Number,
80 | "required": false,
81 | "index": true
82 | },
83 | "min_purchase_amount": {
84 | "type": Number,
85 | "required": false
86 | },
87 | "perishable_date": {
88 | "type": Date,
89 | "required": false,
90 | "index": true
91 | },
92 | "weight": {
93 | "type": Number,
94 | "required": false,
95 | "index": true
96 | },
97 | "weight_unit_of_measure": {
98 | "type": String,
99 | "required": false,
100 | "index": true
101 | },
102 | "is_available": {
103 | "type": Boolean,
104 | "default": false,
105 | "required": true,
106 | "index": true
107 | },
108 | "is_finite": {
109 | "type": Boolean,
110 | "default": false,
111 | "required": true,
112 | "index": true
113 | },
114 | "is_perishable": {
115 | "type": Boolean,
116 | "default": false,
117 | "required": true,
118 | "index": true
119 | },
120 | "is_tangible": {
121 | "type": Boolean,
122 | "default": true,
123 | "required": true,
124 | "index": true
125 | },
126 | "timestamp_added": {
127 | "type": Date,
128 | "default": Date.now,
129 | "required": false,
130 | "index": true
131 | },
132 | "timestamp_modified": {
133 | "type": Date,
134 | "default": Date.now,
135 | "required": false,
136 | "index": true
137 | },
138 | "timestamp_deactivated": {
139 | "type": Date,
140 | "required": false,
141 | "index": true
142 | }
143 | }, {
144 | "autoIndex": false
145 | });
146 |
147 | //ItemSchema.index({
148 | // "name": 1, "slug": 1, "sku": 1, "price": 1, "currency_id": 1, "category_id": 1, "availability_date": 1,
149 | // "finite_amount_available": 1, "finite_unit_of_measure": 1, "max_purchase_amount": 1, "metric_unit_of_measure": 1,
150 | // "metric_width": 1, "metric_height": 1, "metric_depth": 1, "min_purchase_amount": 1, "perishable_date": 1,
151 | // "weight": 1, "weight_unit_of_measure": 1, "is_available": 1, "is_finite": 1, "is_perishable": 1, "is_tangible": 1,
152 | // "timestamp_added": 1, "timestamp_modified": 1, "timestamp_deactivated": 1
153 | //});
154 | module.exports = mongoose.model("Item", ItemSchema);
155 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | /**
2 | * ZRECore.js - A REST-ful set of commerce related data models.
3 | * @author ZRECommerce
4 | * @license GPL v3 or higher.
5 | */
6 |
7 | /**
8 | * Module dependencies.
9 | */
10 | var port = 8080;
11 | var useSSL = false;
12 | var sslCertificatePath = '';
13 | var sslKeyPath = '';
14 | var sslCaPath = '';
15 | var databaseHost = 'localhost';
16 | var databaseName = 'zrecore';
17 | var authorizationRequired = false; // Set to false while you add your first User, then set back to true and restart the app.
18 |
19 | var http = require('http')
20 | , path = require('path')
21 | , fs = require('fs')
22 | , restify = require('restify')
23 | , _ = require('underscore');
24 |
25 | var ZRECORE_DIR = __dirname;
26 | var crud = require(ZRECORE_DIR + '/lib/crud.js');
27 |
28 | // Load config if found
29 | try {
30 | // Found. Load them.
31 | var config = require(ZRECORE_DIR + '/_config.js')
32 | if (!_.isUndefined(config.port)) port = config.port;
33 | if (!_.isUndefined(config.useSSL)) useSSL = config.useSSL;
34 | if (!_.isUndefined(config.sslCertificatePath)) sslCertificatePath = config.sslCertificatePath;
35 | if (!_.isUndefined(config.sslKeyPath)) sslKeyPath = config.sslKeyPath;
36 | if (!_.isUndefined(config.sslCaPath)) sslCaPath = config.sslCaPath;
37 | if (!_.isUndefined(config.databaseHost)) databaseHost = config.databaseHost;
38 | if (!_.isUndefined(config.databaseName)) databaseName = config.databaseName;
39 | if (!_.isUndefined(config.authorizationRequired)) authorizationRequired = config.authorizationRequired;
40 |
41 | console.log('Loaded config.');
42 |
43 | } catch (e) {
44 | // Not found. Continue
45 | }
46 |
47 |
48 | var server;
49 | // ...Do we want to enable SSL support?
50 | if ( useSSL == true) {
51 | server = restify.createServer({
52 | certificate: fs.readFileSync(sslCertificatePath),
53 | key: fs.readFileSync(sslKeyPath),
54 | ca: fs.readFileSync(sslCaPath),
55 | requestCert: true,
56 | rejectUnauthorized: true
57 | });
58 | } else {
59 | server = restify.createServer({
60 |
61 | });
62 | }
63 | // ...Set up our connection to the database.
64 | var mongoose = require("mongoose");
65 | mongoose.connect('mongodb://' + databaseHost + '/' + databaseName);
66 |
67 | try {
68 | console.log( 'Try to fix mquery issue' );
69 |
70 | delete mongoose.__proto__.mquery.permissions.count;
71 | console.log( 'mquery fix applied to this instance' );
72 | } catch (ex) {
73 | console.log( 'Cannot fix count with sort issue from mquery');
74 | }
75 |
76 | /**
77 | * Set up our REST controllers.
78 | */
79 |
80 | // ...Enforce API authentication
81 | server.use(restify.fullResponse());
82 | server.use(restify.bodyParser());
83 | server.use(restify.queryParser());
84 |
85 | if (authorizationRequired) {
86 | server.pre(function (req, res, next) {
87 | var api_user = req.header('API-USER');
88 | var api_key = req.header('API-KEY');
89 | var api_version = req.header('API-VERSION');
90 |
91 | if ( _.isUndefined( api_user ) || _.isUndefined(api_key) ) {
92 |
93 | res.send(401, '401 Access Denied');
94 | } else {
95 |
96 | // ...Attempt to look it up.
97 | var User = require('./models/User.js');
98 |
99 | var authUser = User.findOne({"handle": api_user}, function (err, doc) {
100 | if (err) {
101 | console.error(err.toString());
102 | res.send(500, 'Internal server error.');
103 | } else {
104 | if (doc) {
105 |
106 | doc.comparePassword(api_key, function (err, isMatch) {
107 | if (err || !isMatch) {
108 | res.send(401, '401 Access Denied');
109 | } else {
110 | // OK! ...Just continue execution.
111 | next();
112 | }
113 | });
114 | } else {
115 | // User not found
116 | res.send(401, '401 Access Denied');
117 | }
118 | }
119 | });
120 | }
121 |
122 | });
123 | }
124 |
125 | var routeFiles = fs.readdirSync( ZRECORE_DIR + '/routes');
126 | var route = '';
127 | var models = [];
128 |
129 | for (var r = 0; r < routeFiles.length; r++) {
130 | route = path.basename(routeFiles[r], '.js');
131 | if (route != '') models.push(route);
132 | }
133 | var model = null;
134 | for (var i = 0; i < models.length; i++) {
135 | console.log('...Routing ' + models[i]);
136 | model = require('./routes/' + models[i]);
137 | crud.setUpServer(server, '/' + models[i], model);
138 | }
139 |
140 | /**
141 | * Ok! Let's start the show.
142 | */
143 |
144 | server.listen(port, function () {
145 | console.log('Server is running on port ' + port);
146 | });
147 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | zrecore-js
2 | ==========
3 |
4 | ZRECore.js - A RESTful interface to commonly used 'commerce' data models.
5 |
6 |
7 | How to use
8 | ==========
9 |
10 | Use `npm install zrecore`
11 |
12 |
13 | Then open up your main node file (like app.js, or server.js, or whatever), and add the following line:
14 |
15 | ```javascript
16 | var zrecore = require('zrecore');
17 | ```
18 |
19 | You can now use HTTP GET/PUT/POST/DELETE methods on the data model end-points (such as /acl-permission or /item)
20 |
21 | You can add (or better yet, sym link) a _config.js to your npm_module/zrecore/ directory. When zrecore is loaded, it will automatically use those settings instead of the default ones.
22 |
23 | Here is a sample _config.js for you to modify.
24 |
25 | ```
26 | exports.port = 8080; // What port should this instance run on?
27 | exports.useSSL = false; // Do you want to force SSL? (restify 2.0 or greater I think)
28 | exports.sslCertificatePath = ''; // If useSSL is enabled (true), path to .crt file
29 | exports.sslKeyPath = ''; // If useSSL is enabled, path to key file
30 | exports.sslCaPath = ''; // If useSSL is enabled, path to ca or crt file
31 | exports.databaseHost = 'localhost'; // Where is your mongodb at?
32 | exports.databaseName = 'zrecore'; // What is the name of your mongo database
33 |
34 | // Set this to true once you have an User document in your mongo database to
35 | // avoid unauthorized access of your RESTful end-points!
36 | //
37 | // If set to true, you must set the following headers with your
38 | // RESTful requests:
39 | //
40 | // API-USER: the_user_name
41 | // API-KEY: the_user_password
42 | // API-VERSION: 1.0
43 | //
44 | // (The API-VERSION header is reserved for future use)
45 | exports.authorizationRequired = false; // Require valid User credentials to access this instance?
46 |
47 | ```
48 |
49 | See the package.json file for dependencies. The full list of data model enpoints are available at http://www.zrecore.com
50 |
51 | How are data models related to each other?
52 | ==========
53 | Our basic groups of models are organized in a straight-forward and simple manner (modify as you see fit). The idea is to think of the most
54 | commonly used features, and provide a starting point with a basic set of data models:
55 |
56 | * AclPermission - A list of valid ACL Permissions, such as 'allow', 'deny', or something like 'create', 'read', 'update', 'delete'. An access control list associates a user with a resource, and (according to the user's role) specifies what permissions a user has.
57 | * AclResource - A list of things that we consider a resource, such as '/foo/some-page', or 'Some object'.
58 | * AclRole - A list of roles a user can have, such as 'editor', 'administrator', 'guest', etc...
59 | * Folder - Just like a real-life folder, this is used to organize/group pages and sub-folders.
60 | * Page - A page is a page ...is a page. This just holds content we would like to make viewable out at some point.
61 | * Item - As in, items for sale, or an item for rent. Something tangible we would like to offer, or perhaps something intangible, such as a software/media download.
62 | * ItemCoupon - A list of coupons that are available for a specific item.
63 | * ItemProperty - A list of additional properties that are associated with a specific item, such as "shoe sizes", or "available colors", etc. See the Property models below.
64 | * MerchantGateway - A list of merchant gateways our application will use. This is solely a list, you should implement your own usage of merchant gateways however you see fit, and simply use this list to keep track of what merchant gateways you use.
65 | * Order - A list of orders. An order simply contains some basic information about a sale, including items purchased, sale date, sale totals, services purchased, subscriptions subscribed to, etc...
66 | * OrderCoupon - A list of coupons that were applied to a specific order. This has fields to keep track of what coupon values were used, so that if a specific coupon is updated in the future, we still have an immutable historical reference.
67 | * OrderItem - A list of items that were purchased under a specific order.
68 | * OrderService - A list of services that were purchased under a specific order.
69 | * OrderStatusHistory - A historical list of status changes made to a specific order record, such as changing from 'placed' to 'pending', then to 'shipped', or whatever status you have defined in the 'Status' list of records.
70 | * OrderSubscription - A list of subscriptions associated with a specific order.
71 | * PackageLevel - This is associated with the Subscription and Service data models. Subscriptions and services can offer multiple packages, sometimes in order of most basic to most full featured. The PackageLevel model simply lists what these package levels are.
72 | * Property - A generic list of extra properties we can associate with an Item data model object, such as 'shoe sizes', or 't-shirt color', etc...
73 | * PropertyType - A list of available 'types' we can assign to our Property objects.
74 | * PropertyValue - A list of available value(s) a specific PropertyType model can have.
75 | * Service - A list of services offered for sale, such as 'Tax consultation', or 'Landscaping', etc...
76 | * ServiceCoupon - A list of coupons available to a specific service.
77 | * ServicePackageLevel - A list of package levels available to a specific service.
78 | * Status - A list to help define what status an Order may have, such as 'pending', 'sold', 'rma begin', 'lost in space', or whatever you think are valid order history statuses.
79 | * Subscription - A list of available subscriptions you offer.
80 | * SubscriptionCoupon - A list of coupons available for a specific subscription.
81 | * SubscriptionPackageLevel - A list of package levels available for a specific subscription.
82 | * SubscriptionService - A list of service(s) available as part of a specific subscription. Kind of like how you can sign up something such as a gym membership subscription, and receive personal training, or a 10 days of kick-boxing lessons (as a service, not a punching bag).
83 | * User - A list of users that may access your application. This is usually used in conjunction with ACL data models to define who can (or can't) access certain resources, according to what permissions a user's role has on a resource.
84 | * UserAcl - A list defining what role is associated with a specific user, along with resources and permissions.
85 | * UserProfile - This is just a list containing common user 'profile' properties, such as 'twitter handle', or 'about me', etc.
86 |
87 | A complete list of related resources can be viewed at http://www.zrecore.com/
88 |
--------------------------------------------------------------------------------
/lib/crud.js:
--------------------------------------------------------------------------------
1 | var _ = require('underscore');
2 | var restify = require('restify');
3 |
4 | module.exports.list = function (mModel, req, res, next) {
5 |
6 | var searchQuery = !_.isUndefined(req.header('API-QUERY')) ? JSON.parse(req.header('API-QUERY')) : null;
7 | var populate = !_.isUndefined(req.header('API-POPULATE')) ? req.header('API-POPULATE') : null;
8 | var limit = !_.isUndefined(req.header('API-LIMIT')) && req.header('API-LIMIT') ? req.header('API-LIMIT') : null;
9 | var skip = !_.isUndefined(req.header('API-SKIP')) && req.header('API-SKIP') ? req.header('API-SKIP') : null;
10 | var sort = !_.isUndefined(req.header('API-SORT')) ? req.header('API-SORT') : null;
11 | var query;
12 |
13 | try {
14 | populate = JSON.parse(populate);
15 | } catch (e) {
16 | // Nope, not JSON.
17 | }
18 |
19 | if (!_.isNull(searchQuery) && searchQuery != '') {
20 | if (_.isObject(searchQuery)) {
21 | if (_.has(searchQuery, 'query') && _.has(searchQuery, 'fields')) {
22 | query = mModel.find(searchQuery.query, searchQuery.fields);
23 | } else if(_.has(searchQuery, 'query')) {
24 | query = mModel.find(searchQuery.query);
25 | } else {
26 | query = mModel.find(searchQuery);
27 | }
28 |
29 | if (_.has(searchQuery, 'sort')) {
30 | query = query.sort(searchQuery.sort);
31 | }
32 | } else {
33 | query = mModel.find(searchQuery);
34 | }
35 | } else {
36 | query = mModel.find();
37 | }
38 |
39 |
40 | if (!_.isNull(populate)) {
41 | if (_.isObject(populate)) {
42 | if (_.has(populate, 'document') && _.has(populate, 'fields')) {
43 | query.populate(populate.document, populate.fields);
44 | } else if (_.has(populate, 'document')) {
45 | query.populate(populate.document);
46 | } else if (Array.isArray(populate)) {
47 | for(var i = 0; i < populate.length; i++) {
48 | query.populate(populate[i]);
49 | }
50 | } else {
51 | query.populate(populate);
52 | }
53 | } else {
54 | query.populate(populate);
55 | }
56 | }
57 | if (!_.isNull(skip)) query.skip(skip);
58 | if (!_.isNull(limit) && limit != '') query.limit(limit);
59 | if (!_.isNull(sort)) query.sort(sort);
60 |
61 | query.exec(function (err, records) {
62 | if (err) {
63 | res.send({
64 | result: 'error',
65 | message: err.toString()
66 | });
67 | } else {
68 | query.count(function (err, cnt) {
69 | res.send({
70 | result: 'ok',
71 | pagination: {
72 | count: cnt,
73 | limit: limit,
74 | skip: skip,
75 | sort: sort,
76 | query: searchQuery,
77 | populate: populate
78 | },
79 | data: records
80 | });
81 | });
82 | }
83 | });
84 |
85 | return next;
86 | };
87 |
88 | module.exports.get = function (mModel, req, res, next) {
89 | var id = !_.isUndefined(req.params.id) ? req.params.id : null;
90 |
91 | mModel.findById(id, function (err, records) {
92 |
93 | if (err) {
94 | res.send({
95 | result: 'error',
96 | message: err.toString()
97 | });
98 | } else {
99 | res.send({
100 | result: 'ok',
101 | data: records
102 | });
103 | }
104 | });
105 |
106 | return next;
107 | };
108 |
109 | /**
110 | * Do not provide the _id property in the data. Only supply the id value at the end of the URL.
111 | *
112 | * @param mModel
113 | * @param req
114 | * @param res
115 | * @param next
116 | * @returns {*}
117 | */
118 | module.exports.put = function (mModel, req, res, next) {
119 | var id = !_.isUndefined(req.params.id) ? req.params.id : null;
120 |
121 | // Update only.
122 | if (id) {
123 | var data = req.params;
124 | delete data.id;
125 |
126 | mModel.findByIdAndUpdate(id, {$set: data}, function (err, record) {
127 | if (err) {
128 | res.send({
129 | result: 'error',
130 | message: err.toString()
131 | });
132 | } else {
133 | res.send({
134 | result: 'ok',
135 | data: record,
136 | message: 'Update complete'
137 | });
138 | }
139 | });
140 | }
141 |
142 | return next;
143 | }
144 | /**
145 | * Do not provide the _id property in the data. Only supply the id value at the end of the URL.
146 | * @param mModel
147 | * @param req
148 | * @param res
149 | * @param next
150 | * @returns {*}
151 | */
152 | module.exports.post = function (mModel, req, res, next) {
153 | var id = !_.isUndefined(req.params.id) ? req.params.id : null;
154 | var data = req.params;
155 |
156 | if (id) {
157 | delete data.id;
158 |
159 | // Update
160 | mModel.findByIdAndUpdate(id, {$set: data}, function (err, record) {
161 |
162 | if (err) {
163 | res.send({
164 | result: 'error',
165 | message: err.toString()
166 | });
167 | } else {
168 | res.send({
169 | result: 'ok',
170 | data: record,
171 | message: 'Update complete'
172 | });
173 | }
174 | });
175 |
176 | } else {
177 | // Create
178 | var newModel = new mModel(data);
179 | newModel.save(function (err, m) {
180 |
181 | if (err) {
182 | res.send({
183 | result: 'error',
184 | message: err.toString()
185 | });
186 | } else {
187 | res.send({
188 | result: 'ok',
189 | data: m,
190 | message: 'Create',
191 | err: err
192 | });
193 | }
194 | });
195 | }
196 |
197 | return next;
198 | }
199 |
200 | module.exports.del = function (mModel, req, res, next) {
201 | var id = !_.isUndefined(req.params.id) ? req.params.id : (!_.isUndefined(req.params._id) ? req.params._id : null);
202 |
203 | if (id) {
204 | // Delete
205 | mModel.findByIdAndRemove(id, function (err, record) {
206 |
207 | res.send({
208 | result: 'ok',
209 | message: 'Deleted.'
210 | });
211 | });
212 | }
213 |
214 | return next;
215 | }
216 |
217 | module.exports.setUpServer = function(server, routeURI, route) {
218 | server.get(routeURI, route.list);
219 | server.get(routeURI + '/:id', route.get);
220 |
221 | server.put(routeURI + '/:id', route.put);
222 | server.post(routeURI + '/', route.post);
223 | server.post(routeURI + '/:id', route.post);
224 | server.del(routeURI + '/:id', route.del);
225 | }
--------------------------------------------------------------------------------
/public/bootstrap-2.3.1/css/bootstrap-responsive.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Responsive v2.3.1
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
10 |
--------------------------------------------------------------------------------
/public/bootstrap-2.3.1/js/bootstrap.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap.js by @fat & @mdo
3 | * Copyright 2012 Twitter, Inc.
4 | * http://www.apache.org/licenses/LICENSE-2.0.txt
5 | */
6 | !function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||s.toggleClass("open"),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f