Objectum Enterprise Edition - javascript app platform
Deprecated.
Objectum platform makes it easy to create realtime single page applications that run in both Node.js and browsers.
Objectum includes a powerful user interface constructor called Visual Objectum that creates grids, tree grids, forms, etc. Automatically generates source code for CRUD (create, read, update, delete) functions.
Learn by Example project "To-Do list"
Complete project https://github.com/objectum/todo
## InitializationCreate directories:
mkdir /opt/objectum/node
mkdir /opt/objectum/projects
mkdir /opt/objectum/projects/todo
mkdir /opt/objectum/projects/todo/bin
Install:
cd /opt/objectum/node
npm install objectum-ee
You must have installed PostgreSQL 9.x (datestyle = dmy)
Add project configuration (postgres password: 12345):
cat > /opt/objectum/projects/todo/config.json
{
"rootDir": "/opt/objectum/projects/todo",
"adminPassword": "D033E22AE348AEB5660FC2140AEC35850C4DA997",
"database": "postgres",
"host": "localhost",
"port": 5432,
"db": "todo",
"dbUser": "todo",
"dbPassword": "1",
"dbaUser": "postgres",
"dbaPassword": "12345",
"dbEngine": {
"enabled": 1
},
"visualObjectum": {
"menuConstructor": 1,
"accessConstructor": 1,
"projectConstructor": 1
}
}
Add platform configuration:
cat > /opt/objectum/node/config.js
module.exports = {
"rootDir": "/opt/objectum/node",
"projectsDir": "/opt/objectum/projects",
"port": 8100,
"storages": {
"todo": require ("/opt/objectum/projects/todo/config.json")
}
}
Add script:
cat > /opt/objectum/node/objectum.js
var objectum = require ("objectum-ee");
var config = require ("./config");
module.exports = new objectum.Objectum (config);
Add script:
cat > /opt/objectum/node/index.js
var objectum = require ("objectum-ee");
objectum.start (require ("./config"));
Add script:
cat > /opt/objectum/projects/todo/bin/init.js
var $o = require ("/opt/objectum/node/objectum");
$o.db.execute ({
code: "todo",
fn: "init",
name: "To-Do list",
locale: "en" // en, ru
});
Init project folder:
cd /opt/objectum/projects/todo/bin
node init.js
Prepare tablespace folder:
mkdir /opt/objectum/projects/todo/db
chown postgres:postgres /opt/objectum/projects/todo/db
Add script:
cat > /opt/objectum/projects/todo/bin/create.js
var $o = require ("/opt/objectum/node/objectum");
$o.db.execute ({
code: "todo",
fn: "create",
path: "/opt/objectum/projects/todo/db"
});
Create storage:
cd /opt/objectum/projects/todo/bin
node create.js
Add script:
cat > /opt/objectum/projects/todo/bin/import.js
var $o = require ("/opt/objectum/node/objectum");
$o.db.execute ({
code: "todo",
fn: "import",
file: "/opt/objectum/projects/todo/schema/schema-app.js" // parent storage
});
Import storage structure:
cd /opt/objectum/projects/todo/bin
node import.js
Start platform:
cd /opt/objectum/node
node index.js:
Start platform with forever:
forever start -a -l /opt/objectum/node/objectum.log -o /dev/null -e /opt/objectum/node/objectum-error.log --sourceDir /opt/objectum/node index.js
Stop platform with forever:
forever stop index.js
Open URL: http://localhost:8100/projects/todo/
Login: admin
Password: admin
Add script:
cat > /opt/objectum/projects/todo/bin/remove.js
var $o = require ("/opt/objectum/node/objectum");
$o.db.execute ({
code: "todo",
fn: "remove"
});
You can remove storage (drop tablespace, role, user from PostgreSQL):
cd /opt/objectum/projects/todo/bin
node remove.js
## Build user interface by Visual Objectum
1. Create class

2. Create class attribute

3. Create card
3.1. Open action layout

3.2. Open card

3.3. Add field to card

4. Create view

5. Create query

6. Create layout

7. Add table to layout

8. Create menu

9. Create menu item

10. Create admin account (login: adm) and select administrator menu

11. Build project

12. Reload browser page. Login as "adm". You can add, remove and open tasks.

## Advanced learning
### Dictionary
1. Create dict "status"

2. On message "Create standard dictionary (card, view)?" press "Yes".
3. Create menu item for dictionary

4. Create items

5. Create class attribute "status" in "task"

6. Open action layout and add field

7. Add column to view query

8. Build project and reload browser page

### Table
1. Create class "comment" with attributes: text, task

2. Open action "comment.card" layout and add field

3. Change action "task.create"

4. Create view "comments" and query for comments

5. Open action "task.card" layout and convert card to splitter

6. Add table for comments

7. Add option

8. Build project and reload browser page

