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/DboBuilder.ts
CHANGED
|
@@ -10,20 +10,63 @@ declare global { export interface Promise<T> extends Bluebird<T> {} }
|
|
|
10
10
|
import * as pgPromise from 'pg-promise';
|
|
11
11
|
import pg = require('pg-promise/typescript/pg-subset');
|
|
12
12
|
import {
|
|
13
|
-
ColumnInfo, ValidatedColumnInfo, FieldFilter, SelectParams, SubscribeParams, OrderBy, InsertParams, UpdateParams, DeleteParams,
|
|
13
|
+
ColumnInfo, ValidatedColumnInfo, FieldFilter, SelectParams, SubscribeParams, OrderBy, InsertParams, UpdateParams, DeleteParams, SQLOptions,
|
|
14
14
|
DbJoinMaker,
|
|
15
15
|
unpatchText,
|
|
16
16
|
isEmpty,
|
|
17
17
|
asName,
|
|
18
18
|
PG_COLUMN_UDT_DATA_TYPE,
|
|
19
19
|
TS_PG_Types,
|
|
20
|
+
TableInfo as TInfo,
|
|
21
|
+
SQLHandler,
|
|
22
|
+
AnyObject,
|
|
20
23
|
} from "prostgles-types";
|
|
21
24
|
|
|
25
|
+
export type Media = {
|
|
26
|
+
"id"?: string;
|
|
27
|
+
"title"?: string;
|
|
28
|
+
"extension"?: string;
|
|
29
|
+
"content_type"?: string;
|
|
30
|
+
"local_url"?: string;
|
|
31
|
+
"url"?: string;
|
|
32
|
+
"signed_url"?: string;
|
|
33
|
+
"signed_url_expires"?: number;
|
|
34
|
+
"name"?: string;
|
|
35
|
+
"original_name"?: string;
|
|
36
|
+
"etag"?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface TxHandler {
|
|
40
|
+
[key: string]: TableHandler | ViewHandler;
|
|
41
|
+
}
|
|
42
|
+
export type TxCB = {
|
|
43
|
+
(t: TxHandler, _t: pgPromise.ITask<{}>): (any | void);
|
|
44
|
+
}
|
|
45
|
+
export type TX = {
|
|
46
|
+
(t: TxCB): Promise<(any | void)>;
|
|
47
|
+
}
|
|
22
48
|
export type DbHandler = {
|
|
23
49
|
[key: string]: Partial<TableHandler>;
|
|
24
|
-
} &
|
|
25
|
-
|
|
26
|
-
|
|
50
|
+
} &
|
|
51
|
+
DbJoinMaker &
|
|
52
|
+
{
|
|
53
|
+
sql?: SQLHandler
|
|
54
|
+
} & {
|
|
55
|
+
tx?: TX
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// <TXKey extends string = "tx">
|
|
59
|
+
// & {
|
|
60
|
+
// [K in TXKey]: TX
|
|
61
|
+
// };
|
|
62
|
+
|
|
63
|
+
// const d: DbHandler = { } as any;
|
|
64
|
+
// d.
|
|
65
|
+
// export type DbHandlerTX = { [key: string]: TX } | DbHandler;
|
|
66
|
+
// export type DbHandlerTX = DbHandler
|
|
67
|
+
// & Partial<{
|
|
68
|
+
// [key: string]: TX
|
|
69
|
+
// }>
|
|
27
70
|
|
|
28
71
|
import { get } from "./utils";
|
|
29
72
|
import { getNewQuery, makeQuery, COMPUTED_FIELDS, SelectItem, FieldSpec, asNameAlias, SelectItemBuilder, FUNCTIONS } from "./QueryBuilder";
|
|
@@ -40,7 +83,7 @@ export const pgp: PGP = pgPromise({
|
|
|
40
83
|
// ,query: function (e) { console.log({psql: e.query, params: e.params}); }
|
|
41
84
|
});
|
|
42
85
|
|
|
43
|
-
export type TableInfo = {
|
|
86
|
+
export type TableInfo = TInfo & {
|
|
44
87
|
schema: string;
|
|
45
88
|
name: string;
|
|
46
89
|
oid: number;
|
|
@@ -57,14 +100,24 @@ export type TableOrViewInfo = TableInfo & ViewInfo & {
|
|
|
57
100
|
}
|
|
58
101
|
|
|
59
102
|
export type LocalParams = {
|
|
103
|
+
httpReq?: any;
|
|
60
104
|
socket?: any;
|
|
61
105
|
func?: () => any;
|
|
62
106
|
has_rules?: boolean;
|
|
63
107
|
testRule?: boolean;
|
|
64
108
|
tableAlias?: string;
|
|
65
109
|
// subOne?: boolean;
|
|
66
|
-
dbTX?:
|
|
110
|
+
dbTX?: TxHandler;
|
|
111
|
+
|
|
112
|
+
// localTX?: pgPromise.ITask<{}>;
|
|
113
|
+
localDBTX?: DbHandler;
|
|
114
|
+
|
|
67
115
|
returnQuery?: boolean;
|
|
116
|
+
|
|
117
|
+
nestedJoin?: {
|
|
118
|
+
depth: number;
|
|
119
|
+
data: AnyObject;
|
|
120
|
+
}
|
|
68
121
|
}
|
|
69
122
|
function replaceNonAlphaNumeric(string: string): string {
|
|
70
123
|
return string.replace(/[\W_]+/g,"_");
|
|
@@ -129,13 +182,14 @@ type Query = {
|
|
|
129
182
|
}
|
|
130
183
|
|
|
131
184
|
export type JoinInfo = {
|
|
132
|
-
table: string,
|
|
133
|
-
on: [[string, string]],
|
|
134
185
|
expectOne: boolean,
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
186
|
+
paths: {
|
|
187
|
+
table: string,
|
|
188
|
+
on: [[string, string]],
|
|
189
|
+
source: string,
|
|
190
|
+
target: string
|
|
191
|
+
}[]
|
|
192
|
+
}
|
|
139
193
|
type JoinPaths = {
|
|
140
194
|
t1: string;
|
|
141
195
|
t2: string;
|
|
@@ -303,11 +357,14 @@ export class ViewHandler {
|
|
|
303
357
|
joinGraph: Graph;
|
|
304
358
|
joinPaths: JoinPaths;
|
|
305
359
|
dboBuilder: DboBuilder;
|
|
360
|
+
|
|
306
361
|
t: pgPromise.ITask<{}>;
|
|
362
|
+
|
|
307
363
|
is_view: boolean = true;
|
|
308
364
|
filterDef: string = "";
|
|
309
365
|
|
|
310
366
|
pubSubManager: PubSubManager;
|
|
367
|
+
is_media: boolean = false;
|
|
311
368
|
constructor(db: DB, tableOrViewInfo: TableOrViewInfo, pubSubManager: PubSubManager, dboBuilder: DboBuilder, t?: pgPromise.ITask<{}>, joinPaths?: JoinPaths){
|
|
312
369
|
if(!db || !tableOrViewInfo) throw "";
|
|
313
370
|
|
|
@@ -334,7 +391,7 @@ export class ViewHandler {
|
|
|
334
391
|
// if(this.tsDataName === "T") this.tsDataName = this.tsDataName + "_";
|
|
335
392
|
// this.tsDataDef = `export type ${this.tsDataName} = {\n`;
|
|
336
393
|
this.columns.map(({ name, udt_name }) => {
|
|
337
|
-
this.tsColumnDefs.push(`${escapeTSNames(name, false)}?: ${postgresToTsType(udt_name)};`);
|
|
394
|
+
this.tsColumnDefs.push(`${escapeTSNames(name, false)}?: ${postgresToTsType(udt_name) as string};`);
|
|
338
395
|
});
|
|
339
396
|
// this.tsDataDef += "};";
|
|
340
397
|
// this.tsDataDef += "\n";
|
|
@@ -376,12 +433,15 @@ export class ViewHandler {
|
|
|
376
433
|
return []
|
|
377
434
|
}
|
|
378
435
|
|
|
379
|
-
async validateViewRules(fields: FieldFilter, filterFields: FieldFilter, returningFields: FieldFilter, forcedFilter: object, rule:
|
|
436
|
+
async validateViewRules(fields: FieldFilter, filterFields: FieldFilter, returningFields: FieldFilter, forcedFilter: object, rule: "update" | "select" | "insert" | "delete"){
|
|
380
437
|
|
|
381
438
|
/* Safely test publish rules */
|
|
382
439
|
if(fields) {
|
|
383
440
|
try {
|
|
384
|
-
this.parseFieldFilter(fields);
|
|
441
|
+
const _fields = this.parseFieldFilter(fields);
|
|
442
|
+
if(this.is_media && rule === "insert" && !_fields.includes("id")){
|
|
443
|
+
throw "Must allow id insert for media table"
|
|
444
|
+
}
|
|
385
445
|
} catch(e){
|
|
386
446
|
throw ` issue with publish.${this.name}.${rule}.fields: \nVALUE: ` + JSON.stringify(fields, null, 2) + "\nERROR: " + JSON.stringify(e, null, 2);
|
|
387
447
|
}
|
|
@@ -430,7 +490,7 @@ export class ViewHandler {
|
|
|
430
490
|
}
|
|
431
491
|
|
|
432
492
|
getJoins(source: string, target: string, path?: string[]): JoinInfo {
|
|
433
|
-
let
|
|
493
|
+
let paths: JoinInfo["paths"] = [];
|
|
434
494
|
|
|
435
495
|
if(!this.joinPaths) throw "Joins dissallowed";
|
|
436
496
|
|
|
@@ -450,7 +510,7 @@ export class ViewHandler {
|
|
|
450
510
|
if(!jp || !this.joinPaths.find(j => path? j.path.join() === path.join() : j.t1 === source && j.t2 === target)) throw `Joining ${source} <-...-> ${target} dissallowed or missing`;
|
|
451
511
|
|
|
452
512
|
/* Make the join chain info excluding root table */
|
|
453
|
-
|
|
513
|
+
paths = (path || jp.path).slice(1).map((t2, i, arr) => {
|
|
454
514
|
const t1 = i === 0? source : arr[i-1];
|
|
455
515
|
|
|
456
516
|
if(!this.joins) this.joins = JSON.parse(JSON.stringify(this.dboBuilder.joins));
|
|
@@ -482,7 +542,22 @@ export class ViewHandler {
|
|
|
482
542
|
on
|
|
483
543
|
};
|
|
484
544
|
});
|
|
485
|
-
|
|
545
|
+
let expectOne = false;
|
|
546
|
+
paths.map(({ source, target, on }, i) => {
|
|
547
|
+
// if(expectOne && on.length === 1){
|
|
548
|
+
// const sourceCol = on[0][1];
|
|
549
|
+
// const targetCol = on[0][0];
|
|
550
|
+
|
|
551
|
+
// const sCol = this.dboBuilder.dbo[source].columns.find(c => c.name === sourceCol)
|
|
552
|
+
// const tCol = this.dboBuilder.dbo[target].columns.find(c => c.name === targetCol)
|
|
553
|
+
// console.log({ sourceCol, targetCol, sCol, source, tCol, target, on})
|
|
554
|
+
// expectOne = sCol.is_pkey && tCol.is_pkey
|
|
555
|
+
// }
|
|
556
|
+
})
|
|
557
|
+
return {
|
|
558
|
+
paths,
|
|
559
|
+
expectOne
|
|
560
|
+
};
|
|
486
561
|
}
|
|
487
562
|
|
|
488
563
|
|
|
@@ -490,13 +565,38 @@ export class ViewHandler {
|
|
|
490
565
|
if(filter === null || filter && !isPojoObject(filter)) throw `invalid filter -> ${JSON.stringify(filter)} \nExpecting: undefined | {} | { field_name: "value" } | { field: { $gt: 22 } } ... `;
|
|
491
566
|
}
|
|
492
567
|
|
|
493
|
-
async getInfo(param1
|
|
568
|
+
async getInfo(param1?, param2?, param3?, tableRules?: TableRule, localParams?: LocalParams): Promise<{ oid: number; comment: string; is_media: boolean; has_media?: "one" | "many" }>{
|
|
494
569
|
const p = this.getValidatedRules(tableRules, localParams);
|
|
495
570
|
if(!p.select.getInfo) throw "Not allowed";
|
|
496
571
|
|
|
572
|
+
let has_media = undefined;
|
|
573
|
+
|
|
574
|
+
const mediaTable = this.dboBuilder.prostgles?.opts?.fileTable?.tableName;
|
|
575
|
+
if(!this.is_media && mediaTable){
|
|
576
|
+
if(this.dboBuilder.prostgles?.opts?.fileTable?.referencedTables?.[this.name]){
|
|
577
|
+
has_media = this.dboBuilder.prostgles?.opts?.fileTable?.referencedTables?.[this.name];
|
|
578
|
+
} else {
|
|
579
|
+
const jp = this.dboBuilder.joinPaths.find(jp => jp.t1 === this.name && jp.t2 === mediaTable);
|
|
580
|
+
if(jp && jp.path.length < 4){
|
|
581
|
+
await Promise.all(jp.path.map(async tableName => {
|
|
582
|
+
const cols = (await this.dboBuilder.dbo[tableName].getColumns()).filter(c => jp.path.includes(c.references?.ftable));
|
|
583
|
+
if(cols.length && has_media !== "many"){
|
|
584
|
+
if(cols.find(c => !c.is_pkey)){
|
|
585
|
+
has_media = "many"
|
|
586
|
+
} else {
|
|
587
|
+
has_media = "one"
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
}));
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
497
595
|
return {
|
|
498
596
|
oid: this.tableOrViewInfo.oid,
|
|
499
597
|
comment: this.tableOrViewInfo.comment,
|
|
598
|
+
is_media: this.is_media, // this.name === this.dboBuilder.prostgles?.opts?.fileTable?.tableName
|
|
599
|
+
has_media,
|
|
500
600
|
}
|
|
501
601
|
}
|
|
502
602
|
|
|
@@ -513,8 +613,8 @@ export class ViewHandler {
|
|
|
513
613
|
let _lang = lang;
|
|
514
614
|
return this.columns.map(c => {
|
|
515
615
|
let label = c.comment || c.name;
|
|
516
|
-
const iConf = this.dboBuilder.prostgles?.i18n?.column_labels?.[this.name]?.[c.name];
|
|
517
|
-
const fallbackLang = this.dboBuilder.prostgles?.i18n?.fallbackLang;
|
|
616
|
+
const iConf = this.dboBuilder.prostgles?.opts?.i18n?.column_labels?.[this.name]?.[c.name];
|
|
617
|
+
const fallbackLang = this.dboBuilder.prostgles?.opts?.i18n?.fallbackLang;
|
|
518
618
|
_lang = _lang || fallbackLang as string;
|
|
519
619
|
|
|
520
620
|
if((lang || fallbackLang) && iConf){
|
|
@@ -680,9 +780,10 @@ export class ViewHandler {
|
|
|
680
780
|
async find(filter?: Filter, selectParams?: SelectParams , param3_unused = null, tableRules?: TableRule, localParams?: LocalParams): Promise<any[]>{
|
|
681
781
|
try {
|
|
682
782
|
filter = filter || {};
|
|
783
|
+
const allowedReturnTypes: Array<SelectParams["returnType"]> = ["row", "value", "values"]
|
|
683
784
|
const { returnType } = selectParams || {};
|
|
684
|
-
if(returnType && !
|
|
685
|
-
throw `returnType (${returnType}) can only be ${
|
|
785
|
+
if(returnType && !allowedReturnTypes.includes(returnType)){
|
|
786
|
+
throw `returnType (${returnType}) can only be ${allowedReturnTypes.join(" OR ")}`
|
|
686
787
|
}
|
|
687
788
|
|
|
688
789
|
const { testRule = false, returnQuery = false } = localParams || {};
|
|
@@ -715,7 +816,6 @@ export class ViewHandler {
|
|
|
715
816
|
|
|
716
817
|
let q = await getNewQuery(this as unknown as TableHandler, filter, selectParams, param3_unused, tableRules, localParams),
|
|
717
818
|
_query = makeQuery(this as unknown as TableHandler, q, undefined, undefined, selectParams);
|
|
718
|
-
// console.log(_query)
|
|
719
819
|
|
|
720
820
|
if(testRule){
|
|
721
821
|
try {
|
|
@@ -727,8 +827,6 @@ export class ViewHandler {
|
|
|
727
827
|
}
|
|
728
828
|
}
|
|
729
829
|
|
|
730
|
-
// console.log(_query);
|
|
731
|
-
|
|
732
830
|
if(returnQuery) return (_query as unknown as any[]);
|
|
733
831
|
if(["row", "value"].includes(returnType)) {
|
|
734
832
|
return (this.t || this.db).oneOrNone(_query).then(data => {
|
|
@@ -926,21 +1024,23 @@ export class ViewHandler {
|
|
|
926
1024
|
|
|
927
1025
|
const makeTableChain = (finalFilter: string) => {
|
|
928
1026
|
|
|
929
|
-
let joinPaths: JoinInfo = [];
|
|
1027
|
+
let joinPaths: JoinInfo["paths"] = [];
|
|
1028
|
+
let expectOne = true;
|
|
930
1029
|
tables.map((t2, depth) => {
|
|
931
1030
|
let t1 = depth? tables[depth - 1] : thisTable;
|
|
932
1031
|
let exactPaths = [t1, t2];
|
|
933
1032
|
|
|
934
1033
|
if(!depth && eConfig.shortestJoin) exactPaths = undefined;
|
|
935
|
-
|
|
936
|
-
|
|
1034
|
+
const jinf= this.getJoins(t1, t2, exactPaths);
|
|
1035
|
+
expectOne = expectOne && jinf.expectOne
|
|
1036
|
+
joinPaths = joinPaths.concat(jinf.paths);
|
|
937
1037
|
});
|
|
938
1038
|
|
|
939
|
-
let r = makeJoin(joinPaths, 0);
|
|
940
|
-
// console.log(r);
|
|
1039
|
+
let r = makeJoin({ paths: joinPaths, expectOne }, 0);
|
|
941
1040
|
return r;
|
|
942
1041
|
|
|
943
|
-
function makeJoin(
|
|
1042
|
+
function makeJoin(joinInfo: JoinInfo, ji: number) {
|
|
1043
|
+
const { paths } = joinInfo;
|
|
944
1044
|
const jp = paths[ji];
|
|
945
1045
|
|
|
946
1046
|
let prevTable = ji? paths[ji - 1].table : jp.source;
|
|
@@ -951,7 +1051,6 @@ export class ViewHandler {
|
|
|
951
1051
|
let cond = `${jp.on.map(([c1, c2]) =>
|
|
952
1052
|
`${prevTableAlias}.${asName(c1)} = ${tableAlias}.${asName(c2)}`).join("\n AND ")
|
|
953
1053
|
}`;
|
|
954
|
-
// console.log(join, cond);
|
|
955
1054
|
|
|
956
1055
|
let j = `SELECT 1 \n` +
|
|
957
1056
|
`FROM ${asName(table)} ${tableAlias} \n` +
|
|
@@ -966,7 +1065,7 @@ export class ViewHandler {
|
|
|
966
1065
|
const indent = (a, b) => a;
|
|
967
1066
|
|
|
968
1067
|
if(ji < paths.length - 1){
|
|
969
|
-
j += `AND ${makeJoin(
|
|
1068
|
+
j += `AND ${makeJoin(joinInfo, ji + 1)} \n`
|
|
970
1069
|
}
|
|
971
1070
|
|
|
972
1071
|
j = indent(j, ji + 1);
|
|
@@ -985,9 +1084,9 @@ export class ViewHandler {
|
|
|
985
1084
|
tableAlias;
|
|
986
1085
|
|
|
987
1086
|
/* Check if allowed to view data */
|
|
988
|
-
if(localParams && localParams.socket && this.dboBuilder.publishParser){
|
|
1087
|
+
if(localParams && (localParams.socket || localParams.httpReq) && this.dboBuilder.publishParser){
|
|
989
1088
|
/* Need to think about joining through dissallowed tables */
|
|
990
|
-
t2Rules = await this.dboBuilder.publishParser.getValidatedRequestRuleWusr({ tableName: t2, command: "find",
|
|
1089
|
+
t2Rules = await this.dboBuilder.publishParser.getValidatedRequestRuleWusr({ tableName: t2, command: "find", localParams });
|
|
991
1090
|
if(!t2Rules || !t2Rules.select) throw "Dissallowed";
|
|
992
1091
|
({ forcedFilter, filterFields } = t2Rules.select);
|
|
993
1092
|
}
|
|
@@ -1001,13 +1100,13 @@ export class ViewHandler {
|
|
|
1001
1100
|
addKeywords: false,
|
|
1002
1101
|
tableAlias,
|
|
1003
1102
|
localParams,
|
|
1004
|
-
tableRule: tableRules
|
|
1103
|
+
tableRule: t2Rules //tableRules
|
|
1005
1104
|
}))
|
|
1006
1105
|
} catch(err) {
|
|
1007
1106
|
// console.trace(err)
|
|
1008
1107
|
throw "Issue with preparing $exists query for table " + t2 + "\n->" + JSON.stringify(err);
|
|
1009
1108
|
}
|
|
1010
|
-
|
|
1109
|
+
|
|
1011
1110
|
if(!isJoined){
|
|
1012
1111
|
res = ` EXISTS (SELECT 1 \nFROM ${asName(t2)} \n${finalWhere? `WHERE ${finalWhere}` : ""}) `
|
|
1013
1112
|
} else {
|
|
@@ -1117,7 +1216,6 @@ export class ViewHandler {
|
|
|
1117
1216
|
return false;
|
|
1118
1217
|
})
|
|
1119
1218
|
}
|
|
1120
|
-
// console.log(allowedSelect);
|
|
1121
1219
|
|
|
1122
1220
|
/* Add remaining allowed fields */
|
|
1123
1221
|
allowedSelect = allowedSelect.concat(
|
|
@@ -1169,7 +1267,7 @@ export class ViewHandler {
|
|
|
1169
1267
|
pgp,
|
|
1170
1268
|
select: allowedSelect
|
|
1171
1269
|
});
|
|
1172
|
-
|
|
1270
|
+
|
|
1173
1271
|
let templates: string[] = [q].filter(q=>q);
|
|
1174
1272
|
|
|
1175
1273
|
if(existsCond) templates.push(existsCond);
|
|
@@ -1178,7 +1276,6 @@ export class ViewHandler {
|
|
|
1178
1276
|
return templates.sort() /* sorted to ensure duplicate subscription channels are not created due to different condition order */
|
|
1179
1277
|
.join(" AND \n");
|
|
1180
1278
|
|
|
1181
|
-
// console.log(templates)
|
|
1182
1279
|
// return templates; //pgp.as.format(template, data);
|
|
1183
1280
|
|
|
1184
1281
|
/*
|
|
@@ -1268,7 +1365,7 @@ export class ViewHandler {
|
|
|
1268
1365
|
if(!_ob || !_ob.length) return "";
|
|
1269
1366
|
|
|
1270
1367
|
const validatedAggAliases = select.filter(s => s.type !== "joinedColumn").map(s => s.alias)
|
|
1271
|
-
|
|
1368
|
+
|
|
1272
1369
|
let bad_param = _ob.find(({ key }) =>
|
|
1273
1370
|
!(validatedAggAliases || []).includes(key) &&
|
|
1274
1371
|
(
|
|
@@ -1529,6 +1626,7 @@ export class TableHandler extends ViewHandler {
|
|
|
1529
1626
|
batching: null
|
|
1530
1627
|
};
|
|
1531
1628
|
this.is_view = false;
|
|
1629
|
+
this.is_media = dboBuilder.prostgles.isMedia(this.name)
|
|
1532
1630
|
}
|
|
1533
1631
|
|
|
1534
1632
|
/* TO DO: Maybe finished query batching */
|
|
@@ -1641,7 +1739,7 @@ export class TableHandler extends ViewHandler {
|
|
|
1641
1739
|
)
|
|
1642
1740
|
)
|
|
1643
1741
|
);
|
|
1644
|
-
|
|
1742
|
+
|
|
1645
1743
|
return this.db.tx(t => {
|
|
1646
1744
|
const _queries = queries.map(q => t.none(q as unknown as string))
|
|
1647
1745
|
return t.batch(_queries)
|
|
@@ -1726,13 +1824,12 @@ export class TableHandler extends ViewHandler {
|
|
|
1726
1824
|
if(unrecProps.length) throw "Unrecognised params in textPatch field: " + unrecProps.join(", ");
|
|
1727
1825
|
patchedTextData.push({ ...d, fieldName: c.name });
|
|
1728
1826
|
}
|
|
1729
|
-
// console.log("update2", patchedTextData);
|
|
1730
1827
|
});
|
|
1731
1828
|
|
|
1732
1829
|
if(patchedTextData && patchedTextData.length){
|
|
1733
1830
|
if(tableRules && !tableRules.select) throw "Select needs to be permitted to patch data";
|
|
1734
1831
|
const rows = await this.find(filter, { select: patchedTextData.reduce((a, v) => ({ ...a, [v.fieldName]: 1 }), {}) }, null, tableRules);
|
|
1735
|
-
|
|
1832
|
+
|
|
1736
1833
|
if(rows.length !== 1) {
|
|
1737
1834
|
throw "Cannot patch data within a filter that affects more/less than 1 row";
|
|
1738
1835
|
}
|
|
@@ -1761,10 +1858,9 @@ export class TableHandler extends ViewHandler {
|
|
|
1761
1858
|
let qType = "none";
|
|
1762
1859
|
if(returning){
|
|
1763
1860
|
qType = multi? "any" : "one";
|
|
1764
|
-
query += await this.prepareReturning(returning, this.parseFieldFilter(returningFields));
|
|
1861
|
+
query += this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
|
|
1765
1862
|
}
|
|
1766
1863
|
|
|
1767
|
-
// console.log(query)
|
|
1768
1864
|
if(returnQuery) return query as unknown as void;
|
|
1769
1865
|
if(this.t){
|
|
1770
1866
|
return this.t[qType](query).catch(err => makeErr(err, localParams));
|
|
@@ -1795,7 +1891,248 @@ export class TableHandler extends ViewHandler {
|
|
|
1795
1891
|
return { data, allowedCols: this.columns.filter(c => dataKeys.includes(c.name)).map(c => c.name) }
|
|
1796
1892
|
}
|
|
1797
1893
|
|
|
1798
|
-
|
|
1894
|
+
|
|
1895
|
+
private async insertDataParse(data: (AnyObject | AnyObject[]), param2?: InsertParams, param3_unused?, tableRules?: TableRule, _localParams: LocalParams = null): Promise<{
|
|
1896
|
+
data?: AnyObject | AnyObject[];
|
|
1897
|
+
insertResult?: AnyObject | AnyObject[];
|
|
1898
|
+
}>{
|
|
1899
|
+
const localParams = _localParams || {};
|
|
1900
|
+
const {dbTX} = localParams;
|
|
1901
|
+
|
|
1902
|
+
const isMultiInsert = Array.isArray(data);
|
|
1903
|
+
const getExtraKeys = d => Object.keys(d).filter(k => !this.columns.find(c => c.name === k));
|
|
1904
|
+
|
|
1905
|
+
/* Nested insert is not allowed for the file table */
|
|
1906
|
+
const isNestedInsert = this.is_media? false : (Array.isArray(data)? data : [data]).some(d => getExtraKeys(d).length);
|
|
1907
|
+
|
|
1908
|
+
/**
|
|
1909
|
+
* Make sure nested insert uses a transaction
|
|
1910
|
+
*/
|
|
1911
|
+
if(isNestedInsert && (!this.t || !dbTX)){
|
|
1912
|
+
return {
|
|
1913
|
+
insertResult: await this.dboBuilder.getTX((dbTX) =>
|
|
1914
|
+
(dbTX[this.name] as TableHandler).insert(
|
|
1915
|
+
data,
|
|
1916
|
+
param2,
|
|
1917
|
+
param3_unused,
|
|
1918
|
+
tableRules,
|
|
1919
|
+
{dbTX, ...localParams}
|
|
1920
|
+
)
|
|
1921
|
+
)
|
|
1922
|
+
}
|
|
1923
|
+
}
|
|
1924
|
+
|
|
1925
|
+
const preValidate = tableRules?.insert?.preValidate,
|
|
1926
|
+
validate = tableRules?.insert?.validate;
|
|
1927
|
+
|
|
1928
|
+
let _data = await Promise.all((Array.isArray(data)? data : [data]).map(async row => {
|
|
1929
|
+
if(preValidate){
|
|
1930
|
+
row = await preValidate(row);
|
|
1931
|
+
}
|
|
1932
|
+
|
|
1933
|
+
const dataKeys = Object.keys(row);
|
|
1934
|
+
const extraKeys = getExtraKeys(row);
|
|
1935
|
+
|
|
1936
|
+
/* Upload file then continue insert */
|
|
1937
|
+
if(this.is_media){
|
|
1938
|
+
if(!this.dboBuilder.prostgles?.fileManager) throw "fileManager not set up";
|
|
1939
|
+
const { data, name } = row;
|
|
1940
|
+
|
|
1941
|
+
if(dataKeys.length !== 2) throw "Expecting only two properties: { name: string; data: File }";
|
|
1942
|
+
|
|
1943
|
+
// if(!Buffer.isBuffer(data)) throw "data is not of type Buffer"
|
|
1944
|
+
if(!data) throw "data not provided"
|
|
1945
|
+
if(typeof name !== "string"){
|
|
1946
|
+
throw "name is not of type string"
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1949
|
+
const media_id = (await this.db.oneOrNone("SELECT gen_random_uuid() as name")).name;
|
|
1950
|
+
const type = await this.dboBuilder.prostgles.fileManager.getMIME(data, name)
|
|
1951
|
+
const media_name = `${media_id}.${type.ext}`;
|
|
1952
|
+
let media: Media = {
|
|
1953
|
+
id: media_id,
|
|
1954
|
+
name: media_name,
|
|
1955
|
+
original_name: name,
|
|
1956
|
+
extension: type.ext,
|
|
1957
|
+
content_type: type.mime
|
|
1958
|
+
}
|
|
1959
|
+
|
|
1960
|
+
if(validate){
|
|
1961
|
+
media = await validate(media);
|
|
1962
|
+
}
|
|
1963
|
+
|
|
1964
|
+
const _media: Media = await this.dboBuilder.prostgles.fileManager.uploadAsMedia({
|
|
1965
|
+
item: {
|
|
1966
|
+
data,
|
|
1967
|
+
name: media.name,
|
|
1968
|
+
content_type: media.content_type as any
|
|
1969
|
+
},
|
|
1970
|
+
// imageCompression: {
|
|
1971
|
+
// inside: {
|
|
1972
|
+
// width: 1100,
|
|
1973
|
+
// height: 630
|
|
1974
|
+
// }
|
|
1975
|
+
// }
|
|
1976
|
+
});
|
|
1977
|
+
|
|
1978
|
+
return {
|
|
1979
|
+
...media,
|
|
1980
|
+
..._media,
|
|
1981
|
+
};
|
|
1982
|
+
|
|
1983
|
+
/* Potentially a nested join */
|
|
1984
|
+
} else if(extraKeys.length){
|
|
1985
|
+
|
|
1986
|
+
/* Ensure we're using the same transaction */
|
|
1987
|
+
const _this = this.t? this : dbTX[this.name] as TableHandler;
|
|
1988
|
+
|
|
1989
|
+
let rootData = filterObj(data, null, extraKeys);
|
|
1990
|
+
|
|
1991
|
+
let insertedChildren: AnyObject[];
|
|
1992
|
+
let targetTableRules: TableRule;
|
|
1993
|
+
|
|
1994
|
+
if(validate){
|
|
1995
|
+
rootData = await validate(rootData);
|
|
1996
|
+
}
|
|
1997
|
+
|
|
1998
|
+
const fullRootResult = await _this.insert(rootData, { returning: "*" }, null, tableRules, localParams);
|
|
1999
|
+
let returnData: AnyObject;
|
|
2000
|
+
const returning = param2?.returning;
|
|
2001
|
+
if(returning){
|
|
2002
|
+
returnData = {}
|
|
2003
|
+
const returningItems = await this.prepareReturning(returning, this.parseFieldFilter(tableRules?.insert?.returningFields));
|
|
2004
|
+
returningItems.filter(s => s.selected).map(rs => {
|
|
2005
|
+
returnData[rs.alias] = fullRootResult[rs.alias];
|
|
2006
|
+
})
|
|
2007
|
+
}
|
|
2008
|
+
|
|
2009
|
+
await Promise.all(extraKeys.map(async targetTable => {
|
|
2010
|
+
const childDataItems = Array.isArray(row[targetTable])? row[targetTable] : [row[targetTable]];
|
|
2011
|
+
// console.log({childDataItems})
|
|
2012
|
+
|
|
2013
|
+
/* Must be allowed to insert into media table */
|
|
2014
|
+
const canInsert = async (tbl: string) => {
|
|
2015
|
+
const childRules = await this.dboBuilder.publishParser.getValidatedRequestRuleWusr({ tableName: tbl, command: "insert", localParams });
|
|
2016
|
+
if(!childRules || !childRules.insert) throw "Dissallowed nested insert into table " + childRules;
|
|
2017
|
+
return childRules;
|
|
2018
|
+
}
|
|
2019
|
+
|
|
2020
|
+
// console.log(JSON.stringify(this.dboBuilder.joinPaths, null, 2))
|
|
2021
|
+
const jp = this.dboBuilder.joinPaths.find(jp => jp.t1 === this.name && jp.t2 === targetTable);
|
|
2022
|
+
if(!jp) throw `Could not find a valid table for the nested data { ${targetTable} } `;
|
|
2023
|
+
|
|
2024
|
+
const childInsert = async (cdata, tableName) => {
|
|
2025
|
+
// console.log("childInsert", {data, tableName})
|
|
2026
|
+
if(!cdata || !dbTX[tableName] || !("insert" in dbTX[tableName])) throw "childInsertErr: Child table handler missing for: " + tableName;
|
|
2027
|
+
|
|
2028
|
+
const tableRules = await canInsert(tableName);
|
|
2029
|
+
return Promise.all(
|
|
2030
|
+
(Array.isArray(cdata)? cdata : [cdata])
|
|
2031
|
+
.map(m => (dbTX[tableName] as TableHandler)
|
|
2032
|
+
.insert(m, { returning: "*" }, null, tableRules, localParams)
|
|
2033
|
+
.catch(e => {
|
|
2034
|
+
console.trace({ childInsertErr: e })
|
|
2035
|
+
return Promise.reject({ childInsertErr: e });
|
|
2036
|
+
})
|
|
2037
|
+
)
|
|
2038
|
+
);
|
|
2039
|
+
}
|
|
2040
|
+
|
|
2041
|
+
const { path } = jp;
|
|
2042
|
+
const [tbl1, tbl2, tbl3] = path;
|
|
2043
|
+
targetTableRules = await canInsert(targetTable); // tbl3
|
|
2044
|
+
|
|
2045
|
+
const cols2 = this.dboBuilder.dbo[tbl2].columns || [];
|
|
2046
|
+
if(!this.dboBuilder.dbo[tbl2]) throw "Invalid/disallowed table: " + tbl2;
|
|
2047
|
+
const colsRefT1 = cols2?.filter(c => c.references?.cols.length === 1 && c.references?.ftable === tbl1);
|
|
2048
|
+
|
|
2049
|
+
|
|
2050
|
+
if(!path.length) {
|
|
2051
|
+
throw "Nested inserts join path not found for " + [this.name, targetTable];
|
|
2052
|
+
} else if(path.length === 2){
|
|
2053
|
+
if(targetTable !== tbl2) throw "Did not expect this";
|
|
2054
|
+
|
|
2055
|
+
if(!colsRefT1.length) throw `Target table ${tbl2} does not reference any columns from the root table ${this.name}. Cannot do nested insert`;
|
|
2056
|
+
|
|
2057
|
+
// console.log(JSON.stringify(colsRefT1, null, 2))
|
|
2058
|
+
insertedChildren = await childInsert(
|
|
2059
|
+
childDataItems.map(d => {
|
|
2060
|
+
let result = {...d};
|
|
2061
|
+
colsRefT1.map(col => {
|
|
2062
|
+
result[col.references.cols[0]] = fullRootResult[col.references.fcols[0]]
|
|
2063
|
+
})
|
|
2064
|
+
return result;
|
|
2065
|
+
}),
|
|
2066
|
+
targetTable
|
|
2067
|
+
);
|
|
2068
|
+
|
|
2069
|
+
} else if(path.length === 3){
|
|
2070
|
+
if(targetTable !== tbl3) throw "Did not expect this";
|
|
2071
|
+
const colsRefT3 = cols2?.filter(c => c.references?.cols.length === 1 && c.references?.ftable === tbl3);
|
|
2072
|
+
if(!colsRefT1.length || !colsRefT3.length) throw "Incorrectly referenced or missing columns for nested insert";
|
|
2073
|
+
|
|
2074
|
+
if(targetTable !== this.dboBuilder.prostgles.fileManager.tableName){
|
|
2075
|
+
throw "Only media allowed to have nested inserts more than 2 tables apart"
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
/* We expect tbl2 to have only 2 columns (media_id and foreign_id) */
|
|
2079
|
+
if(!cols2 || cols2.find(c => !["media_id", "foreign_id"].includes(c.name))){
|
|
2080
|
+
throw "Second joining table not of expected format";
|
|
2081
|
+
}
|
|
2082
|
+
|
|
2083
|
+
insertedChildren = await childInsert(childDataItems, targetTable);
|
|
2084
|
+
|
|
2085
|
+
/* Insert in key_lookup table */
|
|
2086
|
+
await Promise.all(insertedChildren.map(async t3Child => {
|
|
2087
|
+
let tbl2Row = {};
|
|
2088
|
+
|
|
2089
|
+
colsRefT3.map(col => {
|
|
2090
|
+
tbl2Row[col.name] = t3Child[col.references.fcols[0]];
|
|
2091
|
+
})
|
|
2092
|
+
colsRefT1.map(col => {
|
|
2093
|
+
tbl2Row[col.name] = fullRootResult[col.references.fcols[0]];
|
|
2094
|
+
})
|
|
2095
|
+
// console.log({ rootResult, tbl2Row, t3Child, colsRefT3, colsRefT1, t: this.t?.ctx?.start });
|
|
2096
|
+
|
|
2097
|
+
await childInsert(tbl2Row, tbl2);//.then(() => {});
|
|
2098
|
+
}));
|
|
2099
|
+
|
|
2100
|
+
} else throw "Unexpected path for Nested inserts";
|
|
2101
|
+
|
|
2102
|
+
/* Return also the nested inserted data */
|
|
2103
|
+
if(targetTableRules && insertedChildren?.length && returning){
|
|
2104
|
+
const targetTableHandler = dbTX[targetTable] as TableHandler;
|
|
2105
|
+
const targetReturning = await targetTableHandler.prepareReturning("*", targetTableHandler.parseFieldFilter(targetTableRules?.insert?.returningFields));
|
|
2106
|
+
let clientTargetInserts = insertedChildren.map(d => {
|
|
2107
|
+
let _d = { ...d };
|
|
2108
|
+
let res = {};
|
|
2109
|
+
targetReturning.map(r => {
|
|
2110
|
+
res[r.alias] = _d[r.alias]
|
|
2111
|
+
});
|
|
2112
|
+
return res;
|
|
2113
|
+
});
|
|
2114
|
+
|
|
2115
|
+
returnData[targetTable] = clientTargetInserts.length === 1? clientTargetInserts[0] : clientTargetInserts;
|
|
2116
|
+
}
|
|
2117
|
+
}));
|
|
2118
|
+
|
|
2119
|
+
return returnData
|
|
2120
|
+
}
|
|
2121
|
+
|
|
2122
|
+
return row;
|
|
2123
|
+
}));
|
|
2124
|
+
|
|
2125
|
+
const result = isMultiInsert? _data : _data[0];
|
|
2126
|
+
let res = isNestedInsert?
|
|
2127
|
+
{ insertResult: result } :
|
|
2128
|
+
{ data: result };
|
|
2129
|
+
|
|
2130
|
+
return res;
|
|
2131
|
+
}
|
|
2132
|
+
|
|
2133
|
+
async insert(rowOrRows: (AnyObject | AnyObject[]), param2?: InsertParams, param3_unused?, tableRules?: TableRule, _localParams: LocalParams = null): Promise<any | any[] | boolean>{
|
|
2134
|
+
const localParams = _localParams || {};
|
|
2135
|
+
const {dbTX} = localParams
|
|
1799
2136
|
try {
|
|
1800
2137
|
|
|
1801
2138
|
const { returning, onConflictDoNothing, fixIssues = false } = param2 || {};
|
|
@@ -1803,8 +2140,8 @@ export class TableHandler extends ViewHandler {
|
|
|
1803
2140
|
|
|
1804
2141
|
let returningFields: FieldFilter,
|
|
1805
2142
|
forcedData: object,
|
|
1806
|
-
validate:
|
|
1807
|
-
preValidate: any,
|
|
2143
|
+
// validate: TableRule["insert"]["validate"],
|
|
2144
|
+
// preValidate: any,
|
|
1808
2145
|
fields: FieldFilter;
|
|
1809
2146
|
|
|
1810
2147
|
if(tableRules){
|
|
@@ -1812,17 +2149,17 @@ export class TableHandler extends ViewHandler {
|
|
|
1812
2149
|
returningFields = tableRules.insert.returningFields;
|
|
1813
2150
|
forcedData = tableRules.insert.forcedData;
|
|
1814
2151
|
fields = tableRules.insert.fields;
|
|
1815
|
-
validate = tableRules.insert.validate;
|
|
1816
|
-
preValidate = tableRules.insert.preValidate;
|
|
2152
|
+
// validate = tableRules.insert.validate;
|
|
2153
|
+
// preValidate = tableRules.insert.preValidate;
|
|
1817
2154
|
|
|
1818
2155
|
/* If no returning fields specified then take select fields as returning */
|
|
1819
|
-
if(!returningFields) returningFields = get(tableRules, "select.fields");
|
|
1820
|
-
if(!returningFields) returningFields = get(tableRules, "insert.fields");
|
|
2156
|
+
if(!returningFields) returningFields = get(tableRules, "select.fields") || get(tableRules, "insert.fields");
|
|
1821
2157
|
|
|
1822
2158
|
if(!fields) throw ` invalid insert rule for ${this.name} -> fields missing `;
|
|
1823
2159
|
|
|
1824
2160
|
/* Safely test publish rules */
|
|
1825
2161
|
if(testRule){
|
|
2162
|
+
// if(this.is_media && tableRules.insert.preValidate) throw "Media table cannot have a preValidate. It already is used internally by prostgles for file upload";
|
|
1826
2163
|
await this.validateViewRules(fields, null, returningFields, null, "insert");
|
|
1827
2164
|
if(forcedData) {
|
|
1828
2165
|
const keys = Object.keys(forcedData);
|
|
@@ -1836,6 +2173,7 @@ export class TableHandler extends ViewHandler {
|
|
|
1836
2173
|
}
|
|
1837
2174
|
}
|
|
1838
2175
|
}
|
|
2176
|
+
|
|
1839
2177
|
return true;
|
|
1840
2178
|
}
|
|
1841
2179
|
}
|
|
@@ -1844,43 +2182,50 @@ export class TableHandler extends ViewHandler {
|
|
|
1844
2182
|
if(typeof onConflictDoNothing === "boolean" && onConflictDoNothing){
|
|
1845
2183
|
conflict_query = " ON CONFLICT DO NOTHING ";
|
|
1846
2184
|
}
|
|
2185
|
+
|
|
2186
|
+
if(param2){
|
|
2187
|
+
const good_params = ["returning", "multi", "onConflictDoNothing", "fixIssues"];
|
|
2188
|
+
const bad_params = Object.keys(param2).filter(k => !good_params.includes(k));
|
|
2189
|
+
if(bad_params && bad_params.length) throw "Invalid params: " + bad_params.join(", ") + " \n Expecting: " + good_params.join(", ");
|
|
2190
|
+
}
|
|
1847
2191
|
|
|
1848
|
-
if(!
|
|
1849
|
-
let returningSelect = await this.prepareReturning(returning, this.parseFieldFilter(returningFields));
|
|
2192
|
+
if(!rowOrRows) rowOrRows = {}; //throw "Provide data in param1";
|
|
2193
|
+
let returningSelect = this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
|
|
1850
2194
|
const makeQuery = async (_row, isOne = false) => {
|
|
1851
2195
|
let row = { ..._row };
|
|
1852
|
-
|
|
1853
|
-
|
|
2196
|
+
|
|
2197
|
+
if(!isPojoObject(row)) {
|
|
2198
|
+
console.trace(row)
|
|
2199
|
+
throw "\ninvalid insert data provided -> " + JSON.stringify(row);
|
|
1854
2200
|
}
|
|
1855
|
-
if(!isPojoObject(row)) throw "\ninvalid insert data provided -> " + JSON.stringify(row);
|
|
1856
2201
|
|
|
1857
2202
|
const { data, allowedCols } = this.validateNewData({ row, forcedData, allowedFields: fields, tableRules, fixIssues });
|
|
1858
2203
|
let _data = { ...data };
|
|
1859
|
-
|
|
1860
|
-
_data = await validate(_data);
|
|
1861
|
-
}
|
|
2204
|
+
|
|
1862
2205
|
let insertQ = "";
|
|
1863
2206
|
if(!Object.keys(_data).length) insertQ = `INSERT INTO ${asName(this.name)} DEFAULT VALUES `;
|
|
1864
2207
|
else insertQ = this.colSet.getInsertQuery(_data, allowedCols) // pgp.helpers.insert(_data, columnSet);
|
|
1865
2208
|
return insertQ + conflict_query + returningSelect;
|
|
1866
2209
|
};
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
if(param2){
|
|
1870
|
-
const good_params = ["returning", "multi", "onConflictDoNothing", "fixIssues"];
|
|
1871
|
-
const bad_params = Object.keys(param2).filter(k => !good_params.includes(k));
|
|
1872
|
-
if(bad_params && bad_params.length) throw "Invalid params: " + bad_params.join(", ") + " \n Expecting: " + good_params.join(", ");
|
|
1873
|
-
}
|
|
1874
2210
|
|
|
1875
2211
|
let query = "";
|
|
1876
2212
|
let queryType = "none";
|
|
2213
|
+
|
|
2214
|
+
/**
|
|
2215
|
+
* If media it will: upload file and continue insert
|
|
2216
|
+
* If nested insert it will: make separate inserts and not continue main insert
|
|
2217
|
+
*/
|
|
2218
|
+
const { data, insertResult } = await this.insertDataParse(rowOrRows, param2, param3_unused, tableRules, localParams);
|
|
2219
|
+
|
|
2220
|
+
if(insertResult) return insertResult;
|
|
2221
|
+
|
|
1877
2222
|
if(Array.isArray(data)){
|
|
1878
2223
|
// if(returning) throw "Sorry but [returning] is dissalowed for multi insert";
|
|
1879
2224
|
let queries = await Promise.all(data.map(async p => {
|
|
1880
2225
|
const q = await makeQuery(p);
|
|
1881
2226
|
return q;
|
|
1882
2227
|
}));
|
|
1883
|
-
|
|
2228
|
+
|
|
1884
2229
|
query = pgp.helpers.concat(queries);
|
|
1885
2230
|
if(returning) queryType = "many";
|
|
1886
2231
|
} else {
|
|
@@ -1888,18 +2233,27 @@ export class TableHandler extends ViewHandler {
|
|
|
1888
2233
|
if(returning) queryType = "one";
|
|
1889
2234
|
}
|
|
1890
2235
|
|
|
1891
|
-
// console.log(query);
|
|
1892
2236
|
if(returnQuery) return query;
|
|
1893
|
-
|
|
1894
|
-
|
|
2237
|
+
let result;
|
|
2238
|
+
|
|
2239
|
+
// console.log(this.t?.ctx?.start, "insert in " + this.name, data);
|
|
2240
|
+
|
|
2241
|
+
const tx = dbTX?.[this.name]?.t || this.t;
|
|
2242
|
+
if(tx) {
|
|
2243
|
+
result = tx[queryType](query).catch(err => makeErr(err, localParams));
|
|
2244
|
+
} else {
|
|
2245
|
+
result = this.db.tx(t => t[queryType](query)).catch(err => makeErr(err, localParams));
|
|
2246
|
+
}
|
|
2247
|
+
|
|
2248
|
+
return result;
|
|
1895
2249
|
} catch(e){
|
|
1896
2250
|
if(localParams && localParams.testRule) throw e;
|
|
1897
2251
|
throw { err: parseError(e), msg: `Issue with dbo.${this.name}.insert()` };
|
|
1898
|
-
}
|
|
2252
|
+
}
|
|
1899
2253
|
};
|
|
1900
2254
|
|
|
1901
|
-
prepareReturning = async (returning: FieldFilter, allowedFields: string[]
|
|
1902
|
-
let result =
|
|
2255
|
+
prepareReturning = async (returning: FieldFilter, allowedFields: string[]): Promise<SelectItem[]> => {
|
|
2256
|
+
let result: SelectItem[] = [];
|
|
1903
2257
|
if(returning){
|
|
1904
2258
|
let sBuilder = new SelectItemBuilder({
|
|
1905
2259
|
allFields: this.column_names.slice(0),
|
|
@@ -1910,13 +2264,16 @@ export class TableHandler extends ViewHandler {
|
|
|
1910
2264
|
});
|
|
1911
2265
|
await sBuilder.parseUserSelect(returning);
|
|
1912
2266
|
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
result += sBuilder.select.map(s => s.getQuery() + " AS " + asNameAlias(s.alias, tableAlias )).join(", ")
|
|
2267
|
+
return sBuilder.select;
|
|
1916
2268
|
}
|
|
1917
2269
|
|
|
1918
2270
|
return result;
|
|
1919
2271
|
}
|
|
2272
|
+
|
|
2273
|
+
makeReturnQuery(items?: SelectItem[]){
|
|
2274
|
+
if(items?.length) return " RETURNING " + items.map(s => s.getQuery() + " AS " + asName(s.alias)).join(", ");
|
|
2275
|
+
return "";
|
|
2276
|
+
}
|
|
1920
2277
|
|
|
1921
2278
|
async delete(filter?: Filter, params?: DeleteParams, param3_unused?, table_rules?: TableRule, localParams: LocalParams = null): Promise<any> { //{ socket, func, has_rules = false, socketDb } = {}
|
|
1922
2279
|
try {
|
|
@@ -1972,7 +2329,7 @@ export class TableHandler extends ViewHandler {
|
|
|
1972
2329
|
if(!returningFields) {
|
|
1973
2330
|
throw "Returning dissallowed";
|
|
1974
2331
|
}
|
|
1975
|
-
_query += await this.prepareReturning(returning, this.parseFieldFilter(returningFields));
|
|
2332
|
+
_query += this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
|
|
1976
2333
|
}
|
|
1977
2334
|
|
|
1978
2335
|
if(returnQuery) return _query;
|
|
@@ -2001,18 +2358,12 @@ export class TableHandler extends ViewHandler {
|
|
|
2001
2358
|
return tblH.find(filter, { select: "", limit: 1 }, {}, table_rules, localParams)
|
|
2002
2359
|
.then(exists => {
|
|
2003
2360
|
if(exists && exists.length){
|
|
2004
|
-
// console.log(filter, "exists");
|
|
2005
2361
|
return tblH.update(filter, newData, params, table_rules, localParams);
|
|
2006
2362
|
} else {
|
|
2007
|
-
// console.log(filter, "existnts")
|
|
2008
2363
|
return tblH.insert({ ...newData, ...filter }, params, null, table_rules, localParams);
|
|
2009
2364
|
}
|
|
2010
2365
|
});
|
|
2011
2366
|
}
|
|
2012
|
-
// .catch(existnts => {
|
|
2013
|
-
// console.log(filter, "existnts")
|
|
2014
|
-
// return this.insert({ ...filter, ...newData}, params);
|
|
2015
|
-
// });
|
|
2016
2367
|
} catch(e){
|
|
2017
2368
|
if(localParams && localParams.testRule) throw e;
|
|
2018
2369
|
throw { err: parseError(e), msg: `Issue with dbo.${this.name}.upsert()` };
|
|
@@ -2116,40 +2467,9 @@ export class TableHandler extends ViewHandler {
|
|
|
2116
2467
|
}
|
|
2117
2468
|
|
|
2118
2469
|
}
|
|
2119
|
-
type TransactionHandler = {
|
|
2120
|
-
(): Promise<TxHandler>
|
|
2121
|
-
}
|
|
2122
|
-
export interface TxHandler {
|
|
2123
|
-
[key: string]: TableHandler | ViewHandler;
|
|
2124
|
-
}
|
|
2125
|
-
export type TxCB = {
|
|
2126
|
-
(t: TxHandler): (any | void);
|
|
2127
|
-
}
|
|
2128
|
-
export type TX = {
|
|
2129
|
-
(t: TxCB): Promise<(any | void)>;
|
|
2130
|
-
}
|
|
2131
|
-
// export type JoinMaker = (filter?: object, select?: FieldFilter, options?: SelectParams) => any;
|
|
2132
|
-
|
|
2133
|
-
// export type TableJoin = {
|
|
2134
|
-
// [key: string]: JoinMaker;
|
|
2135
|
-
// }
|
|
2136
|
-
// export type DbJoinMaker = {
|
|
2137
|
-
// innerJoin: TableJoin;
|
|
2138
|
-
// leftJoin: TableJoin;
|
|
2139
|
-
// innerJoinOne: TableJoin;
|
|
2140
|
-
// leftJoinOne: TableJoin;
|
|
2141
|
-
// }
|
|
2142
|
-
|
|
2143
|
-
// export type DbHandler = {
|
|
2144
|
-
// [key: string]: TableHandler | ViewHandler;
|
|
2145
|
-
// } & DbJoinMaker;
|
|
2146
|
-
|
|
2147
|
-
export type DbHandlerTX = { [key: string]: TX } | DbHandler;
|
|
2148
2470
|
|
|
2149
2471
|
|
|
2150
2472
|
import { JOIN_TYPES } from "./Prostgles";
|
|
2151
|
-
import { type } from "os";
|
|
2152
|
-
import { join } from "path";
|
|
2153
2473
|
|
|
2154
2474
|
export class DboBuilder {
|
|
2155
2475
|
tablesOrViews: TableOrViewInfo[];
|
|
@@ -2157,7 +2477,8 @@ export class DboBuilder {
|
|
|
2157
2477
|
db: DB;
|
|
2158
2478
|
schema: string = "public";
|
|
2159
2479
|
|
|
2160
|
-
dbo: DbHandler | DbHandlerTX;
|
|
2480
|
+
// dbo: DbHandler | DbHandlerTX;
|
|
2481
|
+
dbo: DbHandler;
|
|
2161
2482
|
pubSubManager: PubSubManager;
|
|
2162
2483
|
|
|
2163
2484
|
pojoDefinitions: string[];
|
|
@@ -2177,8 +2498,8 @@ export class DboBuilder {
|
|
|
2177
2498
|
private constructor(prostgles: Prostgles){
|
|
2178
2499
|
this.prostgles = prostgles;
|
|
2179
2500
|
this.db = this.prostgles.db;
|
|
2180
|
-
this.schema = this.prostgles.schema || "public";
|
|
2181
|
-
this.dbo = { };
|
|
2501
|
+
this.schema = this.prostgles.opts.schema || "public";
|
|
2502
|
+
this.dbo = { } as unknown as DbHandler;
|
|
2182
2503
|
// this.joins = this.prostgles.joins;
|
|
2183
2504
|
|
|
2184
2505
|
}
|
|
@@ -2186,7 +2507,7 @@ export class DboBuilder {
|
|
|
2186
2507
|
private init = async () => {
|
|
2187
2508
|
let onSchemaChange;
|
|
2188
2509
|
|
|
2189
|
-
if(this.prostgles.watchSchema){
|
|
2510
|
+
if(this.prostgles.opts.watchSchema){
|
|
2190
2511
|
onSchemaChange = (event: { command: string; query: string }) => {
|
|
2191
2512
|
this.prostgles.onSchemaChange(event)
|
|
2192
2513
|
}
|
|
@@ -2216,14 +2537,19 @@ export class DboBuilder {
|
|
|
2216
2537
|
}
|
|
2217
2538
|
|
|
2218
2539
|
async parseJoins(): Promise<JoinPaths> {
|
|
2219
|
-
if(this.prostgles.joins){
|
|
2220
|
-
let _joins = await this.prostgles.joins;
|
|
2540
|
+
if(this.prostgles.opts.joins){
|
|
2541
|
+
let _joins = await this.prostgles.opts.joins;
|
|
2542
|
+
let inferredJoins = await getInferredJoins(this.db, this.prostgles.opts.schema);
|
|
2221
2543
|
if(typeof _joins === "string" && _joins === "inferred"){
|
|
2222
|
-
_joins =
|
|
2544
|
+
_joins = inferredJoins
|
|
2545
|
+
/* If joins are specified then include inferred joins except the explicit tables */
|
|
2546
|
+
} else if(Array.isArray(_joins)){
|
|
2547
|
+
const joinTables = _joins.map(j => j.tables).flat();
|
|
2548
|
+
_joins = _joins.concat(inferredJoins.filter(j => !j.tables.find(t => joinTables.includes(t))))
|
|
2223
2549
|
}
|
|
2224
2550
|
let joins = JSON.parse(JSON.stringify(_joins)) as Join[];
|
|
2225
2551
|
this.joins = joins;
|
|
2226
|
-
|
|
2552
|
+
|
|
2227
2553
|
// Validate joins
|
|
2228
2554
|
try {
|
|
2229
2555
|
// 1 find duplicates
|
|
@@ -2302,9 +2628,6 @@ export class DboBuilder {
|
|
|
2302
2628
|
}
|
|
2303
2629
|
});
|
|
2304
2630
|
});
|
|
2305
|
-
// console.log(this.joinPaths)
|
|
2306
|
-
// console.log(888, this.prostgles.joins);
|
|
2307
|
-
// console.log(this.joinGraph, findShortestPath(this.joinGraph, "colors", "drawings"));
|
|
2308
2631
|
}
|
|
2309
2632
|
|
|
2310
2633
|
return this.joinPaths;
|
|
@@ -2314,7 +2637,7 @@ export class DboBuilder {
|
|
|
2314
2637
|
|
|
2315
2638
|
}
|
|
2316
2639
|
|
|
2317
|
-
async build(): Promise<DbHandler
|
|
2640
|
+
async build(): Promise<DbHandler>{
|
|
2318
2641
|
|
|
2319
2642
|
// await this.pubSubManager.init()
|
|
2320
2643
|
|
|
@@ -2350,7 +2673,6 @@ export type TxCB = {
|
|
|
2350
2673
|
i18nDef += ` [key in ${tov.columns.map(c => JSON.stringify(c.name)).join(" | ")}]: { [lang_id in keyof LANG_IDS]: string }; \n`;
|
|
2351
2674
|
i18nDef += ` }; \n`;
|
|
2352
2675
|
|
|
2353
|
-
// console.log("dboInit", tov.name, tov.columns.map(c => c.name))
|
|
2354
2676
|
const filterKeywords = Object.values(this.prostgles.keywords);
|
|
2355
2677
|
const $filterCol = tov.columns.find(c => filterKeywords.includes(c.name));
|
|
2356
2678
|
if($filterCol){
|
|
@@ -2421,13 +2743,88 @@ export type TxCB = {
|
|
|
2421
2743
|
}
|
|
2422
2744
|
|
|
2423
2745
|
|
|
2424
|
-
if(this.prostgles.transactions){
|
|
2746
|
+
if(this.prostgles.opts.transactions){
|
|
2425
2747
|
let txKey = "tx";
|
|
2426
|
-
if(typeof this.prostgles.transactions === "string") txKey = this.prostgles.transactions;
|
|
2748
|
+
if(typeof this.prostgles.opts.transactions === "string") txKey = this.prostgles.opts.transactions;
|
|
2427
2749
|
this.dboDefinition += ` ${txKey}: (t: TxCB) => Promise<any | void> ;\n`;
|
|
2428
2750
|
|
|
2429
|
-
this.dbo[txKey] = (cb: TxCB) => this.getTX(cb);
|
|
2751
|
+
(this.dbo[txKey] as TX) = (cb: TxCB) => this.getTX(cb);
|
|
2752
|
+
}
|
|
2753
|
+
|
|
2754
|
+
if(!this.dbo.sql){
|
|
2755
|
+
|
|
2756
|
+
let needType = true;// this.publishRawSQL && typeof this.publishRawSQL === "function";
|
|
2757
|
+
let DATA_TYPES = !needType? [] : await this.db.any("SELECT oid, typname FROM pg_type");
|
|
2758
|
+
let USER_TABLES = !needType? [] : await this.db.any("SELECT relid, relname FROM pg_catalog.pg_statio_user_tables");
|
|
2759
|
+
|
|
2760
|
+
this.dbo.sql = async (query: string, params: any, options: SQLOptions, localParams?: LocalParams) => {
|
|
2761
|
+
const canRunSQL = async (localParams: LocalParams) => {
|
|
2762
|
+
if(!localParams) return true;
|
|
2763
|
+
|
|
2764
|
+
const { socket } = localParams;
|
|
2765
|
+
const publishParams = await this.prostgles.publishParser.getPublishParams({ socket });
|
|
2766
|
+
let res = await this.prostgles.opts.publishRawSQL(publishParams);
|
|
2767
|
+
return Boolean(res && typeof res === "boolean" || res === "*");
|
|
2768
|
+
}
|
|
2769
|
+
|
|
2770
|
+
if(!(await canRunSQL(localParams))) throw "Not allowed to run SQL";
|
|
2771
|
+
|
|
2772
|
+
const { returnType }: SQLOptions = options || ({} as any);
|
|
2773
|
+
const { socket } = localParams || {};
|
|
2774
|
+
|
|
2775
|
+
if(returnType === "noticeSubscription"){
|
|
2776
|
+
if(!socket) throw "Only allowed with client socket"
|
|
2777
|
+
return await this.prostgles.dbEventsManager.addNotice(socket);
|
|
2778
|
+
} else if(returnType === "statement"){
|
|
2779
|
+
try {
|
|
2780
|
+
return pgp.as.format(query, params);
|
|
2781
|
+
} catch (err){
|
|
2782
|
+
throw err.toString();
|
|
2783
|
+
}
|
|
2784
|
+
} else if(this.db) {
|
|
2785
|
+
|
|
2786
|
+
let qres = await this.db.result(query, params)
|
|
2787
|
+
const { duration, fields, rows, command } = qres;
|
|
2788
|
+
|
|
2789
|
+
if(command === "LISTEN"){
|
|
2790
|
+
if(!socket) throw "Only allowed with client socket"
|
|
2791
|
+
return await this.prostgles.dbEventsManager.addNotify(query, socket);
|
|
2792
|
+
|
|
2793
|
+
} else if(returnType === "rows") {
|
|
2794
|
+
return rows;
|
|
2795
|
+
|
|
2796
|
+
} else if(returnType === "row") {
|
|
2797
|
+
return rows[0];
|
|
2798
|
+
|
|
2799
|
+
} else if(returnType === "value") {
|
|
2800
|
+
return Object.values(rows?.[0] || {})?.[0];
|
|
2801
|
+
|
|
2802
|
+
} else if(returnType === "values") {
|
|
2803
|
+
return rows.map(r => Object.values(r[0]));
|
|
2804
|
+
|
|
2805
|
+
} else {
|
|
2806
|
+
if(fields && DATA_TYPES.length){
|
|
2807
|
+
qres.fields = fields.map(f => {
|
|
2808
|
+
const dataType = DATA_TYPES.find(dt => +dt.oid === +f.dataTypeID),
|
|
2809
|
+
tableName = USER_TABLES.find(t => +t.relid === +f.tableID),
|
|
2810
|
+
{ name } = f;
|
|
2811
|
+
|
|
2812
|
+
return {
|
|
2813
|
+
...f,
|
|
2814
|
+
...(dataType? { dataType: dataType.typname } : {}),
|
|
2815
|
+
...(tableName? { tableName: tableName.relname } : {}),
|
|
2816
|
+
}
|
|
2817
|
+
});
|
|
2818
|
+
}
|
|
2819
|
+
return qres;
|
|
2820
|
+
}
|
|
2821
|
+
|
|
2822
|
+
} else console.error("db missing");
|
|
2823
|
+
}
|
|
2824
|
+
} else {
|
|
2825
|
+
console.warn(`Could not create dbo.sql handler because there is already a table named "sql"`)
|
|
2430
2826
|
}
|
|
2827
|
+
|
|
2431
2828
|
this.dboDefinition += "};\n";
|
|
2432
2829
|
|
|
2433
2830
|
this.tsTypesDefinition = [
|
|
@@ -2447,15 +2844,23 @@ export type TxCB = {
|
|
|
2447
2844
|
|
|
2448
2845
|
getTX = (dbTX: TxCB) => {
|
|
2449
2846
|
return this.db.tx((t) => {
|
|
2450
|
-
let txDB = {};
|
|
2847
|
+
let txDB: TxHandler = {};
|
|
2451
2848
|
this.tablesOrViews.map(tov => {
|
|
2452
2849
|
if(tov.is_view){
|
|
2850
|
+
|
|
2453
2851
|
txDB[tov.name] = new ViewHandler(this.db, tov, this.pubSubManager, this, t, this.joinPaths);
|
|
2454
2852
|
} else {
|
|
2455
2853
|
txDB[tov.name] = new TableHandler(this.db, tov, this.pubSubManager, this, t, this.joinPaths);
|
|
2854
|
+
|
|
2855
|
+
/**
|
|
2856
|
+
* Pass only the transaction object to ensure consistency
|
|
2857
|
+
*/
|
|
2858
|
+
// txDB[tov.name] = new ViewHandler(t, tov, this.pubSubManager, this, t, this.joinPaths);
|
|
2859
|
+
// } else {
|
|
2860
|
+
// txDB[tov.name] = new TableHandler(t as any, tov, this.pubSubManager, this, t, this.joinPaths);
|
|
2456
2861
|
}
|
|
2457
2862
|
});
|
|
2458
|
-
return dbTX(txDB);
|
|
2863
|
+
return dbTX(txDB, t);
|
|
2459
2864
|
});
|
|
2460
2865
|
}
|
|
2461
2866
|
}
|
|
@@ -2888,6 +3293,6 @@ async function getInferredJoins(db: DB, schema: string = "public"): Promise<Join
|
|
|
2888
3293
|
})
|
|
2889
3294
|
}
|
|
2890
3295
|
});
|
|
2891
|
-
|
|
3296
|
+
|
|
2892
3297
|
return joins;
|
|
2893
3298
|
}
|