prostgles-server 1.5.119 → 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 +53 -28
- package/dist/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder.js +432 -113
- 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 +163 -78
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js +241 -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 +581 -175
- package/lib/FileManager.ts +546 -0
- package/lib/Prostgles.ts +424 -252
- 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 +83 -62
- package/tests/client/package.json +3 -3
- 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 +43 -1
- package/tests/isomorphic_queries.ts +33 -2
- package/tests/server/DBoGenerated.d.ts +192 -0
- package/tests/server/index.js +64 -26
- package/tests/server/index.ts +64 -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 } 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 = {
|
|
@@ -307,28 +349,97 @@ type Keywords = {
|
|
|
307
349
|
$not: string;
|
|
308
350
|
};
|
|
309
351
|
|
|
310
|
-
export type
|
|
352
|
+
export type DeepPartial<T> = {
|
|
353
|
+
[P in keyof T]?: DeepPartial<T[P]>;
|
|
354
|
+
};
|
|
355
|
+
export type I18N_CONFIG<LANG_IDS = { en: 1, fr: 1 }> = {
|
|
356
|
+
fallbackLang: keyof LANG_IDS;
|
|
357
|
+
column_labels?: DeepPartial<{
|
|
358
|
+
[table_name: string]: {
|
|
359
|
+
[column_name: string]: {
|
|
360
|
+
[lang_id in keyof LANG_IDS]: string
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}>;
|
|
364
|
+
}
|
|
365
|
+
|
|
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> = {
|
|
311
421
|
dbConnection: DbConnection;
|
|
312
422
|
dbOptions?: DbConnectionOpts;
|
|
313
423
|
tsGeneratedTypesDir?: string;
|
|
314
424
|
io?: any;
|
|
315
|
-
publish?: Publish
|
|
316
|
-
publishMethods?:
|
|
317
|
-
publishRawSQL?(
|
|
425
|
+
publish?: Publish<DBO>;
|
|
426
|
+
publishMethods?: PublishMethods<DBO>;
|
|
427
|
+
publishRawSQL?(params: PublishParams<DBO>): ( (boolean | "*") | Promise<(boolean | "*")>);
|
|
318
428
|
joins?: Joins;
|
|
319
429
|
schema?: string;
|
|
320
430
|
sqlFilePath?: string;
|
|
321
|
-
onReady(dbo:
|
|
322
|
-
// auth,
|
|
431
|
+
onReady(dbo: DBO, db: DB): void;
|
|
323
432
|
transactions?: string | boolean;
|
|
324
433
|
wsChannelNamePrefix?: string;
|
|
325
|
-
onSocketConnect?(socket: Socket, dbo:
|
|
326
|
-
onSocketDisconnect?(socket: Socket, dbo:
|
|
327
|
-
auth?: Auth
|
|
434
|
+
onSocketConnect?(socket: Socket, dbo: DBO, db?: DB);
|
|
435
|
+
onSocketDisconnect?(socket: Socket, dbo: DBO, db?: DB);
|
|
436
|
+
auth?: Auth<DBO>;
|
|
328
437
|
DEBUG_MODE?: boolean;
|
|
329
438
|
watchSchema?: boolean | "hotReloadMode" | ((event: { command: string; query: string }) => void);
|
|
330
439
|
keywords?: Keywords;
|
|
331
440
|
onNotice?: (msg: any) => void;
|
|
441
|
+
i18n?: I18N_CONFIG<AnyObject>;
|
|
442
|
+
fileTable?: FileTableConfig;
|
|
332
443
|
}
|
|
333
444
|
|
|
334
445
|
// interface ISocketSetup {
|
|
@@ -362,49 +473,69 @@ const DEFAULT_KEYWORDS = {
|
|
|
362
473
|
};
|
|
363
474
|
|
|
364
475
|
const fs = require('fs');
|
|
365
|
-
export class Prostgles {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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,
|
|
373
488
|
};
|
|
374
|
-
|
|
489
|
+
|
|
490
|
+
// dbConnection: DbConnection = {
|
|
491
|
+
// host: "localhost",
|
|
492
|
+
// port: 5432,
|
|
493
|
+
// application_name: "prostgles_app"
|
|
494
|
+
// };
|
|
495
|
+
// dbOptions: DbConnectionOpts;
|
|
375
496
|
db: DB;
|
|
376
497
|
pgp: PGP;
|
|
377
|
-
dbo: DbHandler
|
|
498
|
+
dbo: DbHandler;
|
|
378
499
|
dboBuilder: DboBuilder;
|
|
379
|
-
|
|
380
|
-
publishMethods?: publishMethods;
|
|
381
|
-
io: any;
|
|
382
|
-
publish?: Publish;
|
|
383
|
-
joins?: Joins;
|
|
384
|
-
schema: string = "public";
|
|
385
|
-
transactions?: string | boolean;
|
|
386
|
-
// auth,
|
|
387
|
-
publishRawSQL?: any;
|
|
388
|
-
wsChannelNamePrefix: string = "_psqlWS_";
|
|
389
|
-
onSocketConnect?(socket: Socket | any, dbo: any, db?: DB);
|
|
390
|
-
onSocketDisconnect?(socket: Socket | any, dbo: any, db?: DB);
|
|
391
|
-
sqlFilePath?: string;
|
|
392
|
-
tsGeneratedTypesDir?: string;
|
|
393
500
|
publishParser: PublishParser;
|
|
394
|
-
auth?: Auth;
|
|
395
|
-
DEBUG_MODE?: boolean = false;
|
|
396
|
-
watchSchema?: boolean | "hotReloadMode" | ((event: { command: string; query: string }) => void) = false;
|
|
397
|
-
private loaded = false;
|
|
398
|
-
keywords = DEFAULT_KEYWORDS;
|
|
399
|
-
onReady: (dbo: any, db: DB) => void;
|
|
400
501
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
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;
|
|
405
529
|
|
|
406
530
|
dbEventsManager: DBEventsManager;
|
|
407
531
|
|
|
532
|
+
|
|
533
|
+
fileManager?: FileManager;
|
|
534
|
+
|
|
535
|
+
isMedia(tableName: string){
|
|
536
|
+
return this.opts?.fileTable?.tableName === tableName;
|
|
537
|
+
}
|
|
538
|
+
|
|
408
539
|
constructor(params: ProstglesInitOptions){
|
|
409
540
|
if(!params) throw "ProstglesInitOptions missing";
|
|
410
541
|
if(!params.io) console.warn("io missing. WebSockets will not be set up");
|
|
@@ -414,14 +545,22 @@ export class Prostgles {
|
|
|
414
545
|
"transactions", "joins", "tsGeneratedTypesDir",
|
|
415
546
|
"onReady", "dbConnection", "dbOptions", "publishMethods", "io",
|
|
416
547
|
"publish", "schema", "publishRawSQL", "wsChannelNamePrefix", "onSocketConnect",
|
|
417
|
-
"onSocketDisconnect", "sqlFilePath", "auth", "DEBUG_MODE", "watchSchema"
|
|
548
|
+
"onSocketDisconnect", "sqlFilePath", "auth", "DEBUG_MODE", "watchSchema",
|
|
549
|
+
"i18n", "fileTable"
|
|
418
550
|
];
|
|
419
551
|
const unknownParams = Object.keys(params).filter((key: string) => !(config as string[]).includes(key))
|
|
420
552
|
if(unknownParams.length){
|
|
421
553
|
console.error(`Unrecognised ProstglesInitOptions params: ${unknownParams.join()}`);
|
|
422
554
|
}
|
|
423
555
|
|
|
424
|
-
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
|
+
|
|
425
564
|
this.keywords = {
|
|
426
565
|
...DEFAULT_KEYWORDS,
|
|
427
566
|
...params.keywords,
|
|
@@ -431,15 +570,16 @@ export class Prostgles {
|
|
|
431
570
|
destroyed = false;
|
|
432
571
|
|
|
433
572
|
async onSchemaChange(event: { command: string; query: string }){
|
|
434
|
-
|
|
573
|
+
const { watchSchema, onReady, tsGeneratedTypesDir } = this.opts;
|
|
574
|
+
if(watchSchema && this.loaded){
|
|
435
575
|
console.log("Schema changed");
|
|
436
576
|
|
|
437
|
-
if(typeof
|
|
577
|
+
if(typeof watchSchema === "function"){
|
|
438
578
|
/* Only call the provided func */
|
|
439
|
-
|
|
579
|
+
watchSchema(event);
|
|
440
580
|
|
|
441
|
-
} else if(
|
|
442
|
-
if(
|
|
581
|
+
} else if(watchSchema === "hotReloadMode") {
|
|
582
|
+
if(tsGeneratedTypesDir) {
|
|
443
583
|
/* Hot reload integration. Will only touch tsGeneratedTypesDir */
|
|
444
584
|
console.log("watchSchema: Re-writing TS schema");
|
|
445
585
|
|
|
@@ -447,10 +587,10 @@ export class Prostgles {
|
|
|
447
587
|
this.writeDBSchema(true);
|
|
448
588
|
}
|
|
449
589
|
|
|
450
|
-
} else if(
|
|
590
|
+
} else if(watchSchema === true){
|
|
451
591
|
/* Full re-init. Sockets must reconnect */
|
|
452
592
|
console.log("watchSchema: Full re-initialisation")
|
|
453
|
-
this.init(
|
|
593
|
+
this.init(onReady);
|
|
454
594
|
}
|
|
455
595
|
}
|
|
456
596
|
}
|
|
@@ -461,7 +601,7 @@ export class Prostgles {
|
|
|
461
601
|
|
|
462
602
|
getTSFileName(){
|
|
463
603
|
const fileName = "DBoGenerated.d.ts" //`dbo_${this.schema}_types.ts`;
|
|
464
|
-
const fullPath = (this.tsGeneratedTypesDir || "") + fileName;
|
|
604
|
+
const fullPath = (this.opts.tsGeneratedTypesDir || "") + fileName;
|
|
465
605
|
return { fileName, fullPath }
|
|
466
606
|
}
|
|
467
607
|
|
|
@@ -476,7 +616,7 @@ export class Prostgles {
|
|
|
476
616
|
|
|
477
617
|
writeDBSchema(force = false){
|
|
478
618
|
|
|
479
|
-
if(this.tsGeneratedTypesDir){
|
|
619
|
+
if(this.opts.tsGeneratedTypesDir){
|
|
480
620
|
const { fullPath, fileName } = this.getTSFileName();
|
|
481
621
|
const header = `/* This file was generated by Prostgles \n` +
|
|
482
622
|
// `* ${(new Date).toUTCString()} \n`
|
|
@@ -493,13 +633,14 @@ export class Prostgles {
|
|
|
493
633
|
}
|
|
494
634
|
}
|
|
495
635
|
|
|
496
|
-
async
|
|
497
|
-
this.dboBuilder = await DboBuilder.create(this);
|
|
498
|
-
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;
|
|
499
640
|
}
|
|
500
641
|
|
|
501
|
-
async init(onReady: (dbo:
|
|
502
|
-
db:
|
|
642
|
+
async init(onReady: (dbo: DBO, db: DB) => any): Promise<{
|
|
643
|
+
db: DbHandler;
|
|
503
644
|
_db: DB;
|
|
504
645
|
pgp: PGP;
|
|
505
646
|
io?: any;
|
|
@@ -508,14 +649,14 @@ export class Prostgles {
|
|
|
508
649
|
this.loaded = false;
|
|
509
650
|
|
|
510
651
|
|
|
511
|
-
if(this.watchSchema === "hotReloadMode" && !this.tsGeneratedTypesDir) {
|
|
652
|
+
if(this.opts.watchSchema === "hotReloadMode" && !this.opts.tsGeneratedTypesDir) {
|
|
512
653
|
throw "tsGeneratedTypesDir option is needed for watchSchema: hotReloadMode to work ";
|
|
513
654
|
}
|
|
514
655
|
|
|
515
656
|
/* 1. Connect to db */
|
|
516
657
|
if(!this.db){
|
|
517
|
-
const { db, pgp } = getDbConnection(this.dbConnection, this.dbOptions, this.DEBUG_MODE, notice => {
|
|
518
|
-
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);
|
|
519
660
|
if(this.dbEventsManager){
|
|
520
661
|
this.dbEventsManager.onNotice(notice)
|
|
521
662
|
}
|
|
@@ -527,32 +668,46 @@ export class Prostgles {
|
|
|
527
668
|
const { db, pgp } = this;
|
|
528
669
|
|
|
529
670
|
/* 2. Execute any SQL file if provided */
|
|
530
|
-
if(this.sqlFilePath){
|
|
531
|
-
await this.runSQLFile(this.sqlFilePath);
|
|
671
|
+
if(this.opts.sqlFilePath){
|
|
672
|
+
await this.runSQLFile(this.opts.sqlFilePath);
|
|
532
673
|
}
|
|
533
674
|
|
|
534
675
|
try {
|
|
535
676
|
/* 3. Make DBO object from all tables and views */
|
|
536
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();
|
|
537
688
|
|
|
538
|
-
this.writeDBSchema();
|
|
539
689
|
|
|
540
|
-
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
|
+
|
|
541
694
|
/* 3.9 Check auth config */
|
|
542
|
-
if(this.auth){
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
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 } ";
|
|
546
701
|
}
|
|
547
702
|
if(!getUser || !getClientUser) throw "getUser OR getClientUser missing from auth config";
|
|
548
703
|
}
|
|
549
704
|
|
|
550
|
-
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);
|
|
551
706
|
this.dboBuilder.publishParser = this.publishParser;
|
|
552
707
|
/* 4. Set publish and auth listeners */ //makeDBO(db, allTablesViews, pubSubManager, false)
|
|
553
708
|
await this.setSocketEvents();
|
|
554
709
|
|
|
555
|
-
} 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";
|
|
556
711
|
|
|
557
712
|
// if(this.watchSchema){
|
|
558
713
|
// if(!(await isSuperUser(db))) throw "Cannot watchSchema without a super user schema. Set watchSchema=false or provide a super user";
|
|
@@ -560,12 +715,15 @@ export class Prostgles {
|
|
|
560
715
|
|
|
561
716
|
this.dbEventsManager = new DBEventsManager(db, pgp);
|
|
562
717
|
|
|
718
|
+
|
|
719
|
+
this.writeDBSchema();
|
|
720
|
+
|
|
563
721
|
/* 5. Finish init and provide DBO object */
|
|
564
722
|
try {
|
|
565
723
|
if(this.destroyed) {
|
|
566
724
|
console.trace(1)
|
|
567
725
|
}
|
|
568
|
-
onReady(this.dbo, this.db);
|
|
726
|
+
onReady(this.dbo as any, this.db);
|
|
569
727
|
} catch(err){
|
|
570
728
|
console.error("Prostgles: Error within onReady: \n", err)
|
|
571
729
|
}
|
|
@@ -575,16 +733,16 @@ export class Prostgles {
|
|
|
575
733
|
db: this.dbo,
|
|
576
734
|
_db: db,
|
|
577
735
|
pgp,
|
|
578
|
-
io: this.io,
|
|
736
|
+
io: this.opts.io,
|
|
579
737
|
destroy: async () => {
|
|
580
738
|
console.log("destroying prgl instance")
|
|
581
739
|
this.destroyed = true;
|
|
582
|
-
if(this.io){
|
|
583
|
-
this.io.on("connection", (socket) => {
|
|
740
|
+
if(this.opts.io){
|
|
741
|
+
this.opts.io.on("connection", (socket) => {
|
|
584
742
|
console.log("Socket connected to destroyed instance")
|
|
585
743
|
});
|
|
586
|
-
if(typeof this.io.close === "function"){
|
|
587
|
-
this.io.close();
|
|
744
|
+
if(typeof this.opts.io.close === "function"){
|
|
745
|
+
this.opts.io.close();
|
|
588
746
|
console.log("this.io.close")
|
|
589
747
|
}
|
|
590
748
|
}
|
|
@@ -610,8 +768,8 @@ export class Prostgles {
|
|
|
610
768
|
|
|
611
769
|
return this.db.multi(fileContent).then((data)=>{
|
|
612
770
|
console.log("Prostgles: SQL file executed successfuly \n -> " + filePath);
|
|
613
|
-
return
|
|
614
|
-
}).catch((err)=>{
|
|
771
|
+
return data
|
|
772
|
+
}).catch((err) => {
|
|
615
773
|
const { position, length } = err,
|
|
616
774
|
lines = fileContent.split("\n");
|
|
617
775
|
let errMsg = filePath + " error: ";
|
|
@@ -629,30 +787,31 @@ export class Prostgles {
|
|
|
629
787
|
});
|
|
630
788
|
}
|
|
631
789
|
|
|
632
|
-
|
|
633
|
-
|
|
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;
|
|
634
798
|
|
|
635
|
-
const {
|
|
799
|
+
const { sidKeyName } = this.opts.auth;
|
|
636
800
|
|
|
637
|
-
if(!
|
|
801
|
+
if(!sidKeyName || !localParams) return null;
|
|
638
802
|
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
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
|
+
}
|
|
644
810
|
|
|
645
|
-
if(
|
|
646
|
-
|
|
647
|
-
}
|
|
811
|
+
} else if(localParams.httpReq){
|
|
812
|
+
return localParams.httpReq?.cookies?.[sidKeyName];
|
|
648
813
|
|
|
649
|
-
|
|
650
|
-
const cookie_str = get(socket, "handshake.headers.cookie");
|
|
651
|
-
const cookie = parseCookieStr(cookie_str);
|
|
652
|
-
if(socket && cookie){
|
|
653
|
-
result.sidCookie = cookie[sidCookieName];
|
|
654
|
-
}
|
|
655
|
-
}
|
|
814
|
+
} else throw "socket OR httpReq missing from localParams";
|
|
656
815
|
|
|
657
816
|
function parseCookieStr(cookie_str: string): any {
|
|
658
817
|
if(!cookie_str || typeof cookie_str !== "string") return {}
|
|
@@ -662,38 +821,23 @@ export class Prostgles {
|
|
|
662
821
|
return prev
|
|
663
822
|
}, {});
|
|
664
823
|
}
|
|
665
|
-
|
|
666
|
-
result.sid = result.sidQuery || result.sidCookie;
|
|
667
|
-
|
|
668
|
-
return result;
|
|
669
824
|
}
|
|
670
825
|
|
|
671
|
-
async
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
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;
|
|
675
829
|
|
|
676
|
-
if(getUser){
|
|
677
|
-
const
|
|
678
|
-
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
|
+
}
|
|
679
837
|
}
|
|
680
838
|
}
|
|
681
839
|
|
|
682
|
-
return
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
async getUserFromCookieSession(socket: any): Promise<null | { user: any, clientUser: any }>{
|
|
686
|
-
|
|
687
|
-
// console.log("conn", socket.handshake.query, socket._session)
|
|
688
|
-
const params = this.getSID(socket);
|
|
689
|
-
|
|
690
|
-
const { getUser, getClientUser } = this.auth;
|
|
691
|
-
|
|
692
|
-
const user = await getUser(params, this.dbo, this.db, socket);
|
|
693
|
-
const clientUser = await getClientUser(params, this.dbo, this.db, socket);
|
|
694
|
-
|
|
695
|
-
if(!user) return undefined;
|
|
696
|
-
return { user, clientUser };
|
|
840
|
+
return {};
|
|
697
841
|
}
|
|
698
842
|
|
|
699
843
|
connectedSockets: any[] = [];
|
|
@@ -702,10 +846,10 @@ export class Prostgles {
|
|
|
702
846
|
|
|
703
847
|
if(!this.dbo) throw "dbo missing";
|
|
704
848
|
|
|
705
|
-
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);
|
|
706
850
|
this.publishParser = publishParser;
|
|
707
851
|
|
|
708
|
-
if(!this.io) return;
|
|
852
|
+
if(!this.opts.io) return;
|
|
709
853
|
|
|
710
854
|
/* Already initialised. Only reconnect sockets */
|
|
711
855
|
if(this.connectedSockets.length){
|
|
@@ -717,7 +861,7 @@ export class Prostgles {
|
|
|
717
861
|
}
|
|
718
862
|
|
|
719
863
|
/* Initialise */
|
|
720
|
-
this.io.on('connection', async (socket) => {
|
|
864
|
+
this.opts.io.on('connection', async (socket) => {
|
|
721
865
|
if(this.destroyed){
|
|
722
866
|
console.log("Socket connected to destroyed instance");
|
|
723
867
|
socket.disconnect();
|
|
@@ -729,7 +873,7 @@ export class Prostgles {
|
|
|
729
873
|
let { dbo, db, pgp } = this;
|
|
730
874
|
|
|
731
875
|
try {
|
|
732
|
-
if(this.onSocketConnect) await this.onSocketConnect(socket, dbo, db);
|
|
876
|
+
if(this.opts.onSocketConnect) await this.opts.onSocketConnect(socket, dbo as any, db);
|
|
733
877
|
|
|
734
878
|
|
|
735
879
|
/* RUN Client request from Publish.
|
|
@@ -744,8 +888,8 @@ export class Prostgles {
|
|
|
744
888
|
throw "socket missing??!!";
|
|
745
889
|
}
|
|
746
890
|
|
|
747
|
-
const
|
|
748
|
-
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);
|
|
749
893
|
if(valid_table_command_rules){
|
|
750
894
|
let res = await this.dbo[tableName][command](param1, param2, param3, valid_table_command_rules, { socket, has_rules: true });
|
|
751
895
|
cb(null, res);
|
|
@@ -765,8 +909,8 @@ export class Prostgles {
|
|
|
765
909
|
this.dbEventsManager.removeNotify(socket);
|
|
766
910
|
this.connectedSockets = this.connectedSockets.filter(s => s.id !== socket.id);
|
|
767
911
|
// subscriptions = subscriptions.filter(sub => sub.socket.id !== socket.id);
|
|
768
|
-
if(this.onSocketDisconnect){
|
|
769
|
-
this.onSocketDisconnect(socket, dbo);
|
|
912
|
+
if(this.opts.onSocketDisconnect){
|
|
913
|
+
this.opts.onSocketDisconnect(socket, dbo as any);
|
|
770
914
|
};
|
|
771
915
|
});
|
|
772
916
|
|
|
@@ -801,16 +945,21 @@ export class Prostgles {
|
|
|
801
945
|
pushSocketSchema = async (socket: any) => {
|
|
802
946
|
|
|
803
947
|
let auth: any = {};
|
|
804
|
-
if(this.auth){
|
|
805
|
-
const { register, login, logout,
|
|
806
|
-
|
|
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
|
+
|
|
807
956
|
let handlers = [
|
|
808
957
|
{ func: register, ch: CHANNELS.REGISTER, name: "register" },
|
|
809
958
|
{ func: login, ch: CHANNELS.LOGIN, name: "login" },
|
|
810
959
|
{ func: logout, ch: CHANNELS.LOGOUT, name: "logout" }
|
|
811
960
|
].filter(h => h.func);
|
|
812
961
|
|
|
813
|
-
const usrData = await this.
|
|
962
|
+
const usrData = await this.getClientInfo({ socket });
|
|
814
963
|
if(usrData){
|
|
815
964
|
auth.user = usrData.clientUser;
|
|
816
965
|
handlers = handlers.filter(h => h.name === "logout");
|
|
@@ -825,7 +974,7 @@ export class Prostgles {
|
|
|
825
974
|
try {
|
|
826
975
|
if(!socket) throw "socket missing??!!";
|
|
827
976
|
|
|
828
|
-
const res = await func(params, dbo, db
|
|
977
|
+
const res = await func(params, dbo as any, db);
|
|
829
978
|
if(name === "login" && res && res.sid){
|
|
830
979
|
/* TODO: Re-send schema to client */
|
|
831
980
|
}
|
|
@@ -841,9 +990,9 @@ export class Prostgles {
|
|
|
841
990
|
|
|
842
991
|
}
|
|
843
992
|
|
|
844
|
-
let needType = this.publishRawSQL && typeof this.publishRawSQL === "function";
|
|
845
|
-
let DATA_TYPES = !needType? [] : await this.db.any("SELECT oid, typname FROM pg_type");
|
|
846
|
-
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");
|
|
847
996
|
|
|
848
997
|
let schema: any = {};
|
|
849
998
|
let publishValidationError;
|
|
@@ -852,7 +1001,6 @@ export class Prostgles {
|
|
|
852
1001
|
const { dbo, db, pgp, publishParser } = this;
|
|
853
1002
|
try {
|
|
854
1003
|
schema = await publishParser.getSchemaFromPublish(socket);
|
|
855
|
-
// console.log("getSchemaFromPublish", Object.keys(schema), this.dboBuilder.tablesOrViews.map(t => `${t.name} (${t.columns.map(c => c.name).join(", ")})`))
|
|
856
1004
|
} catch(e){
|
|
857
1005
|
publishValidationError = "Server Error: PUBLISH VALIDATION ERROR";
|
|
858
1006
|
console.error(`\nProstgles PUBLISH VALIDATION ERROR (after socket connected):\n ->`, e);
|
|
@@ -863,73 +1011,88 @@ export class Prostgles {
|
|
|
863
1011
|
*/
|
|
864
1012
|
let fullSchema = [];
|
|
865
1013
|
let allTablesViews = this.dboBuilder.tablesOrViews;
|
|
866
|
-
if(this.publishRawSQL && typeof this.publishRawSQL === "function"){
|
|
1014
|
+
if(this.opts.publishRawSQL && typeof this.opts.publishRawSQL === "function"){
|
|
867
1015
|
const canRunSQL = async () => {
|
|
868
|
-
|
|
1016
|
+
const publishParams = await this.publishParser.getPublishParams({ socket })
|
|
1017
|
+
let res = await this.opts.publishRawSQL(publishParams as any);
|
|
869
1018
|
return Boolean(res && typeof res === "boolean" || res === "*");
|
|
870
1019
|
}
|
|
871
1020
|
|
|
872
|
-
// console.log("canRunSQL", canRunSQL, socket.handshake.headers["x-real-ip"]);//, allTablesViews);
|
|
873
|
-
|
|
874
1021
|
if(await canRunSQL()){
|
|
875
1022
|
socket.removeAllListeners(CHANNELS.SQL)
|
|
876
1023
|
socket.on(CHANNELS.SQL, async ({ query, params, options }: SQLRequest, cb = (...callback) => {}) => {
|
|
877
1024
|
|
|
878
|
-
if(!
|
|
879
|
-
cb("Dissallowed", null);
|
|
880
|
-
return;
|
|
881
|
-
}
|
|
1025
|
+
if(!this.dbo.sql) throw "Internal error: sql handler missing";
|
|
882
1026
|
|
|
883
|
-
|
|
884
|
-
|
|
1027
|
+
this.dbo.sql(query, params, options, { socket }).then(res => {
|
|
1028
|
+
cb(null, res)
|
|
1029
|
+
}).catch(err => {
|
|
1030
|
+
makeSocketError(cb, err);
|
|
1031
|
+
})
|
|
885
1032
|
|
|
886
|
-
|
|
1033
|
+
// if(!(await canRunSQL())) {
|
|
1034
|
+
// cb("Dissallowed", null);
|
|
1035
|
+
// return;
|
|
1036
|
+
// }
|
|
887
1037
|
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
1038
|
+
// const { returnType }: SQLOptions = options || ({} as any);
|
|
1039
|
+
// if(returnType === "noticeSubscription"){
|
|
1040
|
+
|
|
1041
|
+
// const sub = await this.dbEventsManager.addNotice(socket);
|
|
1042
|
+
|
|
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) {
|
|
896
1051
|
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
1052
|
+
// db.result(query, params)
|
|
1053
|
+
// .then(async (qres: any) => {
|
|
1054
|
+
// const { duration, fields, rows, command } = qres;
|
|
900
1055
|
|
|
901
|
-
|
|
902
|
-
|
|
1056
|
+
// if(command === "LISTEN"){
|
|
1057
|
+
// const sub = await this.dbEventsManager.addNotify(query, socket);
|
|
903
1058
|
|
|
904
|
-
|
|
1059
|
+
// cb(null, sub);
|
|
905
1060
|
|
|
906
|
-
|
|
907
|
-
|
|
1061
|
+
// } else if(returnType === "rows") {
|
|
1062
|
+
// cb(null, rows);
|
|
908
1063
|
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
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);
|
|
915
1078
|
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
1079
|
+
// return {
|
|
1080
|
+
// ...f,
|
|
1081
|
+
// ...(dataType? { dataType: dataType.typname } : {}),
|
|
1082
|
+
// ...(tableName? { tableName: tableName.relname } : {}),
|
|
1083
|
+
// }
|
|
1084
|
+
// });
|
|
1085
|
+
// }
|
|
1086
|
+
// cb(null, qres)
|
|
1087
|
+
// }
|
|
925
1088
|
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
1089
|
+
// })
|
|
1090
|
+
// .catch(err => {
|
|
1091
|
+
// makeSocketError(cb, err);
|
|
1092
|
+
// // Promise.reject(err.toString());
|
|
1093
|
+
// });
|
|
931
1094
|
|
|
932
|
-
} else console.error("db missing");
|
|
1095
|
+
// } else console.error("db missing");
|
|
933
1096
|
});
|
|
934
1097
|
if(db){
|
|
935
1098
|
// let allTablesViews = await db.any(STEP2_GET_ALL_TABLES_AND_COLUMNS);
|
|
@@ -941,7 +1104,7 @@ export class Prostgles {
|
|
|
941
1104
|
|
|
942
1105
|
// let joinTables = [];
|
|
943
1106
|
let joinTables2 = [];
|
|
944
|
-
if(this.joins){
|
|
1107
|
+
if(this.opts.joins){
|
|
945
1108
|
// joinTables = Array.from(new Set(flat(this.dboBuilder.getJoins().map(j => j.tables)).filter(t => schema[t])));
|
|
946
1109
|
let _joinTables2 = this.dboBuilder.getJoinPaths()
|
|
947
1110
|
.filter(jp =>
|
|
@@ -997,14 +1160,17 @@ type callback = {
|
|
|
997
1160
|
|
|
998
1161
|
|
|
999
1162
|
type Request = {
|
|
1000
|
-
socket
|
|
1163
|
+
socket?: any;
|
|
1164
|
+
httpReq?: any;
|
|
1001
1165
|
}
|
|
1002
1166
|
|
|
1003
1167
|
type DboTable = Request & {
|
|
1004
1168
|
tableName: string;
|
|
1169
|
+
localParams: LocalParams;
|
|
1005
1170
|
}
|
|
1006
1171
|
type DboTableCommand = Request & DboTable & {
|
|
1007
1172
|
command: string;
|
|
1173
|
+
localParams: LocalParams;
|
|
1008
1174
|
}
|
|
1009
1175
|
|
|
1010
1176
|
// const insertParams: Array<keyof InsertRule> = ["fields", "forcedData", "returningFields", "validate"];
|
|
@@ -1064,7 +1230,7 @@ export function flat(arr){
|
|
|
1064
1230
|
let res = arr.reduce(function (farr, toFlatten) {
|
|
1065
1231
|
return farr.concat(Array.isArray(toFlatten) ? flat(toFlatten) : toFlatten);
|
|
1066
1232
|
}, []);
|
|
1067
|
-
|
|
1233
|
+
|
|
1068
1234
|
return res;
|
|
1069
1235
|
}
|
|
1070
1236
|
|
|
@@ -1072,11 +1238,11 @@ export class PublishParser {
|
|
|
1072
1238
|
publish: any;
|
|
1073
1239
|
publishMethods?: any;
|
|
1074
1240
|
publishRawSQL?: any;
|
|
1075
|
-
dbo: DbHandler
|
|
1241
|
+
dbo: DbHandler;
|
|
1076
1242
|
db: DB
|
|
1077
1243
|
prostgles: Prostgles;
|
|
1078
1244
|
|
|
1079
|
-
constructor(publish: any, publishMethods: any, publishRawSQL: any, dbo: DbHandler
|
|
1245
|
+
constructor(publish: any, publishMethods: any, publishRawSQL: any, dbo: DbHandler, db: DB, prostgles: Prostgles){
|
|
1080
1246
|
this.publish = publish;
|
|
1081
1247
|
this.publishMethods = publishMethods;
|
|
1082
1248
|
this.publishRawSQL = publishRawSQL;
|
|
@@ -1087,11 +1253,19 @@ export class PublishParser {
|
|
|
1087
1253
|
if(!this.dbo || !this.publish) throw "INTERNAL ERROR: dbo and/or publish missing";
|
|
1088
1254
|
}
|
|
1089
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
|
+
|
|
1090
1264
|
async getMethods(socket: any){
|
|
1091
1265
|
let methods = {};
|
|
1092
1266
|
|
|
1093
|
-
const
|
|
1094
|
-
const _methods = await applyParamsIfFunc(this.publishMethods,
|
|
1267
|
+
const publishParams = await this.getPublishParams({ socket });
|
|
1268
|
+
const _methods = await applyParamsIfFunc(this.publishMethods, publishParams);
|
|
1095
1269
|
|
|
1096
1270
|
if(_methods && Object.keys(_methods).length){
|
|
1097
1271
|
Object.keys(_methods).map(key => {
|
|
@@ -1111,8 +1285,9 @@ export class PublishParser {
|
|
|
1111
1285
|
* @param socket
|
|
1112
1286
|
* @param user
|
|
1113
1287
|
*/
|
|
1114
|
-
async getPublish(
|
|
1115
|
-
|
|
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 );
|
|
1116
1291
|
|
|
1117
1292
|
if(_publish === "*"){
|
|
1118
1293
|
let publish = {}
|
|
@@ -1124,12 +1299,12 @@ export class PublishParser {
|
|
|
1124
1299
|
|
|
1125
1300
|
return _publish;
|
|
1126
1301
|
}
|
|
1127
|
-
async getValidatedRequestRuleWusr({ tableName, command,
|
|
1128
|
-
const
|
|
1129
|
-
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);
|
|
1130
1305
|
}
|
|
1131
1306
|
|
|
1132
|
-
async getValidatedRequestRule({ tableName, command,
|
|
1307
|
+
async getValidatedRequestRule({ tableName, command, localParams }: DboTableCommand, clientInfo: ClientInfo): Promise<TableRule>{
|
|
1133
1308
|
if(!this.dbo) throw "INTERNAL ERROR: dbo is missing";
|
|
1134
1309
|
|
|
1135
1310
|
if(!command || !tableName) throw "command OR tableName are missing";
|
|
@@ -1140,18 +1315,17 @@ export class PublishParser {
|
|
|
1140
1315
|
}
|
|
1141
1316
|
|
|
1142
1317
|
/* Must be local request -> allow everything */
|
|
1143
|
-
if(!socket) return undefined;
|
|
1318
|
+
if(!localParams || (!localParams.socket && !localParams.httpReq)) return undefined;
|
|
1144
1319
|
|
|
1145
1320
|
/* Must be from socket. Must have a publish */
|
|
1146
1321
|
if(!this.publish) throw "publish is missing";
|
|
1147
1322
|
|
|
1148
1323
|
/* Get any publish errors for socket */
|
|
1149
|
-
const schm =
|
|
1324
|
+
const schm = localParams?.socket?.prostgles?.schema?.[tableName]?.[command];
|
|
1150
1325
|
|
|
1151
|
-
// console.log(schm, get(socket, `prostgles.schema`));
|
|
1152
1326
|
if(schm && schm.err) throw schm.err;
|
|
1153
1327
|
|
|
1154
|
-
let table_rule = await this.getTableRules({ tableName,
|
|
1328
|
+
let table_rule = await this.getTableRules({ tableName, localParams }, clientInfo);
|
|
1155
1329
|
if(!table_rule) throw "Invalid or disallowed table: " + tableName;
|
|
1156
1330
|
|
|
1157
1331
|
if(command === "upsert"){
|
|
@@ -1165,14 +1339,14 @@ export class PublishParser {
|
|
|
1165
1339
|
} else throw `Invalid or disallowed command: ${command}`;
|
|
1166
1340
|
}
|
|
1167
1341
|
|
|
1168
|
-
async getTableRules({ tableName,
|
|
1342
|
+
async getTableRules({ tableName, localParams }: DboTable, clientInfo: ClientInfo): Promise<PublishTable> {
|
|
1169
1343
|
|
|
1170
1344
|
try {
|
|
1171
|
-
if(!
|
|
1345
|
+
if(!localParams || !tableName) throw "publish OR socket OR dbo OR tableName are missing";
|
|
1172
1346
|
|
|
1173
|
-
let _publish = await this.getPublish(
|
|
1347
|
+
let _publish = await this.getPublish(localParams, clientInfo);
|
|
1174
1348
|
|
|
1175
|
-
let table_rules = applyParamsIfFunc(_publish[tableName],
|
|
1349
|
+
let table_rules = _publish[tableName];// applyParamsIfFunc(_publish[tableName], localParams, this.dbo, this.db, user);
|
|
1176
1350
|
|
|
1177
1351
|
/* Get view or table specific rules */
|
|
1178
1352
|
const is_view = (this.dbo[tableName] as TableHandler | ViewHandler).is_view,
|
|
@@ -1182,7 +1356,7 @@ export class PublishParser {
|
|
|
1182
1356
|
if(table_rules){
|
|
1183
1357
|
|
|
1184
1358
|
/* All methods allowed. Add no limits for table rules */
|
|
1185
|
-
if([true, "*"].includes(table_rules)){
|
|
1359
|
+
if([true, "*"].includes(table_rules as any)){
|
|
1186
1360
|
table_rules = {};
|
|
1187
1361
|
MY_RULES.map(r => {
|
|
1188
1362
|
table_rules[r.rule] = { ...r.no_limits };
|
|
@@ -1199,10 +1373,10 @@ export class PublishParser {
|
|
|
1199
1373
|
if(table_rules[r.rule]){
|
|
1200
1374
|
r.methods.map(method => {
|
|
1201
1375
|
if(table_rules[method] === undefined){
|
|
1376
|
+
const publishedTable = (table_rules as PublishTable);
|
|
1377
|
+
if(method === "updateBatch" && !publishedTable.update){
|
|
1202
1378
|
|
|
1203
|
-
if(method === "
|
|
1204
|
-
|
|
1205
|
-
} else if(method === "upsert" && (!table_rules.update || !table_rules.insert)){
|
|
1379
|
+
} else if(method === "upsert" && (!publishedTable.update || !publishedTable.insert)){
|
|
1206
1380
|
// return;
|
|
1207
1381
|
} else {
|
|
1208
1382
|
table_rules[method] = {};
|
|
@@ -1256,14 +1430,14 @@ export class PublishParser {
|
|
|
1256
1430
|
const sr = MY_RULES.find(r => r.rule === "subscribe");
|
|
1257
1431
|
if(sr){
|
|
1258
1432
|
table_rules[sr.rule] = { ...sr.no_limits };
|
|
1259
|
-
table_rules.subscribeOne = { ...sr.no_limits };
|
|
1433
|
+
(table_rules as PublishTable).subscribeOne = { ...sr.no_limits };
|
|
1260
1434
|
}
|
|
1261
1435
|
}
|
|
1262
1436
|
});
|
|
1263
1437
|
}
|
|
1264
1438
|
}
|
|
1265
1439
|
|
|
1266
|
-
return table_rules;
|
|
1440
|
+
return table_rules as PublishTable;
|
|
1267
1441
|
} catch (e) {
|
|
1268
1442
|
throw e;
|
|
1269
1443
|
}
|
|
@@ -1277,14 +1451,14 @@ export class PublishParser {
|
|
|
1277
1451
|
|
|
1278
1452
|
try {
|
|
1279
1453
|
/* Publish tables and views based on socket */
|
|
1280
|
-
const
|
|
1281
|
-
let _publish = await this.getPublish(socket,
|
|
1454
|
+
const clientInfo = await this.prostgles.getClientInfo({ socket });
|
|
1455
|
+
let _publish = await this.getPublish(socket, clientInfo);
|
|
1282
1456
|
|
|
1283
1457
|
|
|
1284
1458
|
if(_publish && Object.keys(_publish).length){
|
|
1285
1459
|
let txKey = "tx";
|
|
1286
|
-
if(!this.prostgles.transactions) txKey = "";
|
|
1287
|
-
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;
|
|
1288
1462
|
|
|
1289
1463
|
const tableNames = Object.keys(_publish).filter(k => !txKey || txKey !== k);
|
|
1290
1464
|
|
|
@@ -1297,7 +1471,7 @@ export class PublishParser {
|
|
|
1297
1471
|
`;
|
|
1298
1472
|
}
|
|
1299
1473
|
|
|
1300
|
-
const table_rules = await this.getTableRules({ socket, tableName },
|
|
1474
|
+
const table_rules = await this.getTableRules({ localParams: {socket}, tableName }, clientInfo);
|
|
1301
1475
|
|
|
1302
1476
|
if(table_rules && Object.keys(table_rules).length){
|
|
1303
1477
|
schema[tableName] = {};
|
|
@@ -1321,7 +1495,7 @@ export class PublishParser {
|
|
|
1321
1495
|
|
|
1322
1496
|
let err = null;
|
|
1323
1497
|
try {
|
|
1324
|
-
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);
|
|
1325
1499
|
await this.dbo[tableName][method]({}, {}, {}, valid_table_command_rules, { socket, has_rules: true, testRule: true });
|
|
1326
1500
|
|
|
1327
1501
|
} catch(e) {
|
|
@@ -1346,8 +1520,6 @@ export class PublishParser {
|
|
|
1346
1520
|
throw e;
|
|
1347
1521
|
}
|
|
1348
1522
|
|
|
1349
|
-
// console.log(schema)
|
|
1350
|
-
|
|
1351
1523
|
return schema;
|
|
1352
1524
|
}
|
|
1353
1525
|
|