8000 new uncompleted example · nCodefresh/examples@e78c170 · GitHub
[go: up one dir, main page]

Skip to content

Commit e78c170

Browse files
committed
new uncompleted example
1 parent 399823e commit e78c170

File tree

10 files changed

+273
-0
lines changed

10 files changed

+273
-0
lines changed

0-learn/config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
database : mongodb://localhost:27017/local

0-learn/controllers/api.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
var Users = MODEL('Users');
2+
3+
exports.install = function() {
4+
F.route('/api/users/', json_users_query);
5+
F.route('/api/users/{id}/', json_users_read);
6+
F.route('/api/users/{id}/', json_users_remove, ['delete']);
7+
F.route('/api/users/', json_users_save, ['put', 'json', '*User']);
8+
};
9+
10+
function json_users_query() {
11+
var self = this;
12+
Users.User.query(self.query, self.callback());
13+
}
14+
15+
function json_users_read(id) {
16+
var self = this;
17+
Users.User.get({ _id: id }, self.callback());
18+
}
19+
20+
function json_users_remove(id) {
21+
var self = this;
22+
Users.User.remove({ _id: id }, self.callback());
23+
}
24+
25+
function json_users_save() {
26+
var self = this;
27+
self.body.$async(self.callback()).$workflow('check').$save();
28+
}

0-learn/controllers/default.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
exports.install = function() {
2+
F.route('/');
3+
};

0-learn/definitions/database.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
var MC = require('mongodb').MongoClient;
2+
var DB = null;
3+
var Addons = require('mongodb-addons');
4+
5+
MC.connect(CONFIG('database'), function(err, db) {
6+
if (err)
7+
F.error(err);
8+
DB = db;
9+
});
10+
11+
F.database = function(collection) {
12+
if (collection)
13+
return DB.collection(collection);
14+
return DB;
15+
};

0-learn/definitions/localization.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
F.onLocate = function(req, res) {
2+
// default resource file: en.resource
3+
return 'en';
4+
};

0-learn/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// ===================================================
2+
// IMPORTANT: only for development
3+
// total.js - web application framework for node.js
4+
// http://w F438 ww.totaljs.com
5+
// ===================================================
6+
7+
require('total.js').http('debug');

0-learn/models/users.js

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
// Model name
2+
exports.id = 'Users';
3+
exports.version = '1.0';
4+
5+
var Address = NEWSCHEMA('Address');
6+
Address.define('street', 'string(50)', true);
7+
Address.define('city', 'string(50)', true);
8+
Address.setValidation(on_validation);
9+
10+
var User = NEWSCHEMA('User');
11+
User.define('_id', Object);
12+
User.define('name', 'string(30)', true);
13+
User.define('email', 'string(200)', true);
14+
User.define('age', Number, true);
15+
User.define('address', Address, true);
16+
User.define('created', Date);
17+
User.define('isremoved', Boolean);
18+
User.setPrepare(on_prepare);
19+
User.setDefault(on_default);
20+
User.setValidation(on_validation);
21+
22+
User.setGet(function*(error, model, options, callback) {
23+
24+
// options._id
25+
26+
var db = DATABASE('users');
27+
var builder = new MongoBuilder();
28+
29+
builder.where('_id', '=', options.id, true);
30+
builder.where('isremoved', false);
31+
32+
var user = yield sync(builder.$$findOne(db))();
33+
if (user !== null) {
34+
U.copy(user, model); // copy "user" values to "model" (model is a default "User" instance)
35+
return callback(); // if you don't send any value into the callback then the framework uses "model"
36+
}
37+
38+
error.push('error-user-404');
39+
callback();
40+
});
41+
42+
User.setQuery(function(error, options, callback) {
43+
44+
// options.page
45+
46+
var db = DATABASE('users');
47+
var builder = new MongoBuilder();
48+
49+
builder.where('isremoved', false);
50+
builder.page(options.page, 50); // 50 items per page
51+
52+
builder.find(db).toArray(callback);
53+
});
54+
55+
User.setSave(function(error, model, options, callback) {
56+
var db = DATABASE('users');
57+
var isUpdate = model._id ? true : false;
58+
var builder = new MongoBuilder();
59+
60+
builder.set(model.$clean()); // .$clean() -–> removes built-in internal functions
61+
62+
if (isUpdate) {
63+
builder.where('_id', '=', model._id, true); // true === auto-parsing ObjectID from the object
64+
builder.update(db, F.error()); // F.error() --> auto-error-handling
65+
} else{
66+
builder.set('_id', new ObjectID());
67+
builder.insert(db, F.error()) // F.error() --> auto-error-handling
68+
}
69+
70+
callback(SUCCESS(true));
71+
});
72+
73+
User.setRemove(function(error, options, callback) {
74+
75+
// options.id
76+
77+
var db = DATABASE('users');
78+
var builder = new MongoBuilder();
79+
80+
builder.where('_id', '=', options.id, true); // true === auto-parsing ObjectID from the object
81+
builder.set('isremoved', true);
82+
builder.update(db, F.error()); // F.error() --> auto-error-handling
83+
84+
callback(SUCCESS(true));
85+
});
86+
87+
User.addWorkflow('check', function*(error, model, options, callback) {
88+
var builder = new MongoBuilder();
89+
90+
builder.where('email', model.email);
91+
builder.where('isremoved', false);
92+
93+
var user = yield sync(builder.$$one(DATABASE('users')))();
94+
if (!user)
95+
return callback(SUCCESS(true));
96+
97+
error.push('error-user-exists');
98+
callback();
99+
});
100+
101+
// Sets default values
102+
function on_default(name) {
103+
switch (name) {
104+
case 'created':
105+
return new Date();
106+
}
107+
}
108+
109+
// Prepares values
110+
function on_prepare(name, value) {
111+
switch (name) {
112+
case 'email':
113+
return value.toLowerCase();
114+
}
115+
}
116+
117+
// Validates values
118+
function on_validation(name, value) {
119+
switch (name) {
120+
case 'name':
121+
case 'street':
122+
case 'city':
123+
return value.length > 0;
124+
case 'email':
125+
return value.isEmail();
126+
case age:
127+
// The value will be always Number (The framework compares types)
128+
return value > 18 && value < 60;
129+
}
130+
}
131+
132+
exports.User = User;
133+
exports.Address = Address;

