pure-orm 4.0.0 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -43
- package/coverage/clover.xml +969 -626
- package/coverage/coverage-final.json +34 -22
- package/coverage/lcov-report/dist/src/core.js.html +220 -190
- package/coverage/lcov-report/dist/src/driver-integrations/index.html +97 -0
- package/coverage/lcov-report/dist/src/driver-integrations/pgp.js.html +240 -0
- package/coverage/lcov-report/dist/src/index.html +44 -18
- package/coverage/lcov-report/dist/src/index.js.html +2 -2
- package/coverage/lcov-report/dist/src/orm.js.html +125 -119
- package/coverage/lcov-report/dist/test-utils/blog/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/article.js.html +15 -15
- package/coverage/lcov-report/dist/test-utils/blog/models/article_tag.js.html +7 -7
- package/coverage/lcov-report/dist/test-utils/blog/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/person.js.html +13 -13
- package/coverage/lcov-report/dist/test-utils/blog/models/tag.js.html +4 -4
- package/coverage/lcov-report/dist/test-utils/five/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/order.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/parcel-event.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/parcel-line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/parcel.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/fourteen/entities.js.html +87 -0
- package/coverage/lcov-report/dist/test-utils/fourteen/index.html +97 -0
- package/coverage/lcov-report/dist/test-utils/fourteen/models/customer.js.html +159 -0
- package/coverage/lcov-report/dist/test-utils/fourteen/models/index.html +110 -0
- package/coverage/lcov-report/dist/test-utils/fourteen/models/person.js.html +138 -0
- package/coverage/lcov-report/dist/test-utils/nine/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/models/feature-switch.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/entities.js.html +11 -11
- package/coverage/lcov-report/dist/test-utils/order/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/models/line-item.js.html +24 -24
- package/coverage/lcov-report/dist/test-utils/order/models/order.js.html +42 -42
- package/coverage/lcov-report/dist/test-utils/order/models/product-variant.js.html +23 -23
- package/coverage/lcov-report/dist/test-utils/order/models/product.js.html +17 -17
- package/coverage/lcov-report/dist/test-utils/order/models/utm-source.js.html +12 -12
- package/coverage/lcov-report/dist/test-utils/order-more/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/actual-product-variant.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/color.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/customer.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/gender.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/inventory-level.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/order.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-event.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/physical-address.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant-image.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/product.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/refund.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/shipment-actual-product-variant.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/shipment.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/size.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/utm-medium.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/utm-source.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/customer.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/order.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/parcel-line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/parcel.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/audience.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/brand.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/category.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/member.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/passion.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/product.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation-audience.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/three/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/three/results.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/member.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/prompt.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/two/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/two/results.js.html +1 -1
- package/coverage/lcov-report/index.html +105 -27
- package/coverage/lcov-report/src/core.ts.html +235 -196
- package/coverage/lcov-report/src/driver-integrations/index.html +97 -0
- package/coverage/lcov-report/src/driver-integrations/pgp.ts.html +345 -0
- package/coverage/lcov-report/src/index.html +44 -18
- package/coverage/lcov-report/src/index.ts.html +3 -15
- package/coverage/lcov-report/src/orm.ts.html +256 -130
- package/coverage/lcov-report/test-utils/blog/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/blog/index.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/article.ts.html +15 -15
- package/coverage/lcov-report/test-utils/blog/models/article_tag.ts.html +7 -7
- package/coverage/lcov-report/test-utils/blog/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/person.ts.html +13 -13
- package/coverage/lcov-report/test-utils/blog/models/tag.ts.html +4 -4
- package/coverage/lcov-report/test-utils/five/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/index.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/order.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/parcel-event.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/parcel-line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/parcel.ts.html +1 -1
- package/coverage/lcov-report/test-utils/fourteen/entities.ts.html +78 -0
- package/coverage/lcov-report/test-utils/fourteen/index.html +97 -0
- package/coverage/lcov-report/test-utils/fourteen/models/customer.ts.html +177 -0
- package/coverage/lcov-report/test-utils/fourteen/models/index.html +110 -0
- package/coverage/lcov-report/test-utils/fourteen/models/person.ts.html +150 -0
- package/coverage/lcov-report/test-utils/nine/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/nine/index.html +1 -1
- package/coverage/lcov-report/test-utils/nine/models/feature-switch.ts.html +1 -1
- package/coverage/lcov-report/test-utils/nine/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/order/entities.ts.html +5 -5
- package/coverage/lcov-report/test-utils/order/index.html +1 -1
- package/coverage/lcov-report/test-utils/order/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/order/models/line-item.ts.html +18 -18
- package/coverage/lcov-report/test-utils/order/models/order.ts.html +37 -37
- package/coverage/lcov-report/test-utils/order/models/product-variant.ts.html +18 -18
- package/coverage/lcov-report/test-utils/order/models/product.ts.html +13 -13
- package/coverage/lcov-report/test-utils/order/models/utm-source.ts.html +8 -8
- package/coverage/lcov-report/test-utils/order-more/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/index.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/actual-product-variant.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/color.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/customer.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/gender.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/inventory-level.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/order.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/parcel-event.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/parcel-line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/parcel.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/physical-address.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/product-variant-image.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/product-variant.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/product.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/refund.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/shipment-actual-product-variant.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/shipment.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/size.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/utm-medium.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/utm-source.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/index.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/customer.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/order.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/parcel-line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/parcel.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/index.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/audience.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/brand.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/category.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/member.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/passion.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/product.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/recommendation-audience.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/recommendation.ts.html +1 -1
- package/coverage/lcov-report/test-utils/three/index.html +1 -1
- package/coverage/lcov-report/test-utils/three/results.js.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/index.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/member.ts.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/prompt.ts.html +1 -1
- package/coverage/lcov-report/test-utils/two/index.html +1 -1
- package/coverage/lcov-report/test-utils/two/results.js.html +1 -1
- package/coverage/lcov.info +1686 -1005
- package/dist/src/core.d.ts +1 -1
- package/dist/src/core.js +18 -8
- package/dist/src/core.spec.js +643 -540
- package/dist/src/driver-integrations/index.d.ts +1 -0
- package/dist/src/orm.d.ts +21 -0
- package/dist/src/orm.js +6 -2
- package/dist/src/orm.spec.d.ts +1 -0
- package/dist/src/orm.spec.js +102 -0
- package/dist/test-utils/fourteen/entities.d.ts +6 -0
- package/dist/test-utils/fourteen/entities.js +6 -0
- package/dist/test-utils/fourteen/entities.ts +3 -0
- package/dist/test-utils/fourteen/models/customer.d.ts +19 -0
- package/dist/test-utils/fourteen/models/customer.js +30 -0
- package/dist/test-utils/fourteen/models/customer.ts +36 -0
- package/dist/test-utils/fourteen/models/person.d.ts +17 -0
- package/dist/test-utils/fourteen/models/person.js +23 -0
- package/dist/test-utils/fourteen/models/person.ts +27 -0
- package/dist/test-utils/fourteen/results.json +8 -0
- package/dist/test-utils/order/entities.js +2 -2
- package/dist/test-utils/order/entities.ts +2 -2
- package/dist/test-utils/order/models/order.js +1 -1
- package/dist/test-utils/order/models/order.ts +1 -1
- package/package.json +1 -1
- package/src/core.spec.ts +1112 -986
- package/src/core.ts +27 -14
- package/src/driver-integrations/index.ts +2 -0
- package/src/orm.spec.ts +113 -0
- package/src/orm.ts +54 -8
- package/test-utils/fourteen/entities.ts +3 -0
- package/test-utils/fourteen/models/customer.ts +36 -0
- package/test-utils/fourteen/models/person.ts +27 -0
- package/test-utils/fourteen/results.json +8 -0
- package/test-utils/order/entities.ts +2 -2
- package/test-utils/order/models/order.ts +1 -1
package/README.md
CHANGED
|
@@ -10,43 +10,99 @@ npm install --save pure-orm
|
|
|
10
10
|
|
|
11
11
|
PureORM is a lightweight ORM for mapping the relational result rows of a database driver query to properly structured (nested) pure instances of your business object classes.
|
|
12
12
|
|
|
13
|
-
It's purpose - and guiding principle - is to allow you to write
|
|
13
|
+
It's purpose - and guiding principle - is to allow you to write _native_, _unobstructed_ SQL (not niche library-specific ORM wrapper APIs) and receive back properly structured/nested pure business objects (not database-connected stateful objects).
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
#### What does this mean?
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
This means you can just write SQL like this:
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
```javascript
|
|
20
|
+
SELECT *
|
|
21
|
+
FROM person
|
|
22
|
+
LEFT JOIN job on person.id = job.person_id
|
|
23
|
+
LEFT JOIN employer on job.employer_id = employer.id
|
|
24
|
+
WHERE person.id = 55
|
|
25
|
+
```
|
|
21
26
|
|
|
22
|
-
|
|
27
|
+
...And for the result data
|
|
23
28
|
|
|
24
|
-
|
|
29
|
+
| id | name | id | personId | employerId | startDate | endDate | id | name |
|
|
30
|
+
| --- | -------- | --- | -------- | ---------- | ---------- | ---------- | --- | ----------- |
|
|
31
|
+
| 55 | John Doe | 277 | 55 | 17 | 2020-01-01 | 2020-12-31 | 17 | Good Corp |
|
|
32
|
+
| 55 | John Doe | 278 | 55 | 26 | 2021-01-01 | 2021-12-31 | 26 | Better Corp |
|
|
25
33
|
|
|
26
|
-
|
|
34
|
+
...Rather than getting flat, collided result objects:
|
|
27
35
|
|
|
28
|
-
|
|
36
|
+
```javascript
|
|
37
|
+
[
|
|
38
|
+
{
|
|
39
|
+
id: 17, // from employer which collided with job.id and person.id :(
|
|
40
|
+
name: 'Good Corp', // from employer which collided with person.name :(
|
|
41
|
+
person_id: 55,
|
|
42
|
+
employer_id: 17,
|
|
43
|
+
start_date: 2020-01-01T05:00:00.000Z,
|
|
44
|
+
end_date: 2020-12-31T05:00:00.000Z
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: 26, // from employer which collided with job.id and person.id :(
|
|
48
|
+
name: 'Better Corp', // from employer which collided with person.name :(
|
|
49
|
+
person_id: 55,
|
|
50
|
+
employer_id: 26,
|
|
51
|
+
start_date: 2021-01-01T05:00:00.000Z,
|
|
52
|
+
end_date: 2021-12-31T05:00:00.000Z
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
...You get properly structured/nested, pure objects like this:
|
|
58
|
+
|
|
59
|
+
```javascript
|
|
60
|
+
{
|
|
61
|
+
id: 55,
|
|
62
|
+
name: "John Doe",
|
|
63
|
+
jobs: {
|
|
64
|
+
models: [
|
|
65
|
+
{
|
|
66
|
+
id: 277,
|
|
67
|
+
personId: 55,
|
|
68
|
+
employerId: 17,
|
|
69
|
+
employer: {
|
|
70
|
+
id: 17,
|
|
71
|
+
name: "Good Corp"
|
|
72
|
+
},
|
|
73
|
+
startDate: "2020-01-01",
|
|
74
|
+
endDate: "2020-12-31"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 278,
|
|
78
|
+
personId: 55,
|
|
79
|
+
employerId: 26,
|
|
80
|
+
employer: {
|
|
81
|
+
id: 26,
|
|
82
|
+
name: "Better Corp"
|
|
83
|
+
},
|
|
84
|
+
startDate: "2021-01-01",
|
|
85
|
+
endDate: "2021-12-31"
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
```
|
|
29
91
|
|
|
30
|
-
|
|
92
|
+
...Where these objects are instantiations of classes you define. So the above is our (not shown) Person class, which has a jobs field pointing to our (not shown) Jobs collection class, which has individual (not shown) Job classes, which have a employer field pointing to our (not shown) Employer classes. Each of these classes is defined by us, and can contain custom business logic. (Check out the full example lower down to see these!)
|
|
31
93
|
|
|
32
|
-
|
|
94
|
+
#### How does PureORM compare with traditional ORMs?
|
|
33
95
|
|
|
34
|
-
|
|
35
|
-
- They represent a row of the table data, but as pure javascript objects.
|
|
36
|
-
- They are not connected to the database.
|
|
37
|
-
- They are the subject of the app's business logic.
|
|
38
|
-
- They will be full of userland business logic methods.
|
|
39
|
-
- Their purity allows them to be easy to test/use.
|
|
96
|
+
PureORM contrasts with tradtional ORMs in two important ways:
|
|
40
97
|
|
|
41
|
-
|
|
98
|
+
1. PureORM is purely the "orm" (object-relational mapping) - it has the small scope of "owning" the mapping of database driver relational result rows to properly structured business objects. This contrasts against ORMs as typically exist - where they have swelled to intertwine a huge query builder API with the ORM layer, where mapped objects are database-connected and serve as the query builder.
|
|
99
|
+
2. PureORM yields pure (not database-connected) models. Queries are written in SQL (not niche library-specific ORM wrapper APIs), and the results are pure businesses objects.
|
|
42
100
|
|
|
43
|
-
|
|
44
|
-
- You can create the Collection class (in cases where it is useful to have business methods on the collection object, not just each model object).
|
|
101
|
+
PureORM thus contrasts against traditional ORMs which use query builders (rather than raw SQL) to return database-connected (rather than pure) objects. The name _**pure**ORM_ reflects both of these points - that it is _pure_ ORM (there is no query builder dimension) as well as the _purity_ of the mapped models.
|
|
45
102
|
|
|
46
|
-
|
|
103
|
+
#### So I bring my own database driver?
|
|
47
104
|
|
|
48
|
-
|
|
49
|
-
- There are no database-bound stateful orm objects with their huge query builder APIs sprawling across all the application code. Instead there is a single layer where native SQL is written, and which returns pure business objects (properly nested and structured).
|
|
105
|
+
Yep! PureORM is the top layer for interfacing with your database. You bring your own database driver (eg [node-postgres](https://github.com/brianc/node-postgres)/[pg-promise](https://github.com/vitaly-t/pg-promise), [mysql](https://github.com/mysqljs/mysql), [node-sqlite3](https://github.com/mapbox/node-sqlite3), [node-mssql](https://github.com/tediousjs/node-mssql), [node-oracledb](https://github.com/oracle/node-oracledb), etc), and PureORM works on top of it to perform the Object-Relational Mapping (ORM).
|
|
50
106
|
|
|
51
107
|
## Practical Example
|
|
52
108
|
|
|
@@ -71,23 +127,23 @@ app.get('/rest/person', (req: Request, res: Response) => {
|
|
|
71
127
|
id: 277,
|
|
72
128
|
personId: 55,
|
|
73
129
|
employerId: 17,
|
|
74
|
-
startDate: '2020-01-01',
|
|
75
|
-
endDate: '2020-12-31',
|
|
76
130
|
employer: {
|
|
77
131
|
id: 17,
|
|
78
132
|
name: 'Good Corp'
|
|
79
|
-
}
|
|
133
|
+
},
|
|
134
|
+
startDate: '2020-01-01',
|
|
135
|
+
endDate: '2020-12-31'
|
|
80
136
|
},
|
|
81
137
|
{
|
|
82
138
|
id: 278,
|
|
83
139
|
personId: 55,
|
|
84
140
|
employerId: 26,
|
|
85
|
-
startDate: '2021-01-01',
|
|
86
|
-
endDate: '2021-12-31',
|
|
87
141
|
employer: {
|
|
88
142
|
id: 26,
|
|
89
143
|
name: 'Better Corp'
|
|
90
|
-
}
|
|
144
|
+
},
|
|
145
|
+
startDate: '2021-01-01',
|
|
146
|
+
endDate: '2021-12-31'
|
|
91
147
|
}
|
|
92
148
|
]
|
|
93
149
|
}
|
|
@@ -144,7 +200,7 @@ npm install --save pg-promise
|
|
|
144
200
|
|
|
145
201
|
### Step 2: Creating the Business Objects
|
|
146
202
|
|
|
147
|
-
Let's create a `/models` directory
|
|
203
|
+
Let's create a `/models` directory, with a file corresponding to each table. These modules contain the model and (optionally) collection classes we want to use when mapping our flat results to business objects, as well as the `tableName` and `columns` fields. We'll end up passing all this to the PureORM factory later.
|
|
148
204
|
|
|
149
205
|
```typescript
|
|
150
206
|
// models/person.ts
|
|
@@ -227,8 +283,6 @@ export class Employer implements IModel {
|
|
|
227
283
|
export const EmployerEntity: IEntity = { tableName, columns, Model: Employer };
|
|
228
284
|
```
|
|
229
285
|
|
|
230
|
-
We've not got our three entities that relate our table data to our business objects.
|
|
231
|
-
|
|
232
286
|
### Step 3: Creating our ORM
|
|
233
287
|
|
|
234
288
|
First we create our database driver:
|
|
@@ -307,10 +361,10 @@ Some things to note:
|
|
|
307
361
|
person.id as "person#id",
|
|
308
362
|
person.name as "person#name",
|
|
309
363
|
job.id as "job#id",
|
|
310
|
-
job.person_id
|
|
311
|
-
job.employer_id
|
|
312
|
-
job.start_date
|
|
313
|
-
job.end_date
|
|
364
|
+
job.person_id as "job#person_id",
|
|
365
|
+
job.employer_id as "job#employer_id",
|
|
366
|
+
job.start_date as "job#start_date",
|
|
367
|
+
job.end_date as "job#end_date",
|
|
314
368
|
employer.id as "employer#id",
|
|
315
369
|
employer.name as "employer#name"
|
|
316
370
|
FROM person
|
|
@@ -325,7 +379,7 @@ Some things to note:
|
|
|
325
379
|
|
|
326
380
|
### Step 5: Writing the Controller Code
|
|
327
381
|
|
|
328
|
-
We can now return to our controller code, and use our
|
|
382
|
+
We can now return to our controller code, and use our data access function.
|
|
329
383
|
|
|
330
384
|
```diff
|
|
331
385
|
// app.ts
|
|
@@ -345,23 +399,23 @@ app.get('/rest/person', (req: Request, res: Response) => {
|
|
|
345
399
|
- id: 277,
|
|
346
400
|
- personId: 55,
|
|
347
401
|
- employerId: 17,
|
|
348
|
-
- startDate: '2020-01-01',
|
|
349
|
-
- endDate: '2020-12-31',
|
|
350
402
|
- employer: {
|
|
351
403
|
- id: 17,
|
|
352
404
|
- name: 'Good Corp'
|
|
353
|
-
- }
|
|
405
|
+
- },
|
|
406
|
+
- startDate: '2020-01-01',
|
|
407
|
+
- endDate: '2020-12-31'
|
|
354
408
|
- },
|
|
355
409
|
- {
|
|
356
410
|
- id: 278,
|
|
357
411
|
- personId: 55,
|
|
358
412
|
- employerId: 26,
|
|
359
|
-
- startDate: '2021-01-01',
|
|
360
|
-
- endDate: '2021-12-31',
|
|
361
413
|
- employer: {
|
|
362
414
|
- id: 26,
|
|
363
415
|
- name: 'Better Corp'
|
|
364
|
-
- }
|
|
416
|
+
- },
|
|
417
|
+
- startDate: '2021-01-01',
|
|
418
|
+
- endDate: '2021-12-31'
|
|
365
419
|
- }
|
|
366
420
|
- ]
|
|
367
421
|
- }
|