### Deployment
Add script:
```bash
cat > /opt/objectum/projects/todo/bin/export.js
var $o = require ("/opt/objectum/node/objectum");
$o.db.execute ({
code: "todo",
fn: "export",
file: "../schema/schema-todo.js",
filterClasses: ["task", "comment"]
});
```Export storage:
cd /opt/objectum/projects/todo/bin
node export.js
Add script:
cat > /opt/objectum/projects/todo_my/bin/import.js
var $o = require ("/opt/objectum/node/objectum");
$o.db.execute ({
code: "todo_my",
fn: "import",
file: "/opt/objectum/projects/todo/schema/schema-todo.js" // parent storage
});
Import your storage "todo" to new created storage "todo_my":
cd /opt/objectum/projects/todo_my/bin
node import.js
Just export "todo" and import "todo" to "todo_my" for update to new version of storage "todo". Stop platform before import storage.
### Objectum APIstartTransaction - start transaction. Only one transaction for one session allowed.
commitTransaction - commit transaction.
rollbackTransaction - rollback transaction.
createObject - create object
getObject - get object
set - set attribute value
sync - save object changes to storage
remove - remove object
execute - execute SQL query (only SELECT)
storage.commitTransaction (function (err) {
});
storage.rollbackTransaction (function (err) {
});
storage.createObject ("class", function (err, object) {
var id = object.get ("id");
});
storage.getObject (id, function (err, object) {
object.set ("text", "Changed text");
object.sync (function (err) {
});
});
object.remove ();
object.sync (function (err) {
});
storage.execute ({
asArray: true,
select: [
{"a": "id"}, "id",
{"a": "name"}, "name",
{"b": "name"}, "status"
],
from: [
{"a": "task"},
"left-join", {"b": "spr.status"}, "on", [{"a": "status"}, "=", {"b": "id"}]
],
where: [
{"a": "name"}, "like", "Buy%", "and", {"a": "id"}, "in", [1000, 1002, 1003, 1004, 1005].join (".,.").split (".")
],
order: [
{"a": "name"}
]
}, function (err, recs) {
_.each (recs, function (rec) {
console.log (rec.id, rec.name, rec.status);
});
});
### Server
```bash
storage.startTransaction ({session: session, description: "description"}, function (err) {
});
```
```bash
storage.commitTransaction ({session: session}, function (err) {
});
```
```bash
storage.rollbackTransaction ({session: session}, function (err) {
});
```
```bash
storage.createObject ({session: session, code: "class"}, function (err, object) {
var id = object.get ("id");
});
```
```bash
storage.getObject ({session: session, id: id}, function (err, object) {
object.set ("text", "Changed text");
object.sync ({session: session}, function (err) {
});
});
```
```bash
object.remove ();
object.sync ({session: session}, function (err) {
});
```
```bash
storage.execute ({session: session, sql: {
asArray: true,
select: [
{"a": "id"}, "id",
{"a": "name"}, "name",
{"b": "name"}, "status"
],
from: [
{"a": "task"},
"left-join", {"b": "spr.status"}, "on", [{"a": "status"}, "=", {"b": "id"}]
],
where: [
{"a": "name"}, "like", "Buy%", "and", {"a": "id"}, "in", [1000, 1002, 1003, 1004, 1005].join (".,.").split (".")
],
order: [
{"a": "name"}
]
}}, function (err, recs) {
_.each (recs, function (rec) {
console.log (rec.id, rec.name, rec.status);
});
});
```
### Sync (only client side)
```bash
$o.startTransaction ("description");
```
```bash
$o.commitTransaction ();
```
```bash
$o.rollbackTransaction ();
```
```bash
$o.createObject ("class");
var id = object.get ("id");
```
```bash
var object = $o.getObject (id);
object.set ("text", "Changed text");
object.sync ();
```
```bash
object.remove ();
object.sync ();
```
```bash
var recs = $o.execute ({
asArray: true,
select: [
{"a": "id"}, "id",
{"a": "name"}, "name",
{"b": "name"}, "status"
],
from: [
{"a": "task"},
"left-join", {"b": "spr.status"}, "on", [{"a": "status"}, "=", {"b": "id"}]
],
where: [
{"a": "name"}, "like", "Buy%", "and", {"a": "id"}, "in", [1000, 1002, 1003, 1004, 1005].join (".,.").split (".")
],
order: [
{"a": "name"}
]
});
```
### Reports (only client side)
```bash
var rows = [{
cells: [{
text: "Cell 1 1", style: "border", rowspan: 2
}, {
text: "Cell 1 2", style: "border", colspan: 2
}]
}, {
startIndex: 2, cells: [{
text: "Cell 2 2", style: "border"
}, {
text: "Cell 2 3", style: "border"
}]
}];
var report = new $report.xmlss ();
report.sheets = [
new $report.sheet ({
name: "Sheet1",
orientation: "landscape",
autoFitHeight: true,
margins: {
left: 15,
top: 15,
right: 15,
bottom: 15
},
columns: [15, 15, 15],
rows: rows
})
];
report.preview ();
```
### Locale
You can add another locale file in this folder
https://github.com/objectum/objectum-ee/tree/master/www/client/extjs4/locale
Change "locale" in projects/todo/index.html
```bash
```
### Cluster
Install [Redis](https://redis.io/download)
Change platform configuration:
```bash
module.exports = {
"rootDir": "/opt/objectum/node",
"projectsDir": "/opt/objectum/projects",
"port": 8100,
"storages": {
"todo": require ("/opt/objectum/projects/todo/config.json")
},
"redis": {
"enabled": true,
"host": "127.0.0.1",
"port": 6379,
"resetCache": true,
"db": 1
},
"cluster": {
"www": {
"port": 8100,
"workers": 3
},
"app": {
"workers": 3
}
}
}
```
www-worker - work on cluster.www.port
app.worker - work on cluster.www.port ++ (8101, 8102, 8103). Service worker on 8101, not used for user requests. Change index.js for start in cluster mode:
var objectum = require ("objectum-ee");
objectum.startCluster (require ("./config"));
Cluster architecture:
Author
Dmitriy Samortsev
Copyright and license
GPLv3