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/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,19 +565,44 @@ 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(tableRules?: TableRule, localParams?: LocalParams): Promise<{ oid: number; comment: string; }>{
|
|
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
|
|
|
503
603
|
// TODO: fix renamed table trigger problem
|
|
504
604
|
|
|
505
|
-
async getColumns(tableRules?: TableRule, localParams?: LocalParams): Promise<ValidatedColumnInfo[]> {
|
|
605
|
+
async getColumns(lang?: string, param2?, param3?, tableRules?: TableRule, localParams?: LocalParams): Promise<ValidatedColumnInfo[]> {
|
|
506
606
|
|
|
507
607
|
try {
|
|
508
608
|
const p = this.getValidatedRules(tableRules, localParams);
|
|
@@ -510,18 +610,35 @@ export class ViewHandler {
|
|
|
510
610
|
if(!p.select.getColumns) throw "Not allowed";
|
|
511
611
|
|
|
512
612
|
// console.log("getColumns", this.name, this.columns.map(c => c.name))
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
613
|
+
let _lang = lang;
|
|
614
|
+
return this.columns.map(c => {
|
|
615
|
+
let label = c.comment || c.name;
|
|
616
|
+
const iConf = this.dboBuilder.prostgles?.opts?.i18n?.column_labels?.[this.name]?.[c.name];
|
|
617
|
+
const fallbackLang = this.dboBuilder.prostgles?.opts?.i18n?.fallbackLang;
|
|
618
|
+
_lang = _lang || fallbackLang as string;
|
|
619
|
+
|
|
620
|
+
if((lang || fallbackLang) && iConf){
|
|
621
|
+
let langLabel;
|
|
622
|
+
if(lang) langLabel = iConf[lang];
|
|
623
|
+
if(!langLabel && fallbackLang) langLabel = iConf[fallbackLang];
|
|
624
|
+
label = langLabel || label;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
return {
|
|
628
|
+
...c,
|
|
629
|
+
label,
|
|
630
|
+
tsDataType: postgresToTsType(c.udt_name),
|
|
631
|
+
insert: Boolean(p.insert && p.insert.fields && p.insert.fields.includes(c.name)),
|
|
632
|
+
select: Boolean(p.select && p.select.fields && p.select.fields.includes(c.name)),
|
|
633
|
+
filter: Boolean(p.select && p.select.filterFields && p.select.filterFields.includes(c.name)),
|
|
634
|
+
update: Boolean(p.update && p.update.fields && p.update.fields.includes(c.name)),
|
|
635
|
+
delete: Boolean(p.delete && p.delete.filterFields && p.delete.filterFields.includes(c.name)),
|
|
636
|
+
}
|
|
637
|
+
});
|
|
522
638
|
|
|
523
639
|
} catch(e){
|
|
524
|
-
|
|
640
|
+
console.trace(e);
|
|
641
|
+
throw "Something went wrong in " + `db.${this.name}.getColumns()`;
|
|
525
642
|
}
|
|
526
643
|
}
|
|
527
644
|
|
|
@@ -663,9 +780,10 @@ export class ViewHandler {
|
|
|
663
780
|
async find(filter?: Filter, selectParams?: SelectParams , param3_unused = null, tableRules?: TableRule, localParams?: LocalParams): Promise<any[]>{
|
|
664
781
|
try {
|
|
665
782
|
filter = filter || {};
|
|
783
|
+
const allowedReturnTypes: Array<SelectParams["returnType"]> = ["row", "value", "values"]
|
|
666
784
|
const { returnType } = selectParams || {};
|
|
667
|
-
if(returnType && !
|
|
668
|
-
throw `returnType (${returnType}) can only be ${
|
|
785
|
+
if(returnType && !allowedReturnTypes.includes(returnType)){
|
|
786
|
+
throw `returnType (${returnType}) can only be ${allowedReturnTypes.join(" OR ")}`
|
|
669
787
|
}
|
|
670
788
|
|
|
671
789
|
const { testRule = false, returnQuery = false } = localParams || {};
|
|
@@ -698,7 +816,6 @@ export class ViewHandler {
|
|
|
698
816
|
|
|
699
817
|
let q = await getNewQuery(this as unknown as TableHandler, filter, selectParams, param3_unused, tableRules, localParams),
|
|
700
818
|
_query = makeQuery(this as unknown as TableHandler, q, undefined, undefined, selectParams);
|
|
701
|
-
// console.log(_query)
|
|
702
819
|
|
|
703
820
|
if(testRule){
|
|
704
821
|
try {
|
|
@@ -710,8 +827,6 @@ export class ViewHandler {
|
|
|
710
827
|
}
|
|
711
828
|
}
|
|
712
829
|
|
|
713
|
-
// console.log(_query);
|
|
714
|
-
|
|
715
830
|
if(returnQuery) return (_query as unknown as any[]);
|
|
716
831
|
if(["row", "value"].includes(returnType)) {
|
|
717
832
|
return (this.t || this.db).oneOrNone(_query).then(data => {
|
|
@@ -909,21 +1024,23 @@ export class ViewHandler {
|
|
|
909
1024
|
|
|
910
1025
|
const makeTableChain = (finalFilter: string) => {
|
|
911
1026
|
|
|
912
|
-
let joinPaths: JoinInfo = [];
|
|
1027
|
+
let joinPaths: JoinInfo["paths"] = [];
|
|
1028
|
+
let expectOne = true;
|
|
913
1029
|
tables.map((t2, depth) => {
|
|
914
1030
|
let t1 = depth? tables[depth - 1] : thisTable;
|
|
915
1031
|
let exactPaths = [t1, t2];
|
|
916
1032
|
|
|
917
1033
|
if(!depth && eConfig.shortestJoin) exactPaths = undefined;
|
|
918
|
-
|
|
919
|
-
|
|
1034
|
+
const jinf= this.getJoins(t1, t2, exactPaths);
|
|
1035
|
+
expectOne = expectOne && jinf.expectOne
|
|
1036
|
+
joinPaths = joinPaths.concat(jinf.paths);
|
|
920
1037
|
});
|
|
921
1038
|
|
|
922
|
-
let r = makeJoin(joinPaths, 0);
|
|
923
|
-
// console.log(r);
|
|
1039
|
+
let r = makeJoin({ paths: joinPaths, expectOne }, 0);
|
|
924
1040
|
return r;
|
|
925
1041
|
|
|
926
|
-
function makeJoin(
|
|
1042
|
+
function makeJoin(joinInfo: JoinInfo, ji: number) {
|
|
1043
|
+
const { paths } = joinInfo;
|
|
927
1044
|
const jp = paths[ji];
|
|
928
1045
|
|
|
929
1046
|
let prevTable = ji? paths[ji - 1].table : jp.source;
|
|
@@ -934,7 +1051,6 @@ export class ViewHandler {
|
|
|
934
1051
|
let cond = `${jp.on.map(([c1, c2]) =>
|
|
935
1052
|
`${prevTableAlias}.${asName(c1)} = ${tableAlias}.${asName(c2)}`).join("\n AND ")
|
|
936
1053
|
}`;
|
|
937
|
-
// console.log(join, cond);
|
|
938
1054
|
|
|
939
1055
|
let j = `SELECT 1 \n` +
|
|
940
1056
|
`FROM ${asName(table)} ${tableAlias} \n` +
|
|
@@ -949,7 +1065,7 @@ export class ViewHandler {
|
|
|
949
1065
|
const indent = (a, b) => a;
|
|
950
1066
|
|
|
951
1067
|
if(ji < paths.length - 1){
|
|
952
|
-
j += `AND ${makeJoin(
|
|
1068
|
+
j += `AND ${makeJoin(joinInfo, ji + 1)} \n`
|
|
953
1069
|
}
|
|
954
1070
|
|
|
955
1071
|
j = indent(j, ji + 1);
|
|
@@ -968,9 +1084,9 @@ export class ViewHandler {
|
|
|
968
1084
|
tableAlias;
|
|
969
1085
|
|
|
970
1086
|
/* Check if allowed to view data */
|
|
971
|
-
if(localParams && localParams.socket && this.dboBuilder.publishParser){
|
|
1087
|
+
if(localParams && (localParams.socket || localParams.httpReq) && this.dboBuilder.publishParser){
|
|
972
1088
|
/* Need to think about joining through dissallowed tables */
|
|
973
|
-
t2Rules = await this.dboBuilder.publishParser.getValidatedRequestRuleWusr({ tableName: t2, command: "find",
|
|
1089
|
+
t2Rules = await this.dboBuilder.publishParser.getValidatedRequestRuleWusr({ tableName: t2, command: "find", localParams });
|
|
974
1090
|
if(!t2Rules || !t2Rules.select) throw "Dissallowed";
|
|
975
1091
|
({ forcedFilter, filterFields } = t2Rules.select);
|
|
976
1092
|
}
|
|
@@ -984,13 +1100,13 @@ export class ViewHandler {
|
|
|
984
1100
|
addKeywords: false,
|
|
985
1101
|
tableAlias,
|
|
986
1102
|
localParams,
|
|
987
|
-
tableRule: tableRules
|
|
1103
|
+
tableRule: t2Rules //tableRules
|
|
988
1104
|
}))
|
|
989
1105
|
} catch(err) {
|
|
990
1106
|
// console.trace(err)
|
|
991
1107
|
throw "Issue with preparing $exists query for table " + t2 + "\n->" + JSON.stringify(err);
|
|
992
1108
|
}
|
|
993
|
-
|
|
1109
|
+
|
|
994
1110
|
if(!isJoined){
|
|
995
1111
|
res = ` EXISTS (SELECT 1 \nFROM ${asName(t2)} \n${finalWhere? `WHERE ${finalWhere}` : ""}) `
|
|
996
1112
|
} else {
|
|
@@ -1100,7 +1216,6 @@ export class ViewHandler {
|
|
|
1100
1216
|
return false;
|
|
1101
1217
|
})
|
|
1102
1218
|
}
|
|
1103
|
-
// console.log(allowedSelect);
|
|
1104
1219
|
|
|
1105
1220
|
/* Add remaining allowed fields */
|
|
1106
1221
|
allowedSelect = allowedSelect.concat(
|
|
@@ -1152,7 +1267,7 @@ export class ViewHandler {
|
|
|
1152
1267
|
pgp,
|
|
1153
1268
|
select: allowedSelect
|
|
1154
1269
|
});
|
|
1155
|
-
|
|
1270
|
+
|
|
1156
1271
|
let templates: string[] = [q].filter(q=>q);
|
|
1157
1272
|
|
|
1158
1273
|
if(existsCond) templates.push(existsCond);
|
|
@@ -1161,7 +1276,6 @@ export class ViewHandler {
|
|
|
1161
1276
|
return templates.sort() /* sorted to ensure duplicate subscription channels are not created due to different condition order */
|
|
1162
1277
|
.join(" AND \n");
|
|
1163
1278
|
|
|
1164
|
-
// console.log(templates)
|
|
1165
1279
|
// return templates; //pgp.as.format(template, data);
|
|
1166
1280
|
|
|
1167
1281
|
/*
|
|
@@ -1251,7 +1365,7 @@ export class ViewHandler {
|
|
|
1251
1365
|
if(!_ob || !_ob.length) return "";
|
|
1252
1366
|
|
|
1253
1367
|
const validatedAggAliases = select.filter(s => s.type !== "joinedColumn").map(s => s.alias)
|
|
1254
|
-
|
|
1368
|
+
|
|
1255
1369
|
let bad_param = _ob.find(({ key }) =>
|
|
1256
1370
|
!(validatedAggAliases || []).includes(key) &&
|
|
1257
1371
|
(
|
|
@@ -1512,6 +1626,7 @@ export class TableHandler extends ViewHandler {
|
|
|
1512
1626
|
batching: null
|
|
1513
1627
|
};
|
|
1514
1628
|
this.is_view = false;
|
|
1629
|
+
this.is_media = dboBuilder.prostgles.isMedia(this.name)
|
|
1515
1630
|
}
|
|
1516
1631
|
|
|
1517
1632
|
/* TO DO: Maybe finished query batching */
|
|
@@ -1624,7 +1739,7 @@ export class TableHandler extends ViewHandler {
|
|
|
1624
1739
|
)
|
|
1625
1740
|
)
|
|
1626
1741
|
);
|
|
1627
|
-
|
|
1742
|
+
|
|
1628
1743
|
return this.db.tx(t => {
|
|
1629
1744
|
const _queries = queries.map(q => t.none(q as unknown as string))
|
|
1630
1745
|
return t.batch(_queries)
|
|
@@ -1709,13 +1824,12 @@ export class TableHandler extends ViewHandler {
|
|
|
1709
1824
|
if(unrecProps.length) throw "Unrecognised params in textPatch field: " + unrecProps.join(", ");
|
|
1710
1825
|
patchedTextData.push({ ...d, fieldName: c.name });
|
|
1711
1826
|
}
|
|
1712
|
-
// console.log("update2", patchedTextData);
|
|
1713
1827
|
});
|
|
1714
1828
|
|
|
1715
1829
|
if(patchedTextData && patchedTextData.length){
|
|
1716
1830
|
if(tableRules && !tableRules.select) throw "Select needs to be permitted to patch data";
|
|
1717
1831
|
const rows = await this.find(filter, { select: patchedTextData.reduce((a, v) => ({ ...a, [v.fieldName]: 1 }), {}) }, null, tableRules);
|
|
1718
|
-
|
|
1832
|
+
|
|
1719
1833
|
if(rows.length !== 1) {
|
|
1720
1834
|
throw "Cannot patch data within a filter that affects more/less than 1 row";
|
|
1721
1835
|
}
|
|
@@ -1744,10 +1858,9 @@ export class TableHandler extends ViewHandler {
|
|
|
1744
1858
|
let qType = "none";
|
|
1745
1859
|
if(returning){
|
|
1746
1860
|
qType = multi? "any" : "one";
|
|
1747
|
-
query += await this.prepareReturning(returning, this.parseFieldFilter(returningFields));
|
|
1861
|
+
query += this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
|
|
1748
1862
|
}
|
|
1749
1863
|
|
|
1750
|
-
// console.log(query)
|
|
1751
1864
|
if(returnQuery) return query as unknown as void;
|
|
1752
1865
|
if(this.t){
|
|
1753
1866
|
return this.t[qType](query).catch(err => makeErr(err, localParams));
|
|
@@ -1778,7 +1891,248 @@ export class TableHandler extends ViewHandler {
|
|
|
1778
1891
|
return { data, allowedCols: this.columns.filter(c => dataKeys.includes(c.name)).map(c => c.name) }
|
|
1779
1892
|
}
|
|
1780
1893
|
|
|
1781
|
-
|
|
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
|
|
1782
2136
|
try {
|
|
1783
2137
|
|
|
1784
2138
|
const { returning, onConflictDoNothing, fixIssues = false } = param2 || {};
|
|
@@ -1786,8 +2140,8 @@ export class TableHandler extends ViewHandler {
|
|
|
1786
2140
|
|
|
1787
2141
|
let returningFields: FieldFilter,
|
|
1788
2142
|
forcedData: object,
|
|
1789
|
-
validate:
|
|
1790
|
-
preValidate: any,
|
|
2143
|
+
// validate: TableRule["insert"]["validate"],
|
|
2144
|
+
// preValidate: any,
|
|
1791
2145
|
fields: FieldFilter;
|
|
1792
2146
|
|
|
1793
2147
|
if(tableRules){
|
|
@@ -1795,17 +2149,17 @@ export class TableHandler extends ViewHandler {
|
|
|
1795
2149
|
returningFields = tableRules.insert.returningFields;
|
|
1796
2150
|
forcedData = tableRules.insert.forcedData;
|
|
1797
2151
|
fields = tableRules.insert.fields;
|
|
1798
|
-
validate = tableRules.insert.validate;
|
|
1799
|
-
preValidate = tableRules.insert.preValidate;
|
|
2152
|
+
// validate = tableRules.insert.validate;
|
|
2153
|
+
// preValidate = tableRules.insert.preValidate;
|
|
1800
2154
|
|
|
1801
2155
|
/* If no returning fields specified then take select fields as returning */
|
|
1802
|
-
if(!returningFields) returningFields = get(tableRules, "select.fields");
|
|
1803
|
-
if(!returningFields) returningFields = get(tableRules, "insert.fields");
|
|
2156
|
+
if(!returningFields) returningFields = get(tableRules, "select.fields") || get(tableRules, "insert.fields");
|
|
1804
2157
|
|
|
1805
2158
|
if(!fields) throw ` invalid insert rule for ${this.name} -> fields missing `;
|
|
1806
2159
|
|
|
1807
2160
|
/* Safely test publish rules */
|
|
1808
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";
|
|
1809
2163
|
await this.validateViewRules(fields, null, returningFields, null, "insert");
|
|
1810
2164
|
if(forcedData) {
|
|
1811
2165
|
const keys = Object.keys(forcedData);
|
|
@@ -1819,6 +2173,7 @@ export class TableHandler extends ViewHandler {
|
|
|
1819
2173
|
}
|
|
1820
2174
|
}
|
|
1821
2175
|
}
|
|
2176
|
+
|
|
1822
2177
|
return true;
|
|
1823
2178
|
}
|
|
1824
2179
|
}
|
|
@@ -1827,43 +2182,50 @@ export class TableHandler extends ViewHandler {
|
|
|
1827
2182
|
if(typeof onConflictDoNothing === "boolean" && onConflictDoNothing){
|
|
1828
2183
|
conflict_query = " ON CONFLICT DO NOTHING ";
|
|
1829
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
|
+
}
|
|
1830
2191
|
|
|
1831
|
-
if(!
|
|
1832
|
-
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)));
|
|
1833
2194
|
const makeQuery = async (_row, isOne = false) => {
|
|
1834
2195
|
let row = { ..._row };
|
|
1835
|
-
|
|
1836
|
-
|
|
2196
|
+
|
|
2197
|
+
if(!isPojoObject(row)) {
|
|
2198
|
+
console.trace(row)
|
|
2199
|
+
throw "\ninvalid insert data provided -> " + JSON.stringify(row);
|
|
1837
2200
|
}
|
|
1838
|
-
if(!isPojoObject(row)) throw "\ninvalid insert data provided -> " + JSON.stringify(row);
|
|
1839
2201
|
|
|
1840
2202
|
const { data, allowedCols } = this.validateNewData({ row, forcedData, allowedFields: fields, tableRules, fixIssues });
|
|
1841
2203
|
let _data = { ...data };
|
|
1842
|
-
|
|
1843
|
-
_data = await validate(_data);
|
|
1844
|
-
}
|
|
2204
|
+
|
|
1845
2205
|
let insertQ = "";
|
|
1846
2206
|
if(!Object.keys(_data).length) insertQ = `INSERT INTO ${asName(this.name)} DEFAULT VALUES `;
|
|
1847
2207
|
else insertQ = this.colSet.getInsertQuery(_data, allowedCols) // pgp.helpers.insert(_data, columnSet);
|
|
1848
2208
|
return insertQ + conflict_query + returningSelect;
|
|
1849
2209
|
};
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
if(param2){
|
|
1853
|
-
const good_params = ["returning", "multi", "onConflictDoNothing", "fixIssues"];
|
|
1854
|
-
const bad_params = Object.keys(param2).filter(k => !good_params.includes(k));
|
|
1855
|
-
if(bad_params && bad_params.length) throw "Invalid params: " + bad_params.join(", ") + " \n Expecting: " + good_params.join(", ");
|
|
1856
|
-
}
|
|
1857
2210
|
|
|
1858
2211
|
let query = "";
|
|
1859
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
|
+
|
|
1860
2222
|
if(Array.isArray(data)){
|
|
1861
2223
|
// if(returning) throw "Sorry but [returning] is dissalowed for multi insert";
|
|
1862
2224
|
let queries = await Promise.all(data.map(async p => {
|
|
1863
2225
|
const q = await makeQuery(p);
|
|
1864
2226
|
return q;
|
|
1865
2227
|
}));
|
|
1866
|
-
|
|
2228
|
+
|
|
1867
2229
|
query = pgp.helpers.concat(queries);
|
|
1868
2230
|
if(returning) queryType = "many";
|
|
1869
2231
|
} else {
|
|
@@ -1871,18 +2233,27 @@ export class TableHandler extends ViewHandler {
|
|
|
1871
2233
|
if(returning) queryType = "one";
|
|
1872
2234
|
}
|
|
1873
2235
|
|
|
1874
|
-
// console.log(query);
|
|
1875
2236
|
if(returnQuery) return query;
|
|
1876
|
-
|
|
1877
|
-
|
|
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;
|
|
1878
2249
|
} catch(e){
|
|
1879
2250
|
if(localParams && localParams.testRule) throw e;
|
|
1880
2251
|
throw { err: parseError(e), msg: `Issue with dbo.${this.name}.insert()` };
|
|
1881
|
-
}
|
|
2252
|
+
}
|
|
1882
2253
|
};
|
|
1883
2254
|
|
|
1884
|
-
prepareReturning = async (returning: FieldFilter, allowedFields: string[]
|
|
1885
|
-
let result =
|
|
2255
|
+
prepareReturning = async (returning: FieldFilter, allowedFields: string[]): Promise<SelectItem[]> => {
|
|
2256
|
+
let result: SelectItem[] = [];
|
|
1886
2257
|
if(returning){
|
|
1887
2258
|
let sBuilder = new SelectItemBuilder({
|
|
1888
2259
|
allFields: this.column_names.slice(0),
|
|
@@ -1893,13 +2264,16 @@ export class TableHandler extends ViewHandler {
|
|
|
1893
2264
|
});
|
|
1894
2265
|
await sBuilder.parseUserSelect(returning);
|
|
1895
2266
|
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
result += sBuilder.select.map(s => s.getQuery() + " AS " + asNameAlias(s.alias, tableAlias )).join(", ")
|
|
2267
|
+
return sBuilder.select;
|
|
1899
2268
|
}
|
|
1900
2269
|
|
|
1901
2270
|
return result;
|
|
1902
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
|
+
}
|
|
1903
2277
|
|
|
1904
2278
|
async delete(filter?: Filter, params?: DeleteParams, param3_unused?, table_rules?: TableRule, localParams: LocalParams = null): Promise<any> { //{ socket, func, has_rules = false, socketDb } = {}
|
|
1905
2279
|
try {
|
|
@@ -1955,7 +2329,7 @@ export class TableHandler extends ViewHandler {
|
|
|
1955
2329
|
if(!returningFields) {
|
|
1956
2330
|
throw "Returning dissallowed";
|
|
1957
2331
|
}
|
|
1958
|
-
_query += await this.prepareReturning(returning, this.parseFieldFilter(returningFields));
|
|
2332
|
+
_query += this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
|
|
1959
2333
|
}
|
|
1960
2334
|
|
|
1961
2335
|
if(returnQuery) return _query;
|
|
@@ -1984,18 +2358,12 @@ export class TableHandler extends ViewHandler {
|
|
|
1984
2358
|
return tblH.find(filter, { select: "", limit: 1 }, {}, table_rules, localParams)
|
|
1985
2359
|
.then(exists => {
|
|
1986
2360
|
if(exists && exists.length){
|
|
1987
|
-
// console.log(filter, "exists");
|
|
1988
2361
|
return tblH.update(filter, newData, params, table_rules, localParams);
|
|
1989
2362
|
} else {
|
|
1990
|
-
// console.log(filter, "existnts")
|
|
1991
2363
|
return tblH.insert({ ...newData, ...filter }, params, null, table_rules, localParams);
|
|
1992
2364
|
}
|
|
1993
2365
|
});
|
|
1994
2366
|
}
|
|
1995
|
-
// .catch(existnts => {
|
|
1996
|
-
// console.log(filter, "existnts")
|
|
1997
|
-
// return this.insert({ ...filter, ...newData}, params);
|
|
1998
|
-
// });
|
|
1999
2367
|
} catch(e){
|
|
2000
2368
|
if(localParams && localParams.testRule) throw e;
|
|
2001
2369
|
throw { err: parseError(e), msg: `Issue with dbo.${this.name}.upsert()` };
|
|
@@ -2099,40 +2467,9 @@ export class TableHandler extends ViewHandler {
|
|
|
2099
2467
|
}
|
|
2100
2468
|
|
|
2101
2469
|
}
|
|
2102
|
-
type TransactionHandler = {
|
|
2103
|
-
(): Promise<TxHandler>
|
|
2104
|
-
}
|
|
2105
|
-
export interface TxHandler {
|
|
2106
|
-
[key: string]: TableHandler | ViewHandler;
|
|
2107
|
-
}
|
|
2108
|
-
export type TxCB = {
|
|
2109
|
-
(t: TxHandler): (any | void);
|
|
2110
|
-
}
|
|
2111
|
-
export type TX = {
|
|
2112
|
-
(t: TxCB): Promise<(any | void)>;
|
|
2113
|
-
}
|
|
2114
|
-
// export type JoinMaker = (filter?: object, select?: FieldFilter, options?: SelectParams) => any;
|
|
2115
|
-
|
|
2116
|
-
// export type TableJoin = {
|
|
2117
|
-
// [key: string]: JoinMaker;
|
|
2118
|
-
// }
|
|
2119
|
-
// export type DbJoinMaker = {
|
|
2120
|
-
// innerJoin: TableJoin;
|
|
2121
|
-
// leftJoin: TableJoin;
|
|
2122
|
-
// innerJoinOne: TableJoin;
|
|
2123
|
-
// leftJoinOne: TableJoin;
|
|
2124
|
-
// }
|
|
2125
|
-
|
|
2126
|
-
// export type DbHandler = {
|
|
2127
|
-
// [key: string]: TableHandler | ViewHandler;
|
|
2128
|
-
// } & DbJoinMaker;
|
|
2129
|
-
|
|
2130
|
-
export type DbHandlerTX = { [key: string]: TX } | DbHandler;
|
|
2131
2470
|
|
|
2132
2471
|
|
|
2133
2472
|
import { JOIN_TYPES } from "./Prostgles";
|
|
2134
|
-
import { type } from "os";
|
|
2135
|
-
import { join } from "path";
|
|
2136
2473
|
|
|
2137
2474
|
export class DboBuilder {
|
|
2138
2475
|
tablesOrViews: TableOrViewInfo[];
|
|
@@ -2140,7 +2477,8 @@ export class DboBuilder {
|
|
|
2140
2477
|
db: DB;
|
|
2141
2478
|
schema: string = "public";
|
|
2142
2479
|
|
|
2143
|
-
dbo: DbHandler | DbHandlerTX;
|
|
2480
|
+
// dbo: DbHandler | DbHandlerTX;
|
|
2481
|
+
dbo: DbHandler;
|
|
2144
2482
|
pubSubManager: PubSubManager;
|
|
2145
2483
|
|
|
2146
2484
|
pojoDefinitions: string[];
|
|
@@ -2160,8 +2498,8 @@ export class DboBuilder {
|
|
|
2160
2498
|
private constructor(prostgles: Prostgles){
|
|
2161
2499
|
this.prostgles = prostgles;
|
|
2162
2500
|
this.db = this.prostgles.db;
|
|
2163
|
-
this.schema = this.prostgles.schema || "public";
|
|
2164
|
-
this.dbo = { };
|
|
2501
|
+
this.schema = this.prostgles.opts.schema || "public";
|
|
2502
|
+
this.dbo = { } as unknown as DbHandler;
|
|
2165
2503
|
// this.joins = this.prostgles.joins;
|
|
2166
2504
|
|
|
2167
2505
|
}
|
|
@@ -2169,7 +2507,7 @@ export class DboBuilder {
|
|
|
2169
2507
|
private init = async () => {
|
|
2170
2508
|
let onSchemaChange;
|
|
2171
2509
|
|
|
2172
|
-
if(this.prostgles.watchSchema){
|
|
2510
|
+
if(this.prostgles.opts.watchSchema){
|
|
2173
2511
|
onSchemaChange = (event: { command: string; query: string }) => {
|
|
2174
2512
|
this.prostgles.onSchemaChange(event)
|
|
2175
2513
|
}
|
|
@@ -2199,14 +2537,19 @@ export class DboBuilder {
|
|
|
2199
2537
|
}
|
|
2200
2538
|
|
|
2201
2539
|
async parseJoins(): Promise<JoinPaths> {
|
|
2202
|
-
if(this.prostgles.joins){
|
|
2203
|
-
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);
|
|
2204
2543
|
if(typeof _joins === "string" && _joins === "inferred"){
|
|
2205
|
-
_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))))
|
|
2206
2549
|
}
|
|
2207
2550
|
let joins = JSON.parse(JSON.stringify(_joins)) as Join[];
|
|
2208
2551
|
this.joins = joins;
|
|
2209
|
-
|
|
2552
|
+
|
|
2210
2553
|
// Validate joins
|
|
2211
2554
|
try {
|
|
2212
2555
|
// 1 find duplicates
|
|
@@ -2285,9 +2628,6 @@ export class DboBuilder {
|
|
|
2285
2628
|
}
|
|
2286
2629
|
});
|
|
2287
2630
|
});
|
|
2288
|
-
// console.log(this.joinPaths)
|
|
2289
|
-
// console.log(888, this.prostgles.joins);
|
|
2290
|
-
// console.log(this.joinGraph, findShortestPath(this.joinGraph, "colors", "drawings"));
|
|
2291
2631
|
}
|
|
2292
2632
|
|
|
2293
2633
|
return this.joinPaths;
|
|
@@ -2297,7 +2637,7 @@ export class DboBuilder {
|
|
|
2297
2637
|
|
|
2298
2638
|
}
|
|
2299
2639
|
|
|
2300
|
-
async build(): Promise<DbHandler
|
|
2640
|
+
async build(): Promise<DbHandler>{
|
|
2301
2641
|
|
|
2302
2642
|
// await this.pubSubManager.init()
|
|
2303
2643
|
|
|
@@ -2321,9 +2661,18 @@ export type TxCB = {
|
|
|
2321
2661
|
let joinTableNames = [];
|
|
2322
2662
|
|
|
2323
2663
|
let allDataDefs = "";
|
|
2664
|
+
let i18nDef = "type DeepPartial<T> = { [P in keyof T]?: DeepPartial<T[P]>; }; \n"
|
|
2665
|
+
i18nDef += "export type I18N_DBO_CONFIG<LANG_IDS = { en: 1, fr: 1 }> = { \n";
|
|
2666
|
+
i18nDef += " fallbackLang: keyof LANG_IDS; \n";
|
|
2667
|
+
i18nDef += " column_labels?: DeepPartial<{ \n";
|
|
2668
|
+
|
|
2669
|
+
|
|
2324
2670
|
|
|
2325
2671
|
this.tablesOrViews.map(tov => {
|
|
2326
|
-
|
|
2672
|
+
i18nDef += ` ${JSON.stringify(tov.name)}: { \n`;
|
|
2673
|
+
i18nDef += ` [key in ${tov.columns.map(c => JSON.stringify(c.name)).join(" | ")}]: { [lang_id in keyof LANG_IDS]: string }; \n`;
|
|
2674
|
+
i18nDef += ` }; \n`;
|
|
2675
|
+
|
|
2327
2676
|
const filterKeywords = Object.values(this.prostgles.keywords);
|
|
2328
2677
|
const $filterCol = tov.columns.find(c => filterKeywords.includes(c.name));
|
|
2329
2678
|
if($filterCol){
|
|
@@ -2378,6 +2727,8 @@ export type TxCB = {
|
|
|
2378
2727
|
}
|
|
2379
2728
|
}
|
|
2380
2729
|
});
|
|
2730
|
+
i18nDef += " }> \n";
|
|
2731
|
+
i18nDef += "} \n";
|
|
2381
2732
|
|
|
2382
2733
|
let joinBuilderDef = "";
|
|
2383
2734
|
if(joinTableNames.length){
|
|
@@ -2392,13 +2743,88 @@ export type TxCB = {
|
|
|
2392
2743
|
}
|
|
2393
2744
|
|
|
2394
2745
|
|
|
2395
|
-
if(this.prostgles.transactions){
|
|
2746
|
+
if(this.prostgles.opts.transactions){
|
|
2396
2747
|
let txKey = "tx";
|
|
2397
|
-
if(typeof this.prostgles.transactions === "string") txKey = this.prostgles.transactions;
|
|
2748
|
+
if(typeof this.prostgles.opts.transactions === "string") txKey = this.prostgles.opts.transactions;
|
|
2398
2749
|
this.dboDefinition += ` ${txKey}: (t: TxCB) => Promise<any | void> ;\n`;
|
|
2399
2750
|
|
|
2400
|
-
this.dbo[txKey] = (cb: TxCB) => this.getTX(cb);
|
|
2751
|
+
(this.dbo[txKey] as TX) = (cb: TxCB) => this.getTX(cb);
|
|
2401
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"`)
|
|
2826
|
+
}
|
|
2827
|
+
|
|
2402
2828
|
this.dboDefinition += "};\n";
|
|
2403
2829
|
|
|
2404
2830
|
this.tsTypesDefinition = [
|
|
@@ -2408,7 +2834,8 @@ export type TxCB = {
|
|
|
2408
2834
|
joinBuilderDef,
|
|
2409
2835
|
|
|
2410
2836
|
`/* DBO Definition. Isomorphic */`,
|
|
2411
|
-
this.dboDefinition
|
|
2837
|
+
this.dboDefinition,
|
|
2838
|
+
i18nDef,
|
|
2412
2839
|
].join("\n");
|
|
2413
2840
|
|
|
2414
2841
|
return this.dbo;
|
|
@@ -2417,15 +2844,23 @@ export type TxCB = {
|
|
|
2417
2844
|
|
|
2418
2845
|
getTX = (dbTX: TxCB) => {
|
|
2419
2846
|
return this.db.tx((t) => {
|
|
2420
|
-
let txDB = {};
|
|
2847
|
+
let txDB: TxHandler = {};
|
|
2421
2848
|
this.tablesOrViews.map(tov => {
|
|
2422
2849
|
if(tov.is_view){
|
|
2850
|
+
|
|
2423
2851
|
txDB[tov.name] = new ViewHandler(this.db, tov, this.pubSubManager, this, t, this.joinPaths);
|
|
2424
2852
|
} else {
|
|
2425
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);
|
|
2426
2861
|
}
|
|
2427
2862
|
});
|
|
2428
|
-
return dbTX(txDB);
|
|
2863
|
+
return dbTX(txDB, t);
|
|
2429
2864
|
});
|
|
2430
2865
|
}
|
|
2431
2866
|
}
|
|
@@ -2556,35 +2991,6 @@ export function isPlainObject(o) {
|
|
|
2556
2991
|
return Object(o) === o && Object.getPrototypeOf(o) === Object.prototype;
|
|
2557
2992
|
}
|
|
2558
2993
|
|
|
2559
|
-
// export const _PG_strings = ['bpchar','char','varchar','text','citext','uuid','bytea','inet','time','timetz','interval','name'] as const;
|
|
2560
|
-
// export const _PG_numbers = ['int2','int4','int8','float4','float8','numeric','money','oid'] as const;
|
|
2561
|
-
// export const _PG_json = ['json', 'jsonb'] as const;
|
|
2562
|
-
// export const _PG_bool = ['bool'] as const;
|
|
2563
|
-
// export const _PG_date = ['date', 'timestamp', 'timestamptz'] as const;
|
|
2564
|
-
// export const _PG_postgis = ['geometry'] as const;
|
|
2565
|
-
// export type PG_COLUMN_UDT_DATA_TYPE =
|
|
2566
|
-
// | typeof _PG_strings[number]
|
|
2567
|
-
// | typeof _PG_numbers[number]
|
|
2568
|
-
// | typeof _PG_json[number]
|
|
2569
|
-
// | typeof _PG_bool[number]
|
|
2570
|
-
// | typeof _PG_date[number]
|
|
2571
|
-
// | typeof _PG_postgis[number];
|
|
2572
|
-
|
|
2573
|
-
// export const TS_PG_Types: { [key: string]: readonly string[]; } = {
|
|
2574
|
-
// "string": _PG_strings,
|
|
2575
|
-
// "number": _PG_numbers,
|
|
2576
|
-
// "boolean": _PG_bool,
|
|
2577
|
-
// "Object": _PG_json,
|
|
2578
|
-
// "Date": _PG_date,
|
|
2579
|
-
// "Array<number>": _PG_numbers.map(s => `_${s}`),
|
|
2580
|
-
// "Array<boolean>": _PG_bool.map(s => `_${s}`),
|
|
2581
|
-
// "Array<string>": _PG_strings.map(s => `_${s}`),
|
|
2582
|
-
// "Array<Object>": _PG_json.map(s => `_${s}`),
|
|
2583
|
-
// "Array<Date>": _PG_date.map(s => `_${s}`),
|
|
2584
|
-
// "any": [],
|
|
2585
|
-
// } as const;
|
|
2586
|
-
// export type TS_COLUMN_DATA_TYPES = keyof typeof TS_PG_Types;
|
|
2587
|
-
|
|
2588
2994
|
function postgresToTsType(udt_data_type: PG_COLUMN_UDT_DATA_TYPE): keyof typeof TS_PG_Types {
|
|
2589
2995
|
return Object.keys(TS_PG_Types).find(k => {
|
|
2590
2996
|
return TS_PG_Types[k].includes(udt_data_type) || !TS_PG_Types[k].length;
|
|
@@ -2887,6 +3293,6 @@ async function getInferredJoins(db: DB, schema: string = "public"): Promise<Join
|
|
|
2887
3293
|
})
|
|
2888
3294
|
}
|
|
2889
3295
|
});
|
|
2890
|
-
|
|
3296
|
+
|
|
2891
3297
|
return joins;
|
|
2892
3298
|
}
|