prostgles-server 1.5.122 → 2.0.3
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/dist/DboBuilder.d.ts +52 -27
- package/dist/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder.js +404 -85
- package/dist/DboBuilder.js.map +1 -1
- package/dist/FileManager.d.ts +160 -0
- package/dist/FileManager.d.ts.map +1 -0
- package/dist/FileManager.js +419 -0
- package/dist/FileManager.js.map +1 -0
- package/dist/Prostgles.d.ts +145 -79
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js +240 -180
- package/dist/Prostgles.js.map +1 -1
- package/dist/PubSubManager.js +1 -1
- package/dist/PubSubManager.js.map +1 -1
- package/dist/QueryBuilder.d.ts.map +1 -1
- package/dist/QueryBuilder.js +8 -5
- package/dist/QueryBuilder.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/lib/DboBuilder.ts +541 -136
- package/lib/FileManager.ts +546 -0
- package/lib/Prostgles.ts +407 -253
- package/lib/PubSubManager.ts +1 -1
- package/lib/QueryBuilder.ts +10 -6
- package/lib/index.ts +3 -3
- package/package.json +8 -2
- package/tests/client/index.js +18 -6
- package/tests/client/index.ts +16 -4
- package/tests/client/package-lock.json +27 -26
- package/tests/client/package.json +1 -1
- package/tests/client_only_queries.js +4 -4
- package/tests/config_test/DBoGenerated.d.ts +231 -8
- package/tests/config_test/index.html +35 -9
- package/tests/config_test/index.js +55 -97
- package/tests/config_test/index.js.map +1 -0
- package/tests/config_test/index.ts +67 -113
- package/tests/config_test/init.sql +50 -24
- package/tests/config_test/media/002d5f12-63c3-41f3-9007-cd33009104f4.txt +1 -0
- package/tests/config_test/media/003f0136-d231-4dd1-8937-08fa9a7c3d2e.txt +1 -0
- package/tests/config_test/media/01bd39a0-083b-4bfa-91fc-f4d1d9b7b204.txt +1 -0
- package/tests/config_test/media/0224513a-62de-4f0a-92bb-dcb3f700da7f.txt +1 -0
- package/tests/config_test/media/03005346-d6d5-4824-96ae-5ad7ca762730.txt +1 -0
- package/tests/config_test/media/0342d065-9bd2-443f-9058-f8058ab52de0.txt +1 -0
- package/tests/config_test/media/0350d1cf-b3b3-4c58-aef2-ad1dc3f80c6c.txt +1 -0
- package/tests/config_test/media/036833d7-d166-43a1-bda3-b801938c614d.txt +1 -0
- package/tests/config_test/media/03b5324d-0913-408f-a78a-252ff8fe8126.txt +1 -0
- package/tests/config_test/media/0540b670-bf42-4a83-82b2-67164630a24a.txt +1 -0
- package/tests/config_test/media/05900f5f-3b67-4ee9-8e1d-b511fd79d878.txt +1 -0
- package/tests/config_test/media/05969252-3f9e-41a0-88ce-aa23ba8b42eb.txt +1 -0
- package/tests/config_test/media/05a8a60c-cc75-4469-8e06-55d88c26e97a.txt +1 -0
- package/tests/config_test/media/05e662fc-7a03-4303-ae42-27a28d9affb9.txt +1 -0
- package/tests/config_test/media/061f86e6-0ddd-49b0-b243-4c063c6db5e4.txt +1 -0
- package/tests/config_test/media/062cf311-3976-471e-88ec-d618bd8ceeaa.txt +1 -0
- package/tests/config_test/media/0693b073-77b9-446a-9606-5453bcafd200.txt +1 -0
- package/tests/config_test/media/07a09b79-b1ed-45a3-bb42-42cd1a00757b.txt +1 -0
- package/tests/config_test/media/07e48303-0520-4a80-921e-130417488baa.txt +1 -0
- package/tests/config_test/media/09ab90a6-8461-4f39-89fb-8e2277974771.txt +1 -0
- package/tests/config_test/media/09c1194a-5d09-417c-a0c4-26dcf1e65bdb.txt +1 -0
- package/tests/config_test/media/09dc662f-6a9d-4a0b-95ba-8d24ceae9721.txt +1 -0
- package/tests/config_test/media/09ebb492-6146-4ff8-ac83-ac9970f5844c.txt +1 -0
- package/tests/config_test/media/0a198d6f-c629-42bd-9aa8-3c0ff62e1f1d.txt +1 -0
- package/tests/config_test/media/0a6d3ced-a16f-4491-b25b-679e9323ad79.txt +1 -0
- package/tests/config_test/media/0a817a27-6888-4ac4-b07b-4d1275e035ff.txt +1 -0
- package/tests/config_test/media/0aadc4f7-bf87-49da-8ef6-0857bf1789b4.txt +1 -0
- package/tests/config_test/media/0abe4a2e-fd75-428b-9757-2535d4112862.txt +1 -0
- package/tests/config_test/media/0ad9deca-6362-41dd-b0b3-8f8a71e2e1e2.txt +1 -0
- package/tests/config_test/media/0bdb19df-b82c-4a07-8d9b-a6e3a2af8a94.txt +1 -0
- package/tests/config_test/media/0c1e4575-223d-4d0c-b2c3-6ab6bb9844e6.txt +1 -0
- package/tests/config_test/media/0c4e3d55-432f-42e9-aa53-48e816ff6d15.txt +1 -0
- package/tests/config_test/media/0c5b47a4-884a-4207-b106-fa2557fc5600.txt +1 -0
- package/tests/config_test/media/0d8fbe62-22bc-47e8-b4ca-b77d8fd02798.txt +1 -0
- package/tests/config_test/media/0d95a140-3ae1-4faa-a34b-ed5b6cc524ac.txt +1 -0
- package/tests/config_test/media/0e0907c7-bd10-4ce2-ac36-066916a8a793.txt +1 -0
- package/tests/config_test/media/0e192b00-2676-4130-8819-90ee34a50932.txt +1 -0
- package/tests/config_test/media/0f9e3861-0e59-4ae4-a606-1fdd2c890c5b.txt +1 -0
- package/tests/config_test/media/1039afe1-24e9-4ea6-bfd0-6871b5f06f8f.txt +1 -0
- package/tests/config_test/media/1052e479-295e-46e9-88ec-d8f20efa75ea.txt +1 -0
- package/tests/config_test/media/11973be6-a675-4e0d-a54e-1eccbcdb3f2a.txt +1 -0
- package/tests/config_test/media/121656f5-1ef9-4181-9ee0-e3ae1433fed1.txt +1 -0
- package/tests/config_test/media/121a16b4-a925-406b-9ba9-0e4b4d413402.txt +1 -0
- package/tests/config_test/media/122cdf36-5b17-4b81-aa9d-c6725d1e8c8a.txt +1 -0
- package/tests/config_test/media/12435236-4735-4978-a234-52100181ee72.txt +1 -0
- package/tests/config_test/media/130eea28-64d0-40c4-8fa4-0cfba493e321.txt +1 -0
- package/tests/config_test/media/1435b6fd-4b86-4f7e-8e68-b607c5e5f2ad.txt +1 -0
- package/tests/config_test/media/14d78bf0-fd3e-4686-863d-b18d2c69b181.txt +1 -0
- package/tests/config_test/media/14dffd0e-23ae-4659-b8b3-25c89593643e.txt +1 -0
- package/tests/config_test/media/14e32028-fb4d-4743-a34d-c325be47b25e.txt +1 -0
- package/tests/config_test/media/14fb2139-eb53-4246-8dcb-c1e568572306.txt +1 -0
- package/tests/config_test/media/1644d880-c61f-4e9c-9c5c-892623ff5689.txt +1 -0
- package/tests/config_test/media/16818bb0-a022-4fd9-acac-e5a448b58eaf.txt +1 -0
- package/tests/config_test/media/16a47db5-262f-490b-850f-0f82019a58b4.txt +1 -0
- package/tests/config_test/media/16c2ffcc-8632-4935-b12d-be1313b74ddc.txt +1 -0
- package/tests/config_test/media/16fe3928-25c7-4e3a-9f68-51520712a4f6.txt +1 -0
- package/tests/config_test/media/172a7736-d3cf-431c-92a5-1a4aa6e89c7e.txt +1 -0
- package/tests/config_test/media/1784e75f-d063-43e2-accb-364ed36ae7d0.txt +1 -0
- package/tests/config_test/media/182e9dcc-0443-4cc5-aff1-9cf954dab771.txt +1 -0
- package/tests/config_test/media/19158860-e0c0-4ac7-afee-5428f9060b36.txt +1 -0
- package/tests/config_test/media/1998f271-5d71-4bc0-9f92-376a8a98f7da.txt +1 -0
- package/tests/config_test/media/19d2b383-4b1b-41a5-a7ef-ceaf1e691e0f.txt +1 -0
- package/tests/config_test/media/1c33fac7-470b-47e0-8aba-7c7394406aad.txt +1 -0
- package/tests/config_test/media/1d8a6c9c-0539-4c08-8ea5-4bd0bbe8fa18.txt +1 -0
- package/tests/config_test/media/1de86105-97ce-49c0-8137-030f3af37fb5.txt +1 -0
- package/tests/config_test/media/1f1393d1-e2f2-445e-806e-05c9a6135437.txt +1 -0
- package/tests/config_test/media/1fc303e7-943c-42cd-87f0-d14b361e5564.txt +1 -0
- package/tests/config_test/media/1fd79260-4246-4230-b4ab-c42baad3de44.txt +1 -0
- package/tests/config_test/media/209085fb-8441-4039-bb01-32171248c7f7.txt +1 -0
- package/tests/config_test/media/20ab3e07-77d6-4fbc-9532-b47e16c38e68.txt +1 -0
- package/tests/config_test/media/20d43c00-35b4-43da-b79f-cb59888ac41b.txt +1 -0
- package/tests/config_test/media/20f7f651-06de-4d5f-aa39-2c261c662cd3.txt +1 -0
- package/tests/config_test/media/214af93c-f973-4809-a440-87a5a3b28e83.txt +1 -0
- package/tests/config_test/media/22bffc7f-c942-4163-bbf6-141f585f3671.txt +1 -0
- package/tests/config_test/media/23d09f4f-db2a-44cb-9d1b-552eb0568acf.txt +1 -0
- package/tests/config_test/media/24a256f7-fe83-4a6d-ace8-a2c2ded37341.txt +1 -0
- package/tests/config_test/media/25522aa0-9c30-413b-b0df-f9f2c2562769.txt +1 -0
- package/tests/config_test/media/25806b78-52cd-40f2-907a-d4fba3821435.txt +1 -0
- package/tests/config_test/media/259920a6-0c5a-4193-8940-91fc0183204c.txt +1 -0
- package/tests/config_test/media/28ca6b02-f58e-4204-a87a-28347d8f5884.txt +1 -0
- package/tests/config_test/media/2a3f8e6e-3bc4-44b3-ac43-17851b1f53e4.txt +1 -0
- package/tests/config_test/media/2afe6eb3-64ca-4aae-b002-676ab3862c96.txt +1 -0
- package/tests/config_test/media/2bd913c1-408a-4451-b465-e48452ca46cb.txt +1 -0
- package/tests/config_test/media/2bfe0f21-70b6-45a7-9bc0-f60dee9b0786.txt +1 -0
- package/tests/config_test/media/2c37bb2d-412e-44be-8f91-58bf1adae554.txt +1 -0
- package/tests/config_test/media/2c6ffa05-479f-4d8f-bc98-0c050567ef28.txt +1 -0
- package/tests/config_test/media/2ce666cb-e1e7-411f-9727-ce47be9365f5.txt +1 -0
- package/tests/config_test/media/2d737158-559b-4fca-b35c-3a832e21a0bf.txt +1 -0
- package/tests/config_test/media/2d7cae40-8fa9-4715-8834-b105a5815efc.txt +1 -0
- package/tests/config_test/media/2ea6b55b-eb9e-4b72-9510-4d5b00490076.txt +1 -0
- package/tests/config_test/media/2f0f8b73-7a21-48e5-b0d8-6e733de5eef8.txt +1 -0
- package/tests/config_test/media/2f37ed63-4a76-49e8-9df0-b586e2318b54.txt +1 -0
- package/tests/config_test/media/2f4e2797-63dd-43cb-8edf-b6e4a5f6d85b.txt +1 -0
- package/tests/config_test/media/2fc8b254-571c-49da-b8d8-af12bead2b6e.txt +1 -0
- package/tests/config_test/media/31887ce4-a69d-429e-bd32-e3fcf1b6ec3c.txt +1 -0
- package/tests/config_test/media/31ab5780-f38f-4614-b11e-1399a5d19e88.txt +1 -0
- package/tests/config_test/media/330b1369-abf8-4a0d-aac3-15185409347b.txt +1 -0
- package/tests/config_test/media/332306f0-16a4-46f1-b312-42d5b1739561.txt +1 -0
- package/tests/config_test/media/33729cd7-ef5a-461d-860c-188b12c3c0e1.txt +1 -0
- package/tests/config_test/media/34f797b8-98c7-47ff-ac4f-da792d3e59ec.txt +1 -0
- package/tests/config_test/media/35753dc2-4a87-4fdb-b547-8ba587ab7cca.txt +1 -0
- package/tests/config_test/media/35cf2e07-f087-410d-898b-326b16617631.txt +1 -0
- package/tests/config_test/media/3704c54c-08b7-429c-98fa-0656dca539ca.txt +1 -0
- package/tests/config_test/media/3823f728-c199-416b-aeb3-223bc0dc006a.txt +1 -0
- package/tests/config_test/media/38d31ef9-7e41-47f9-8e05-e826f9d1a378.txt +1 -0
- package/tests/config_test/media/39504f22-47a7-428a-8793-7cb9cc79b23d.txt +1 -0
- package/tests/config_test/media/39baaddd-7764-48b4-9dc3-e77f91b04ff0.txt +1 -0
- package/tests/config_test/media/39c91ceb-928d-4279-a8a7-00f363b18384.txt +1 -0
- package/tests/config_test/media/3a58c511-78de-425f-a857-63a43e3b4c51.txt +1 -0
- package/tests/config_test/media/3c3fd2ca-8a72-4d38-899b-776f4ff690fc.txt +1 -0
- package/tests/config_test/media/3c592436-14fa-49f5-be05-1d8aff250d0d.txt +1 -0
- package/tests/config_test/media/3db275e8-327d-45d4-a755-3df103967b04.txt +1 -0
- package/tests/config_test/media/3de350d2-a26d-40ef-ad11-fa1454a0f50a.txt +1 -0
- package/tests/config_test/media/3e4f08ac-8b0a-4ec6-b3be-ff6ce140af6a.txt +1 -0
- package/tests/config_test/media/3fa40e56-cb30-4722-ba36-583e7c064d16.txt +1 -0
- package/tests/config_test/media/3fe9495c-6fa5-49ca-a16f-e3cf1808d619.txt +1 -0
- package/tests/config_test/media/3fed5003-1a13-433d-a82f-325dbd57ff55.txt +1 -0
- package/tests/config_test/media/40dfa3df-237e-4e0d-99ff-c90000c5f7ed.txt +1 -0
- package/tests/config_test/media/40ea2d40-3f28-46e5-a41d-5aae1721de21.txt +1 -0
- package/tests/config_test/media/410c564d-860e-4693-9112-efb2304bf940.txt +1 -0
- package/tests/config_test/media/424c9239-aa07-48f3-9a64-c99261387fec.txt +1 -0
- package/tests/config_test/media/4260eab4-3e7d-420a-bc8f-b9cc945f3c80.txt +1 -0
- package/tests/config_test/media/42886a01-8047-4a49-beab-97f5a3a7c128.txt +1 -0
- package/tests/config_test/media/44e2e069-a213-4632-b13b-153461000c5e.txt +1 -0
- package/tests/config_test/media/46520b9c-f878-41e9-9840-0d0babb9b63d.txt +1 -0
- package/tests/config_test/media/46f010a8-66b2-48d8-b4a6-62cc23e26008.txt +1 -0
- package/tests/config_test/media/48c9f649-f776-4cd9-8df5-56b5312f51c2.txt +1 -0
- package/tests/config_test/media/49f5836b-4fb0-4ee1-831b-91ddfcaac0bf.txt +1 -0
- package/tests/config_test/media/4a2d3bae-040e-44fe-bb36-301af65302fd.txt +1 -0
- package/tests/config_test/media/4ab15a14-36c7-4a4e-8179-be60c56368c5.txt +1 -0
- package/tests/config_test/media/4b98c009-458a-4e35-96e2-ccd465673234.txt +1 -0
- package/tests/config_test/media/4bf86749-685c-423c-9997-eb73cb0bc254.txt +1 -0
- package/tests/config_test/media/4db9d5ad-c703-4fb5-9b15-9c48ee3edca1.txt +1 -0
- package/tests/config_test/media/4dd147f7-59ef-4b8f-963b-1dbedb0d10a2.txt +1 -0
- package/tests/config_test/media/4e61da19-25e1-44a0-b901-2cefc3461619.txt +1 -0
- package/tests/config_test/media/4e66c64c-72e3-4458-8ac9-490774193a50.txt +1 -0
- package/tests/config_test/media/4e98ba50-1583-4d7b-9e0d-7c577af28182.txt +1 -0
- package/tests/config_test/media/4e9cb872-dd5f-404a-ae9f-97ec69606d36.txt +1 -0
- package/tests/config_test/media/4fbb89d3-e922-42f2-81ed-6c1370199c94.txt +1 -0
- package/tests/config_test/media/4fdf0b1d-1718-4f53-8a9c-6d44bdef0c60.txt +1 -0
- package/tests/config_test/media/503c6659-ff3f-4df4-ac88-628e809b2e72.txt +1 -0
- package/tests/config_test/media/51010c69-5b30-4ac7-8ed9-12f1866ef145.txt +1 -0
- package/tests/config_test/media/51b2d38d-230e-4eb0-9b1f-dab8fa8b415d.txt +1 -0
- package/tests/config_test/media/51cc7a7b-a764-4ebd-ac31-ba881fa1404e.txt +1 -0
- package/tests/config_test/media/52f0dbb6-2179-4472-871d-dd80c6341c58.txt +1 -0
- package/tests/config_test/media/54aff9eb-0202-447d-9c95-c74560cabcd7.txt +1 -0
- package/tests/config_test/media/55551c8d-4305-48ca-a752-ade3a9efb538.txt +1 -0
- package/tests/config_test/media/555b772b-6c78-4667-80d6-bbe2f290611c.txt +1 -0
- package/tests/config_test/media/555fbb0b-febc-4611-9efa-16ddbf8e988c.txt +1 -0
- package/tests/config_test/media/55a84883-9a15-4368-b8fe-05bd848de6ba.txt +1 -0
- package/tests/config_test/media/56523343-de4a-49de-94ae-8205cc92eeb6.txt +1 -0
- package/tests/config_test/media/567d431e-813f-47d7-a3d2-e2371c0f32e2.txt +1 -0
- package/tests/config_test/media/56fa54a9-10a4-42a3-9a29-ea132adf09bc.txt +1 -0
- package/tests/config_test/media/57734e9e-d5b8-4942-a76c-db1d0cb72aea.txt +1 -0
- package/tests/config_test/media/5777d7a2-cd26-494e-92ba-fa681c2445ef.txt +1 -0
- package/tests/config_test/media/582f6e3f-1b06-4f97-bb81-4355cc139e41.txt +1 -0
- package/tests/config_test/media/584ef61c-974e-4882-aaff-8089029b7a66.txt +1 -0
- package/tests/config_test/media/58987f15-0627-4c3c-a8ba-33e0315548f9.txt +1 -0
- package/tests/config_test/media/58eb23e6-6110-489f-81d3-37d48bcd3bf7.txt +1 -0
- package/tests/config_test/media/5c5e5543-491c-49d2-b762-162faa75019a.txt +1 -0
- package/tests/config_test/media/5e688b4a-afba-4d47-bdc8-dd108d673619.txt +1 -0
- package/tests/config_test/media/5f42b54e-6020-4552-8872-17dc7d57b110.txt +1 -0
- package/tests/config_test/media/5f5ae0f6-816d-4425-8403-5d07284db0aa.txt +1 -0
- package/tests/config_test/media/5ffa2969-2d65-430e-a621-420c07f18f41.txt +1 -0
- package/tests/config_test/media/62a62671-e4bc-4312-8dfd-a06168c22aee.txt +1 -0
- package/tests/config_test/media/63732c16-1f11-4635-b2bc-62a6459e651e.txt +1 -0
- package/tests/config_test/media/64b8c889-5423-4cbb-9816-a05e72771b52.txt +1 -0
- package/tests/config_test/media/653d8bcd-4e60-4fda-9676-2e0054d966c1.txt +1 -0
- package/tests/config_test/media/6602e1e0-07e9-4dd1-b3c8-276f24e2a41f.txt +1 -0
- package/tests/config_test/media/67868636-99cc-441b-991d-7fe781b67745.txt +1 -0
- package/tests/config_test/media/67b4eede-7118-4e25-8801-ca53d0fd9d7f.txt +1 -0
- package/tests/config_test/media/67b817df-8c2f-4fe5-ba38-6090b5658943.txt +1 -0
- package/tests/config_test/media/67f8c8a6-8aa3-4d0f-bcf6-bec8c5a6726a.txt +1 -0
- package/tests/config_test/media/6808c09c-a1a9-4eea-92d6-327957c599be.txt +1 -0
- package/tests/config_test/media/681f8ee3-0d7f-4d85-a593-0c1f5ceea9be.txt +1 -0
- package/tests/config_test/media/68ae942b-c728-4127-a057-dfd08edc1aee.txt +1 -0
- package/tests/config_test/media/6a405178-234d-4562-ab34-c554826476fc.txt +1 -0
- package/tests/config_test/media/6b801410-b1fb-43f6-935e-c7cb09fb0f5a.txt +1 -0
- package/tests/config_test/media/6bd41073-fa62-4c20-a896-8b1e5d2b8381.txt +1 -0
- package/tests/config_test/media/6ea9bf1d-780e-4fc2-987e-841038b791cd.txt +1 -0
- package/tests/config_test/media/6fa62bcc-859a-44eb-a85b-ed12b3aec3ae.txt +1 -0
- package/tests/config_test/media/70118801-66f3-4165-a0b2-8918e4d4bd15.txt +1 -0
- package/tests/config_test/media/70640e73-56dc-4880-af62-ad7530a1185d.txt +1 -0
- package/tests/config_test/media/7114e6d7-f285-48b3-80c9-ec3fb1c3233e.txt +1 -0
- package/tests/config_test/media/71997029-9398-4efb-9868-3025b6de861a.txt +1 -0
- package/tests/config_test/media/725cb5f7-8410-4b7a-8427-90b213cea9d6.txt +1 -0
- package/tests/config_test/media/727960af-4454-4aa2-b479-c88398ca2c01.txt +1 -0
- package/tests/config_test/media/763e2702-7677-48b0-89be-30f8caf56667.txt +1 -0
- package/tests/config_test/media/7682d7aa-6622-4ae1-bdfc-bb5134cf92d9.txt +1 -0
- package/tests/config_test/media/773d6a45-2316-41da-9973-1395727ffc1f.txt +1 -0
- package/tests/config_test/media/783cdda1-9913-4ab0-aba6-56a4c22e2b61.txt +1 -0
- package/tests/config_test/media/78becb97-76f6-4fd1-976d-ab3d5e4b21c2.txt +1 -0
- package/tests/config_test/media/78cb1409-965a-44ea-b42b-0363db4d2ebd.txt +1 -0
- package/tests/config_test/media/79f9864e-b5d5-4c8d-bb66-749f5b49877f.txt +1 -0
- package/tests/config_test/media/7b2928b9-4fd3-46c7-8b78-f8d1118c605b.txt +1 -0
- package/tests/config_test/media/7b5aead0-b20b-4719-88aa-3dd070d53e4d.txt +1 -0
- package/tests/config_test/media/7c1a82c9-391d-40fb-a6f3-d79468fcd45f.txt +1 -0
- package/tests/config_test/media/7f1aefd7-7c6b-4b29-9f71-a85d800d63eb.txt +1 -0
- package/tests/config_test/media/7fe1aa1b-3e92-4f1b-a77d-bf69601ba162.txt +1 -0
- package/tests/config_test/media/802ca8c0-8898-446d-aeca-59d0cce3eea5.txt +1 -0
- package/tests/config_test/media/8034e1cc-a82a-4e65-9019-ecf53a212c9e.txt +1 -0
- package/tests/config_test/media/80828d5a-916c-412b-aa23-eccdf3ce4078.txt +1 -0
- package/tests/config_test/media/81a6ec1c-49c5-490b-afe8-bd47a3c3b1e7.txt +1 -0
- package/tests/config_test/media/82827b46-f1f4-4b2a-bd5a-4a83e6b5cc12.txt +1 -0
- package/tests/config_test/media/82f7163d-c5a6-44fe-b06a-b1863c553af4.txt +1 -0
- package/tests/config_test/media/83141a3e-3f8b-456a-83f1-b9b4ada167f0.txt +1 -0
- package/tests/config_test/media/837397e7-63f9-4cba-8b10-51d565e00341.txt +1 -0
- package/tests/config_test/media/8440b86e-2036-46ef-affe-e052ae1e232f.txt +1 -0
- package/tests/config_test/media/8729c33a-8f9d-496c-8090-42947d3bd4c7.txt +1 -0
- package/tests/config_test/media/874e1047-3429-443a-868d-4ce453c3a525.txt +1 -0
- package/tests/config_test/media/8770cffa-58f5-4c15-869a-687c77529f81.txt +1 -0
- package/tests/config_test/media/87c977c0-4375-4527-abc1-6223c71e8756.txt +1 -0
- package/tests/config_test/media/889e72cc-7e19-40ef-9d5b-1e501f3b48c7.txt +1 -0
- package/tests/config_test/media/88c89c9b-755e-43f9-9ac6-c01df1e83dfb.txt +1 -0
- package/tests/config_test/media/894ee8b5-d527-40e2-a7e1-475d9f07c2aa.txt +1 -0
- package/tests/config_test/media/89ec8a46-a4bf-4462-8f6d-c132016af9e1.txt +1 -0
- package/tests/config_test/media/8b2bee47-1673-4cd9-a8d5-033ef092b93e.txt +1 -0
- package/tests/config_test/media/8c362262-34ff-4707-ab5f-c334034083ee.txt +1 -0
- package/tests/config_test/media/8c458967-085b-4750-91e6-3ea391147bc7.txt +1 -0
- package/tests/config_test/media/8c5b0560-fc62-47a5-b480-a93120ca7bc4.txt +1 -0
- package/tests/config_test/media/8ce076d6-e809-4355-97ab-96104b51b939.txt +1 -0
- package/tests/config_test/media/8d60f276-8a2d-48e2-934b-63ef82f03d0f.txt +1 -0
- package/tests/config_test/media/8d889db9-f6b8-4ccb-864c-d10d1a54f7e9.txt +1 -0
- package/tests/config_test/media/8df0284b-c43f-4c32-a4e1-7dbe2c8c80f0.txt +1 -0
- package/tests/config_test/media/8e583c0b-1e2e-4b51-b104-1382e81f69d9.txt +1 -0
- package/tests/config_test/media/8f57d7e8-0f26-4719-b4d1-37896da3f579.txt +1 -0
- package/tests/config_test/media/9070fc55-481f-44c9-96f2-62f7c0a08814.txt +1 -0
- package/tests/config_test/media/93743c64-b60e-4521-9774-4d3beffd4465.txt +1 -0
- package/tests/config_test/media/939c6b06-b95d-4de6-bdaa-6f33cbe1fc1e.txt +1 -0
- package/tests/config_test/media/94ac4fc1-ba54-43de-b283-a7fa05eb3921.txt +1 -0
- package/tests/config_test/media/95093a2d-81d2-46d7-a817-7ab507cc2454.txt +1 -0
- package/tests/config_test/media/9628850e-c8d3-44da-b3b4-b27e00ba0e05.txt +1 -0
- package/tests/config_test/media/965e4782-3120-41c1-a398-23b38a342d95.txt +1 -0
- package/tests/config_test/media/97216f64-db92-4fa8-a239-5a115e3293a0.txt +1 -0
- package/tests/config_test/media/97b54a41-ec05-498e-9c61-6ec20f34a331.txt +1 -0
- package/tests/config_test/media/97c15c9a-13b4-49f1-b9ea-708c92756b95.txt +1 -0
- package/tests/config_test/media/97e45e1c-d03b-4a17-bb6f-ea8601e7fdf4.txt +1 -0
- package/tests/config_test/media/98faca9f-2686-4338-a1c2-d1920cce2fc0.txt +1 -0
- package/tests/config_test/media/997016d6-6832-4c09-9f8d-949dba5f4f8e.txt +1 -0
- package/tests/config_test/media/99ce7c2e-d4a3-49d0-9251-9c62d28288f5.txt +1 -0
- package/tests/config_test/media/9a9940a6-78b9-4978-98a6-914a171406c3.txt +1 -0
- package/tests/config_test/media/9ade4d45-452f-4a3f-ba4f-d9a08da80dab.txt +1 -0
- package/tests/config_test/media/9aff7e30-1809-4021-8ab1-e9a04068ad15.txt +1 -0
- package/tests/config_test/media/9b6b83df-1ee4-48f2-a3b0-aee0723378fc.txt +1 -0
- package/tests/config_test/media/9bbf50e1-c19d-4cc4-a366-0dcc234f003f.txt +1 -0
- package/tests/config_test/media/9ce9bc18-89eb-4a6f-832d-a4380111ebfa.txt +1 -0
- package/tests/config_test/media/9d7e647b-f1a9-44a7-bb9d-5ad7ac545ed9.txt +1 -0
- package/tests/config_test/media/9e141207-cb69-47c7-a80a-9096886b0f4e.txt +1 -0
- package/tests/config_test/media/9e58e7cc-04bb-48d0-9af1-9fd7c80d46be.txt +1 -0
- package/tests/config_test/media/9f1f6f42-70f0-404e-89e4-31588f235108.txt +1 -0
- package/tests/config_test/media/9f3e0022-deb0-44a2-b47c-fd4880fb2fa6.txt +1 -0
- package/tests/config_test/media/a07a6a4e-25c7-4f91-acdc-411e676bae99.txt +1 -0
- package/tests/config_test/media/a08ef99a-7cff-4224-985f-aa7cf292c6c3.txt +1 -0
- package/tests/config_test/media/a0c4ef94-eb1d-4b7f-b636-62ad6914a69c.txt +1 -0
- package/tests/config_test/media/a170f562-2b00-4662-85d7-7c43f9f67e0c.txt +1 -0
- package/tests/config_test/media/a32bb27b-7772-4373-ada7-890d9315256f.txt +1 -0
- package/tests/config_test/media/a36c31b9-f5c1-43a9-b448-34a380990d3f.txt +1 -0
- package/tests/config_test/media/a3831984-3f77-4bac-af70-5a7de6ce5424.txt +1 -0
- package/tests/config_test/media/a4f1f023-6135-44da-b580-c1d024cd3f47.txt +1 -0
- package/tests/config_test/media/a6227af7-2710-47be-ab45-25f497cec39f.txt +1 -0
- package/tests/config_test/media/a64baf32-bd1e-4353-bdf8-74cc3672639f.txt +1 -0
- package/tests/config_test/media/a67f5ac1-9645-4f28-a221-c3466b6ba865.txt +1 -0
- package/tests/config_test/media/a7f8e5a7-0c0e-48fb-b323-743b121fc091.txt +1 -0
- package/tests/config_test/media/a969343e-857b-49b1-a311-0030e0cc57cd.txt +1 -0
- package/tests/config_test/media/a9bc7241-7413-4113-8baf-784af73b110d.txt +1 -0
- package/tests/config_test/media/aa5b6ba2-76cf-4ca2-90b8-8f83cb23687e.txt +1 -0
- package/tests/config_test/media/aa5f29d2-3c13-4a15-ac68-b28964f80a1d.txt +1 -0
- package/tests/config_test/media/aaa97926-1d6f-4f5a-9af8-e68584797d23.txt +1 -0
- package/tests/config_test/media/ac98c0da-b830-4ec8-9ab6-d8e72a6d0bf2.txt +1 -0
- package/tests/config_test/media/af2dda92-1ed0-4b00-a786-f0f7516d4b2b.txt +1 -0
- package/tests/config_test/media/b0327e27-0733-4f08-b728-8dca3eae7526.txt +1 -0
- package/tests/config_test/media/b23fc74b-403b-49d6-810b-5c3dc71f48de.txt +1 -0
- package/tests/config_test/media/b2aa3fbb-ef3f-423b-b7a9-1863aba35bdd.txt +1 -0
- package/tests/config_test/media/b38675e5-1ecf-4967-88ef-9f60cce1bb89.txt +1 -0
- package/tests/config_test/media/b45c1951-b045-4762-a9fa-8d346617c1b5.txt +1 -0
- package/tests/config_test/media/b5359b92-46ea-4ebc-b6bc-102ef03ac5f5.txt +1 -0
- package/tests/config_test/media/b5d5aa47-fb92-48a6-9bd5-e394dc7b5212.txt +1 -0
- package/tests/config_test/media/b6bba0b4-d9fe-431b-8836-ef41bcd890fe.txt +1 -0
- package/tests/config_test/media/b72f4de8-5071-4314-a8e9-0adc7ce98fb8.txt +1 -0
- package/tests/config_test/media/b792506c-a05f-4b33-8934-83a7f2b1ebdd.txt +1 -0
- package/tests/config_test/media/b7e0e1bd-5e0f-44cc-89b9-55e67c368dce.txt +1 -0
- package/tests/config_test/media/b7ec24ac-6967-441e-9cb9-533daa7b443e.txt +1 -0
- package/tests/config_test/media/b86f2242-9e7c-4434-ac3d-e8fe868ab758.txt +1 -0
- package/tests/config_test/media/b8aa1cbb-05fe-4564-bfad-96a5243eec54.txt +1 -0
- package/tests/config_test/media/b8c54323-7977-4626-9412-66116a40fe42.txt +1 -0
- package/tests/config_test/media/ba3387a6-c5cd-4677-bddd-a399c6f648a3.txt +1 -0
- package/tests/config_test/media/ba70f293-7a40-4a5d-9e60-9d9c3d1fd2c0.txt +1 -0
- package/tests/config_test/media/ba7cad62-385b-494c-9688-b008fbae10c9.txt +1 -0
- package/tests/config_test/media/bb07c0ca-4b9f-4888-9109-95087951d2a6.txt +1 -0
- package/tests/config_test/media/bcf860eb-13b6-44b7-9a58-f2b6422a4fb0.txt +1 -0
- package/tests/config_test/media/bd8a019f-c9fd-4289-bc38-cc222a247ba8.txt +1 -0
- package/tests/config_test/media/bda18b4f-b4f3-4095-8b9b-8d715945ded1.txt +1 -0
- package/tests/config_test/media/bf3e4228-17f4-40d6-9d23-7ba79a333be5.txt +1 -0
- package/tests/config_test/media/bfa2fe67-34fe-466c-b807-bea2ddfb0141.txt +1 -0
- package/tests/config_test/media/c15ecf6e-6167-42ad-ba24-161216dbabfb.txt +1 -0
- package/tests/config_test/media/c17436fb-113d-425e-b59b-cafe93e3418e.txt +1 -0
- package/tests/config_test/media/c22154ee-3f66-4996-8ed7-df6120806040.txt +1 -0
- package/tests/config_test/media/c2c47ffe-50a1-46f4-bace-d66008c3ce7b.txt +1 -0
- package/tests/config_test/media/c4e0c0bf-f9b0-4fec-8fbf-292d8d2fe254.txt +1 -0
- package/tests/config_test/media/c56803d2-29bc-4359-8cb4-ea9574a47b2d.txt +1 -0
- package/tests/config_test/media/c607d0ee-1641-47e1-83d5-66e9e4bed857.txt +1 -0
- package/tests/config_test/media/c62769c5-d469-4499-bf09-97f752a65397.txt +1 -0
- package/tests/config_test/media/c667bac7-c161-4f89-b311-9975dcac5865.txt +1 -0
- package/tests/config_test/media/c7485a24-95f6-45e7-90f2-6a4716e8971e.txt +1 -0
- package/tests/config_test/media/c80b124d-579a-4f7b-9743-5428be624edf.txt +1 -0
- package/tests/config_test/media/c8f6e757-0252-4ac6-a439-14a5cd406e16.txt +1 -0
- package/tests/config_test/media/c94c9c39-24e1-4ce3-94bd-e32db7052a9d.txt +1 -0
- package/tests/config_test/media/ca950ac2-312d-472f-ae0f-7604edd6eae8.txt +1 -0
- package/tests/config_test/media/cc1ffb29-8d6f-47cd-9efd-f38832045570.txt +1 -0
- package/tests/config_test/media/cf42859e-23b6-4f7b-9b00-4928b0fc33fd.txt +1 -0
- package/tests/config_test/media/d000b20e-fd2c-4d07-bb8c-fc48541fe420.txt +1 -0
- package/tests/config_test/media/d191b4ba-365d-4346-96c6-7ab4f27a163d.txt +1 -0
- package/tests/config_test/media/d2739585-5101-44b5-8dd1-bbb09a104978.txt +1 -0
- package/tests/config_test/media/d31d2bf6-bdb1-4de2-9942-3ab83e857a52.txt +1 -0
- package/tests/config_test/media/d4027635-8e25-4cf5-a3dc-73a826c5045c.txt +1 -0
- package/tests/config_test/media/d476077e-d4e9-42e8-a7db-ded7f075d88d.txt +1 -0
- package/tests/config_test/media/d4fe0fae-942f-4966-ab76-64ba34352269.txt +1 -0
- package/tests/config_test/media/d551ace3-b4bb-4306-ad17-4873cdbfa5f5.txt +1 -0
- package/tests/config_test/media/d5aabdf7-472d-4268-b542-ddce2b25c70e.txt +1 -0
- package/tests/config_test/media/d6279202-c868-4058-947d-d9e44acd26cc.txt +1 -0
- package/tests/config_test/media/d62ecbb0-df04-449c-91fa-5d60f96c717f.txt +1 -0
- package/tests/config_test/media/d6309af6-add5-4d3d-9596-92a3c1b785b8.txt +1 -0
- package/tests/config_test/media/d6f419fc-2441-4170-8967-1d3f2a232869.txt +1 -0
- package/tests/config_test/media/d78e034e-51e4-47e7-802b-2fb9ca7aeeb0.txt +1 -0
- package/tests/config_test/media/d7a5dea2-b545-4b1f-9f25-0ca31bfa9ba9.txt +1 -0
- package/tests/config_test/media/d7eff0e2-7e17-4364-995a-13608df42af3.txt +1 -0
- package/tests/config_test/media/d89b187c-f4e0-45c2-8622-8f6c05b3f8f8.txt +1 -0
- package/tests/config_test/media/d8e4f769-79a3-4577-ae6f-e21b6c373661.txt +1 -0
- package/tests/config_test/media/d9266efc-e275-4daf-bb58-a7d224649ac5.txt +1 -0
- package/tests/config_test/media/db04add1-1f89-4657-a897-4779001bd6cc.txt +1 -0
- package/tests/config_test/media/dc709e83-06c7-4371-95f4-c4982d094c7b.txt +1 -0
- package/tests/config_test/media/de3812df-b579-4203-98b1-7ee8821680a4.txt +1 -0
- package/tests/config_test/media/df1a21db-e3e1-4670-b909-da77c591486e.txt +1 -0
- package/tests/config_test/media/e033a02b-3a38-4b6f-8873-b121cc0cbcad.txt +1 -0
- package/tests/config_test/media/e13e2632-4aaf-4a79-b6b4-ef1f81028346.txt +1 -0
- package/tests/config_test/media/e19633b3-1ab1-4f18-86cd-e421633e96af.txt +1 -0
- package/tests/config_test/media/e1dc9b89-9563-4937-b529-43cd55f82a98.txt +1 -0
- package/tests/config_test/media/e37f9c75-0571-4336-b7a6-d431e295ba92.txt +1 -0
- package/tests/config_test/media/e3fb83b1-53ed-470d-b9f4-015f98c6a128.txt +1 -0
- package/tests/config_test/media/e6c964da-ab48-4779-9706-0ae9ab5f22bb.txt +1 -0
- package/tests/config_test/media/e732131f-d7e2-4969-9f0f-10672281405b.txt +1 -0
- package/tests/config_test/media/e73f5320-f030-43ae-9efe-002aeb6e0522.txt +1 -0
- package/tests/config_test/media/e98267b9-553f-4cd2-9277-2bee037b7003.txt +1 -0
- package/tests/config_test/media/ea3c4ac0-f63d-4a91-b015-345851856564.txt +1 -0
- package/tests/config_test/media/eacee16f-a2db-4d60-a36b-9b60ea2be330.txt +1 -0
- package/tests/config_test/media/eba1b05a-52aa-4f00-92f6-3d556ca2f366.txt +1 -0
- package/tests/config_test/media/ebf6e54b-0d1e-4d87-b206-34fa81c66dbb.txt +1 -0
- package/tests/config_test/media/ecbf0894-6d76-4141-875d-7691de63a8f7.txt +1 -0
- package/tests/config_test/media/ece7a87a-3490-4ac6-adaf-289b1e427325.txt +1 -0
- package/tests/config_test/media/ed59c963-3449-4431-8440-2cba7defdcae.txt +1 -0
- package/tests/config_test/media/eda09368-348b-4531-a062-a8aafbf9cb8a.txt +1 -0
- package/tests/config_test/media/edd1c2b2-179f-4d44-9ac0-72b4fe16c6f2.txt +1 -0
- package/tests/config_test/media/ee4e9f39-779e-4084-b696-f39abe74f545.txt +1 -0
- package/tests/config_test/media/ef08a195-fcc6-452f-b81e-9d4e97231327.txt +1 -0
- package/tests/config_test/media/ef518fee-57a4-47d3-bbb5-aef9b166ca49.txt +1 -0
- package/tests/config_test/media/efd77ad3-0e00-448f-a01d-4f363ad5c0b1.txt +1 -0
- package/tests/config_test/media/f0c18f54-1095-4787-891b-63c82ba6c153.txt +1 -0
- package/tests/config_test/media/f18dca67-521a-4e7f-8064-e6daa08ea3bc.txt +1 -0
- package/tests/config_test/media/f19a32ab-f345-4bcb-be01-58e62ade0285.txt +1 -0
- package/tests/config_test/media/f29ef9e1-4f84-4bb7-93ce-3693d7cd01f7.txt +1 -0
- package/tests/config_test/media/f2cd3857-386e-4d43-b5ee-cb54d1e7fa3c.txt +1 -0
- package/tests/config_test/media/f3c8b431-4b3a-43b9-a277-233daea240bb.txt +1 -0
- package/tests/config_test/media/f7344305-dde1-4b33-989e-b64b18447e2a.txt +1 -0
- package/tests/config_test/media/f829cdfe-a118-4751-a49f-565a617c2b99.txt +1 -0
- package/tests/config_test/media/f89206aa-0728-4215-a1df-c1f4315079b5.txt +1 -0
- package/tests/config_test/media/f89bb977-c022-471d-9972-d9417484f025.txt +1 -0
- package/tests/config_test/media/f960f026-724a-4630-b3ea-48d7ad60b022.txt +1 -0
- package/tests/config_test/media/fa343cd4-aca6-482b-9395-f221148fd0d8.txt +1 -0
- package/tests/config_test/media/fa802dcc-614e-4027-95fe-ce4f0da61bc9.txt +1 -0
- package/tests/config_test/media/ff1a47f0-9c4b-4c88-b0dc-b28d20a83509.txt +1 -0
- package/tests/config_test/media/ff8aa3b0-5c4d-4d39-be53-4e28e9ee02e7.txt +1 -0
- package/tests/config_test/media/ffb998c5-c98b-4442-b8ef-187bdc7e4c73.txt +1 -0
- package/tests/config_test/media/ffc43791-7d7b-4e13-a2ea-3bb952457e7f.txt +1 -0
- package/tests/config_test/package-lock.json +727 -688
- package/tests/config_test/package.json +2 -2
- package/tests/config_test/tsconfig.json +1 -1
- package/tests/isomorphic_queries.js +38 -0
- package/tests/isomorphic_queries.ts +28 -1
- package/tests/server/DBoGenerated.d.ts +135 -1
- package/tests/server/index.js +51 -27
- package/tests/server/index.ts +49 -26
- package/tests/server/init.sql +22 -7
- package/tests/server/media/35d7e3d7-64d3-4d4b-b564-5e810ca3671f.txt +1 -0
- package/tests/server/media/70ca7114-d6bc-4551-8170-cd7dcdff11dd.txt +1 -0
- package/tests/server/media/9e19f591-edc8-4ad7-ac4f-96c3078cb8ed.txt +1 -0
- package/tests/server/package-lock.json +166 -535
- package/tests/server/package.json +2 -2
- package/tests/config_test2/package-lock.json +0 -1999
package/lib/Prostgles.ts
CHANGED
|
@@ -6,19 +6,20 @@
|
|
|
6
6
|
import * as promise from "bluebird";
|
|
7
7
|
import * as pgPromise from 'pg-promise';
|
|
8
8
|
import pg = require('pg-promise/typescript/pg-subset');
|
|
9
|
+
import FileManager, { ImageOptions, LocalConfig, S3Config } from "./FileManager";
|
|
9
10
|
|
|
10
11
|
const pkgj = require('../package.json');
|
|
11
12
|
const version = pkgj.version;
|
|
12
13
|
|
|
14
|
+
console.log("Add a basic auth mode where user and sessions table are created");
|
|
15
|
+
|
|
13
16
|
import { get } from "./utils";
|
|
14
|
-
import { DboBuilder, DbHandler,
|
|
17
|
+
import { DboBuilder, DbHandler, TableHandler, ViewHandler, isPlainObject, LocalParams } from "./DboBuilder";
|
|
15
18
|
import { PubSubManager, DEFAULT_SYNC_BATCH_SIZE, asValue } from "./PubSubManager";
|
|
16
|
-
|
|
19
|
+
export { DbHandler }
|
|
17
20
|
export type PGP = pgPromise.IMain<{}, pg.IClient>;
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
export { DbHandler, DbHandlerTX } from "./DboBuilder";
|
|
21
|
-
import { SQLRequest, SQLOptions, CHANNELS, asName, DBHandler, AnyObject } from "prostgles-types";
|
|
22
|
+
import { SQLRequest, SQLOptions, CHANNELS, AnyObject } from "prostgles-types";
|
|
22
23
|
|
|
23
24
|
import { DBEventsManager } from "./DBEventsManager";
|
|
24
25
|
|
|
@@ -66,9 +67,6 @@ function getDbConnection(dbConnection: DbConnection, options: DbConnectionOpts,
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
|
|
69
|
-
const QueryFile = require('pg-promise').QueryFile;
|
|
70
|
-
|
|
71
|
-
|
|
72
70
|
import { Socket } from "dgram";
|
|
73
71
|
import { FieldFilter, SelectParamsBasic as SelectParams } from "prostgles-types";
|
|
74
72
|
|
|
@@ -98,6 +96,8 @@ export type UpdateRequestDataBatch = {
|
|
|
98
96
|
}
|
|
99
97
|
export type UpdateRequestData = UpdateRequestDataOne | UpdateRequestDataBatch;
|
|
100
98
|
|
|
99
|
+
export type ValidateRow = (row: AnyObject) => AnyObject | Promise<AnyObject>;
|
|
100
|
+
|
|
101
101
|
export type SelectRule = {
|
|
102
102
|
|
|
103
103
|
/**
|
|
@@ -153,14 +153,14 @@ export type InsertRule = {
|
|
|
153
153
|
returningFields?: FieldFilter;
|
|
154
154
|
|
|
155
155
|
/**
|
|
156
|
-
* Validation logic to check/update data for each request. Happens before
|
|
156
|
+
* Validation logic to check/update data for each request. Happens before publish rule checks (for fields, forcedData/forcedFilter)
|
|
157
157
|
*/
|
|
158
|
-
preValidate?:
|
|
158
|
+
preValidate?: ValidateRow
|
|
159
159
|
|
|
160
160
|
/**
|
|
161
|
-
* Validation logic to check/update data for each request. Happens after
|
|
161
|
+
* Validation logic to check/update data for each request. Happens after publish rule checks (for fields, forcedData/forcedFilter)
|
|
162
162
|
*/
|
|
163
|
-
validate?:
|
|
163
|
+
validate?: ValidateRow
|
|
164
164
|
}
|
|
165
165
|
export type UpdateRule = {
|
|
166
166
|
|
|
@@ -193,7 +193,7 @@ export type UpdateRule = {
|
|
|
193
193
|
/**
|
|
194
194
|
* Validation logic to check/update data for each request
|
|
195
195
|
*/
|
|
196
|
-
validate?:
|
|
196
|
+
validate?: ValidateRow
|
|
197
197
|
}
|
|
198
198
|
export type DeleteRule = {
|
|
199
199
|
|
|
@@ -215,7 +215,7 @@ export type DeleteRule = {
|
|
|
215
215
|
/**
|
|
216
216
|
* Validation logic to check/update data for each request
|
|
217
217
|
*/
|
|
218
|
-
validate?(...
|
|
218
|
+
validate?(...args): UpdateRequestData
|
|
219
219
|
}
|
|
220
220
|
export type SyncRule = {
|
|
221
221
|
|
|
@@ -274,9 +274,21 @@ export type PublishViewRule = {
|
|
|
274
274
|
// tablesOrViews: {[key:string]: TableRule | ViewRule | "*" }
|
|
275
275
|
// }
|
|
276
276
|
export type RequestParams = { dbo?: DbHandler, socket?: any };
|
|
277
|
-
export type PublishAllOrNothing =
|
|
278
|
-
export type
|
|
279
|
-
|
|
277
|
+
export type PublishAllOrNothing = "*" | false | null;
|
|
278
|
+
export type PublishObject = {
|
|
279
|
+
[table_name: string]: (PublishTableRule | PublishViewRule | PublishAllOrNothing )
|
|
280
|
+
};
|
|
281
|
+
export type PublishTable = {
|
|
282
|
+
[table_name: string]: (PublishTableRule | PublishViewRule)
|
|
283
|
+
};
|
|
284
|
+
export type PublishedResult = PublishAllOrNothing | PublishObject ;
|
|
285
|
+
export type PublishParams<DBO = DbHandler> = {
|
|
286
|
+
sid?: string;
|
|
287
|
+
dbo?: DBO;
|
|
288
|
+
db?: DB;
|
|
289
|
+
user?: AnyObject;
|
|
290
|
+
}
|
|
291
|
+
export type Publish<DBO> =(params: PublishParams<DBO>) => (PublishedResult | Promise<PublishedResult>);
|
|
280
292
|
|
|
281
293
|
export type Method = (...args: any) => ( any | Promise<any> );
|
|
282
294
|
export const JOIN_TYPES = ["one-many", "many-one", "one-one", "many-many"] as const;
|
|
@@ -287,18 +299,48 @@ export type Join = {
|
|
|
287
299
|
};
|
|
288
300
|
export type Joins = Join[] | "inferred";
|
|
289
301
|
|
|
290
|
-
export type
|
|
302
|
+
export type PublishMethods<DBO> = (params: PublishParams<DBO>) => { [key:string]: Method } | Promise<{ [key:string]: Method }>;
|
|
291
303
|
|
|
292
304
|
export type BasicSession = { sid: string, expires: number };
|
|
293
|
-
|
|
294
|
-
export type
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
305
|
+
|
|
306
|
+
export type AuthClientRequest = { socket: any } | { httpReq: any }
|
|
307
|
+
export type Auth<DBO = DbHandler> = {
|
|
308
|
+
/**
|
|
309
|
+
* Name of the cookie or socket hadnshake query param that represents the session id.
|
|
310
|
+
* Defaults to "session_id"
|
|
311
|
+
*/
|
|
312
|
+
sidKeyName?: string;
|
|
313
|
+
expressConfig?: {
|
|
314
|
+
/**
|
|
315
|
+
* Express app instance. If provided Prostgles will attempt to set sidKeyName to user cookie
|
|
316
|
+
*/
|
|
317
|
+
app: any;
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Used in allowing logging in through express
|
|
321
|
+
*/
|
|
322
|
+
loginPostPath: string;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* User data used on server
|
|
327
|
+
*/
|
|
328
|
+
getUser: (sid: string, dbo: DBO, db: DB) => Promise<AnyObject | null | undefined>;
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* User data sent to client
|
|
332
|
+
*/
|
|
333
|
+
getClientUser: (sid: string, dbo: DBO, db: DB) => Promise<AnyObject | null | undefined>;
|
|
334
|
+
|
|
335
|
+
register?: (params: AnyObject, dbo: DBO, db: DB) => Promise<BasicSession>;
|
|
336
|
+
login?: (params: AnyObject, dbo: DBO, db: DB) => Promise<BasicSession>;
|
|
337
|
+
logout?: (sid: string, dbo: DBO, db: DB) => Promise<any>;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
export type ClientInfo = {
|
|
341
|
+
user?: AnyObject;
|
|
342
|
+
clientUser?: AnyObject;
|
|
343
|
+
sid?: string;
|
|
302
344
|
}
|
|
303
345
|
|
|
304
346
|
type Keywords = {
|
|
@@ -321,29 +363,83 @@ export type I18N_CONFIG<LANG_IDS = { en: 1, fr: 1 }> = {
|
|
|
321
363
|
}>;
|
|
322
364
|
}
|
|
323
365
|
|
|
324
|
-
|
|
366
|
+
type ExpressApp = {
|
|
367
|
+
get: (
|
|
368
|
+
routePath: string,
|
|
369
|
+
cb: (
|
|
370
|
+
req: {
|
|
371
|
+
params: { name: string },
|
|
372
|
+
cookies: { sid: string }
|
|
373
|
+
},
|
|
374
|
+
res: {
|
|
375
|
+
redirect: (redirectUrl: string) => any;
|
|
376
|
+
contentType: (type: string) => void;
|
|
377
|
+
sendFile: (fileName: string, opts?: { root: string }) => any;
|
|
378
|
+
status: (code: number) => {
|
|
379
|
+
json: (response: AnyObject) => any;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
) => any
|
|
383
|
+
) => any
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Allows uploading and downloading files.
|
|
388
|
+
* Currently supports only S3.
|
|
389
|
+
*
|
|
390
|
+
* @description
|
|
391
|
+
* Will create a media table that contains file metadata and urls
|
|
392
|
+
* Inserting a file into this table through prostgles will upload it to S3 and insert the relevant metadata into the media table
|
|
393
|
+
* Requesting a file from HTTP GET {fileUrlPath}/{fileId} will:
|
|
394
|
+
* 1. check auth (if provided)
|
|
395
|
+
* 2. check the permissions in publish (if provided)
|
|
396
|
+
* 3. redirect the request to the signed url (if allowed)
|
|
397
|
+
*
|
|
398
|
+
* Specifying referencedTables will:
|
|
399
|
+
* 1. create a column in that table called media
|
|
400
|
+
* 2. create a lookup table lookup_media_{referencedTable} that joins referencedTable to the media table
|
|
401
|
+
*/
|
|
402
|
+
export type FileTableConfig = {
|
|
403
|
+
tableName?: string; /* defaults to 'media' */
|
|
404
|
+
fileUrlPath?: string; // defaults to tableName
|
|
405
|
+
awsS3Config?: S3Config;
|
|
406
|
+
localConfig?: LocalConfig;
|
|
407
|
+
// {
|
|
408
|
+
// region: string;
|
|
409
|
+
// bucket: string;
|
|
410
|
+
// accessKeyId: string;
|
|
411
|
+
// secretAccessKey: string;
|
|
412
|
+
// },
|
|
413
|
+
expressApp: ExpressApp;
|
|
414
|
+
referencedTables?: {
|
|
415
|
+
[tableName: string]: "one" | "many"
|
|
416
|
+
},
|
|
417
|
+
imageOptions?: ImageOptions
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
export type ProstglesInitOptions<DBO = DbHandler> = {
|
|
325
421
|
dbConnection: DbConnection;
|
|
326
422
|
dbOptions?: DbConnectionOpts;
|
|
327
423
|
tsGeneratedTypesDir?: string;
|
|
328
424
|
io?: any;
|
|
329
|
-
publish?: Publish
|
|
330
|
-
publishMethods?:
|
|
331
|
-
publishRawSQL?(
|
|
425
|
+
publish?: Publish<DBO>;
|
|
426
|
+
publishMethods?: PublishMethods<DBO>;
|
|
427
|
+
publishRawSQL?(params: PublishParams<DBO>): ( (boolean | "*") | Promise<(boolean | "*")>);
|
|
332
428
|
joins?: Joins;
|
|
333
429
|
schema?: string;
|
|
334
430
|
sqlFilePath?: string;
|
|
335
|
-
onReady(dbo:
|
|
336
|
-
// auth,
|
|
431
|
+
onReady(dbo: DBO, db: DB): void;
|
|
337
432
|
transactions?: string | boolean;
|
|
338
433
|
wsChannelNamePrefix?: string;
|
|
339
|
-
onSocketConnect?(socket: Socket, dbo:
|
|
340
|
-
onSocketDisconnect?(socket: Socket, dbo:
|
|
341
|
-
auth?: Auth
|
|
434
|
+
onSocketConnect?(socket: Socket, dbo: DBO, db?: DB);
|
|
435
|
+
onSocketDisconnect?(socket: Socket, dbo: DBO, db?: DB);
|
|
436
|
+
auth?: Auth<DBO>;
|
|
342
437
|
DEBUG_MODE?: boolean;
|
|
343
438
|
watchSchema?: boolean | "hotReloadMode" | ((event: { command: string; query: string }) => void);
|
|
344
439
|
keywords?: Keywords;
|
|
345
440
|
onNotice?: (msg: any) => void;
|
|
346
441
|
i18n?: I18N_CONFIG<AnyObject>;
|
|
442
|
+
fileTable?: FileTableConfig;
|
|
347
443
|
}
|
|
348
444
|
|
|
349
445
|
// interface ISocketSetup {
|
|
@@ -377,50 +473,68 @@ const DEFAULT_KEYWORDS = {
|
|
|
377
473
|
};
|
|
378
474
|
|
|
379
475
|
const fs = require('fs');
|
|
380
|
-
export class Prostgles {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
476
|
+
export class Prostgles<DBO = DbHandler> {
|
|
477
|
+
|
|
478
|
+
opts: ProstglesInitOptions<DBO> = {
|
|
479
|
+
DEBUG_MODE: false,
|
|
480
|
+
dbConnection: {
|
|
481
|
+
host: "localhost",
|
|
482
|
+
port: 5432,
|
|
483
|
+
application_name: "prostgles_app"
|
|
484
|
+
},
|
|
485
|
+
onReady: () => {},
|
|
486
|
+
schema: "public",
|
|
487
|
+
watchSchema: false,
|
|
388
488
|
};
|
|
389
|
-
|
|
489
|
+
|
|
490
|
+
// dbConnection: DbConnection = {
|
|
491
|
+
// host: "localhost",
|
|
492
|
+
// port: 5432,
|
|
493
|
+
// application_name: "prostgles_app"
|
|
494
|
+
// };
|
|
495
|
+
// dbOptions: DbConnectionOpts;
|
|
390
496
|
db: DB;
|
|
391
497
|
pgp: PGP;
|
|
392
|
-
dbo: DbHandler
|
|
498
|
+
dbo: DbHandler;
|
|
393
499
|
dboBuilder: DboBuilder;
|
|
394
|
-
|
|
395
|
-
publishMethods?: publishMethods;
|
|
396
|
-
io: any;
|
|
397
|
-
publish?: Publish;
|
|
398
|
-
joins?: Joins;
|
|
399
|
-
schema: string = "public";
|
|
400
|
-
transactions?: string | boolean;
|
|
401
|
-
// auth,
|
|
402
|
-
publishRawSQL?: any;
|
|
403
|
-
wsChannelNamePrefix: string = "_psqlWS_";
|
|
404
|
-
onSocketConnect?(socket: Socket | any, dbo: any, db?: DB);
|
|
405
|
-
onSocketDisconnect?(socket: Socket | any, dbo: any, db?: DB);
|
|
406
|
-
sqlFilePath?: string;
|
|
407
|
-
tsGeneratedTypesDir?: string;
|
|
408
500
|
publishParser: PublishParser;
|
|
409
|
-
auth?: Auth;
|
|
410
|
-
DEBUG_MODE?: boolean = false;
|
|
411
|
-
watchSchema?: boolean | "hotReloadMode" | ((event: { command: string; query: string }) => void) = false;
|
|
412
|
-
private loaded = false;
|
|
413
|
-
keywords = DEFAULT_KEYWORDS;
|
|
414
|
-
onReady: (dbo: any, db: DB) => void;
|
|
415
501
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
502
|
+
// publishMethods?: ProstglesInitOptions<DBO>["publishMethods"];
|
|
503
|
+
// io: any;
|
|
504
|
+
// publish?: ProstglesInitOptions<DBO>["publish"];
|
|
505
|
+
// joins?: Joins;
|
|
506
|
+
// schema: string = "public";
|
|
507
|
+
// transactions?: string | boolean;
|
|
508
|
+
|
|
509
|
+
// publishRawSQL?: ProstglesInitOptions<DBO>["publishRawSQL"];
|
|
510
|
+
// wsChannelNamePrefix: string = "_psqlWS_";
|
|
511
|
+
// onSocketConnect?(socket: Socket | any, dbo: DBO, db?: DB);
|
|
512
|
+
// onSocketDisconnect?(socket: Socket | any, dbo: DBO, db?: DB);
|
|
513
|
+
// sqlFilePath?: string;
|
|
514
|
+
// tsGeneratedTypesDir?: string;
|
|
515
|
+
// auth?: ProstglesInitOptions["auth"];
|
|
516
|
+
// DEBUG_MODE?: boolean = false;
|
|
517
|
+
// watchSchema?: ProstglesInitOptions["watchSchema"];// boolean | "hotReloadMode" | ((event: { command: string; query: string }) => void) = false;
|
|
518
|
+
// onReady: (dbo: any, db: DB) => void;
|
|
519
|
+
// i18n?: ProstglesInitOptions["i18n"];
|
|
520
|
+
// fileTable?: FileTableConfig;
|
|
521
|
+
// /**
|
|
522
|
+
// * Postgres on notice callback
|
|
523
|
+
// */
|
|
524
|
+
// onNotice?: ProstglesInitOptions["onNotice"];
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
keywords = DEFAULT_KEYWORDS;
|
|
528
|
+
private loaded = false;
|
|
420
529
|
|
|
421
530
|
dbEventsManager: DBEventsManager;
|
|
422
531
|
|
|
423
|
-
|
|
532
|
+
|
|
533
|
+
fileManager?: FileManager;
|
|
534
|
+
|
|
535
|
+
isMedia(tableName: string){
|
|
536
|
+
return this.opts?.fileTable?.tableName === tableName;
|
|
537
|
+
}
|
|
424
538
|
|
|
425
539
|
constructor(params: ProstglesInitOptions){
|
|
426
540
|
if(!params) throw "ProstglesInitOptions missing";
|
|
@@ -432,14 +546,21 @@ export class Prostgles {
|
|
|
432
546
|
"onReady", "dbConnection", "dbOptions", "publishMethods", "io",
|
|
433
547
|
"publish", "schema", "publishRawSQL", "wsChannelNamePrefix", "onSocketConnect",
|
|
434
548
|
"onSocketDisconnect", "sqlFilePath", "auth", "DEBUG_MODE", "watchSchema",
|
|
435
|
-
"i18n"
|
|
549
|
+
"i18n", "fileTable"
|
|
436
550
|
];
|
|
437
551
|
const unknownParams = Object.keys(params).filter((key: string) => !(config as string[]).includes(key))
|
|
438
552
|
if(unknownParams.length){
|
|
439
553
|
console.error(`Unrecognised ProstglesInitOptions params: ${unknownParams.join()}`);
|
|
440
554
|
}
|
|
441
555
|
|
|
442
|
-
Object.assign(this, params);
|
|
556
|
+
Object.assign(this.opts, params);
|
|
557
|
+
|
|
558
|
+
/* set defaults */
|
|
559
|
+
if(this.opts?.fileTable){
|
|
560
|
+
this.opts.fileTable.tableName = this.opts?.fileTable?.tableName || "media";
|
|
561
|
+
}
|
|
562
|
+
this.opts.schema = this.opts.schema || "public";
|
|
563
|
+
|
|
443
564
|
this.keywords = {
|
|
444
565
|
...DEFAULT_KEYWORDS,
|
|
445
566
|
...params.keywords,
|
|
@@ -449,15 +570,16 @@ export class Prostgles {
|
|
|
449
570
|
destroyed = false;
|
|
450
571
|
|
|
451
572
|
async onSchemaChange(event: { command: string; query: string }){
|
|
452
|
-
|
|
573
|
+
const { watchSchema, onReady, tsGeneratedTypesDir } = this.opts;
|
|
574
|
+
if(watchSchema && this.loaded){
|
|
453
575
|
console.log("Schema changed");
|
|
454
576
|
|
|
455
|
-
if(typeof
|
|
577
|
+
if(typeof watchSchema === "function"){
|
|
456
578
|
/* Only call the provided func */
|
|
457
|
-
|
|
579
|
+
watchSchema(event);
|
|
458
580
|
|
|
459
|
-
} else if(
|
|
460
|
-
if(
|
|
581
|
+
} else if(watchSchema === "hotReloadMode") {
|
|
582
|
+
if(tsGeneratedTypesDir) {
|
|
461
583
|
/* Hot reload integration. Will only touch tsGeneratedTypesDir */
|
|
462
584
|
console.log("watchSchema: Re-writing TS schema");
|
|
463
585
|
|
|
@@ -465,10 +587,10 @@ export class Prostgles {
|
|
|
465
587
|
this.writeDBSchema(true);
|
|
466
588
|
}
|
|
467
589
|
|
|
468
|
-
} else if(
|
|
590
|
+
} else if(watchSchema === true){
|
|
469
591
|
/* Full re-init. Sockets must reconnect */
|
|
470
592
|
console.log("watchSchema: Full re-initialisation")
|
|
471
|
-
this.init(
|
|
593
|
+
this.init(onReady);
|
|
472
594
|
}
|
|
473
595
|
}
|
|
474
596
|
}
|
|
@@ -479,7 +601,7 @@ export class Prostgles {
|
|
|
479
601
|
|
|
480
602
|
getTSFileName(){
|
|
481
603
|
const fileName = "DBoGenerated.d.ts" //`dbo_${this.schema}_types.ts`;
|
|
482
|
-
const fullPath = (this.tsGeneratedTypesDir || "") + fileName;
|
|
604
|
+
const fullPath = (this.opts.tsGeneratedTypesDir || "") + fileName;
|
|
483
605
|
return { fileName, fullPath }
|
|
484
606
|
}
|
|
485
607
|
|
|
@@ -494,7 +616,7 @@ export class Prostgles {
|
|
|
494
616
|
|
|
495
617
|
writeDBSchema(force = false){
|
|
496
618
|
|
|
497
|
-
if(this.tsGeneratedTypesDir){
|
|
619
|
+
if(this.opts.tsGeneratedTypesDir){
|
|
498
620
|
const { fullPath, fileName } = this.getTSFileName();
|
|
499
621
|
const header = `/* This file was generated by Prostgles \n` +
|
|
500
622
|
// `* ${(new Date).toUTCString()} \n`
|
|
@@ -511,13 +633,14 @@ export class Prostgles {
|
|
|
511
633
|
}
|
|
512
634
|
}
|
|
513
635
|
|
|
514
|
-
async
|
|
515
|
-
this.dboBuilder = await DboBuilder.create(this);
|
|
516
|
-
this.dbo = this.dboBuilder.dbo;
|
|
636
|
+
refreshDBO = async () => {
|
|
637
|
+
this.dboBuilder = await DboBuilder.create(this as any) as any;
|
|
638
|
+
this.dbo = this.dboBuilder.dbo as any;
|
|
639
|
+
return this.dbo;
|
|
517
640
|
}
|
|
518
641
|
|
|
519
|
-
async init(onReady: (dbo:
|
|
520
|
-
db:
|
|
642
|
+
async init(onReady: (dbo: DBO, db: DB) => any): Promise<{
|
|
643
|
+
db: DbHandler;
|
|
521
644
|
_db: DB;
|
|
522
645
|
pgp: PGP;
|
|
523
646
|
io?: any;
|
|
@@ -526,14 +649,14 @@ export class Prostgles {
|
|
|
526
649
|
this.loaded = false;
|
|
527
650
|
|
|
528
651
|
|
|
529
|
-
if(this.watchSchema === "hotReloadMode" && !this.tsGeneratedTypesDir) {
|
|
652
|
+
if(this.opts.watchSchema === "hotReloadMode" && !this.opts.tsGeneratedTypesDir) {
|
|
530
653
|
throw "tsGeneratedTypesDir option is needed for watchSchema: hotReloadMode to work ";
|
|
531
654
|
}
|
|
532
655
|
|
|
533
656
|
/* 1. Connect to db */
|
|
534
657
|
if(!this.db){
|
|
535
|
-
const { db, pgp } = getDbConnection(this.dbConnection, this.dbOptions, this.DEBUG_MODE, notice => {
|
|
536
|
-
if(this.onNotice) this.onNotice(notice);
|
|
658
|
+
const { db, pgp } = getDbConnection(this.opts.dbConnection, this.opts.dbOptions, this.opts.DEBUG_MODE, notice => {
|
|
659
|
+
if(this.opts.onNotice) this.opts.onNotice(notice);
|
|
537
660
|
if(this.dbEventsManager){
|
|
538
661
|
this.dbEventsManager.onNotice(notice)
|
|
539
662
|
}
|
|
@@ -545,32 +668,46 @@ export class Prostgles {
|
|
|
545
668
|
const { db, pgp } = this;
|
|
546
669
|
|
|
547
670
|
/* 2. Execute any SQL file if provided */
|
|
548
|
-
if(this.sqlFilePath){
|
|
549
|
-
await this.runSQLFile(this.sqlFilePath);
|
|
671
|
+
if(this.opts.sqlFilePath){
|
|
672
|
+
await this.runSQLFile(this.opts.sqlFilePath);
|
|
550
673
|
}
|
|
551
674
|
|
|
552
675
|
try {
|
|
553
676
|
/* 3. Make DBO object from all tables and views */
|
|
554
677
|
await this.refreshDBO();
|
|
678
|
+
|
|
679
|
+
/* Create media table if required */
|
|
680
|
+
if(this.opts.fileTable){
|
|
681
|
+
const { awsS3Config, localConfig, imageOptions } = this.opts.fileTable;
|
|
682
|
+
if(!awsS3Config && !localConfig) throw "fileTable missing param: Must provide awsS3Config OR localConfig";
|
|
683
|
+
await this.refreshDBO();
|
|
684
|
+
this.fileManager = new FileManager(awsS3Config || localConfig, imageOptions);
|
|
685
|
+
await this.fileManager.init(this as any);
|
|
686
|
+
}
|
|
687
|
+
await this.refreshDBO();
|
|
555
688
|
|
|
556
|
-
this.writeDBSchema();
|
|
557
689
|
|
|
558
|
-
if(this.publish){
|
|
690
|
+
if(this.opts.publish){
|
|
691
|
+
|
|
692
|
+
if(!this.opts.io) console.warn("IO missing. Publish has no effect without io");
|
|
693
|
+
|
|
559
694
|
/* 3.9 Check auth config */
|
|
560
|
-
if(this.auth){
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
695
|
+
if(this.opts.auth){
|
|
696
|
+
this.opts.auth.sidKeyName = this.opts.auth.sidKeyName || "session_id";
|
|
697
|
+
|
|
698
|
+
const { sidKeyName, login, getUser, getClientUser } = this.opts.auth;
|
|
699
|
+
if(typeof sidKeyName !== "string" && !login){
|
|
700
|
+
throw "Invalid auth: Provide { sidKeyName: string } ";
|
|
564
701
|
}
|
|
565
702
|
if(!getUser || !getClientUser) throw "getUser OR getClientUser missing from auth config";
|
|
566
703
|
}
|
|
567
704
|
|
|
568
|
-
this.publishParser = new PublishParser(this.publish, this.publishMethods, this.publishRawSQL, this.dbo, this.db, this);
|
|
705
|
+
this.publishParser = new PublishParser(this.opts.publish, this.opts.publishMethods, this.opts.publishRawSQL, this.dbo, this.db, this as any);
|
|
569
706
|
this.dboBuilder.publishParser = this.publishParser;
|
|
570
707
|
/* 4. Set publish and auth listeners */ //makeDBO(db, allTablesViews, pubSubManager, false)
|
|
571
708
|
await this.setSocketEvents();
|
|
572
709
|
|
|
573
|
-
} else if(this.auth) throw "Auth config does not work without publish";
|
|
710
|
+
} else if(this.opts.auth) throw "Auth config does not work without publish";
|
|
574
711
|
|
|
575
712
|
// if(this.watchSchema){
|
|
576
713
|
// if(!(await isSuperUser(db))) throw "Cannot watchSchema without a super user schema. Set watchSchema=false or provide a super user";
|
|
@@ -578,12 +715,15 @@ export class Prostgles {
|
|
|
578
715
|
|
|
579
716
|
this.dbEventsManager = new DBEventsManager(db, pgp);
|
|
580
717
|
|
|
718
|
+
|
|
719
|
+
this.writeDBSchema();
|
|
720
|
+
|
|
581
721
|
/* 5. Finish init and provide DBO object */
|
|
582
722
|
try {
|
|
583
723
|
if(this.destroyed) {
|
|
584
724
|
console.trace(1)
|
|
585
725
|
}
|
|
586
|
-
onReady(this.dbo, this.db);
|
|
726
|
+
onReady(this.dbo as any, this.db);
|
|
587
727
|
} catch(err){
|
|
588
728
|
console.error("Prostgles: Error within onReady: \n", err)
|
|
589
729
|
}
|
|
@@ -593,16 +733,16 @@ export class Prostgles {
|
|
|
593
733
|
db: this.dbo,
|
|
594
734
|
_db: db,
|
|
595
735
|
pgp,
|
|
596
|
-
io: this.io,
|
|
736
|
+
io: this.opts.io,
|
|
597
737
|
destroy: async () => {
|
|
598
738
|
console.log("destroying prgl instance")
|
|
599
739
|
this.destroyed = true;
|
|
600
|
-
if(this.io){
|
|
601
|
-
this.io.on("connection", (socket) => {
|
|
740
|
+
if(this.opts.io){
|
|
741
|
+
this.opts.io.on("connection", (socket) => {
|
|
602
742
|
console.log("Socket connected to destroyed instance")
|
|
603
743
|
});
|
|
604
|
-
if(typeof this.io.close === "function"){
|
|
605
|
-
this.io.close();
|
|
744
|
+
if(typeof this.opts.io.close === "function"){
|
|
745
|
+
this.opts.io.close();
|
|
606
746
|
console.log("this.io.close")
|
|
607
747
|
}
|
|
608
748
|
}
|
|
@@ -628,8 +768,8 @@ export class Prostgles {
|
|
|
628
768
|
|
|
629
769
|
return this.db.multi(fileContent).then((data)=>{
|
|
630
770
|
console.log("Prostgles: SQL file executed successfuly \n -> " + filePath);
|
|
631
|
-
return
|
|
632
|
-
}).catch((err)=>{
|
|
771
|
+
return data
|
|
772
|
+
}).catch((err) => {
|
|
633
773
|
const { position, length } = err,
|
|
634
774
|
lines = fileContent.split("\n");
|
|
635
775
|
let errMsg = filePath + " error: ";
|
|
@@ -647,30 +787,31 @@ export class Prostgles {
|
|
|
647
787
|
});
|
|
648
788
|
}
|
|
649
789
|
|
|
650
|
-
|
|
651
|
-
|
|
790
|
+
/**
|
|
791
|
+
* Will return first sid value found in : http cookie or query params
|
|
792
|
+
* Based on sid names in auth
|
|
793
|
+
* @param localParams
|
|
794
|
+
* @returns string
|
|
795
|
+
*/
|
|
796
|
+
getSID(localParams: LocalParams): string {
|
|
797
|
+
if(!this.opts.auth) return null;
|
|
652
798
|
|
|
653
|
-
const {
|
|
799
|
+
const { sidKeyName } = this.opts.auth;
|
|
654
800
|
|
|
655
|
-
if(!
|
|
801
|
+
if(!sidKeyName || !localParams) return null;
|
|
656
802
|
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
803
|
+
if(localParams.socket){
|
|
804
|
+
const querySid = localParams.socket?.handshake?.query?.[sidKeyName];
|
|
805
|
+
if(!querySid){
|
|
806
|
+
const cookie_str = get(localParams.socket, "handshake.headers.cookie");
|
|
807
|
+
const cookie = parseCookieStr(cookie_str);
|
|
808
|
+
return cookie[sidKeyName];
|
|
809
|
+
}
|
|
662
810
|
|
|
663
|
-
if(
|
|
664
|
-
|
|
665
|
-
}
|
|
811
|
+
} else if(localParams.httpReq){
|
|
812
|
+
return localParams.httpReq?.cookies?.[sidKeyName];
|
|
666
813
|
|
|
667
|
-
|
|
668
|
-
const cookie_str = get(socket, "handshake.headers.cookie");
|
|
669
|
-
const cookie = parseCookieStr(cookie_str);
|
|
670
|
-
if(socket && cookie){
|
|
671
|
-
result.sidCookie = cookie[sidCookieName];
|
|
672
|
-
}
|
|
673
|
-
}
|
|
814
|
+
} else throw "socket OR httpReq missing from localParams";
|
|
674
815
|
|
|
675
816
|
function parseCookieStr(cookie_str: string): any {
|
|
676
817
|
if(!cookie_str || typeof cookie_str !== "string") return {}
|
|
@@ -680,38 +821,23 @@ export class Prostgles {
|
|
|
680
821
|
return prev
|
|
681
822
|
}, {});
|
|
682
823
|
}
|
|
683
|
-
|
|
684
|
-
result.sid = result.sidQuery || result.sidCookie;
|
|
685
|
-
|
|
686
|
-
return result;
|
|
687
824
|
}
|
|
688
825
|
|
|
689
|
-
async
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
const { getUser } = this.auth;
|
|
826
|
+
async getClientInfo(localParams: Pick<LocalParams, "socket" | "httpReq">): Promise<ClientInfo>{
|
|
827
|
+
if(this.opts.auth){
|
|
828
|
+
const { getUser, getClientUser } = this.opts.auth;
|
|
693
829
|
|
|
694
|
-
if(getUser){
|
|
695
|
-
const
|
|
696
|
-
return
|
|
830
|
+
if(getUser && localParams && (localParams.httpReq || localParams.socket)){
|
|
831
|
+
const sid = this.getSID(localParams);
|
|
832
|
+
return {
|
|
833
|
+
sid,
|
|
834
|
+
user: await getUser(sid, this.dbo as any, this.db),
|
|
835
|
+
clientUser: await getClientUser(sid, this.dbo as any, this.db)
|
|
836
|
+
}
|
|
697
837
|
}
|
|
698
838
|
}
|
|
699
839
|
|
|
700
|
-
return
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
async getUserFromCookieSession(socket: any): Promise<null | { user: any, clientUser: any }>{
|
|
704
|
-
|
|
705
|
-
// console.log("conn", socket.handshake.query, socket._session)
|
|
706
|
-
const params = this.getSID(socket);
|
|
707
|
-
|
|
708
|
-
const { getUser, getClientUser } = this.auth;
|
|
709
|
-
|
|
710
|
-
const user = await getUser(params, this.dbo, this.db, socket);
|
|
711
|
-
const clientUser = await getClientUser(params, this.dbo, this.db, socket);
|
|
712
|
-
|
|
713
|
-
if(!user) return undefined;
|
|
714
|
-
return { user, clientUser };
|
|
840
|
+
return {};
|
|
715
841
|
}
|
|
716
842
|
|
|
717
843
|
connectedSockets: any[] = [];
|
|
@@ -720,10 +846,10 @@ export class Prostgles {
|
|
|
720
846
|
|
|
721
847
|
if(!this.dbo) throw "dbo missing";
|
|
722
848
|
|
|
723
|
-
let publishParser = new PublishParser(this.publish, this.publishMethods, this.publishRawSQL, this.dbo, this.db, this);
|
|
849
|
+
let publishParser = new PublishParser(this.opts.publish, this.opts.publishMethods, this.opts.publishRawSQL, this.dbo, this.db, this as any);
|
|
724
850
|
this.publishParser = publishParser;
|
|
725
851
|
|
|
726
|
-
if(!this.io) return;
|
|
852
|
+
if(!this.opts.io) return;
|
|
727
853
|
|
|
728
854
|
/* Already initialised. Only reconnect sockets */
|
|
729
855
|
if(this.connectedSockets.length){
|
|
@@ -735,7 +861,7 @@ export class Prostgles {
|
|
|
735
861
|
}
|
|
736
862
|
|
|
737
863
|
/* Initialise */
|
|
738
|
-
this.io.on('connection', async (socket) => {
|
|
864
|
+
this.opts.io.on('connection', async (socket) => {
|
|
739
865
|
if(this.destroyed){
|
|
740
866
|
console.log("Socket connected to destroyed instance");
|
|
741
867
|
socket.disconnect();
|
|
@@ -747,7 +873,7 @@ export class Prostgles {
|
|
|
747
873
|
let { dbo, db, pgp } = this;
|
|
748
874
|
|
|
749
875
|
try {
|
|
750
|
-
if(this.onSocketConnect) await this.onSocketConnect(socket, dbo, db);
|
|
876
|
+
if(this.opts.onSocketConnect) await this.opts.onSocketConnect(socket, dbo as any, db);
|
|
751
877
|
|
|
752
878
|
|
|
753
879
|
/* RUN Client request from Publish.
|
|
@@ -762,8 +888,8 @@ export class Prostgles {
|
|
|
762
888
|
throw "socket missing??!!";
|
|
763
889
|
}
|
|
764
890
|
|
|
765
|
-
const
|
|
766
|
-
let valid_table_command_rules = await this.publishParser.getValidatedRequestRule({ tableName, command, socket },
|
|
891
|
+
const clientInfo = await this.getClientInfo({ socket });
|
|
892
|
+
let valid_table_command_rules = await this.publishParser.getValidatedRequestRule({ tableName, command, localParams: { socket } }, clientInfo);
|
|
767
893
|
if(valid_table_command_rules){
|
|
768
894
|
let res = await this.dbo[tableName][command](param1, param2, param3, valid_table_command_rules, { socket, has_rules: true });
|
|
769
895
|
cb(null, res);
|
|
@@ -783,8 +909,8 @@ export class Prostgles {
|
|
|
783
909
|
this.dbEventsManager.removeNotify(socket);
|
|
784
910
|
this.connectedSockets = this.connectedSockets.filter(s => s.id !== socket.id);
|
|
785
911
|
// subscriptions = subscriptions.filter(sub => sub.socket.id !== socket.id);
|
|
786
|
-
if(this.onSocketDisconnect){
|
|
787
|
-
this.onSocketDisconnect(socket, dbo);
|
|
912
|
+
if(this.opts.onSocketDisconnect){
|
|
913
|
+
this.opts.onSocketDisconnect(socket, dbo as any);
|
|
788
914
|
};
|
|
789
915
|
});
|
|
790
916
|
|
|
@@ -819,16 +945,21 @@ export class Prostgles {
|
|
|
819
945
|
pushSocketSchema = async (socket: any) => {
|
|
820
946
|
|
|
821
947
|
let auth: any = {};
|
|
822
|
-
if(this.auth){
|
|
823
|
-
const { register, login, logout,
|
|
824
|
-
|
|
948
|
+
if(this.opts.auth){
|
|
949
|
+
const { register, login, logout, sidKeyName } = this.opts.auth;
|
|
950
|
+
|
|
951
|
+
/**
|
|
952
|
+
* Why ??? Collision with socket.io ???
|
|
953
|
+
*/
|
|
954
|
+
if(sidKeyName === "sid") throw "sidQueryParamName cannot be 'sid' please provide another name.";
|
|
955
|
+
|
|
825
956
|
let handlers = [
|
|
826
957
|
{ func: register, ch: CHANNELS.REGISTER, name: "register" },
|
|
827
958
|
{ func: login, ch: CHANNELS.LOGIN, name: "login" },
|
|
828
959
|
{ func: logout, ch: CHANNELS.LOGOUT, name: "logout" }
|
|
829
960
|
].filter(h => h.func);
|
|
830
961
|
|
|
831
|
-
const usrData = await this.
|
|
962
|
+
const usrData = await this.getClientInfo({ socket });
|
|
832
963
|
if(usrData){
|
|
833
964
|
auth.user = usrData.clientUser;
|
|
834
965
|
handlers = handlers.filter(h => h.name === "logout");
|
|
@@ -843,7 +974,7 @@ export class Prostgles {
|
|
|
843
974
|
try {
|
|
844
975
|
if(!socket) throw "socket missing??!!";
|
|
845
976
|
|
|
846
|
-
const res = await func(params, dbo, db
|
|
977
|
+
const res = await func(params, dbo as any, db);
|
|
847
978
|
if(name === "login" && res && res.sid){
|
|
848
979
|
/* TODO: Re-send schema to client */
|
|
849
980
|
}
|
|
@@ -859,9 +990,9 @@ export class Prostgles {
|
|
|
859
990
|
|
|
860
991
|
}
|
|
861
992
|
|
|
862
|
-
let needType = this.publishRawSQL && typeof this.publishRawSQL === "function";
|
|
863
|
-
let DATA_TYPES = !needType? [] : await this.db.any("SELECT oid, typname FROM pg_type");
|
|
864
|
-
let USER_TABLES = !needType? [] : await this.db.any("SELECT relid, relname FROM pg_catalog.pg_statio_user_tables");
|
|
993
|
+
// let needType = this.publishRawSQL && typeof this.publishRawSQL === "function";
|
|
994
|
+
// let DATA_TYPES = !needType? [] : await this.db.any("SELECT oid, typname FROM pg_type");
|
|
995
|
+
// let USER_TABLES = !needType? [] : await this.db.any("SELECT relid, relname FROM pg_catalog.pg_statio_user_tables");
|
|
865
996
|
|
|
866
997
|
let schema: any = {};
|
|
867
998
|
let publishValidationError;
|
|
@@ -870,7 +1001,6 @@ export class Prostgles {
|
|
|
870
1001
|
const { dbo, db, pgp, publishParser } = this;
|
|
871
1002
|
try {
|
|
872
1003
|
schema = await publishParser.getSchemaFromPublish(socket);
|
|
873
|
-
// console.log("getSchemaFromPublish", Object.keys(schema), this.dboBuilder.tablesOrViews.map(t => `${t.name} (${t.columns.map(c => c.name).join(", ")})`))
|
|
874
1004
|
} catch(e){
|
|
875
1005
|
publishValidationError = "Server Error: PUBLISH VALIDATION ERROR";
|
|
876
1006
|
console.error(`\nProstgles PUBLISH VALIDATION ERROR (after socket connected):\n ->`, e);
|
|
@@ -881,73 +1011,88 @@ export class Prostgles {
|
|
|
881
1011
|
*/
|
|
882
1012
|
let fullSchema = [];
|
|
883
1013
|
let allTablesViews = this.dboBuilder.tablesOrViews;
|
|
884
|
-
if(this.publishRawSQL && typeof this.publishRawSQL === "function"){
|
|
1014
|
+
if(this.opts.publishRawSQL && typeof this.opts.publishRawSQL === "function"){
|
|
885
1015
|
const canRunSQL = async () => {
|
|
886
|
-
|
|
1016
|
+
const publishParams = await this.publishParser.getPublishParams({ socket })
|
|
1017
|
+
let res = await this.opts.publishRawSQL(publishParams as any);
|
|
887
1018
|
return Boolean(res && typeof res === "boolean" || res === "*");
|
|
888
1019
|
}
|
|
889
1020
|
|
|
890
|
-
// console.log("canRunSQL", canRunSQL, socket.handshake.headers["x-real-ip"]);//, allTablesViews);
|
|
891
|
-
|
|
892
1021
|
if(await canRunSQL()){
|
|
893
1022
|
socket.removeAllListeners(CHANNELS.SQL)
|
|
894
1023
|
socket.on(CHANNELS.SQL, async ({ query, params, options }: SQLRequest, cb = (...callback) => {}) => {
|
|
895
1024
|
|
|
896
|
-
if(!
|
|
897
|
-
cb("Dissallowed", null);
|
|
898
|
-
return;
|
|
899
|
-
}
|
|
1025
|
+
if(!this.dbo.sql) throw "Internal error: sql handler missing";
|
|
900
1026
|
|
|
901
|
-
|
|
902
|
-
|
|
1027
|
+
this.dbo.sql(query, params, options, { socket }).then(res => {
|
|
1028
|
+
cb(null, res)
|
|
1029
|
+
}).catch(err => {
|
|
1030
|
+
makeSocketError(cb, err);
|
|
1031
|
+
})
|
|
903
1032
|
|
|
904
|
-
|
|
1033
|
+
// if(!(await canRunSQL())) {
|
|
1034
|
+
// cb("Dissallowed", null);
|
|
1035
|
+
// return;
|
|
1036
|
+
// }
|
|
905
1037
|
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
try {
|
|
909
|
-
cb(null, pgp.as.format(query, params));
|
|
910
|
-
} catch (err){
|
|
911
|
-
cb(err.toString());
|
|
912
|
-
}
|
|
913
|
-
} else if(db) {
|
|
1038
|
+
// const { returnType }: SQLOptions = options || ({} as any);
|
|
1039
|
+
// if(returnType === "noticeSubscription"){
|
|
914
1040
|
|
|
915
|
-
|
|
916
|
-
.then(async (qres: any) => {
|
|
917
|
-
const { duration, fields, rows, command } = qres;
|
|
1041
|
+
// const sub = await this.dbEventsManager.addNotice(socket);
|
|
918
1042
|
|
|
919
|
-
|
|
920
|
-
|
|
1043
|
+
// cb(null, sub);
|
|
1044
|
+
// } else if(returnType === "statement"){
|
|
1045
|
+
// try {
|
|
1046
|
+
// cb(null, pgp.as.format(query, params));
|
|
1047
|
+
// } catch (err){
|
|
1048
|
+
// cb(err.toString());
|
|
1049
|
+
// }
|
|
1050
|
+
// } else if(db) {
|
|
1051
|
+
|
|
1052
|
+
// db.result(query, params)
|
|
1053
|
+
// .then(async (qres: any) => {
|
|
1054
|
+
// const { duration, fields, rows, command } = qres;
|
|
1055
|
+
|
|
1056
|
+
// if(command === "LISTEN"){
|
|
1057
|
+
// const sub = await this.dbEventsManager.addNotify(query, socket);
|
|
921
1058
|
|
|
922
|
-
|
|
1059
|
+
// cb(null, sub);
|
|
923
1060
|
|
|
924
|
-
|
|
925
|
-
|
|
1061
|
+
// } else if(returnType === "rows") {
|
|
1062
|
+
// cb(null, rows);
|
|
926
1063
|
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
1064
|
+
// } else if(returnType === "row") {
|
|
1065
|
+
// cb(null, rows[0]);
|
|
1066
|
+
|
|
1067
|
+
// } else if(returnType === "value") {
|
|
1068
|
+
// cb(null, Object.values(rows[0])[0]);
|
|
1069
|
+
|
|
1070
|
+
// } else if(returnType === "values") {
|
|
1071
|
+
// cb(null, rows.map(r => Object.values(r[0])));
|
|
1072
|
+
|
|
1073
|
+
// } else {
|
|
1074
|
+
// if(fields && DATA_TYPES.length){
|
|
1075
|
+
// qres.fields = fields.map(f => {
|
|
1076
|
+
// const dataType = DATA_TYPES.find(dt => +dt.oid === +f.dataTypeID),
|
|
1077
|
+
// tableName = USER_TABLES.find(t => +t.relid === +f.tableID);
|
|
933
1078
|
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
1079
|
+
// return {
|
|
1080
|
+
// ...f,
|
|
1081
|
+
// ...(dataType? { dataType: dataType.typname } : {}),
|
|
1082
|
+
// ...(tableName? { tableName: tableName.relname } : {}),
|
|
1083
|
+
// }
|
|
1084
|
+
// });
|
|
1085
|
+
// }
|
|
1086
|
+
// cb(null, qres)
|
|
1087
|
+
// }
|
|
943
1088
|
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
1089
|
+
// })
|
|
1090
|
+
// .catch(err => {
|
|
1091
|
+
// makeSocketError(cb, err);
|
|
1092
|
+
// // Promise.reject(err.toString());
|
|
1093
|
+
// });
|
|
949
1094
|
|
|
950
|
-
} else console.error("db missing");
|
|
1095
|
+
// } else console.error("db missing");
|
|
951
1096
|
});
|
|
952
1097
|
if(db){
|
|
953
1098
|
// let allTablesViews = await db.any(STEP2_GET_ALL_TABLES_AND_COLUMNS);
|
|
@@ -959,7 +1104,7 @@ export class Prostgles {
|
|
|
959
1104
|
|
|
960
1105
|
// let joinTables = [];
|
|
961
1106
|
let joinTables2 = [];
|
|
962
|
-
if(this.joins){
|
|
1107
|
+
if(this.opts.joins){
|
|
963
1108
|
// joinTables = Array.from(new Set(flat(this.dboBuilder.getJoins().map(j => j.tables)).filter(t => schema[t])));
|
|
964
1109
|
let _joinTables2 = this.dboBuilder.getJoinPaths()
|
|
965
1110
|
.filter(jp =>
|
|
@@ -1015,14 +1160,17 @@ type callback = {
|
|
|
1015
1160
|
|
|
1016
1161
|
|
|
1017
1162
|
type Request = {
|
|
1018
|
-
socket
|
|
1163
|
+
socket?: any;
|
|
1164
|
+
httpReq?: any;
|
|
1019
1165
|
}
|
|
1020
1166
|
|
|
1021
1167
|
type DboTable = Request & {
|
|
1022
1168
|
tableName: string;
|
|
1169
|
+
localParams: LocalParams;
|
|
1023
1170
|
}
|
|
1024
1171
|
type DboTableCommand = Request & DboTable & {
|
|
1025
1172
|
command: string;
|
|
1173
|
+
localParams: LocalParams;
|
|
1026
1174
|
}
|
|
1027
1175
|
|
|
1028
1176
|
// const insertParams: Array<keyof InsertRule> = ["fields", "forcedData", "returningFields", "validate"];
|
|
@@ -1082,7 +1230,7 @@ export function flat(arr){
|
|
|
1082
1230
|
let res = arr.reduce(function (farr, toFlatten) {
|
|
1083
1231
|
return farr.concat(Array.isArray(toFlatten) ? flat(toFlatten) : toFlatten);
|
|
1084
1232
|
}, []);
|
|
1085
|
-
|
|
1233
|
+
|
|
1086
1234
|
return res;
|
|
1087
1235
|
}
|
|
1088
1236
|
|
|
@@ -1090,11 +1238,11 @@ export class PublishParser {
|
|
|
1090
1238
|
publish: any;
|
|
1091
1239
|
publishMethods?: any;
|
|
1092
1240
|
publishRawSQL?: any;
|
|
1093
|
-
dbo: DbHandler
|
|
1241
|
+
dbo: DbHandler;
|
|
1094
1242
|
db: DB
|
|
1095
1243
|
prostgles: Prostgles;
|
|
1096
1244
|
|
|
1097
|
-
constructor(publish: any, publishMethods: any, publishRawSQL: any, dbo: DbHandler
|
|
1245
|
+
constructor(publish: any, publishMethods: any, publishRawSQL: any, dbo: DbHandler, db: DB, prostgles: Prostgles){
|
|
1098
1246
|
this.publish = publish;
|
|
1099
1247
|
this.publishMethods = publishMethods;
|
|
1100
1248
|
this.publishRawSQL = publishRawSQL;
|
|
@@ -1105,11 +1253,19 @@ export class PublishParser {
|
|
|
1105
1253
|
if(!this.dbo || !this.publish) throw "INTERNAL ERROR: dbo and/or publish missing";
|
|
1106
1254
|
}
|
|
1107
1255
|
|
|
1256
|
+
async getPublishParams(localParams: LocalParams, clientInfo?: ClientInfo): Promise<PublishParams> {
|
|
1257
|
+
return {
|
|
1258
|
+
...(clientInfo || await this.prostgles.getClientInfo(localParams)),
|
|
1259
|
+
dbo: this.dbo,
|
|
1260
|
+
db: this.db
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1108
1264
|
async getMethods(socket: any){
|
|
1109
1265
|
let methods = {};
|
|
1110
1266
|
|
|
1111
|
-
const
|
|
1112
|
-
const _methods = await applyParamsIfFunc(this.publishMethods,
|
|
1267
|
+
const publishParams = await this.getPublishParams({ socket });
|
|
1268
|
+
const _methods = await applyParamsIfFunc(this.publishMethods, publishParams);
|
|
1113
1269
|
|
|
1114
1270
|
if(_methods && Object.keys(_methods).length){
|
|
1115
1271
|
Object.keys(_methods).map(key => {
|
|
@@ -1129,8 +1285,9 @@ export class PublishParser {
|
|
|
1129
1285
|
* @param socket
|
|
1130
1286
|
* @param user
|
|
1131
1287
|
*/
|
|
1132
|
-
async getPublish(
|
|
1133
|
-
|
|
1288
|
+
async getPublish(localParams: LocalParams, clientInfo?: ClientInfo): Promise<PublishObject> {
|
|
1289
|
+
const publishParams: PublishParams = await this.getPublishParams(localParams, clientInfo)
|
|
1290
|
+
let _publish = await applyParamsIfFunc(this.publish, publishParams );
|
|
1134
1291
|
|
|
1135
1292
|
if(_publish === "*"){
|
|
1136
1293
|
let publish = {}
|
|
@@ -1142,12 +1299,12 @@ export class PublishParser {
|
|
|
1142
1299
|
|
|
1143
1300
|
return _publish;
|
|
1144
1301
|
}
|
|
1145
|
-
async getValidatedRequestRuleWusr({ tableName, command,
|
|
1146
|
-
const
|
|
1147
|
-
return await this.getValidatedRequestRule({ tableName, command,
|
|
1302
|
+
async getValidatedRequestRuleWusr({ tableName, command, localParams }: DboTableCommand): Promise<TableRule>{
|
|
1303
|
+
const clientInfo = await this.prostgles.getClientInfo(localParams);
|
|
1304
|
+
return await this.getValidatedRequestRule({ tableName, command, localParams }, clientInfo);
|
|
1148
1305
|
}
|
|
1149
1306
|
|
|
1150
|
-
async getValidatedRequestRule({ tableName, command,
|
|
1307
|
+
async getValidatedRequestRule({ tableName, command, localParams }: DboTableCommand, clientInfo: ClientInfo): Promise<TableRule>{
|
|
1151
1308
|
if(!this.dbo) throw "INTERNAL ERROR: dbo is missing";
|
|
1152
1309
|
|
|
1153
1310
|
if(!command || !tableName) throw "command OR tableName are missing";
|
|
@@ -1158,18 +1315,17 @@ export class PublishParser {
|
|
|
1158
1315
|
}
|
|
1159
1316
|
|
|
1160
1317
|
/* Must be local request -> allow everything */
|
|
1161
|
-
if(!socket) return undefined;
|
|
1318
|
+
if(!localParams || (!localParams.socket && !localParams.httpReq)) return undefined;
|
|
1162
1319
|
|
|
1163
1320
|
/* Must be from socket. Must have a publish */
|
|
1164
1321
|
if(!this.publish) throw "publish is missing";
|
|
1165
1322
|
|
|
1166
1323
|
/* Get any publish errors for socket */
|
|
1167
|
-
const schm =
|
|
1324
|
+
const schm = localParams?.socket?.prostgles?.schema?.[tableName]?.[command];
|
|
1168
1325
|
|
|
1169
|
-
// console.log(schm, get(socket, `prostgles.schema`));
|
|
1170
1326
|
if(schm && schm.err) throw schm.err;
|
|
1171
1327
|
|
|
1172
|
-
let table_rule = await this.getTableRules({ tableName,
|
|
1328
|
+
let table_rule = await this.getTableRules({ tableName, localParams }, clientInfo);
|
|
1173
1329
|
if(!table_rule) throw "Invalid or disallowed table: " + tableName;
|
|
1174
1330
|
|
|
1175
1331
|
if(command === "upsert"){
|
|
@@ -1183,14 +1339,14 @@ export class PublishParser {
|
|
|
1183
1339
|
} else throw `Invalid or disallowed command: ${command}`;
|
|
1184
1340
|
}
|
|
1185
1341
|
|
|
1186
|
-
async getTableRules({ tableName,
|
|
1342
|
+
async getTableRules({ tableName, localParams }: DboTable, clientInfo: ClientInfo): Promise<PublishTable> {
|
|
1187
1343
|
|
|
1188
1344
|
try {
|
|
1189
|
-
if(!
|
|
1345
|
+
if(!localParams || !tableName) throw "publish OR socket OR dbo OR tableName are missing";
|
|
1190
1346
|
|
|
1191
|
-
let _publish = await this.getPublish(
|
|
1347
|
+
let _publish = await this.getPublish(localParams, clientInfo);
|
|
1192
1348
|
|
|
1193
|
-
let table_rules = applyParamsIfFunc(_publish[tableName],
|
|
1349
|
+
let table_rules = _publish[tableName];// applyParamsIfFunc(_publish[tableName], localParams, this.dbo, this.db, user);
|
|
1194
1350
|
|
|
1195
1351
|
/* Get view or table specific rules */
|
|
1196
1352
|
const is_view = (this.dbo[tableName] as TableHandler | ViewHandler).is_view,
|
|
@@ -1200,7 +1356,7 @@ export class PublishParser {
|
|
|
1200
1356
|
if(table_rules){
|
|
1201
1357
|
|
|
1202
1358
|
/* All methods allowed. Add no limits for table rules */
|
|
1203
|
-
if([true, "*"].includes(table_rules)){
|
|
1359
|
+
if([true, "*"].includes(table_rules as any)){
|
|
1204
1360
|
table_rules = {};
|
|
1205
1361
|
MY_RULES.map(r => {
|
|
1206
1362
|
table_rules[r.rule] = { ...r.no_limits };
|
|
@@ -1217,10 +1373,10 @@ export class PublishParser {
|
|
|
1217
1373
|
if(table_rules[r.rule]){
|
|
1218
1374
|
r.methods.map(method => {
|
|
1219
1375
|
if(table_rules[method] === undefined){
|
|
1376
|
+
const publishedTable = (table_rules as PublishTable);
|
|
1377
|
+
if(method === "updateBatch" && !publishedTable.update){
|
|
1220
1378
|
|
|
1221
|
-
if(method === "
|
|
1222
|
-
|
|
1223
|
-
} else if(method === "upsert" && (!table_rules.update || !table_rules.insert)){
|
|
1379
|
+
} else if(method === "upsert" && (!publishedTable.update || !publishedTable.insert)){
|
|
1224
1380
|
// return;
|
|
1225
1381
|
} else {
|
|
1226
1382
|
table_rules[method] = {};
|
|
@@ -1274,14 +1430,14 @@ export class PublishParser {
|
|
|
1274
1430
|
const sr = MY_RULES.find(r => r.rule === "subscribe");
|
|
1275
1431
|
if(sr){
|
|
1276
1432
|
table_rules[sr.rule] = { ...sr.no_limits };
|
|
1277
|
-
table_rules.subscribeOne = { ...sr.no_limits };
|
|
1433
|
+
(table_rules as PublishTable).subscribeOne = { ...sr.no_limits };
|
|
1278
1434
|
}
|
|
1279
1435
|
}
|
|
1280
1436
|
});
|
|
1281
1437
|
}
|
|
1282
1438
|
}
|
|
1283
1439
|
|
|
1284
|
-
return table_rules;
|
|
1440
|
+
return table_rules as PublishTable;
|
|
1285
1441
|
} catch (e) {
|
|
1286
1442
|
throw e;
|
|
1287
1443
|
}
|
|
@@ -1295,14 +1451,14 @@ export class PublishParser {
|
|
|
1295
1451
|
|
|
1296
1452
|
try {
|
|
1297
1453
|
/* Publish tables and views based on socket */
|
|
1298
|
-
const
|
|
1299
|
-
let _publish = await this.getPublish(socket,
|
|
1454
|
+
const clientInfo = await this.prostgles.getClientInfo({ socket });
|
|
1455
|
+
let _publish = await this.getPublish(socket, clientInfo);
|
|
1300
1456
|
|
|
1301
1457
|
|
|
1302
1458
|
if(_publish && Object.keys(_publish).length){
|
|
1303
1459
|
let txKey = "tx";
|
|
1304
|
-
if(!this.prostgles.transactions) txKey = "";
|
|
1305
|
-
if(typeof this.prostgles.transactions === "string") txKey = this.prostgles.transactions;
|
|
1460
|
+
if(!this.prostgles.opts.transactions) txKey = "";
|
|
1461
|
+
if(typeof this.prostgles.opts.transactions === "string") txKey = this.prostgles.opts.transactions;
|
|
1306
1462
|
|
|
1307
1463
|
const tableNames = Object.keys(_publish).filter(k => !txKey || txKey !== k);
|
|
1308
1464
|
|
|
@@ -1315,7 +1471,7 @@ export class PublishParser {
|
|
|
1315
1471
|
`;
|
|
1316
1472
|
}
|
|
1317
1473
|
|
|
1318
|
-
const table_rules = await this.getTableRules({ socket, tableName },
|
|
1474
|
+
const table_rules = await this.getTableRules({ localParams: {socket}, tableName }, clientInfo);
|
|
1319
1475
|
|
|
1320
1476
|
if(table_rules && Object.keys(table_rules).length){
|
|
1321
1477
|
schema[tableName] = {};
|
|
@@ -1339,7 +1495,7 @@ export class PublishParser {
|
|
|
1339
1495
|
|
|
1340
1496
|
let err = null;
|
|
1341
1497
|
try {
|
|
1342
|
-
let valid_table_command_rules = await this.getValidatedRequestRule({ tableName, command: method, socket },
|
|
1498
|
+
let valid_table_command_rules = await this.getValidatedRequestRule({ tableName, command: method, localParams: {socket} }, clientInfo);
|
|
1343
1499
|
await this.dbo[tableName][method]({}, {}, {}, valid_table_command_rules, { socket, has_rules: true, testRule: true });
|
|
1344
1500
|
|
|
1345
1501
|
} catch(e) {
|
|
@@ -1364,8 +1520,6 @@ export class PublishParser {
|
|
|
1364
1520
|
throw e;
|
|
1365
1521
|
}
|
|
1366
1522
|
|
|
1367
|
-
// console.log(schema)
|
|
1368
|
-
|
|
1369
1523
|
return schema;
|
|
1370
1524
|
}
|
|
1371
1525
|
|