0-learn/public/jcta.min.js

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0-learn/resources/en.resource

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
error-user-exists : Sorry, email has been used.
2+
error-user-404 : Sorry, user does not exist.

0-learn/views/index.html

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
@{layout('')}
2+
<!DOCTYPE html>
3+
<html>
4+
<head>
5+
<title>Example</title>
6+
<meta charset="utf-8" />
7+
<meta http-equiv="X-UA-Compatible" content="IE=10" />
8+
<meta name="format-detection" content="telephone=no" />
9+
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
10+
<meta name="robots" content="all,follow" />
11+
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
12+
<script src="/jcta.min.js"></script>
13+
<style>
14+
body { font-family: Arial; font-size: 16px; color: gray; line-height: 16px; padding: 30px; }
15+
table { border: 1px solid #E0E0E0; border-left: 0; border-bottom: 0; }
16+
table td, table th { border-left: 1px solid #E0E0E0; border-bottom: 1px solid #E0E0E0; padding: 10px 20px; }
17+
</style>
18+
</head>
19+
<body>
20+
21+
<table cellpadding="0" cellspacing="0" border="0" width="100%">
22+
<thead>
23+
<th>Name</th>
24+
<th>Age</th>
25+
</thead>
26+
<tbody data-component="repeater" data-component-path="users">
27+
<script type="text/html">
28+
<tr>
29+
<td>{{ name }}</td>
30+
<td>{{ age }}</td>
31+
</tr>
32+
</script>
33+
</tbody>
34+
</table>
35+
36+
<script>
37+
COMPONENT('repeater', function() {
38+
39+
var self = this;
40+
41+
self.make = function() {
42+
var element = self.element.find('script');
43+
var html = element.html();
44+
element.remove();
45+
self.template = Tangular.compile(html);
46+
};
47+
48+
self.getter = null;
49+
self.setter = function(value) {
50+
51+
if (!value || value.length === 0) {
52+
self.element.html('');
53+
return;
54+
}
55+
56+
var builder = '';
57+
for (var i = 0, length = value.length; i < length; i++)
58+
builder += self.template(value[i]);
59+
60+
self.element.empty().append(builder);
61+
$.components();
62+
};
63+
});
64+
</script>
65+
66+
<script>
67+
var users = [];
68+
$.components.GET('/api/users/', 'users');
69+
</script>
70+
71+
72+
</body>
73+
</html>

0 commit comments

Comments
 (0)
0