From 5e812271e11521dde20c1704a8e0a5aeb883e448 Mon Sep 17 00:00:00 2001 From: Stan Runge Date: Mon, 26 Oct 2026 01:25:59 +0000 Subject: [PATCH] worldwide todo list: public todo list of 68 real, sourced problems (planet to street) at /projects/worldwide-todo. worldtodo schema (categories, tasks, change_requests), idempotent seed on deploy, public add/edit/delete requests with Turnstile + salted daily-rotating IP-hash rate limit, owner-only review queue (approve, edit & approve, reject) with live updates over /ws/worldtodo(-owner), JSON API, detail pages with OSM map and history; listed in projects, header, /start and sitemap --- data/worldtodo-seed.json | 1274 + drizzle.config.ts | 3 +- .../20261026012608_worldtodo/migration.sql | 95 + .../20261026012608_worldtodo/snapshot.json | 40822 ++++++++++++++++ scripts/build-worldtodo-seed.py | 237 + scripts/deploy-preflight.ts | 29 +- scripts/deploy-remote.sh | 2 + scripts/seed-worldtodo.ts | 87 + src/env.ts | 5 +- src/hooks.server.ts | 4 +- .../assets/projects/worldwide-todo-list.svg | 25 + src/lib/components/ProjectIcon.svelte | 2 + src/lib/projects.ts | 7 + src/lib/seo.ts | 5 + src/lib/server/db/schema/index.ts | 1 + src/lib/server/db/schema/schemas.ts | 1 + src/lib/server/db/schema/worldtodo.ts | 124 + src/lib/server/owner.ts | 5 +- src/lib/server/worldtodo/decide.ts | 33 + src/lib/server/worldtodo/limit.test.ts | 37 + src/lib/server/worldtodo/limit.ts | 66 + src/lib/server/worldtodo/live.ts | 86 + src/lib/server/worldtodo/requests.ts | 116 + src/lib/server/worldtodo/store.ts | 555 + src/lib/server/worldtodo/turnstile.ts | 32 + src/lib/server/worldtodo/validate.test.ts | 126 + src/lib/server/worldtodo/validate.ts | 247 + src/lib/worldtodo/IconTile.svelte | 41 + src/lib/worldtodo/StatusPill.svelte | 39 + src/lib/worldtodo/TaskCard.svelte | 125 + src/lib/worldtodo/TaskFieldsEditor.svelte | 401 + src/lib/worldtodo/Turnstile.svelte | 71 + src/lib/worldtodo/icons.ts | 52 + src/lib/worldtodo/live.ts | 54 + src/lib/worldtodo/shared.test.ts | 83 + src/lib/worldtodo/shared.ts | 180 + .../projects/worldwide-todo/+layout.server.ts | 12 + .../projects/worldwide-todo/+layout.svelte | 215 + .../projects/worldwide-todo/+page.server.ts | 35 + .../projects/worldwide-todo/+page.svelte | 470 + .../worldwide-todo/[slug]/+page.server.ts | 19 + .../worldwide-todo/[slug]/+page.svelte | 502 + .../worldwide-todo/api/categories/+server.ts | 6 + .../worldwide-todo/api/queue/+server.ts | 12 + .../api/queue/[id]/approve/+server.ts | 32 + .../api/queue/[id]/reject/+server.ts | 20 + .../worldwide-todo/api/requests/+server.ts | 41 + .../api/requests/[id]/+server.ts | 18 + .../worldwide-todo/api/tasks/+server.ts | 26 + .../api/tasks/[slug]/+server.ts | 49 + .../worldwide-todo/queue/+page.server.ts | 79 + .../worldwide-todo/queue/+page.svelte | 576 + .../worldwide-todo/request/+page.server.ts | 59 + .../worldwide-todo/request/+page.svelte | 299 + .../requests/[id]/+page.server.ts | 20 + .../worldwide-todo/requests/[id]/+page.svelte | 116 + src/routes/sitemap.xml/+server.ts | 11 +- src/routes/start/+page.svelte | 9 +- 58 files changed, 47689 insertions(+), 9 deletions(-) create mode 100644 data/worldtodo-seed.json create mode 100644 drizzle/20261026012608_worldtodo/migration.sql create mode 100644 drizzle/20261026012608_worldtodo/snapshot.json create mode 100644 scripts/build-worldtodo-seed.py create mode 100644 scripts/seed-worldtodo.ts create mode 100644 src/lib/assets/projects/worldwide-todo-list.svg create mode 100644 src/lib/server/db/schema/worldtodo.ts create mode 100644 src/lib/server/worldtodo/decide.ts create mode 100644 src/lib/server/worldtodo/limit.test.ts create mode 100644 src/lib/server/worldtodo/limit.ts create mode 100644 src/lib/server/worldtodo/live.ts create mode 100644 src/lib/server/worldtodo/requests.ts create mode 100644 src/lib/server/worldtodo/store.ts create mode 100644 src/lib/server/worldtodo/turnstile.ts create mode 100644 src/lib/server/worldtodo/validate.test.ts create mode 100644 src/lib/server/worldtodo/validate.ts create mode 100644 src/lib/worldtodo/IconTile.svelte create mode 100644 src/lib/worldtodo/StatusPill.svelte create mode 100644 src/lib/worldtodo/TaskCard.svelte create mode 100644 src/lib/worldtodo/TaskFieldsEditor.svelte create mode 100644 src/lib/worldtodo/Turnstile.svelte create mode 100644 src/lib/worldtodo/icons.ts create mode 100644 src/lib/worldtodo/live.ts create mode 100644 src/lib/worldtodo/shared.test.ts create mode 100644 src/lib/worldtodo/shared.ts create mode 100644 src/routes/projects/worldwide-todo/+layout.server.ts create mode 100644 src/routes/projects/worldwide-todo/+layout.svelte create mode 100644 src/routes/projects/worldwide-todo/+page.server.ts create mode 100644 src/routes/projects/worldwide-todo/+page.svelte create mode 100644 src/routes/projects/worldwide-todo/[slug]/+page.server.ts create mode 100644 src/routes/projects/worldwide-todo/[slug]/+page.svelte create mode 100644 src/routes/projects/worldwide-todo/api/categories/+server.ts create mode 100644 src/routes/projects/worldwide-todo/api/queue/+server.ts create mode 100644 src/routes/projects/worldwide-todo/api/queue/[id]/approve/+server.ts create mode 100644 src/routes/projects/worldwide-todo/api/queue/[id]/reject/+server.ts create mode 100644 src/routes/projects/worldwide-todo/api/requests/+server.ts create mode 100644 src/routes/projects/worldwide-todo/api/requests/[id]/+server.ts create mode 100644 src/routes/projects/worldwide-todo/api/tasks/+server.ts create mode 100644 src/routes/projects/worldwide-todo/api/tasks/[slug]/+server.ts create mode 100644 src/routes/projects/worldwide-todo/queue/+page.server.ts create mode 100644 src/routes/projects/worldwide-todo/queue/+page.svelte create mode 100644 src/routes/projects/worldwide-todo/request/+page.server.ts create mode 100644 src/routes/projects/worldwide-todo/request/+page.svelte create mode 100644 src/routes/projects/worldwide-todo/requests/[id]/+page.server.ts create mode 100644 src/routes/projects/worldwide-todo/requests/[id]/+page.svelte diff --git a/data/worldtodo-seed.json b/data/worldtodo-seed.json new file mode 100644 index 0000000..025ed14 --- /dev/null +++ b/data/worldtodo-seed.json @@ -0,0 +1,1274 @@ +{ + "as_of": "2026-10-26", + "schema_version": 1, + "scales": ["planet", "region", "country", "city", "street"], + "categories": [ + "climate", + "energy", + "environment", + "food", + "governance", + "health", + "housing", + "humanitarian", + "infrastructure", + "mobility", + "safety", + "waste", + "water" + ], + "tasks": [ + { + "slug": "interrupt-the-last-wild-poliovirus-transmission-in-afghanistan-and-pak", + "title": "Interrupt the last wild poliovirus transmission in Afghanistan and Pakistan", + "description": "Wild poliovirus type 1 is still endemic only in Afghanistan and Pakistan; GPEI/WHO counted 48 WPV1 cases in 2026 as of mid-October (42 Afghanistan, 6 Pakistan). Reach every missed child with vaccination so polio can be declared eradicated.", + "scale": "planet", + "category": "health", + "location_name": "Afghanistan & Pakistan (global eradication)", + "country_code": null, + "lat": 31.0, + "lon": 68.0, + "status": "open", + "source_urls": [ + "https://polioeradication.org/about-polio/polio-this-week/", + "https://www.emro.who.int/polio-eradication/home/" + ], + "source_date": "2026-10-18", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "eradicate-guinea-worm-disease-stop-the-last-human-and-animal-infection", + "title": "Eradicate Guinea worm disease: stop the last human and animal infections", + "description": "Only 10 human Guinea worm cases were reported worldwide in 2025 (Chad 4, Ethiopia 4, South Sudan 2), but 684 animal infections keep transmission alive. Finish containment, water filtration and animal surveillance in the six remaining countries.", + "scale": "planet", + "category": "health", + "location_name": "Chad, Ethiopia, South Sudan, Cameroon, Mali, Angola", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.cartercenter.org/news/guinea-worm-announcement/", + "https://www.cartercenter.org/programs/guinea-worm/" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "agree-and-adopt-a-binding-global-treaty-to-end-plastic-pollution", + "title": "Agree and adopt a binding global treaty to end plastic pollution", + "description": "UN plastics-treaty talks (INC) have not produced a treaty; INC-5.3 in Feb 2026 only elected a new chair, and the next substantive session, INC-5.4, is planned for 13–24 March 2027. Resolve the open disputes (production limits, chemicals of concern, decision rules) and adopt the treaty.", + "scale": "planet", + "category": "environment", + "location_name": "World", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.unep.org/en/inc-plastic-pollution", + "https://www.france24.com/en/live-news/20261001-plastic-treaty-talks-chair-sees-deal-possible-in-march" + ], + "source_date": "2026-10-01", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "designate-the-first-marine-protected-areas-under-the-high-seas-treaty", + "title": "Designate the first marine protected areas under the High Seas Treaty", + "description": "The BBNJ (High Seas) Agreement entered into force on 17 January 2026; its first COP is set for 11–22 January 2027 in New York. Set up the scientific body and designate the first high-seas protected areas so the treaty actually protects ocean life beyond national borders.", + "scale": "planet", + "category": "environment", + "location_name": "High seas (areas beyond national jurisdiction)", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.un.org/bbnjagreement/en", + "https://www.eli.org/vibrant-environment-blog/charting-new-waters-high-seas-treaty-after-two-months" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "get-food-to-the-645-million-people-who-are-chronically-hungry", + "title": "Get food to the 645 million people who are chronically hungry", + "description": "The UN SOFI 2026 report estimates 645 million people (7.8% of humanity) faced hunger in 2025. Progress is uneven, with hunger still rising in parts of Africa. Zero Hunger (SDG 2) by 2030 is off track.", + "scale": "planet", + "category": "food", + "location_name": "World", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://news.un.org/en/story/2026/07/1167987", + "https://www.fao.org/publications/fao-flagship-publications/the-state-of-food-security-and-nutrition-in-the-world/2026/en" + ], + "source_date": "2026-07", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "connect-the-655-million-people-who-still-have-no-electricity", + "title": "Connect the 655 million people who still have no electricity", + "description": "Tracking SDG7 2026: 655 million people still lack electricity, more than 560 million of them in Sub-Saharan Africa. Electrification has to roughly triple in pace to reach universal access by 2030.", + "scale": "planet", + "category": "energy", + "location_name": "World", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.esmap.org/news/tracking-sdg7-655-million-people-still-without-electricity-underscore-urgent-need-deliver", + "https://www.iea.org/news/655-million-people-still-living-without-electricity-underscore-urgent-need-to-deliver-on-universal-energy-access-target" + ], + "source_date": "2026-06", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "give-the-2-billion-people-cooking-on-polluting-fuels-access-to-clean-c", + "title": "Give the 2 billion people cooking on polluting fuels access to clean cooking", + "description": "About 2 billion people still cook with polluting fuels such as wood, charcoal and kerosene, which causes deadly household air pollution. On current trends 1.8 billion will still do so in 2030. In Sub-Saharan Africa alone, 970 million people lack clean cooking.", + "scale": "planet", + "category": "health", + "location_name": "World", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.esmap.org/news/tracking-sdg7-655-million-people-still-without-electricity-underscore-urgent-need-deliver", + "https://unstats.un.org/sdgs/report/2026/Goal-07/" + ], + "source_date": "2026-06", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "vaccinate-the-13-5-million-zero-dose-children-who-got-no-routine-vacci", + "title": "Vaccinate the 13.5 million 'zero-dose' children who got no routine vaccines", + "description": "WHO/UNICEF estimates (released July 2026) show that 13.5 million infants received no DTP vaccine at all in 2025. That is still 674,000 more than the 2019 baseline. Reach them, mostly in conflict-affected and fragile settings.", + "scale": "planet", + "category": "health", + "location_name": "World", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.who.int/news/item/15-07-2026-global-childhood-immunization-coverage-inches-forward-despite-conflict-and-hesitancy---unicef--who" + ], + "source_date": "2026-07-15", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "cut-malaria-s-282-million-cases-a-year-and-contain-antimalarial-drug-r", + "title": "Cut malaria's 282 million cases a year and contain antimalarial drug resistance", + "description": "The WHO World Malaria Report 2025 estimates 282 million cases and 610,000 deaths in 2024, both rising, with about 95% in Africa. Partial resistance to artemisinin threatens current treatments. Scale up vaccines, nets and new drugs.", + "scale": "planet", + "category": "health", + "location_name": "World", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.who.int/teams/global-malaria-programme/reports/world-malaria-report-2025/", + "https://www.who.int/en/news-room/fact-sheets/detail/malaria" + ], + "source_date": "2025-12", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "provide-safely-managed-drinking-water-to-the-2-1-billion-people-withou", + "title": "Provide safely managed drinking water to the 2.1 billion people without it", + "description": "One in four people worldwide (2.1 billion) still lack safely managed drinking water, and 106 million drink untreated surface water straight from rivers and lakes (WHO/UNICEF JMP).", + "scale": "planet", + "category": "water", + "location_name": "World", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.who.int/news/item/26-08-2025-1-in-4-people-globally-still-lack-access-to-safe-drinking-water---who--unicef", + "https://data.unicef.org/resources/jmp-report-2025/" + ], + "source_date": "2025-08-26", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "close-the-gap-on-the-global-methane-pledge-30-by-2030", + "title": "Close the gap on the Global Methane Pledge (-30% by 2030)", + "description": "UNEP's Global Methane Status Report says methane emissions are still rising. Even if fully implemented, current national plans would deliver only about an 8% cut by 2030, not the pledged 30%. Fix leaks in oil and gas, landfills and agriculture.", + "scale": "planet", + "category": "climate", + "location_name": "World", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.unep.org/en/news-and-stories/press-release/ministers-urge-decisive-methane-action-global-report-shows-progress" + ], + "source_date": "2025-11", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "cut-deaths-from-antimicrobial-resistance-by-10-by-2030", + "title": "Cut deaths from antimicrobial resistance by 10% by 2030", + "description": "In the 2024 UN political declaration, countries committed to cutting deaths associated with bacterial AMR by 10% by 2030, from a 2019 baseline of 4.95 million associated deaths. Deliver the surveillance, stewardship, antibiotic access and funding needed to get there.", + "scale": "planet", + "category": "health", + "location_name": "World", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.who.int/news/item/26-09-2024-world-leaders-commit-to-decisive-action-on-antimicrobial-resistance", + "https://press.un.org/en/2024/ga12642.doc.htm" + ], + "source_date": "2024-09-26", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "stop-low-earth-orbit-filling-up-with-space-debris", + "title": "Stop low Earth orbit filling up with space debris", + "description": "ESA's Space Environment Report 2026 counts roughly 1.5 million objects of 1–10 cm in orbit, and its orbital Health Index got about ten times worse in one year. Enforce end-of-life deorbiting, prevent fragmentations and fund active debris removal.", + "scale": "planet", + "category": "infrastructure", + "location_name": "Earth orbit", + "country_code": null, + "lat": null, + "lon": null, + "status": "open", + "source_urls": [ + "https://www.esa.int/Space_Safety/Space_Debris/ESA_Space_Environment_Report_2026" + ], + "source_date": "2026-09", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "scale-up-the-great-green-wall-from-1-66m-toward-100m-hectares-restored", + "title": "Scale up the Great Green Wall: from 1.66M toward 100M hectares restored across the Sahel", + "description": "As of end-2025 the Great Green Wall Observatory reports 1.66 million hectares under restoration, against a 100-million-hectare target for 2030. A new US$78M programme for 2026 aims to restore 270,000+ hectares in nine countries. Finance and deliver the rest.", + "scale": "region", + "category": "climate", + "location_name": "Sahel (Senegal to Djibouti)", + "country_code": null, + "lat": 15.0, + "lon": 5.0, + "status": "open", + "source_urls": [ + "https://www.unep.org/en/news-and-stories/press-release/new-us78-million-initiative-restore-land-improve-livelihoods-across", + "https://www.au.int/en/pressreleases/20260824/ambition-investment-calls-scaled-finance-great-green-wall" + ], + "source_date": "2026-08", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "end-the-multi-country-cholera-outbreaks-across-africa", + "title": "End the multi-country cholera outbreaks across Africa", + "description": "WHO reported cholera cases in 16 African countries by mid-2026, led by DR Congo, South Sudan and Mozambique. Africa CDC runs a continental cholera response plan. Fund WASH, oral vaccines and case management to stop it.", + "scale": "region", + "category": "health", + "location_name": "Africa (DRC, South Sudan, Mozambique, Malawi, Zambia, Zimbabwe, Namibia…)", + "country_code": null, + "lat": -5.0, + "lon": 25.0, + "status": "open", + "source_urls": [ + "https://africacdc.org/news-item/president-hakainde-hichilema-au-cholera-champion-joins-partners-to-unveil-africas-new-continental-cholera-plan/", + "https://www.afro.who.int/news/southern-africa-faces-acute-surge-cholera-due-floods-displacement" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "drive-amazon-deforestation-from-3-335-km-a-year-to-zero", + "title": "Drive Amazon deforestation from 3,335 km² a year to zero", + "description": "INPE's PRODES estimate for Aug 2025–Jul 2026 is 3,335 km² cleared in Brazil's Legal Amazon, the lowest since 1988 but still more than 3,000 km² of forest lost a year. Hold enforcement and reach the zero-deforestation-by-2030 goal.", + "scale": "region", + "category": "environment", + "location_name": "Amazon basin (Brazil's Legal Amazon)", + "country_code": null, + "lat": -5.0, + "lon": -60.0, + "status": "open", + "source_urls": [ + "https://www.gov.br/inpe/pt-br/assuntos/ultimas-noticias/brasil-alcanca-menores-taxas-de-desmatamento-da-serie-historica-na-amazonia-e-no-cerrado", + "https://terrabrasilis.dpi.inpe.br/app/dashboard/deforestation/biomes/legal_amazon/rates" + ], + "source_date": "2026-10", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "control-crown-of-thorns-starfish-outbreaks-so-the-great-barrier-reef-c", + "title": "Control crown-of-thorns starfish outbreaks so the Great Barrier Reef can recover", + "description": "The AIMS 2025/26 survey found hard coral cover recovering in the northern and central Great Barrier Reef but slipping in the south. The reef is still under pressure from cyclones, flooding and crown-of-thorns starfish. Keep culling and cut runoff.", + "scale": "region", + "category": "environment", + "location_name": "Great Barrier Reef, Australia", + "country_code": "AU", + "lat": -18.3, + "lon": 147.7, + "status": "open", + "source_urls": [ + "https://www.aims.gov.au/monitoring-great-barrier-reef/gbr-condition-summary-2025-26", + "https://www.gbrmpa.gov.au/learn/reef-health/reef-health-updates" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "recover-the-wwii-munitions-dumped-in-the-baltic-and-north-seas", + "title": "Recover the WWII munitions dumped in the Baltic and North Seas", + "description": "Germany's Baltic pilot recovered about 18 tonnes of sea-dumped munitions in 2024–25, a tiny fraction of what lies on the seabed corroding and leaking toxins. Next steps are an expanded Baltic phase, North Sea clearance and an offshore disposal platform due around end-2028.", + "scale": "region", + "category": "environment", + "location_name": "Baltic Sea & North Sea", + "country_code": null, + "lat": 54.5, + "lon": 11.0, + "status": "open", + "source_urls": [ + "https://www.bundesumweltministerium.de/pressemitteilung/probephase-zur-munitionsbergung-erfolgreich-abgeschlossen", + "https://www.bundesumweltministerium.de/en/topics/marine-conservation/unexploded-munitions-in-the-sea" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "fully-fund-food-aid-for-rohingya-refugees-in-cox-s-bazar", + "title": "Fully fund food aid for Rohingya refugees in Cox's Bazar", + "description": "Since April 2026 WFP has cut many of the roughly 1 million Rohingya refugees in Bangladesh to a tiered US$7–10 monthly food voucher, down from US$12, for lack of funding. Refugees report hardship and more negative coping. Restore full rations and fund the response.", + "scale": "region", + "category": "humanitarian", + "location_name": "Cox's Bazar, Bangladesh / Myanmar", + "country_code": null, + "lat": 21.2, + "lon": 92.15, + "status": "open", + "source_urls": [ + "https://www.wfp.org/news/wfp-introduces-needs-based-food-assistance-approach-rohingya-refugees-bangladesh", + "https://apnews.com/article/rohingya-bangladesh-aid-ration-cuts-wfp-8349d38f8f8b21c96e70b5e805468fd1" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "clear-gaza-s-61-million-tonnes-of-war-rubble", + "title": "Clear Gaza's ~61 million tonnes of war rubble", + "description": "UNDP estimates Gaza holds about 61 million tonnes of debris. Clearing most of it could take around seven years, and only with unimpeded access, heavy machinery, fuel and US$110M in up-front funding.", + "scale": "region", + "category": "humanitarian", + "location_name": "Gaza Strip", + "country_code": null, + "lat": 31.45, + "lon": 34.4, + "status": "open", + "source_urls": [ + "https://www.undp.org/stories/clearing-most-rubble-gaza-strip-possible-seven-years-under-right-conditions", + "https://www.reuters.com/world/middle-east/palestinians-use-gaza-rubble-restore-streets-us-rebuilding-plan-stalls-2026-04-27/" + ], + "source_date": "2025-11-20", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "stop-migrants-drowning-on-the-central-mediterranean-route", + "title": "Stop migrants drowning on the Central Mediterranean route", + "description": "IOM recorded 996 people dead or missing on the Central Mediterranean route by 15 Sept 2026, up from 844 in the same period of 2025, even though arrivals there fell by 55%. Restore search-and-rescue capacity and open safe routes.", + "scale": "region", + "category": "humanitarian", + "location_name": "Central Mediterranean (Libya/Tunisia – Italy/Malta)", + "country_code": null, + "lat": 35.0, + "lon": 14.0, + "status": "open", + "source_urls": [ + "https://www.iom.int/news/new-iom-data-migrant-arrivals-europe-fall-39-2026-while-deaths-continue-rise", + "https://missingmigrants.iom.int/data" + ], + "source_date": "2026-09", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "fund-the-response-for-8-2-million-people-in-need-in-the-lake-chad-basi", + "title": "Fund the response for 8.2 million people in need in the Lake Chad Basin", + "description": "OCHA (9 Sept 2026): 8.2 million people need humanitarian help across Cameroon, Chad, Niger and Nigeria around Lake Chad, with more than 3.5 million forcibly displaced.", + "scale": "region", + "category": "humanitarian", + "location_name": "Lake Chad Basin (Cameroon, Chad, Niger, Nigeria)", + "country_code": null, + "lat": 13.0, + "lon": 14.0, + "status": "open", + "source_urls": [ + "https://reliefweb.int/report/cameroon/lake-chad-basin-humanitarian-overview-2026-9-september-2026" + ], + "source_date": "2026-09-09", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "build-end-to-end-glacial-lake-outburst-flood-warning-systems-in-the-hi", + "title": "Build end-to-end glacial-lake-outburst-flood warning systems in the Himalaya", + "description": "Glacier melt across the Hindu Kush Himalaya is swelling glacial lakes. India runs only a pilot GLOF early-warning system (Sissu Lake) and has no end-to-end national system commissioned. ICIMOD is preparing a 2027–2030 regional programme on early warning.", + "scale": "region", + "category": "climate", + "location_name": "Hindu Kush Himalaya (Afghanistan to Myanmar)", + "country_code": null, + "lat": 30.0, + "lon": 82.0, + "status": "open", + "source_urls": [ + "https://www.icimod.org/event/cryosphere-water/hkh-drr-hub-2026/", + "https://timesofindia.indiatimes.com/city/dehradun/ndma-moves-to-scale-up-glof-warning-system-after-sissu-pilot-review/articleshow/130415374.cms" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "get-water-and-food-to-drought-hit-communities-in-somalia-kenya-and-eth", + "title": "Get water and food to drought-hit communities in Somalia, Kenya and Ethiopia", + "description": "Failed Oct–Dec rains triggered severe drought across Somalia, northern Kenya and south-eastern Ethiopia. About 5 million people are affected in Somalia alone, and Oxfam reports water prices up 2,000% in the worst-hit areas.", + "scale": "region", + "category": "humanitarian", + "location_name": "Horn of Africa", + "country_code": null, + "lat": 4.0, + "lon": 43.0, + "status": "open", + "source_urls": [ + "https://www.unocha.org/publications/report/somalia/somalia-2025-2026-drought-emergency-situation-report-no-5", + "https://www.oxfam.org/en/press-releases/millions-people-across-somalia-kenya-and-ethiopia-facing-drought-crisis-cost-water" + ], + "source_date": "2026-04", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "curb-river-sand-mining-that-is-pushing-salt-water-into-the-mekong-delt", + "title": "Curb river sand mining that is pushing salt water into the Mekong Delta", + "description": "A 2026 NTU Singapore study finds sand mining extracts 6–15× the river's natural sediment supply and drives saltwater intrusion further inland, on top of subsidence from groundwater pumping. Set and enforce sustainable extraction limits.", + "scale": "region", + "category": "environment", + "location_name": "Mekong Delta (Vietnam/Cambodia)", + "country_code": null, + "lat": 10.0, + "lon": 105.8, + "status": "open", + "source_urls": [ + "https://www.ntu.edu.sg/nie/news-events/news/detail/sand-mining-is-destabilising-the-mekong-delta-far-more-than-previously-understood--nie--ntu-singapore-study-finds" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "prevent-famine-in-sudan-s-darfur-and-kordofan", + "title": "Prevent famine in Sudan's Darfur and Kordofan", + "description": "The IPC alert of 12 Oct 2026 warns of rapidly worsening conditions across Greater Darfur and Kordofan. Famine is highly likely in El Fasher, and access is severely restricted. Sudan's 2026 response plan asks US$2.9 billion and was badly underfunded.", + "scale": "country", + "category": "humanitarian", + "location_name": "Sudan", + "country_code": "SD", + "lat": 13.6, + "lon": 25.35, + "status": "open", + "source_urls": [ + "https://reliefweb.int/report/sudan/sudan-ipc-alert-new-evidence-reveals-rapidly-worsening-conditions-across-greater-darfur-and-kordofan-published-12-october-2026", + "https://fts.unocha.org/countries/212/summary/2026" + ], + "source_date": "2026-10-12", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "demine-ukraine-s-132-000-km-of-mine-contaminated-land", + "title": "Demine Ukraine's ~132,000 km² of mine-contaminated land", + "description": "As of Feb 2026, about 132,000 km² of Ukraine, nearly a quarter of the country, was potentially contaminated by mines and explosive remnants. Clearance teams return a few thousand hectares a month.", + "scale": "country", + "category": "safety", + "location_name": "Ukraine", + "country_code": "UA", + "lat": 48.4, + "lon": 31.2, + "status": "open", + "source_urls": [ + "https://reliefweb.int/report/ukraine/landmines-use-contamination-and-civilian-harm-ukraine-factsheet-2026-enuk", + "https://demine.gov.ua/en" + ], + "source_date": "2026-02", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "help-haiti-s-1-49-million-displaced-people-return-home-safely", + "title": "Help Haiti's 1.49 million displaced people return home safely", + "description": "IOM counted 1,494,456 internally displaced people in Haiti (about 13% of the population) as of August 2026, driven by gang violence. Cholera also keeps recurring.", + "scale": "country", + "category": "humanitarian", + "location_name": "Haiti", + "country_code": "HT", + "lat": 18.97, + "lon": -72.29, + "status": "open", + "source_urls": ["https://reliefweb.int/report/haiti/iom-haiti-situation-report-august-2026"], + "source_date": "2026-08", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "get-arsenic-out-of-bangladesh-s-drinking-water", + "title": "Get arsenic out of Bangladesh's drinking water", + "description": "A 2025 survey estimates about 26 million Bangladeshis still drink groundwater above the WHO arsenic guideline (10 µg/L), about 15.5 million of them above the national 50 µg/L standard. Test wells and switch people to safe sources.", + "scale": "country", + "category": "water", + "location_name": "Bangladesh", + "country_code": "BD", + "lat": 23.7, + "lon": 90.4, + "status": "open", + "source_urls": [ + "https://www.medrxiv.org/content/10.64898/2026.10.06.26364882v1.full.pdf", + "https://www.bssnews.net/js-session/401178" + ], + "source_date": "2026-10", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "replace-every-lead-drinking-water-pipe-in-the-united-states", + "title": "Replace every lead drinking-water pipe in the United States", + "description": "Under EPA's Lead and Copper Rule Improvements, most US water systems must start mandatory lead service line replacement by 1 Nov 2027 and finish by 31 Dec 2037.", + "scale": "country", + "category": "water", + "location_name": "United States", + "country_code": "US", + "lat": 39.8, + "lon": -98.6, + "status": "open", + "source_urls": [ + "https://www.epa.gov/ground-water-and-drinking-water/planning-and-conducting-lead-service-line-replacement", + "https://www.federalregister.gov/documents/2024/10/30/2024-23549/national-primary-drinking-water-regulations-for-lead-and-copper-improvements-lcri" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "stop-sewage-spills-into-england-s-rivers-and-seas", + "title": "Stop sewage spills into England's rivers and seas", + "description": "Storm overflows in England still spilled 291,492 times in 2025, totalling around 1.8 million hours, even though that was down 35% on 2024 (Environment Agency).", + "scale": "country", + "category": "water", + "location_name": "England, UK", + "country_code": "GB", + "lat": 52.5, + "lon": -1.5, + "status": "open", + "source_urls": [ + "https://www.gov.uk/government/news/fewer-and-shorter-storm-overflow-spills-in-2025-new-monitoring-data-shows", + "https://commonslibrary.parliament.uk/research-briefings/cbp-10027/" + ], + "source_date": "2026-03", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "fix-the-netherlands-electricity-grid-congestion", + "title": "Fix the Netherlands' electricity grid congestion", + "description": "On 30 June 2026, Dutch regional grid operators had 15,498 requests to take power and 8,558 to feed it in waiting on queues because the grid is full (Netbeheer Nederland). Small consumers in congested areas have also been queued since 1 July 2026.", + "scale": "country", + "category": "infrastructure", + "location_name": "Netherlands", + "country_code": "NL", + "lat": 52.2, + "lon": 5.3, + "status": "open", + "source_urls": [ + "https://www.netbeheernederland.nl/artikelen/persbericht/bouw-versnelt-opnieuw-maar-de-vraag-loopt-nog-steeds-op", + "https://www.netbeheernederland.nl/sites/default/files/2026-10/stand_van_de_uitvoering_halfjaar_2026.pdf" + ], + "source_date": "2026-10", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "close-the-dutch-housing-shortage-of-384-000-homes", + "title": "Close the Dutch housing shortage of 384,000 homes", + "description": "The Primos forecast 2026 puts the Dutch statistical housing shortage at 384,000 homes (4.6% of stock). 213,000 extra homes would be needed immediately just to get down to the 2% target level.", + "scale": "country", + "category": "housing", + "location_name": "Netherlands", + "country_code": "NL", + "lat": 52.2, + "lon": 5.3, + "status": "open", + "source_urls": [ + "https://www.tweedekamer.nl/kamerstukken/detail/detail?did=2026D34061&id=2026D34061" + ], + "source_date": "2026-07", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "finish-earthquake-strengthening-the-remaining-8-500-homes-in-groningen", + "title": "Finish earthquake-strengthening the remaining ~8,500 homes in Groningen", + "description": "The Nationaal Coördinator Groningen's 2026 plan still lists 8,583 addresses to strengthen against gas-extraction earthquakes, 1,278 of them heavy or demolish-and-rebuild cases.", + "scale": "country", + "category": "safety", + "location_name": "Groningen, Netherlands", + "country_code": "NL", + "lat": 53.22, + "lon": 6.57, + "status": "open", + "source_urls": [ + "https://www.nationaalcoordinatorgroningen.nl/site/binaries/site-content/collections/documents/2025/12/jaarplan-ncg-2026/jaarplan-ncg-2026.pdf", + "https://www.oogtv.nl/2026/02/ncg-blij-over-aantal-veilig-beoordeelde-huizen-maar-versterking-of-nieuwbouw-begint-bij-13-procent-te-laat/" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "finish-the-last-benefits-scandal-toeslagenaffaire-reviews", + "title": "Finish the last benefits-scandal (toeslagenaffaire) reviews", + "description": "As of 25 Sept 2026, 103 parents were still waiting on their full review (integrale beoordeling) by the UHT: 90 in progress and 13 not yet started. Close them out fairly.", + "scale": "country", + "category": "governance", + "location_name": "Netherlands", + "country_code": "NL", + "lat": 52.08, + "lon": 4.31, + "status": "open", + "source_urls": ["https://herstel.toeslagen.nl/dashboard-kinderopvangtoeslag/"], + "source_date": "2026-09-25", + "as_of": "2026-10-26", + "confidence": "medium", + "verification_note": "Small remaining backlog; may be finished soon, so re-check the dashboard." + }, + { + "slug": "fund-the-renewal-of-ageing-dutch-national-bridges-tunnels-and-locks", + "title": "Fund the renewal of ageing Dutch national bridges, tunnels and locks", + "description": "Rijkswaterstaat manages about 5,500 concrete bridges and 88 lock complexes. Its maintenance and renewal job is bigger than its budget, with a reported shortfall of about €34.5bn for 2024–2038, and an Oct 2026 Kamerbrief re-prioritises the work.", + "scale": "country", + "category": "infrastructure", + "location_name": "Netherlands", + "country_code": "NL", + "lat": 52.2, + "lon": 5.3, + "status": "open", + "source_urls": [ + "https://www.rijkswaterstaat.nl/nieuws/archief/2026/10/kamerbrief-herprioritering-onderhoud-en-vernieuwing-infrastructuur", + "https://zoek.officielebekendmakingen.nl/ah-tk-20252026-914.html" + ], + "source_date": "2026-10", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "speed-up-germany-s-motorway-bridge-repairs-target-400-a-year-achieving", + "title": "Speed up Germany's motorway bridge repairs (target 400 a year, achieving ~170)", + "description": "Germany aims to modernise 4,000 motorway bridge sections in ten years, about 400 a year. Only 157 were finished in 2025 and about 170 are expected in 2026.", + "scale": "country", + "category": "infrastructure", + "location_name": "Germany", + "country_code": "DE", + "lat": 51.2, + "lon": 10.4, + "status": "open", + "source_urls": [ + "https://baubote.de/tiefbau-infrastruktur/brueckensanierung-autobahn-zahlen-2025-2026", + "https://www.handelsblatt.com/mobilitaet/background-verkehr-und-smart-mobility/autobahnen-sind-deutschlands-bruecken-halb-verfallen-oder-halb-saniert/100263521.html" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "lower-gouda-s-inner-city-groundwater-level-to-stop-subsidence-damage", + "title": "Lower Gouda's inner-city groundwater level to stop subsidence damage", + "description": "Gouda and Rijnland are working on 'Gouda Stevige Stad': lowering the water level in the lowest, subsiding parts of the historic centre by 25 cm. Sewers, water-level barriers and a pumping station must be ready first, and the first level reduction is expected in 2027.", + "scale": "city", + "category": "infrastructure", + "location_name": "Gouda (binnenstad), NL", + "country_code": "NL", + "lat": 52.0115, + "lon": 4.7105, + "status": "in_progress", + "source_urls": [ + "https://www.gouda.nl/gouda-werkt-aan-de-stad/gouda-stevige-stad/", + "https://gouda.bestuurlijkeinformatie.nl/Document/View/ee2f89a0-8e2a-4176-b8a8-1e7caf2cd15c" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "replace-amsterdam-s-failing-historic-quay-walls", + "title": "Replace Amsterdam's failing historic quay walls", + "description": "Amsterdam has replaced about 3.5 km of quay wall since 2021. In 2026 it is working on 14 quay projects (about 2,150 m) under its Bridges & Quay Walls programme. Hundreds of kilometres of old quays still need assessing and renewing.", + "scale": "city", + "category": "infrastructure", + "location_name": "Amsterdam, NL", + "country_code": "NL", + "lat": 52.3731, + "lon": 4.8925, + "status": "in_progress", + "source_urls": [ + "https://aandegrachten.amsterdam/hier-werken-we-in-2026-aan-bruggen-en-kademuren/", + "https://www.amsterdam.nl/projecten/kademuren" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "renovate-rotterdam-s-55-movable-bridges-and-locks", + "title": "Renovate Rotterdam's 55 movable bridges and locks", + "description": "Rotterdam's ten-year 'Open/Dicht' programme will tackle overdue maintenance on 55 movable bridges and locks, including the Erasmusbrug. The first six go to tender in 2026.", + "scale": "city", + "category": "infrastructure", + "location_name": "Rotterdam, NL", + "country_code": "NL", + "lat": 51.9244, + "lon": 4.4778, + "status": "in_progress", + "source_urls": [ + "https://www.infrasite.nl/aanbesteden/2026/09/02/rotterdam-gaat-55-bruggen-en-sluizen-renoveren-aanbesteding-voor-o-a-erasmusbrug-start-dit-jaar/" + ], + "source_date": "2026-09-02", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "repair-leiden-s-13-km-of-ageing-quay-walls", + "title": "Repair Leiden's 13 km of ageing quay walls", + "description": "Leiden has started a 15-year programme for 13 km of quay walls at 114 locations, starting with the worst. The first big works (Oude Vest, Herengracht, Kalvermarkt) start in 2027.", + "scale": "city", + "category": "infrastructure", + "location_name": "Leiden, NL", + "country_code": "NL", + "lat": 52.1595, + "lon": 4.4909, + "status": "open", + "source_urls": [ + "https://gemeente.leiden.nl/projecten/verbeteren-kades/", + "https://www.infrasite.nl/waterbouw-deltas/2026/07/01/leiden-start-miljoenenoperatie-voor-verouderde-kademuren-in-historische-binnenstad/" + ], + "source_date": "2026-07", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "stop-pfas-emissions-from-the-chemours-plant-in-dordrecht", + "title": "Stop PFAS emissions from the Chemours plant in Dordrecht", + "description": "The province of Zuid-Holland is appealing at the Raad van State for stricter PFAS limits on Chemours, with a ruling expected in autumn 2026, while DCMR monitors PFAS in air and rainfall around Dordrecht.", + "scale": "city", + "category": "environment", + "location_name": "Dordrecht, NL", + "country_code": "NL", + "lat": 51.8105, + "lon": 4.6458, + "status": "open", + "source_urls": [ + "https://www.zuid-holland.nl/onderwerpen/milieu/chemours/", + "https://www.dcmr.nl/actueel/dossiers/dossier-chemours-delrin-dupont-en-dow" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "get-utrecht-s-3-000-homeless-people-into-housing", + "title": "Get Utrecht's ~3,000 homeless people into housing", + "description": "About 3,000 people in Utrecht are homeless or at risk of homelessness (AD). The city promised 100 'Wonen Eerst' homes for homeless young people in 2026, and the average wait for social housing is close to 12 years.", + "scale": "city", + "category": "housing", + "location_name": "Utrecht, NL", + "country_code": "NL", + "lat": 52.0907, + "lon": 5.1216, + "status": "open", + "source_urls": [ + "https://www.ad.nl/utrecht/aantal-dak-en-thuislozen-in-utrecht-groeit-naar-3000-dit-schrijnende-verhaal-schuilt-achter-de-cijfers~aecf1218/", + "https://momusmedia.nl/updates/utrecht-belooft-100-woningen-aan-dakloze-jongeren-hoe-staat-het-ervoor/" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "medium", + "verification_note": "AD article date not confirmed; figures from search summary." + }, + { + "slug": "rebuild-dresden-s-collapsed-carolabr-cke", + "title": "Rebuild Dresden's collapsed Carolabrücke", + "description": "The Carolabrücke collapsed in Sept 2024 and was fully demolished by Sept 2025. Planners were contracted in Sept 2026, with construction planned from May 2028 and completion in the early 2030s.", + "scale": "city", + "category": "infrastructure", + "location_name": "Dresden, DE", + "country_code": "DE", + "lat": 51.0568, + "lon": 13.747, + "status": "in_progress", + "source_urls": [ + "https://www.dresden.de/de/stadtraum/zentrale-projekte/carolabruecke.php", + "https://www.dresden.de/de/rathaus/aktuelles/pressemitteilungen/2026/09/pm_096.php" + ], + "source_date": "2026-09", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "reopen-hammersmith-bridge-in-london", + "title": "Reopen Hammersmith Bridge in London", + "description": "Hammersmith Bridge has been closed to motor vehicles since 2019. Full restoration was costed at about £300m, plans to reopen it to cars have been shelved, and a cheaper phased repair is now being pursued.", + "scale": "city", + "category": "infrastructure", + "location_name": "London, UK", + "country_code": "GB", + "lat": 51.4884, + "lon": -0.2302, + "status": "open", + "source_urls": [ + "https://tfl.gov.uk/travel-information/improvements-and-projects/hammersmith-bridge", + "https://www.bbc.co.uk/news/articles/c5yzqv29d1eo" + ], + "source_date": "2026-10", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "stop-jakarta-sinking-enforce-the-groundwater-ban-and-pipe-in-water", + "title": "Stop Jakarta sinking: enforce the groundwater ban and pipe in water", + "description": "North Jakarta sinks on average about 3.5 cm a year, up to 20 cm in places, and roughly 40% of the city is below sea level. Enforce the tightened groundwater-extraction rules and expand piped water.", + "scale": "city", + "category": "climate", + "location_name": "Jakarta, ID", + "country_code": "ID", + "lat": -6.1754, + "lon": 106.8272, + "status": "open", + "source_urls": [ + "https://www.thejakartapost.com/indonesia/2026/02/09/jakarta-tightens-groundwater-rule-to-curb-subsidence", + "https://www.straitstimes.com/asia/se-asia/jakarta-sinks-deeper-as-subsidence-worsens-flood-risks" + ], + "source_date": "2026-02", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "clean-up-delhi-s-toxic-winter-air", + "title": "Clean up Delhi's toxic winter air", + "description": "Delhi's AQI passed 300 on 23 Oct 2026 even with GRAP Stage I in force, as crop-stubble fires in Punjab and Haryana resumed. Cut stubble burning, construction dust and vehicle emissions.", + "scale": "city", + "category": "health", + "location_name": "Delhi, IN", + "country_code": "IN", + "lat": 28.6139, + "lon": 77.209, + "status": "open", + "source_urls": [ + "https://www.indiatoday.in/amp/science/story/delhi-aqi-today-pollution-control-measures-grap-ncr-smog-3023247-2026-10-23" + ], + "source_date": "2026-10-23", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "fix-mexico-city-s-leaking-water-network", + "title": "Fix Mexico City's leaking water network", + "description": "Mexico City loses an estimated 40–50% of its drinking water to leaks in the public network and homes. Aquifer over-pumping makes parts of the city sink by up to about 24 cm a year.", + "scale": "city", + "category": "water", + "location_name": "Mexico City, MX", + "country_code": "MX", + "lat": 19.4326, + "lon": -99.1332, + "status": "open", + "source_urls": [ + "https://www.jornada.com.mx/2026/08/14/capital/027n1cap", + "https://politica.expansion.mx/mexico/2026/10/19/cutzamala-llenado-abasto-agua-valle-de-mexico" + ], + "source_date": "2026-10", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "unblock-lagos-drainage-channels-to-end-flash-flooding", + "title": "Unblock Lagos drainage channels to end flash flooding", + "description": "Lagos State approved dredging of 28 drainage channels and has removed 1,544 of 2,218 identified structures blocking drainage. Refuse dumping and wetland encroachment still cause floods.", + "scale": "city", + "category": "climate", + "location_name": "Lagos, NG", + "country_code": "NG", + "lat": 6.5244, + "lon": 3.3792, + "status": "in_progress", + "source_urls": [ + "https://punchng.com/sanwo-olu-approves-dredging-of-28-drainage-channels-to-tackle-lagos-floods/", + "https://punchng.com/lasg-removes-over-1500-structures-to-tackle-flooding/" + ], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "fix-the-sunken-path-at-the-new-footbridge-on-tesselschadestraat-gouda", + "title": "Fix the sunken path at the new footbridge on Tesselschadestraat, Gouda", + "description": "Paving at one end of the footbridge in Korte Akkeren, built in 2025, sank in July 2026 when sand washed out, leaving a hole. The council fenced off the crossing and said it would repair it as soon as possible.", + "scale": "street", + "category": "infrastructure", + "location_name": "Tesselschadestraat, Korte Akkeren, Gouda", + "country_code": "NL", + "lat": 52.0014, + "lon": 4.6979, + "status": "open", + "source_urls": [ + "https://www.goudsepost.nl/nieuws/nieuws/471080/gat-voor-brug-tesselschadestraat-na-verzakking-tegels", + "https://www.omroepwest.nl/verkeer/5130955/gat-ontstaan-pal-voor-bruggetje-oeververbinding-afgesloten" + ], + "source_date": "2026-07-24", + "as_of": "2026-10-26", + "confidence": "medium", + "verification_note": "Reported in July 2026; no repair confirmation found, but it may have been fixed since." + }, + { + "slug": "slow-down-fast-bikes-and-scooters-on-the-aschpotpad-dog-walking-area-g", + "title": "Slow down fast bikes and scooters on the Aschpotpad dog-walking area, Gouda", + "description": "The Aschpotpad in Achterwillens runs straight through an off-leash dog area. A dog was hit and killed by a cyclist on 23 July 2026, and Leefbaar Gouda asked the council for speed-reducing measures such as narrowings and posts.", + "scale": "street", + "category": "safety", + "location_name": "Aschpotpad, Achterwillens, Gouda", + "country_code": "NL", + "lat": 52.0257, + "lon": 4.7217, + "status": "open", + "source_urls": [ + "https://www.goudsepost.nl/nieuws/nieuws/473975/leefbaar-gouda-stelt-vragen-over-veiligheid-aschpotpad-na-dood-hondje" + ], + "source_date": "2026-08-19", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "stop-rat-run-traffic-on-onder-de-boompjes-gouda", + "title": "Stop rat-run traffic on Onder de Boompjes, Gouda", + "description": "With the Koningin Wilhelminaweg works, drivers ignore the closure signs and cut through narrow Onder de Boompjes. Police wrote 16 tickets in one hour on 22 Oct 2026 and will check more often. A physical measure would fix it for good.", + "scale": "street", + "category": "mobility", + "location_name": "Onder de Boompjes, Gouda", + "country_code": "NL", + "lat": 52.0106, + "lon": 4.698, + "status": "open", + "source_urls": [ + "https://www.goudsepost.nl/nieuws/nieuws/482518/politie-bekeurt-16-automobilisten-in-een-uur-op-onder-de-boompjes", + "https://www.ad.nl/gouda/veel-boetes-voor-sluipverkeer-bij-onder-de-boompjes~adc6ac57/" + ], + "source_date": "2026-10-22", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "fix-the-dangerous-sunken-pavement-on-schoonegge-rotterdam-zuidwijk", + "title": "Fix the dangerous sunken pavement on Schoonegge, Rotterdam-Zuidwijk", + "description": "A resident broke her wrist after falling on sunken, uneven tiles. The council has had at least ten reports but postponed repair to 2027 (tree roots, no contractor). The Pendrecht-Zuidwijk wijkraad asks for a temporary safe path now.", + "scale": "street", + "category": "infrastructure", + "location_name": "Schoonegge, Zuidwijk, Rotterdam", + "country_code": "NL", + "lat": 51.8717, + "lon": 4.4915, + "status": "open", + "source_urls": [ + "https://dagblad010.nl/Rotterdam%20&%20Regio/wijkraad-eist-opheldering-over-gevaarlijk-trottoir-in-rotterdam-zuid-" + ], + "source_date": "2026-10-08", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "repair-the-underground-water-leak-causing-sinkholes-on-crooswijksestra", + "title": "Repair the underground water leak causing sinkholes on Crooswijksestraat, Rotterdam", + "description": "An underground water leak washed away sand and opened holes in pavements and streets around Crooswijksestraat and Hendrikstraat, and flooded crawl spaces. Streets are fenced off and Evides is repairing the leak (25 Oct 2026).", + "scale": "street", + "category": "water", + "location_name": "Crooswijksestraat / Hendrikstraat, Crooswijk, Rotterdam", + "country_code": "NL", + "lat": 51.9329, + "lon": 4.4912, + "status": "in_progress", + "source_urls": [ + "https://www.ad.nl/rotterdam/gaten-in-stoepen-en-straten-door-ondergrondse-lekkage-crooswijk~a2a95e15/" + ], + "source_date": "2026-10-25", + "as_of": "2026-10-26", + "confidence": "medium", + "verification_note": "Repair was under way on 25 Oct; it will likely be done within days." + }, + { + "slug": "tackle-dumped-furniture-rats-and-overflowing-containers-in-oud-mathene", + "title": "Tackle dumped furniture, rats and overflowing containers in Oud-Mathenesse, Rotterdam", + "description": "Residents of Oud-Mathenesse report furniture dumped on the street, rats ripping open bin bags and litter everywhere. The council says it is not a major problem, so residents are documenting it themselves (24 Oct 2026).", + "scale": "street", + "category": "waste", + "location_name": "Oud-Mathenesse, Rotterdam", + "country_code": "NL", + "lat": 51.9135, + "lon": 4.43, + "status": "open", + "source_urls": [ + "https://www.inderegiorotterdam.nl/nieuws/ratten-gedumpte-meubels-en-volle-containers-bewoners-willen-afvalprobleem-in-oud-mathenesse-zichtbaar-maken" + ], + "source_date": "2026-10-24", + "as_of": "2026-10-26", + "confidence": "medium", + "verification_note": "Coordinates are approximate for the neighbourhood." + }, + { + "slug": "get-help-and-shelter-for-people-sleeping-under-the-hofbogen-agniesebuu", + "title": "Get help and shelter for people sleeping under the Hofbogen, Agniesebuurt, Rotterdam", + "description": "Open drug use and dealing, litter and vandalism are concentrated along the Hofbogen between former Hofplein station and Eudokiaplein. The council added BOAs, cleaning and outreach in Oct 2026, but evenings remain a problem and shelter capacity is short.", + "scale": "street", + "category": "safety", + "location_name": "Hofbogen, Agniesebuurt, Rotterdam", + "country_code": "NL", + "lat": 51.9295, + "lon": 4.4745, + "status": "in_progress", + "source_urls": [ + "https://www.ad.nl/rotterdam/bewoners-klagen-al-langer-over-drugs-alcohol-en-vernieling-rotterdam-komt-nu-met-maatregelen-voor-de-agniesebuurt~a09e0ac8/" + ], + "source_date": "2026-10-19", + "as_of": "2026-10-26", + "confidence": "medium", + "verification_note": "Coordinates are approximate." + }, + { + "slug": "stop-the-schenkviaduct-leaking-rusty-water-onto-cars-on-weteringkade-d", + "title": "Stop the Schenkviaduct leaking rusty water onto cars on Weteringkade, Den Haag", + "description": "Since at least 2008 the Schenkviaduct has dripped leak water with concrete rot and rust onto parked cars. The council admits it is not solved, and the viaduct's renovation sits in its Meerjarenprogramma Kunstwerken 2026–2029.", + "scale": "street", + "category": "infrastructure", + "location_name": "Schenkviaduct / Weteringkade, Den Haag", + "country_code": "NL", + "lat": 52.0737, + "lon": 4.3254, + "status": "open", + "source_urls": [ + "https://www.omroepwest.nl/verkeer/5163344/zorgen-om-viaduct-in-den-haag-straks-stort-het-in" + ], + "source_date": "2026-10-24", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "agree-and-build-a-safer-layout-for-hobbemaplein-by-the-haagse-markt-de", + "title": "Agree and build a safer layout for Hobbemaplein by the Haagse Markt, Den Haag", + "description": "The previous redesign lacked support. Den Haag restarted the plan in 2026 with about €8.5M to make the square safer for pedestrians, cyclists and public transport while keeping the market reachable.", + "scale": "street", + "category": "mobility", + "location_name": "Hobbemaplein, Transvaalkwartier, Den Haag", + "country_code": "NL", + "lat": 52.0668, + "lon": 4.2969, + "status": "in_progress", + "source_urls": ["https://www.denhaag.nl/nl/denk-mee/herinrichting-hobbemaplein/"], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "re-lay-the-broken-paving-along-the-tram-tracks-on-reguliersbreestraat", + "title": "Re-lay the broken paving along the tram tracks on Reguliersbreestraat, Amsterdam", + "description": "Shopkeepers say people regularly fall on the crooked cobbles around the tram rails. GVB only patches it, and a structural fix is not planned for 2026 (Parool, 4 Oct 2026).", + "scale": "street", + "category": "infrastructure", + "location_name": "Reguliersbreestraat, Amsterdam", + "country_code": "NL", + "lat": 52.3666, + "lon": 4.8947, + "status": "open", + "source_urls": [ + "https://www.parool.nl/amsterdam/ondernemers-balen-van-scheve-straatstenen-in-reguliersbreestraat-mensen-vallen-met-regelmaat~b180b619/" + ], + "source_date": "2026-10-04", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "replace-the-moving-quay-wall-at-oudeschans-1a-39-amsterdam", + "title": "Replace the moving quay wall at Oudeschans 1A–39, Amsterdam", + "description": "The quay wall between Oosterse Kade and Keizersbrug was moving toward the water. A temporary sheet-pile safety structure went in during spring 2026, and full replacement is planned to start in 2028.", + "scale": "street", + "category": "infrastructure", + "location_name": "Oudeschans 1A–39, Amsterdam", + "country_code": "NL", + "lat": 52.3713, + "lon": 4.9052, + "status": "in_progress", + "source_urls": ["https://www.amsterdam.nl/projecten/kademuren/maatregelen/oudeschans1a-39/"], + "source_date": "2026", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "make-the-meernbrug-crossing-in-de-meern-safe", + "title": "Make the Meernbrug crossing in De Meern safe", + "description": "Several traffic flows cross at the Meernbrug, and residents have been worried for years. Utrecht favours one-way traffic on the bridge, and a costed plan is due in Q1 2027 (commissie Leefomgeving, 8 Oct 2026).", + "scale": "street", + "category": "mobility", + "location_name": "Meernbrug, De Meern, Utrecht", + "country_code": "NL", + "lat": 52.0829, + "lon": 5.0369, + "status": "open", + "source_urls": [ + "https://openbestuur.nl/gemeente/utrecht/vergadering/2026-10-08-raad-zoekt-besteding-voor-half-miljoen-aan-verkeersveiligheid" + ], + "source_date": "2026-10-08", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "end-the-nightly-fireworks-and-arson-nuisance-in-ondiep-utrecht", + "title": "End the nightly fireworks and arson nuisance in Ondiep, Utrecht", + "description": "Since September 2026, residents of Ondiep have faced heavy fireworks almost every night, burning bins and a vandalised parking meter. The council announced extra police, enforcement and changes to the public space.", + "scale": "street", + "category": "safety", + "location_name": "Ondiep, Utrecht", + "country_code": "NL", + "lat": 52.1066, + "lon": 5.1014, + "status": "in_progress", + "source_urls": [ + "https://www.rtvutrecht.nl/nieuws/4106957/bewoners-utrechtse-wijk-al-weken-geteisterd-door-overlast-lijkt-wel-oorlogsgebied", + "https://nos.nl/regio/utrecht/artikel/812003-utrecht-neemt-maatregelen-tegen-vuurwerkterreur-ondiep" + ], + "source_date": "2026-10-22", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "clear-the-blocked-drain-flooding-raeburn-place-allan-street-edinburgh", + "title": "Clear the blocked drain flooding Raeburn Place / Allan Street, Edinburgh", + "description": "A FixMyStreet report (24 Oct 2026) says a blocked drain at the junction of Raeburn Place and Allan Street floods the junction and 'has been an issue for some time'.", + "scale": "street", + "category": "water", + "location_name": "Raeburn Place, Stockbridge, Edinburgh", + "country_code": "GB", + "lat": 55.959076, + "lon": -3.213709, + "status": "open", + "source_urls": ["https://www.fixmystreet.com/report/10279290"], + "source_date": "2026-10-24", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "remove-the-horsebox-abandoned-for-years-on-st-clair-place-leith", + "title": "Remove the horsebox abandoned for years on St Clair Place, Leith", + "description": "A FixMyStreet report (24 Oct 2026) says a horsebox has stood unmoved on St Clair Place for several years, with its roof window open.", + "scale": "street", + "category": "waste", + "location_name": "St Clair Place, Leith, Edinburgh", + "country_code": "GB", + "lat": 55.964045, + "lon": -3.169505, + "status": "open", + "source_urls": ["https://www.fixmystreet.com/report/10278913"], + "source_date": "2026-10-24", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "make-safe-the-broken-manhole-cover-on-old-dalkeith-road-edinburgh", + "title": "Make safe the broken manhole cover on Old Dalkeith Road, Edinburgh", + "description": "Part of a manhole cover in the middle of the road between the Royal Infirmary and Ferniehill Road has fallen into the manhole, leaving it exposed (FixMyStreet, 25 Oct 2026).", + "scale": "street", + "category": "infrastructure", + "location_name": "Old Dalkeith Road, Edinburgh", + "country_code": "GB", + "lat": 55.917126, + "lon": -3.132213, + "status": "open", + "source_urls": ["https://www.fixmystreet.com/report/10283120"], + "source_date": "2026-10-25", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "fill-the-deep-pothole-with-exposed-jagged-metal-on-passage-road-bristo", + "title": "Fill the deep pothole with exposed jagged metal on Passage Road, Bristol", + "description": "A deep pothole with exposed jagged metal has damaged a car. Bristol City Council raised an enquiry on 25 Oct 2026 (FixMyStreet).", + "scale": "street", + "category": "infrastructure", + "location_name": "Passage Road, Westbury on Trym, Bristol", + "country_code": "GB", + "lat": 51.505769, + "lon": -2.615863, + "status": "open", + "source_urls": ["https://www.fixmystreet.com/report/10283769"], + "source_date": "2026-10-25", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "replace-the-broken-glass-pavement-panel-on-aldwych-by-bush-house-londo", + "title": "Replace the broken glass pavement panel on Aldwych by Bush House, London", + "description": "A broken glass panel set into the pavement at the Aldwych side entrance to Bush House Central Block leaves a hole that people can trip in or drop things into (FixMyStreet, 20 Oct 2026).", + "scale": "street", + "category": "safety", + "location_name": "Aldwych, Westminster, London", + "country_code": "GB", + "lat": 51.513011, + "lon": -0.117094, + "status": "open", + "source_urls": ["https://www.fixmystreet.com/report/10261310"], + "source_date": "2026-10-20", + "as_of": "2026-10-26", + "confidence": "high" + }, + { + "slug": "clear-the-fly-tipped-sofa-doors-and-carpets-beside-6a-turner-street-go", + "title": "Clear the fly-tipped sofa, doors and carpets beside 6A Turner Street, Gorton, Manchester", + "description": "A three-seater sofa, an armchair, four wooden doors and four large carpets were dumped in the car park next to 6A Turner Street (FixMyStreet, 23 Oct 2026).", + "scale": "street", + "category": "waste", + "location_name": "Turner Street, Gorton, Manchester", + "country_code": "GB", + "lat": 53.463819, + "lon": -2.171036, + "status": "open", + "source_urls": ["https://www.fixmystreet.com/report/10274767"], + "source_date": "2026-10-23", + "as_of": "2026-10-26", + "confidence": "high" + } + ] +} diff --git a/drizzle.config.ts b/drizzle.config.ts index ac09c57..042da38 100755 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -33,7 +33,8 @@ export default defineConfig({ 'dataholders', 'stats', 'ai', - 'movies' + 'movies', + 'worldtodo' ], migrations: { schema: 'drizzle', table: '__drizzle_migrations' }, verbose: true, diff --git a/drizzle/20261026012608_worldtodo/migration.sql b/drizzle/20261026012608_worldtodo/migration.sql new file mode 100644 index 0000000..1a8187d --- /dev/null +++ b/drizzle/20261026012608_worldtodo/migration.sql @@ -0,0 +1,95 @@ +CREATE SCHEMA "worldtodo"; +--> statement-breakpoint +CREATE TYPE "worldtodo"."req_kind" AS ENUM('add', 'edit', 'delete');--> statement-breakpoint +CREATE TYPE "worldtodo"."req_status" AS ENUM('pending', 'approved', 'rejected');--> statement-breakpoint +CREATE TYPE "worldtodo"."scale" AS ENUM('planet', 'region', 'country', 'city', 'street');--> statement-breakpoint +CREATE TYPE "worldtodo"."status" AS ENUM('open', 'in_progress', 'done');--> statement-breakpoint +CREATE TABLE "worldtodo"."categories" ( + "slug" text PRIMARY KEY, + "label" text NOT NULL, + "icon" text NOT NULL, + "colour" text NOT NULL +); +--> statement-breakpoint +CREATE TABLE "worldtodo"."change_requests" ( + "id" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "worldtodo"."change_requests_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1), + "kind" "worldtodo"."req_kind" NOT NULL, + "task_id" bigint, + "payload" jsonb DEFAULT '{}' NOT NULL, + "applied" jsonb, + "task_updated_at" timestamp with time zone, + "reason" text NOT NULL, + "display_name" text, + "status" "worldtodo"."req_status" DEFAULT 'pending'::"worldtodo"."req_status" NOT NULL, + "owner_note" text, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "decided_at" timestamp with time zone, + CONSTRAINT "change_requests_reason_check" CHECK (char_length("reason") BETWEEN 10 AND 1000), + CONSTRAINT "change_requests_display_name_check" CHECK (char_length("display_name") <= 40), + CONSTRAINT "change_requests_task_check" CHECK ((("kind" = 'add') = ("task_id" IS NULL))) +); +--> statement-breakpoint +CREATE TABLE "worldtodo"."tasks" ( + "id" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "worldtodo"."tasks_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1), + "slug" text NOT NULL, + "title" text NOT NULL, + "description" text NOT NULL, + "scale" "worldtodo"."scale" NOT NULL, + "category" text NOT NULL, + "location_name" text NOT NULL, + "country_code" text, + "lat" double precision, + "lon" double precision, + "status" "worldtodo"."status" DEFAULT 'open'::"worldtodo"."status" NOT NULL, + "source_urls" text[] NOT NULL, + "source_date" text, + "confidence" text DEFAULT 'high' NOT NULL, + "verification_note" text, + "as_of" date NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL, + "deleted_at" timestamp with time zone, + "search" tsvector GENERATED ALWAYS AS (to_tsvector('simple', title || ' ' || description || ' ' || location_name)) STORED, + CONSTRAINT "tasks_title_check" CHECK (char_length("title") BETWEEN 5 AND 140), + CONSTRAINT "tasks_description_check" CHECK (char_length("description") <= 2000), + CONSTRAINT "tasks_lat_check" CHECK ("lat" BETWEEN -90 AND 90), + CONSTRAINT "tasks_lon_check" CHECK ("lon" BETWEEN -180 AND 180), + CONSTRAINT "tasks_sources_check" CHECK (cardinality("source_urls") >= 1), + CONSTRAINT "tasks_confidence_check" CHECK ("confidence" IN ('high','medium')) +); +--> statement-breakpoint +CREATE INDEX "change_requests_status_idx" ON "worldtodo"."change_requests" ("status","created_at");--> statement-breakpoint +CREATE INDEX "change_requests_task_idx" ON "worldtodo"."change_requests" ("task_id","status");--> statement-breakpoint +CREATE UNIQUE INDEX "tasks_slug_key" ON "worldtodo"."tasks" ("slug");--> statement-breakpoint +CREATE INDEX "tasks_search_idx" ON "worldtodo"."tasks" USING gin ("search");--> statement-breakpoint +CREATE INDEX "tasks_scale_status_idx" ON "worldtodo"."tasks" ("scale","status") WHERE deleted_at IS NULL;--> statement-breakpoint +ALTER TABLE "worldtodo"."change_requests" ADD CONSTRAINT "change_requests_task_id_tasks_id_fkey" FOREIGN KEY ("task_id") REFERENCES "worldtodo"."tasks"("id");--> statement-breakpoint +ALTER TABLE "worldtodo"."tasks" ADD CONSTRAINT "tasks_category_categories_slug_fkey" FOREIGN KEY ("category") REFERENCES "worldtodo"."categories"("slug"); +--> statement-breakpoint +-- Hand-written below this line (not generated by drizzle-kit). +-- updated_at trigger on tasks, same as the other core tables. +DO $$ +BEGIN + IF to_regprocedure('meta.touch_updated_at()') IS NOT NULL THEN + CREATE TRIGGER touch_updated_at BEFORE UPDATE ON worldtodo.tasks + FOR EACH ROW EXECUTE FUNCTION meta.touch_updated_at(); + END IF; +END $$; +--> statement-breakpoint +-- Grants: app role read/write only (like ai and movies; no personal_ro: change requests may +-- carry a display name). Prod only, where migrations run as `personal`. Rows are seeded by +-- scripts/seed-worldtodo.ts on every deploy. +REVOKE ALL ON SCHEMA worldtodo FROM PUBLIC; +--> statement-breakpoint +DO $$ +BEGIN + IF current_user = 'personal' AND EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'personal_app') THEN + GRANT USAGE ON SCHEMA worldtodo TO personal_app; + GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA worldtodo TO personal_app; + GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA worldtodo TO personal_app; + ALTER DEFAULT PRIVILEGES FOR ROLE personal IN SCHEMA worldtodo + GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO personal_app; + ALTER DEFAULT PRIVILEGES FOR ROLE personal IN SCHEMA worldtodo + GRANT USAGE, SELECT ON SEQUENCES TO personal_app; + END IF; +END $$; diff --git a/drizzle/20261026012608_worldtodo/snapshot.json b/drizzle/20261026012608_worldtodo/snapshot.json new file mode 100644 index 0000000..32b2fdc --- /dev/null +++ b/drizzle/20261026012608_worldtodo/snapshot.json @@ -0,0 +1,40822 @@ +{ + "version": "8", + "dialect": "postgres", + "id": "cd9f3108-bb70-416d-81fe-186c611370f7", + "prevIds": [ + "fb307e37-ffff-43cb-9300-2b6636118c44" + ], + "ddl": [ + { + "name": "ai", + "entityType": "schemas" + }, + { + "name": "animaldex", + "entityType": "schemas" + }, + { + "name": "auth", + "entityType": "schemas" + }, + { + "name": "books", + "entityType": "schemas" + }, + { + "name": "cars", + "entityType": "schemas" + }, + { + "name": "cs", + "entityType": "schemas" + }, + { + "name": "dataholders", + "entityType": "schemas" + }, + { + "name": "games", + "entityType": "schemas" + }, + { + "name": "groceries", + "entityType": "schemas" + }, + { + "name": "hardware", + "entityType": "schemas" + }, + { + "name": "health", + "entityType": "schemas" + }, + { + "name": "home", + "entityType": "schemas" + }, + { + "name": "house", + "entityType": "schemas" + }, + { + "name": "meta", + "entityType": "schemas" + }, + { + "name": "money", + "entityType": "schemas" + }, + { + "name": "movies", + "entityType": "schemas" + }, + { + "name": "music", + "entityType": "schemas" + }, + { + "name": "planes", + "entityType": "schemas" + }, + { + "name": "ref", + "entityType": "schemas" + }, + { + "name": "site", + "entityType": "schemas" + }, + { + "name": "stats", + "entityType": "schemas" + }, + { + "name": "tasks", + "entityType": "schemas" + }, + { + "name": "trains", + "entityType": "schemas" + }, + { + "name": "wildlife", + "entityType": "schemas" + }, + { + "name": "worldtodo", + "entityType": "schemas" + }, + { + "values": [ + "draft", + "published" + ], + "name": "blog_article_status", + "entityType": "enums", + "schema": "site" + }, + { + "values": [ + "catchable", + "trade_only", + "transfer_only", + "event_only", + "unknown", + "evolve", + "breed" + ], + "name": "availability", + "entityType": "enums", + "schema": "ref" + }, + { + "values": [ + "book", + "paper", + "article" + ], + "name": "kind", + "entityType": "enums", + "schema": "books" + }, + { + "values": [ + "pending", + "matched", + "low_confidence", + "not_found", + "manual" + ], + "name": "metadata_status", + "entityType": "enums", + "schema": "books" + }, + { + "values": [ + "want_to_read", + "reading", + "finished", + "abandoned" + ], + "name": "reading_status", + "entityType": "enums", + "schema": "books" + }, + { + "values": [ + "add", + "edit", + "delete" + ], + "name": "req_kind", + "entityType": "enums", + "schema": "worldtodo" + }, + { + "values": [ + "pending", + "approved", + "rejected" + ], + "name": "req_status", + "entityType": "enums", + "schema": "worldtodo" + }, + { + "values": [ + "planet", + "region", + "country", + "city", + "street" + ], + "name": "scale", + "entityType": "enums", + "schema": "worldtodo" + }, + { + "values": [ + "open", + "in_progress", + "done" + ], + "name": "status", + "entityType": "enums", + "schema": "worldtodo" + }, + { + "isRlsEnabled": false, + "name": "account", + "entityType": "tables", + "schema": "auth" + }, + { + "isRlsEnabled": false, + "name": "session", + "entityType": "tables", + "schema": "auth" + }, + { + "isRlsEnabled": false, + "name": "user", + "entityType": "tables", + "schema": "auth" + }, + { + "isRlsEnabled": false, + "name": "verification", + "entityType": "tables", + "schema": "auth" + }, + { + "isRlsEnabled": false, + "name": "blog_articles", + "entityType": "tables", + "schema": "site" + }, + { + "isRlsEnabled": false, + "name": "tasks", + "entityType": "tables", + "schema": "site" + }, + { + "isRlsEnabled": false, + "name": "task_topics", + "entityType": "tables", + "schema": "site" + }, + { + "isRlsEnabled": false, + "name": "topics", + "entityType": "tables", + "schema": "site" + }, + { + "isRlsEnabled": false, + "name": "catch_em_all_settings", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pokemon_games", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_encounters", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_evolutions", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_game_entries", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_locations", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "catch_em_all_entries", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "catch_em_all_games", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "tracker_games", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "tracker_items", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "tracker_progress", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "library", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "cs2_share_codes", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "accounts", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "match_players", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "matches", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "seasons", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "snapshots", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "osu_entries", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pokemon_catches", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pokemon_dex_numbers", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_game_research", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_journeys", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pokemon_learnsets", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_milestones", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pokemon_moves", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_research", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_seen", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "tracker_challenge_progress", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "tracker_challenges", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "tracker_ranks", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "tracker_weapon_ranks", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "animals", + "entityType": "tables", + "schema": "animaldex" + }, + { + "isRlsEnabled": false, + "name": "sighting_photos", + "entityType": "tables", + "schema": "animaldex" + }, + { + "isRlsEnabled": false, + "name": "sightings", + "entityType": "tables", + "schema": "animaldex" + }, + { + "isRlsEnabled": false, + "name": "columns", + "entityType": "tables", + "schema": "meta" + }, + { + "isRlsEnabled": false, + "name": "edit_log", + "entityType": "tables", + "schema": "meta" + }, + { + "isRlsEnabled": false, + "name": "tables", + "entityType": "tables", + "schema": "meta" + }, + { + "isRlsEnabled": false, + "name": "accounts", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "bank_sessions", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "forecasts", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "insurances", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "projection_settings", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "recurring", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "transactions", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "utility_readings", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "utility_settings", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "wishlist", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "item_dimensions", + "entityType": "tables", + "schema": "cs" + }, + { + "isRlsEnabled": false, + "name": "items", + "entityType": "tables", + "schema": "cs" + }, + { + "isRlsEnabled": false, + "name": "price_observations", + "entityType": "tables", + "schema": "cs" + }, + { + "isRlsEnabled": false, + "name": "price_streams", + "entityType": "tables", + "schema": "cs" + }, + { + "isRlsEnabled": false, + "name": "alert_rules", + "entityType": "tables", + "schema": "house" + }, + { + "isRlsEnabled": false, + "name": "listings", + "entityType": "tables", + "schema": "house" + }, + { + "isRlsEnabled": false, + "name": "price_history", + "entityType": "tables", + "schema": "house" + }, + { + "isRlsEnabled": false, + "name": "searches", + "entityType": "tables", + "schema": "house" + }, + { + "isRlsEnabled": false, + "name": "worker_runs", + "entityType": "tables", + "schema": "house" + }, + { + "isRlsEnabled": false, + "name": "appointments", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "body_measurements", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "medications", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "nutrition_daily", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "sleep", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "vaccinations", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "workouts", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "deleted_works", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "files", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "notes", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "progress", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "sessions", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "shelf_works", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "shelves", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "works", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "activity", + "entityType": "tables", + "schema": "tasks" + }, + { + "isRlsEnabled": false, + "name": "areas", + "entityType": "tables", + "schema": "tasks" + }, + { + "isRlsEnabled": false, + "name": "goals", + "entityType": "tables", + "schema": "tasks" + }, + { + "isRlsEnabled": false, + "name": "metric_sources", + "entityType": "tables", + "schema": "tasks" + }, + { + "isRlsEnabled": false, + "name": "tasks", + "entityType": "tables", + "schema": "tasks" + }, + { + "isRlsEnabled": false, + "name": "categories", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "groups", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "import_runs", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "item_prices", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "item_sizes", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "items", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "manual_prices", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "stats_snapshots", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "stores", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "synonyms", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "links", + "entityType": "tables", + "schema": "home" + }, + { + "isRlsEnabled": false, + "name": "snapshots", + "entityType": "tables", + "schema": "home" + }, + { + "isRlsEnabled": false, + "name": "activity", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "brands", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "models", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "photos", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "seen", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "variants", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "activity", + "entityType": "tables", + "schema": "planes" + }, + { + "isRlsEnabled": false, + "name": "makers", + "entityType": "tables", + "schema": "planes" + }, + { + "isRlsEnabled": false, + "name": "photos", + "entityType": "tables", + "schema": "planes" + }, + { + "isRlsEnabled": false, + "name": "seen", + "entityType": "tables", + "schema": "planes" + }, + { + "isRlsEnabled": false, + "name": "types", + "entityType": "tables", + "schema": "planes" + }, + { + "isRlsEnabled": false, + "name": "activity", + "entityType": "tables", + "schema": "wildlife" + }, + { + "isRlsEnabled": false, + "name": "groups", + "entityType": "tables", + "schema": "wildlife" + }, + { + "isRlsEnabled": false, + "name": "photos", + "entityType": "tables", + "schema": "wildlife" + }, + { + "isRlsEnabled": false, + "name": "seen", + "entityType": "tables", + "schema": "wildlife" + }, + { + "isRlsEnabled": false, + "name": "species", + "entityType": "tables", + "schema": "wildlife" + }, + { + "isRlsEnabled": false, + "name": "activity", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "makers", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "operators", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "photos", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "seen", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "type_operators", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "types", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "albums", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "artist_tag_fetch", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "artist_tags", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "artists", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "import_state", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "now_playing", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "osu_match_cache", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "plays", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "spotify_auth", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "track_artists", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "tracks", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "components", + "entityType": "tables", + "schema": "hardware" + }, + { + "isRlsEnabled": false, + "name": "devices", + "entityType": "tables", + "schema": "hardware" + }, + { + "isRlsEnabled": false, + "name": "sensitivities", + "entityType": "tables", + "schema": "hardware" + }, + { + "isRlsEnabled": false, + "name": "setup_photos", + "entityType": "tables", + "schema": "hardware" + }, + { + "isRlsEnabled": false, + "name": "identity", + "entityType": "tables", + "schema": "dataholders" + }, + { + "isRlsEnabled": false, + "name": "orgs", + "entityType": "tables", + "schema": "dataholders" + }, + { + "isRlsEnabled": false, + "name": "bis_policy_rate", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cbs_code", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cbs_obs", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cbs_table", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbcs_bop", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_cpi", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_file", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_gdp_industry", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_gov_finance", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_lfs", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_population", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_tourism", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "eb_item", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ec_crossborder", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ec_dayahead_price", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "elec_election", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "elec_result", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "elec_turnout", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ep_label_agg", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "eurostat_dataset", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "eurostat_obs", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "fetch_run", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "fred_obs", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "gdelt_theme_vol", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "gt_trending", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "hist_event", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "hist_fact", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "hist_holiday", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "hist_office", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "hist_person", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "imf_weo", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "obs", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "op_poll", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "op_wiki_snapshot", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "owid_energy", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "owid_maddison", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "region", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "rf_budget_table", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "series", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "source", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "unesco_site", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "usas_agency_fy", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ust_debt_daily", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ust_mts_outlays", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ust_mts_receipts", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wb_indicator", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "whr_score", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_compass_override", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_country", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_cultural_map", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_narrative", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_party", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_party_position", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_source", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_value_score", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "pubg_markers", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pubg_matches", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pubg_rooms", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "bot_status", + "entityType": "tables", + "schema": "ai" + }, + { + "isRlsEnabled": false, + "name": "news_items", + "entityType": "tables", + "schema": "ai" + }, + { + "isRlsEnabled": false, + "name": "usage_entries", + "entityType": "tables", + "schema": "ai" + }, + { + "isRlsEnabled": false, + "name": "episodes", + "entityType": "tables", + "schema": "movies" + }, + { + "isRlsEnabled": false, + "name": "plays", + "entityType": "tables", + "schema": "movies" + }, + { + "isRlsEnabled": false, + "name": "recs", + "entityType": "tables", + "schema": "movies" + }, + { + "isRlsEnabled": false, + "name": "settings", + "entityType": "tables", + "schema": "movies" + }, + { + "isRlsEnabled": false, + "name": "titles", + "entityType": "tables", + "schema": "movies" + }, + { + "isRlsEnabled": false, + "name": "categories", + "entityType": "tables", + "schema": "worldtodo" + }, + { + "isRlsEnabled": false, + "name": "change_requests", + "entityType": "tables", + "schema": "worldtodo" + }, + { + "isRlsEnabled": false, + "name": "tasks", + "entityType": "tables", + "schema": "worldtodo" + }, + { + "isRlsEnabled": false, + "name": "osu_goals", + "entityType": "tables", + "schema": "games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "account_id", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "issuer", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "provider_id", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "access_token", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "refresh_token", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id_token", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "access_token_expires_at", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "refresh_token_expires_at", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scope", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "password", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "expires_at", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "token", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ip_address", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_agent", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'user'", + "generated": null, + "identity": null, + "name": "role", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "email", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "email_verified", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "identifier", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "expires_at", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "content", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "tags", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "blog_article_status", + "typeSchema": "site", + "notNull": true, + "dimensions": 0, + "default": "'draft'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "current_points", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "total_points", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "site", + "table": "task_topics" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "task_id", + "entityType": "columns", + "schema": "site", + "table": "task_topics" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "topic_id", + "entityType": "columns", + "schema": "site", + "table": "task_topics" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "site", + "table": "task_topics" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "site", + "table": "task_topics" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "site", + "table": "topics" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "site", + "table": "topics" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "emoji", + "entityType": "columns", + "schema": "site", + "table": "topics" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "site", + "table": "topics" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "site", + "table": "topics" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_settings" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "generation", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "breeding", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "number", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "generation", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type1", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type2", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "hp", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "attack", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "defense", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "special_attack", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "special_defense", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "speed", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "evolves_from", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "evolution_chain", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "is_baby", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "is_legendary", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "is_mythical", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "location_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "method", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_level", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_level", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rarity", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "form", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "conditions", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pokeapi'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "from_pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "to_pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "method", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pokeapi'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "availability", + "typeSchema": "ref", + "notNull": true, + "dimensions": 0, + "default": "'catchable'", + "generated": null, + "identity": null, + "name": "availability", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pokeapi'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "region", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_key", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_credit", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pokeapi'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_game_entry_id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "franchise", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "short_name", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "release_year", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rules", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "post_launch", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'done'", + "generated": null, + "identity": null, + "name": "milestone", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "short_name", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'video'", + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'unknown'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "platform", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "tracker_href", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "current_rank", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "peak_rank", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank_label", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "aliases", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "100", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "active", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "code", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "steam_id", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_id", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "outcome_id", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "token", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "found_at", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "demo_parsed_at", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_id", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "enabled", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "state", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_polled_at", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_success_at", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_error", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_id", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "player_id", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "team", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "is_me", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kills", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "deaths", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "assists", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "damage", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "headshots", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "placement", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "numeric", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rating", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stats", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_id", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "played_at", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration_s", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mode", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "map", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "result", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score_own", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score_opp", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "placement", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "team_count", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kills", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "deaths", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "assists", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "damage", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "headshots", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "numeric", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rating", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rating_label", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "match_count", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "share_code", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "extra", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "raw", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "season", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'all'", + "generated": null, + "identity": null, + "name": "board", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_rank", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank_points", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_rank_points", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "matches", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wins", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "losses", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kills", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "deaths", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "raw", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "taken_at", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "data", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'osu'", + "generated": null, + "identity": null, + "name": "mode", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "beatmap_url", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score_url", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pass'", + "generated": null, + "identity": null, + "name": "goal", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'stamina'", + "generated": null, + "identity": null, + "name": "skill", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bpm", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "numeric", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "accuracy", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "combo", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "misses", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "numeric", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pp", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'NM'", + "generated": null, + "identity": null, + "name": "mods", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "numeric(4,2)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1.00", + "generated": null, + "identity": null, + "name": "rate", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "achieved", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "played_on", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "nickname", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "moves", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party_slot", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "shiny", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nature", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ability", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ball", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "location", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'caught'", + "generated": null, + "identity": null, + "name": "obtained", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'story'", + "generated": null, + "identity": null, + "name": "stage", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "caught_on", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex_name", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "number", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_research" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "version_group", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_research" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": null, + "generated": null, + "identity": null, + "name": "regions", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_research" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'story'", + "generated": null, + "identity": null, + "name": "stage", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "location", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "completed", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "version_group", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "moves", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'story'", + "generated": null, + "identity": null, + "name": "stage", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "done", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "power", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "accuracy", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pp", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "priority", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "target", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_research" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "facts", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_research" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "challenge_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "current", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "done", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "requirement", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reward", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "target", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_url", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "prestige", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "prestige", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "species", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "breed", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "animal_name", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ai_breed_suggestion", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ai_breed_confidence", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "submitted_at", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "accepted_at", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "denied_at", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sighting_id", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "r2_key", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "uploaded_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "animal_id", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reporter_name", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seen_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lat", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lng", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "submitted_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "accepted_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "denied_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "byDefault", + "name": "columns_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_id", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "column_name", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ui_type", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "options", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "hidden", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "help_text", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "edit_log_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "at", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_email", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "schema_name", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_name", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "action", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pk", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "before", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "after", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "byDefault", + "name": "tables_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "schema_name", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_name", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "display_name", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "picture_url", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "editable", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "has_done", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "default_sort", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "archived_at", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "opening_balance_cents", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'spendable'", + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "include_in_total", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "archived", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'personal'", + "generated": null, + "identity": null, + "name": "scope", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "owner", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iban", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_uid", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'manual'", + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bank_balance_cents", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bank_balance_type", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bank_balance_at", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'enablebanking'", + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "session_id", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "aspsp_name", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "aspsp_country", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "psu_type", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'authorized'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "valid_until", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'[]'", + "generated": null, + "identity": null, + "name": "accounts", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_synced_at", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_error", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "amount_cents", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "account_id", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "coverage", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "premium_cents", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'monthly'", + "generated": null, + "identity": null, + "name": "cadence", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "investment_account_id", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "100000", + "generated": null, + "identity": null, + "name": "reserve_cents", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "numeric(5,2)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'5.00'", + "generated": null, + "identity": null, + "name": "annual_return_percent", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'excess'", + "generated": null, + "identity": null, + "name": "contribution_mode", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "include_recurring", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "fixed_monthly_cents", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "end_date", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "amount_cents", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cadence", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "starts_on", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ends_on", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "account_id", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "account_id", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "amount_cents", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_id", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'manual'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "booking_status", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "counterparty", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "raw", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value_date", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "numeric(12,3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reading", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "numeric(12,4)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'0'", + "generated": null, + "identity": null, + "name": "rate_per_unit", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "monthly_advance_cents", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "billing_start", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "estimated_cents", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "3", + "generated": null, + "identity": null, + "name": "priority", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "cs", + "table": "item_dimensions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "cs", + "table": "item_dimensions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "cs", + "table": "item_dimensions" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "market_hash_name", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon_url", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_type", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "first_seen_at", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "last_seen_at", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "price_observations_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "currency", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "observed_at", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "volume", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "imported_at", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "cs", + "table": "price_streams" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "currency", + "entityType": "columns", + "schema": "cs", + "table": "price_streams" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "cs", + "table": "price_streams" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "enabled", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'rent'", + "generated": null, + "identity": null, + "name": "offer", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_price", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_price", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_area", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_bedrooms", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "cities", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "property_types", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_id", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "offer", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "property_type", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "street", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "postal_code", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "city", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "city_slug", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "neighbourhood", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_eur", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_m2", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rooms", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bedrooms", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bathrooms", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "construction_year", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "energy_label", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "interior", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "deposit_eur", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "available_from", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contract_type", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "agent", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "features", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lat", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lng", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "offered_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "first_seen_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'slow'", + "generated": null, + "identity": null, + "name": "first_seen_lane", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "last_seen_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "detail_fetched_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "removed_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "alerted_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "address_key", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duplicate_of", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_price_eur", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_score", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_class", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_onv_class", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_level", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_precision", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_buurt_code", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_buurt_name", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_year", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_detail", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_query", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_scored_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contact_status", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contact_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contact_by", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contact_note", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contact_ref", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "viewing_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "listing_id", + "entityType": "columns", + "schema": "house", + "table": "price_history" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "observed_at", + "entityType": "columns", + "schema": "house", + "table": "price_history" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_eur", + "entityType": "columns", + "schema": "house", + "table": "price_history" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "search_url", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lane", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "first_synced_at", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "last_synced_at", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "last_found", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "worker_runs_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lane", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "http_status", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "found", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration_ms", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "message", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'appointment'", + "generated": null, + "identity": null, + "name": "type", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(5,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "weight_kg", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(5,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "waist_cm", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "body_fat_pct", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(5,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "muscle_mass_kg", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(5,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "skeletal_muscle_kg", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bone_mass_kg", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "visceral_fat", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "body_water_pct", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "protein_pct", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bmr_kcal", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bmi", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "measured_at", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'medication'", + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dose", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "frequency", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "start_date", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stop_date", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kcal", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "numeric(5,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "protein_g", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bedtime", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wake_time", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "numeric(4,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": { + "as": "round((extract(epoch from (wake_time - bedtime)) / 3600)::numeric, 2)", + "type": "stored" + }, + "identity": null, + "name": "hours", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vaccine", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "target", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dose_no", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "batch_lot", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "session_id", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "exercise", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sets", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reps", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "numeric(6,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "load_kg", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "numeric(3,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rpe", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "authors", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "isbn13", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "annas_md5", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "file_sha256", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "file_paths", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "source_refs", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "merged_into", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "deleted_at", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "quarantined_at", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "work_id", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "path", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "format", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "size_bytes", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sha256", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "md5", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "work_id", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file_id", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "locator", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "page", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "highlight", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "work_id", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file_id", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "locator", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "page", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "real", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "percent", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "finished_at", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "reading_status", + "typeSchema": "books", + "notNull": true, + "dimensions": 0, + "default": "'want_to_read'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rating", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_read_at", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "work_id", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file_id", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ended_at", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "start_percent", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "end_percent", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "start_page", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "end_page", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pages_read", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'reader'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "shelf_id", + "entityType": "columns", + "schema": "books", + "table": "shelf_works" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "work_id", + "entityType": "columns", + "schema": "books", + "table": "shelf_works" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "books", + "table": "shelf_works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "added_at", + "entityType": "columns", + "schema": "books", + "table": "shelf_works" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "kind", + "typeSchema": "books", + "notNull": true, + "dimensions": 0, + "default": "'book'", + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "subtitle", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "authors", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "isbn10", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "isbn13", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "publisher", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "language", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "page_count", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "tags", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cover_url", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cover_path", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "openlibrary_work_id", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "openlibrary_edition_id", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "google_books_id", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "annas_md5", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "source_refs", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "metadata_status", + "typeSchema": "books", + "notNull": true, + "dimensions": 0, + "default": "'pending'", + "generated": null, + "identity": null, + "name": "metadata_status", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metadata_source", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metadata_fetched_at", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "site_name", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "published_at", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "archived_at", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "task_id", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "goal_id", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "from_status", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "to_status", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "numeric(14,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "archived_at", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'active'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_id", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "target_date", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric_unit", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "numeric(14,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric_target", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "numeric(14,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric_current", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric_key", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric_detail", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric_computed_at", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "flagged", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "achieved_at", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "tasks", + "table": "metric_sources" + }, + { + "type": "numeric(14,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "tasks", + "table": "metric_sources" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "detail", + "entityType": "columns", + "schema": "tasks", + "table": "metric_sources" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "computed_at", + "entityType": "columns", + "schema": "tasks", + "table": "metric_sources" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "attempted_at", + "entityType": "columns", + "schema": "tasks", + "table": "metric_sources" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "error", + "entityType": "columns", + "schema": "tasks", + "table": "metric_sources" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'todo'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "priority", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "flagged", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "due_date", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "time", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "due_time", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reminder_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "recurrence", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_id", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "goal_id", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "parent_id", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "tags", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_id", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "auto_handle", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "start_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "time_zone", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "completed_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "parent_id", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "is_food", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "brand", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category_id", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "family_key", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "favorite", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "manual", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "merged_into_id", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "item_count", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "store_count", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "store_ids", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_unit_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "promo_count", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "is_food", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "search_text", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "store_id", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "finished_at", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'running'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "requests", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "fetched", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "inserted", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "price_changes", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "error", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "observed_on", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "promo_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "promo_label", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "observed_on", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "numeric(12,4)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_amount", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "size_text", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "store_id", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "store_product_id", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "brand", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "size_text", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "numeric(12,4)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_amount", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_source", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "promo_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "promo_label", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "promo_unit_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category_path", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category_id", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gtin", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gtin_checked_at", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "available", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "is_food", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "first_seen_at", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "last_seen_at", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "group_id", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_key", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_method", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_confidence", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "match_locked", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "store_id", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "group_id", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "promo", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "size_text", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "numeric(12,4)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_amount", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "observed_on", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo_url", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "computed_on", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scope", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "computed_at", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration_ms", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "data", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "series", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "website", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "archived_at", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "synonyms" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "term", + "entityType": "columns", + "schema": "groceries", + "table": "synonyms" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "synonym", + "entityType": "columns", + "schema": "groceries", + "table": "synonyms" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "synonyms" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "synonyms" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'links'", + "generated": null, + "identity": null, + "name": "section", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "home", + "table": "snapshots" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "data", + "entityType": "columns", + "schema": "home", + "table": "snapshots" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "collected_at", + "entityType": "columns", + "schema": "home", + "table": "snapshots" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model_id", + "entityType": "columns", + "schema": "cars", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "cars", + "table": "activity" + }, + { + "type": "real", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score", + "entityType": "columns", + "schema": "cars", + "table": "activity" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "model_count", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "nl_count", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_year", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_year", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_file", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_author", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_license", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "brand_id", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "search", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_year", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_year", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "bodies", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "size_classes", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "fuels", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "drives", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "transmissions", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "engine_l_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "engine_l_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cylinders_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cylinders_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "turbo", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "power_kw_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "power_kw_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "l100_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "l100_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "co2_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "co2_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mpg_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mpg_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "range_km_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seats", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "doors", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mass_kg", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "nl_count", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_rank", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_first_year", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_last_year", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_price", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_price_latest", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_price_latest_year", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'[]'", + "generated": null, + "identity": null, + "name": "nl_years", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'[]'", + "generated": null, + "identity": null, + "name": "nl_names", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "us_years", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "variant_count", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "photo_count", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photos_checked_at", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model_id", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "caption", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "thumb", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "width", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "height", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "author", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license_url", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model_id", + "entityType": "columns", + "schema": "cars", + "table": "seen" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seen_on", + "entityType": "columns", + "schema": "cars", + "table": "seen" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "cars", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "cars", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "cars", + "table": "seen" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model_id", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'fueleconomy.gov'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "engine_l", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cylinders", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "transmission", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "drive", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fuel", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "size_class", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mpg_city", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mpg_hwy", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mpg_comb", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "co2_gpm", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "range_mi", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ev_motor", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "turbo", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "supercharged", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "planes", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "planes", + "table": "activity" + }, + { + "type": "real", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score", + "entityType": "columns", + "schema": "planes", + "table": "activity" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "full_name", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "type_count", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_year", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_year", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "built_total", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_file", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_author", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_license", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "caption", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "thumb", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "width", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "height", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "author", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license_url", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "planes", + "table": "seen" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seen_on", + "entityType": "columns", + "schema": "planes", + "table": "seen" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "planes", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "planes", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "planes", + "table": "seen" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "maker_id", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "family_id", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "full_name", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "search", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "summary", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "role", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "roles", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "role_label", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_flight", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_flight_year", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "introduced_year", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "retired_year", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "in_service", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "number_built", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "makers", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "engine_type", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "engine_count", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "engines", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "crew", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "passengers", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "length_m", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wingspan_m", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "height_m", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rotor_m", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mtow_kg", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_speed_kmh", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cruise_kmh", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "range_km", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ceiling_m", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wing", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gear", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "icao", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "recognize", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "photo_count", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photos_checked_at", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "species_id", + "entityType": "columns", + "schema": "wildlife", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "wildlife", + "table": "activity" + }, + { + "type": "real", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score", + "entityType": "columns", + "schema": "wildlife", + "table": "activity" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name_nl", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "emoji", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "species_count", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "nl_count", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "species_id", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo_id", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "width", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "height", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "author", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "page_url", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "species_id", + "entityType": "columns", + "schema": "wildlife", + "table": "seen" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seen_on", + "entityType": "columns", + "schema": "wildlife", + "table": "seen" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "wildlife", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "wildlife", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "wildlife", + "table": "seen" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "group_id", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scientific_name", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name_en", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name_nl", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "search", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "inat_id", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gbif_key", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia_en", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia_nl", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "class_name", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "order_name", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "family_name", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iucn", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_status", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_establishment", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "extinct", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "nl_obs", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "europe_obs", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "world_obs", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gbif_nl", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scope", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "summary", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "summary_nl", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "facts", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mass_kg", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "length_m", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lifespan_years", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "named_year", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "named_by", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "photo_count", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photos_checked_at", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "trains", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "trains", + "table": "activity" + }, + { + "type": "real", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score", + "entityType": "columns", + "schema": "trains", + "table": "activity" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "full_name", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "type_count", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_year", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_year", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "built_total", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_file", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_author", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_license", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "full_name", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "type_count", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_file", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_author", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_license", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "caption", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "thumb", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "width", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "height", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "author", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license_url", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "trains", + "table": "seen" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seen_on", + "entityType": "columns", + "schema": "trains", + "table": "seen" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "trains", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "trains", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "trains", + "table": "seen" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "trains", + "table": "type_operators" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "operator_id", + "entityType": "columns", + "schema": "trains", + "table": "type_operators" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "trains", + "table": "type_operators" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "maker_id", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "family_id", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "full_name", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_name", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "search", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "summary", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category_label", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "traction", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "countries", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "makers", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "operators", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_built", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_built", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "introduced_year", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "retired_year", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "in_service", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "number_built", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_speed_kmh", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "power_kw", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gauge", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gauge_mm", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "electric_system", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wheels", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "length_m", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "weight_t", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "capacity", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "formation", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "designer", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nicknames", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "photo_count", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photos_checked_at", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "spotify_id", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_id", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url_small", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "release_date", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_id", + "entityType": "columns", + "schema": "music", + "table": "artist_tag_fetch" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "music", + "table": "artist_tag_fetch" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "music", + "table": "artist_tag_fetch" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_id", + "entityType": "columns", + "schema": "music", + "table": "artist_tags" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "tag", + "entityType": "columns", + "schema": "music", + "table": "artist_tags" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "weight", + "entityType": "columns", + "schema": "music", + "table": "artist_tags" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "artists" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "spotify_id", + "entityType": "columns", + "schema": "music", + "table": "artists" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "music", + "table": "artists" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "music", + "table": "artists" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "music", + "table": "artists" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "music", + "table": "import_state" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "data", + "entityType": "columns", + "schema": "music", + "table": "import_state" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "music", + "table": "import_state" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "track_id", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "is_playing", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "progress_ms", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "device_name", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "device_type", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "context_uri", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "music", + "table": "osu_match_cache" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "result", + "entityType": "columns", + "schema": "music", + "table": "osu_match_cache" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "searched_at", + "entityType": "columns", + "schema": "music", + "table": "osu_match_cache" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "track_id", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "played_at", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'spotify'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'api'", + "generated": null, + "identity": null, + "name": "origin", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ms_played", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "context_type", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "context_uri", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "platform", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "spotify_user_id", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "display_name", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "refresh_token", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "access_token", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "access_expires_at", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scope", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "recent_cursor", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "needs_reauth", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lease_until", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lease_holder", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_poll_at", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_error", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "connected_at", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "track_id", + "entityType": "columns", + "schema": "music", + "table": "track_artists" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_id", + "entityType": "columns", + "schema": "music", + "table": "track_artists" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "music", + "table": "track_artists" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "spotify_id", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "album_id", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_id", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration_ms", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "explicit", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_key", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "components_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "device_id", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "brand", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "quantity", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "specs", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_price_cents", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_price_cents", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "shop", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "order_number", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "order_date", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "warranty_until", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "invoice_number", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'in_use'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "verified", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dpi", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "measured_dpi", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "section", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slot", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "installed_at", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "removed_at", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "replaces_id", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "usage", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "image_urls", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "image_sources", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "hidden", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "devices_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "hostnames", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'active'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "brand", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "specs", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "monthly_cents", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "budget_cents", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "shop", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "purchase_date", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "100", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "installed_at", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "removed_at", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "image_urls", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "image_sources", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "hidden", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "sensitivities_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "numeric(7,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cm_per_360", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "numeric(10,6)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "yaw", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "numeric(10,4)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "in_game_sens", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mouse_id", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fov", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "100", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "setup_photos_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "caption", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "taken_at", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "100", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "dataholders", + "table": "identity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "dataholders", + "table": "identity" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "since", + "entityType": "columns", + "schema": "dataholders", + "table": "identity" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "dataholders", + "table": "identity" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "dataholders", + "table": "identity" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "orgs_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'Other'", + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "login", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "domains", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "import_key", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_address", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_email", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_phone", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_iban", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_bsn", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_card", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_dob", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_id_doc", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "data_held", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "address_on_file", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'unknown'", + "generated": null, + "identity": null, + "name": "address_status", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "follows_brp", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "email_on_file", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "phone_on_file", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'update'", + "generated": null, + "identity": null, + "name": "action", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'should'", + "generated": null, + "identity": null, + "name": "priority", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "how_to_change", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "link", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "evidence", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "address_updated_on", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "email_updated_on", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "phone_updated_on", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iban_updated_on", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_checked", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "archived", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "edited_at", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ref_area", + "entityType": "columns", + "schema": "stats", + "table": "bis_policy_rate" + }, + { + "type": "char(1)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "freq", + "entityType": "columns", + "schema": "stats", + "table": "bis_policy_rate" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "bis_policy_rate" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rate", + "entityType": "columns", + "schema": "stats", + "table": "bis_policy_rate" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_id", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dimension", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "code", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "decimals", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "group_id", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort_index", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_id", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "obs_id", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "measure", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dims", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value_attribute", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_id", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "modified", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "filter", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "obs_count", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbcs_bop" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbcs_bop" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mln_ang", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbcs_bop" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "uploaded_at", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbcs_bop" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cpi_index", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "infl_mom", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "infl_yoy", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "infl_12m_avg", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "base", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_file" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "topic", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_file" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "filename", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_file" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sha256", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_file" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_file" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "isic", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mln_ang", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "provisional", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_code", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mln_ang", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "provisional", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sex", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "age_group", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "measure", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sex", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "age_group", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_tourism" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "measure", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_tourism" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "market", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_tourism" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_tourism" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wave", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fieldwork_end", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "topic", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "qcode", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "share", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "ec_crossborder" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "neighbour", + "entityType": "columns", + "schema": "stats", + "table": "ec_crossborder" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ts", + "entityType": "columns", + "schema": "stats", + "table": "ec_crossborder" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gw", + "entityType": "columns", + "schema": "stats", + "table": "ec_crossborder" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bzn", + "entityType": "columns", + "schema": "stats", + "table": "ec_dayahead_price" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ts", + "entityType": "columns", + "schema": "stats", + "table": "ec_dayahead_price" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "eur_mwh", + "entityType": "columns", + "schema": "stats", + "table": "ec_dayahead_price" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "election_id", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_seats", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "election_id", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_code", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_name", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "votes", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seats", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "election_id", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_code", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_name", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "electorate", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ballots", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "valid", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "blank", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "invalid", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "snapshot", + "entityType": "columns", + "schema": "stats", + "table": "ep_label_agg" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "stats", + "table": "ep_label_agg" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "stats", + "table": "ep_label_agg" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "homes", + "entityType": "columns", + "schema": "stats", + "table": "ep_label_agg" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "code", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "updated", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "query", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "dims", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "obs_count", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dataset", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "geo", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "fetch_run_run_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": 1, + "cycle": false + }, + "name": "run_id", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'refresh'", + "generated": null, + "identity": null, + "name": "job", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "finished_at", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rows", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ok", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "error", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "series_id", + "entityType": "columns", + "schema": "stats", + "table": "fred_obs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "fred_obs" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "fred_obs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "stats", + "table": "gdelt_theme_vol" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "gdelt_theme_vol" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "theme", + "entityType": "columns", + "schema": "stats", + "table": "gdelt_theme_vol" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vol_pct", + "entityType": "columns", + "schema": "stats", + "table": "gdelt_theme_vol" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "geo", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "query", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "approx_traffic", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pub_date", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "news", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year_end", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date_label", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "summary", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "theme", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_url", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "topic", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "body", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_url", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "local_name", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "global", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "types", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "office_qid", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "office_label", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "person_qid", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "person_label", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "start_date", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "end_date", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "person_qid", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "birth_year", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "death_year", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sitelinks", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vintage", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "indicator", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country_iso3", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "is_forecast", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "series_id", + "entityType": "columns", + "schema": "stats", + "table": "obs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "obs" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "stats", + "table": "obs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "stats", + "table": "obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "series", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "poll_key", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fieldwork_end", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pollster", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sample", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "option", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "seen_at", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "page", + "entityType": "columns", + "schema": "stats", + "table": "op_wiki_snapshot" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "revid", + "entityType": "columns", + "schema": "stats", + "table": "op_wiki_snapshot" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "stats", + "table": "op_wiki_snapshot" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikitext", + "entityType": "columns", + "schema": "stats", + "table": "op_wiki_snapshot" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "owid_energy" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "owid_energy" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "owid_energy" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "values", + "entityType": "columns", + "schema": "stats", + "table": "owid_energy" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "entity", + "entityType": "columns", + "schema": "stats", + "table": "owid_maddison" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "owid_maddison" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "owid_maddison" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gdp_pc", + "entityType": "columns", + "schema": "stats", + "table": "owid_maddison" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "region_code", + "entityType": "columns", + "schema": "stats", + "table": "region" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "region" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "stats", + "table": "region" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "parent", + "entityType": "columns", + "schema": "stats", + "table": "region" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "phase", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "row_key", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "char(1)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vuo", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "chapter", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "chapter_name", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "article", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "article_name", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "detail", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "amount_eur_k", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "series_id", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_code", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "char(1)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "freq", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "region_code", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "theme", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "meta", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "base_url", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "licence", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "key_required", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "attribution", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id_no", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "places", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year_inscribed", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "danger", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lat", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lon", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "toptier_code", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fiscal_year", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "agency_name", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "abbreviation", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "budgetary_resources", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "obligated", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "outlayed", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "record_date", + "entityType": "columns", + "schema": "stats", + "table": "ust_debt_daily" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "debt_held_public", + "entityType": "columns", + "schema": "stats", + "table": "ust_debt_daily" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "intragov_holdings", + "entityType": "columns", + "schema": "stats", + "table": "ust_debt_daily" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_debt", + "entityType": "columns", + "schema": "stats", + "table": "ust_debt_daily" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "record_date", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "classification_id", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "parent_id", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "print_order", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "net_month", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "net_fytd", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gross_month", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "record_date", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "classification_id", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "parent_id", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "print_order", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "net_month", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "net_fytd", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gross_month", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "indicator_id", + "entityType": "columns", + "schema": "stats", + "table": "wb_indicator" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country_iso3", + "entityType": "columns", + "schema": "stats", + "table": "wb_indicator" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "wb_indicator" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "wb_indicator" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ladder", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lower", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "upper", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gdp", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "social", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "health", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "freedom", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "generosity", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "corruption", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dystopia", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_compass_override" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "x", + "entityType": "columns", + "schema": "stats", + "table": "wo_compass_override" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "y", + "entityType": "columns", + "schema": "stats", + "table": "wo_compass_override" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "stats", + "table": "wo_compass_override" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso_num", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "region", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "liberal_meaning", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "main_divide", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "profile", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wave", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year_from", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year_to", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "trad_secular", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "surv_selfexp", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "n", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort", + "entityType": "columns", + "schema": "stats", + "table": "wo_narrative" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "event", + "entityType": "columns", + "schema": "stats", + "table": "wo_narrative" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "years", + "entityType": "columns", + "schema": "stats", + "table": "wo_narrative" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "views", + "entityType": "columns", + "schema": "stats", + "table": "wo_narrative" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "abbrev", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "family", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ches_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "manifesto_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vparty_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "partyfacts_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dim", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vote_share", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort", + "entityType": "columns", + "schema": "stats", + "table": "wo_source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "wo_source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "href", + "entityType": "columns", + "schema": "stats", + "table": "wo_source" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wave", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_code", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_label", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stat", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "n", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_id", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "x", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "y", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "x2", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "y2", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "player", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "room_id", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "number", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "map", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ended_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pubg_rooms" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "code", + "entityType": "columns", + "schema": "games", + "table": "pubg_rooms" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "games", + "table": "pubg_rooms" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_rooms" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_rooms" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "focus", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "recent", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_active", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'ai'", + "generated": null, + "identity": null, + "name": "section", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'manual'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title_id", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ep_key", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "season", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "episode", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "runtime_min", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title_id", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "episode_id", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "watched_on", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "watched_at", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration_min", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'stan'", + "generated": null, + "identity": null, + "name": "who", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "platform", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_key", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "tmdb_id", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "for_whom", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reason", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "added_at", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "poster_path", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "genres", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metadata_at", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "movies", + "table": "settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "movies", + "table": "settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "movies", + "table": "settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "movies", + "table": "settings" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "tmdb_id", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_key", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "original_title", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'watched'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rating", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "rewatch_count", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_watched", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_watched", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "watched_by", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "platform", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pending'", + "generated": null, + "identity": null, + "name": "match_status", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "poster_path", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "backdrop_path", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "overview", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "genres", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "cast", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "runtime_min", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_seasons", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_episodes", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metadata_at", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "worldtodo", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "worldtodo", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon", + "entityType": "columns", + "schema": "worldtodo", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "colour", + "entityType": "columns", + "schema": "worldtodo", + "table": "categories" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "byDefault", + "name": "change_requests_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "req_kind", + "typeSchema": "worldtodo", + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "task_id", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "payload", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "applied", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "task_updated_at", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reason", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "display_name", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "req_status", + "typeSchema": "worldtodo", + "notNull": true, + "dimensions": 0, + "default": "'pending'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "owner_note", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "decided_at", + "entityType": "columns", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "byDefault", + "name": "tasks_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "scale", + "typeSchema": "worldtodo", + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scale", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "location_name", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country_code", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lat", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lon", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "status", + "typeSchema": "worldtodo", + "notNull": true, + "dimensions": 0, + "default": "'open'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": null, + "generated": null, + "identity": null, + "name": "source_urls", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_date", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'high'", + "generated": null, + "identity": null, + "name": "confidence", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "verification_note", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "as_of", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "deleted_at", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "tsvector", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": { + "as": "to_tsvector('simple', title || ' ' || description || ' ' || location_name)", + "type": "stored" + }, + "identity": null, + "name": "search", + "entityType": "columns", + "schema": "worldtodo", + "table": "tasks" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "goal", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "mods", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "list_item_id", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'unmatched'", + "generated": null, + "identity": null, + "name": "match_status", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_note", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'[]'", + "generated": null, + "identity": null, + "name": "candidates", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "beatmapset_id", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "beatmap_id", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mode", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_unicode", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title_unicode", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mapper", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mapper_id", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "version", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "diff_mapper_id", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ranked_at", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "submitted_at", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "genre", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "language", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "tags", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "user_tags", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bpm", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bpm_min", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bpm_max", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "length_seconds", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "drain_seconds", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ar", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "od", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cs", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "hp", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_combo", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "circles", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sliders", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "spinners", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stars", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stars_dt", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stars_hr", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stars_hd", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stars_hddt", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stars_hdhr", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "attributes", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "longest_stream", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stream_notes", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "play_count", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pass_count", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "favourite_count", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "map_play_count", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cover_url", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "card_url", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "list_url", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "preview_url", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "focus", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metadata_at", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "my_play_count", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "best_score_id", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "best_score", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "best_accuracy", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "best_mods", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "best_rank", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "best_pp", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "best_combo", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "best_misses", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "best_fc", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "best_at", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "passed", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "fc", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "achieved_at", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'[]'", + "generated": null, + "identity": null, + "name": "scores", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scores_at", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_error", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "osu_goals" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "account_userId_idx", + "entityType": "indexes", + "schema": "auth", + "table": "account" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "issuer", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "account_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "account_issuer_account_id_unique", + "entityType": "indexes", + "schema": "auth", + "table": "account" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "session_userId_idx", + "entityType": "indexes", + "schema": "auth", + "table": "session" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "identifier", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "verification_identifier_idx", + "entityType": "indexes", + "schema": "auth", + "table": "verification" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "pokemon_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_encounters_pokemon_id_game_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "location_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_encounters_location_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_evolutions_game_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_game_entries_game_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "catch_em_all_entries_user_id_index", + "entityType": "indexes", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "catch_em_all_games_user_id_index", + "entityType": "indexes", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tracker_items_game_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "tracker_items" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tracker_progress_user_id_index", + "entityType": "indexes", + "schema": "games", + "table": "tracker_progress" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "game", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "external_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "accounts_game_source_ext_idx", + "entityType": "indexes", + "schema": "games", + "table": "accounts" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "match_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "player_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "match_players_match_player_idx", + "entityType": "indexes", + "schema": "games", + "table": "match_players" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "player_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "match_players_player_idx", + "entityType": "indexes", + "schema": "games", + "table": "match_players" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "game", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "external_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "matches_source_ext_idx", + "entityType": "indexes", + "schema": "games", + "table": "matches" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "game", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "played_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "matches_game_played_idx", + "entityType": "indexes", + "schema": "games", + "table": "matches" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "game", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "season", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "board", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "seasons_key_idx", + "entityType": "indexes", + "schema": "games", + "table": "seasons" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "game", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "kind", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "taken_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "snapshots_game_kind_idx", + "entityType": "indexes", + "schema": "games", + "table": "snapshots" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "kind", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "osu_entries_user_id_kind_index", + "entityType": "indexes", + "schema": "games", + "table": "osu_entries" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "pokemon_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_catches_user_id_game_id_pokemon_id_index", + "entityType": "indexes", + "schema": "games", + "table": "pokemon_catches" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_dex_numbers_game_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_seen_user_id_index", + "entityType": "indexes", + "schema": "games", + "table": "pokemon_seen" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "table_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "columns_table_id_index", + "entityType": "indexes", + "schema": "meta", + "table": "columns" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "schema_name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "table_name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "edit_log_table_at_index", + "entityType": "indexes", + "schema": "meta", + "table": "edit_log" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "accounts_user_id_index", + "entityType": "indexes", + "schema": "money", + "table": "accounts" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "bank_sessions_user_id_index", + "entityType": "indexes", + "schema": "money", + "table": "bank_sessions" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "forecasts_user_id_date_index", + "entityType": "indexes", + "schema": "money", + "table": "forecasts" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "insurances_user_id_index", + "entityType": "indexes", + "schema": "money", + "table": "insurances" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "recurring_user_id_index", + "entityType": "indexes", + "schema": "money", + "table": "recurring" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "transactions_user_id_date_id_index", + "entityType": "indexes", + "schema": "money", + "table": "transactions" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "account_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "transactions_account_id_index", + "entityType": "indexes", + "schema": "money", + "table": "transactions" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "kind", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "utility_readings_user_id_kind_date_index", + "entityType": "indexes", + "schema": "money", + "table": "utility_readings" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "wishlist_user_id_index", + "entityType": "indexes", + "schema": "money", + "table": "wishlist" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "value", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "item_dimensions_filter_idx", + "entityType": "indexes", + "schema": "cs", + "table": "item_dimensions" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "market_hash_name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_hash_idx", + "entityType": "indexes", + "schema": "cs", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_name_idx", + "entityType": "indexes", + "schema": "cs", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "currency", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "observed_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "kind", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "price_observations_unique_idx", + "entityType": "indexes", + "schema": "cs", + "table": "price_observations" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "currency", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "observed_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "price_observations_lookup_idx", + "entityType": "indexes", + "schema": "cs", + "table": "price_observations" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "observed_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "price_observations_time_idx", + "entityType": "indexes", + "schema": "cs", + "table": "price_observations" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_source_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "offer", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "first_seen_at", + "isExpression": false, + "asc": false, + "nullsFirst": true, + "opclass": null + } + ], + "isUnique": false, + "where": "removed_at IS NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_active_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "offer", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "city_slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_city_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "first_seen_at", + "isExpression": false, + "asc": false, + "nullsFirst": true, + "opclass": null + } + ], + "isUnique": false, + "where": "detail_fetched_at IS NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_details_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "contact_status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": "contact_status IS NOT NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_contact_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "address_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": "address_key IS NOT NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_address_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "created_at", + "isExpression": false, + "asc": false, + "nullsFirst": true, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "worker_runs_created_idx", + "entityType": "indexes", + "schema": "house", + "table": "worker_runs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "appointments_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "appointments" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "body_measurements_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "body_measurements" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "weight_kg", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "body_measurements_date_weight_key", + "entityType": "indexes", + "schema": "health", + "table": "body_measurements" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "measured_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "body_measurements_measured_at_key", + "entityType": "indexes", + "schema": "health", + "table": "body_measurements" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "start_date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "medications_start_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "medications" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "stop_date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "medications_stop_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "medications" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "vaccinations_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "vaccinations" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "workouts_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "workouts" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "session_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "workouts_session_idx", + "entityType": "indexes", + "schema": "health", + "table": "workouts" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "merged_into", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "deleted_works_merged_into_idx", + "entityType": "indexes", + "schema": "books", + "table": "deleted_works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "path", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "files_path_key", + "entityType": "indexes", + "schema": "books", + "table": "files" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "sha256", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "files_sha256_key", + "entityType": "indexes", + "schema": "books", + "table": "files" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "work_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "files_work_id_idx", + "entityType": "indexes", + "schema": "books", + "table": "files" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "work_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "notes_work_id_idx", + "entityType": "indexes", + "schema": "books", + "table": "notes" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "work_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "progress_work_id_key", + "entityType": "indexes", + "schema": "books", + "table": "progress" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "progress_status_idx", + "entityType": "indexes", + "schema": "books", + "table": "progress" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "work_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "sessions_work_id_idx", + "entityType": "indexes", + "schema": "books", + "table": "sessions" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "started_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "sessions_started_at_idx", + "entityType": "indexes", + "schema": "books", + "table": "sessions" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "work_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "shelf_works_work_id_idx", + "entityType": "indexes", + "schema": "books", + "table": "shelf_works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "shelves_slug_key", + "entityType": "indexes", + "schema": "books", + "table": "shelves" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "url", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"url\" is not null", + "with": "", + "method": "btree", + "concurrently": false, + "name": "works_url_key", + "entityType": "indexes", + "schema": "books", + "table": "works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "kind", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "works_kind_idx", + "entityType": "indexes", + "schema": "books", + "table": "works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "archived_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "works_archived_at_idx", + "entityType": "indexes", + "schema": "books", + "table": "works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "isbn13", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"isbn13\" is not null", + "with": "", + "method": "btree", + "concurrently": false, + "name": "works_isbn13_key", + "entityType": "indexes", + "schema": "books", + "table": "works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "lower(\"title\")", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "works_title_idx", + "entityType": "indexes", + "schema": "books", + "table": "works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "task_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "created_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_task_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "goal_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "created_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_goal_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "areas_slug_key", + "entityType": "indexes", + "schema": "tasks", + "table": "areas" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "lower(\"title\")", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "goals_title_key", + "entityType": "indexes", + "schema": "tasks", + "table": "goals" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "area_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_area_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "goal_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_goal_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "parent_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_parent_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "due_date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_status_due_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "tags", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "tasks_tags_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "external_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"external_id\" IS NOT NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_source_external_key", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "categories_slug_key", + "entityType": "indexes", + "schema": "groceries", + "table": "categories" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "parent_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "categories_parent_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "categories" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_key_key", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "family_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_family_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_category_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_category_id_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "store_ids", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "groups_store_ids_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"search_text\" gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "groups_search_trgm_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "store_count", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_list_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "store_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "started_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "import_runs_store_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "import_runs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "observed_on", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "item_prices_item_day_key", + "entityType": "indexes", + "schema": "groceries", + "table": "item_prices" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "observed_on", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "item_sizes_item_day_key", + "entityType": "indexes", + "schema": "groceries", + "table": "item_sizes" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "store_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "store_product_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_store_product_key", + "entityType": "indexes", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "group_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_group_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "gtin", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_gtin_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_category_id_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"name\" gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "items_name_trgm_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "group_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "observed_on", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "manual_prices_group_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "manual_prices" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "manual_prices_item_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "manual_prices" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "computed_on", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "scope", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "stats_snapshots_day_scope_key", + "entityType": "indexes", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "stores_slug_key", + "entityType": "indexes", + "schema": "groceries", + "table": "stores" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "term", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "synonym", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "synonyms_term_synonym_key", + "entityType": "indexes", + "schema": "groceries", + "table": "synonyms" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "section", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "sort_order", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "links_sort_idx", + "entityType": "indexes", + "schema": "home", + "table": "links" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "area", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "score", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_area_score_idx", + "entityType": "indexes", + "schema": "cars", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "brands_slug_key", + "entityType": "indexes", + "schema": "cars", + "table": "brands" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "dex", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "models_dex_key", + "entityType": "indexes", + "schema": "cars", + "table": "models" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "brand_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "models_brand_slug_key", + "entityType": "indexes", + "schema": "cars", + "table": "models" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "nl_count", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "models_nl_count_idx", + "entityType": "indexes", + "schema": "cars", + "table": "models" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"search\" public.gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "models_search_trgm_idx", + "entityType": "indexes", + "schema": "cars", + "table": "models" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "model_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "position", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "photos_model_position_key", + "entityType": "indexes", + "schema": "cars", + "table": "photos" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "model_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "year", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "variants_model_year_idx", + "entityType": "indexes", + "schema": "cars", + "table": "variants" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "area", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "score", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_area_score_idx", + "entityType": "indexes", + "schema": "planes", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "makers_slug_key", + "entityType": "indexes", + "schema": "planes", + "table": "makers" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "type_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "position", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "photos_type_position_key", + "entityType": "indexes", + "schema": "planes", + "table": "photos" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "dex", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_dex_key", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "wikidata", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_wikidata_key", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "maker_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_maker_slug_key", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "number_built", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_number_built_idx", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "first_flight_year", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_first_flight_year_idx", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"search\" public.gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "types_search_trgm_idx", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "area", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "score", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_area_score_idx", + "entityType": "indexes", + "schema": "wildlife", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_slug_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "species_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "position", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "photos_species_position_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "photos" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "species_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "photo_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "photos_species_photo_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "photos" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "dex", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "species_dex_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "inat_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "species_inat_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "species_slug_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "group_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "species_group_idx", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "nl_obs", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "species_nl_obs_idx", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"search\" public.gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "species_search_trgm_idx", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "area", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "score", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_area_score_idx", + "entityType": "indexes", + "schema": "trains", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "makers_slug_key", + "entityType": "indexes", + "schema": "trains", + "table": "makers" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "operators_slug_key", + "entityType": "indexes", + "schema": "trains", + "table": "operators" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "type_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "position", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "photos_type_position_key", + "entityType": "indexes", + "schema": "trains", + "table": "photos" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "operator_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "type_operators_operator_idx", + "entityType": "indexes", + "schema": "trains", + "table": "type_operators" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "dex", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_dex_key", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "wikidata", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_wikidata_key", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "maker_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_maker_slug_key", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "number_built", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_number_built_idx", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "first_built", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_first_built_idx", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_category_idx", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"search\" public.gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "types_search_trgm_idx", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "spotify_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"spotify_id\" is not null", + "with": "", + "method": "btree", + "concurrently": false, + "name": "albums_spotify_id_key", + "entityType": "indexes", + "schema": "music", + "table": "albums" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "lower(\"name\")", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "albums_name_idx", + "entityType": "indexes", + "schema": "music", + "table": "albums" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "tag", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "artist_tags_tag_idx", + "entityType": "indexes", + "schema": "music", + "table": "artist_tags" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "spotify_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"spotify_id\" is not null", + "with": "", + "method": "btree", + "concurrently": false, + "name": "artists_spotify_id_key", + "entityType": "indexes", + "schema": "music", + "table": "artists" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "lower(\"name\")", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "artists_name_idx", + "entityType": "indexes", + "schema": "music", + "table": "artists" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "track_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "played_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_dedupe_key", + "entityType": "indexes", + "schema": "music", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "played_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_played_at_idx", + "entityType": "indexes", + "schema": "music", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "played_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_source_played_idx", + "entityType": "indexes", + "schema": "music", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "track_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "played_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_track_played_idx", + "entityType": "indexes", + "schema": "music", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "artist_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "track_artists_artist_idx", + "entityType": "indexes", + "schema": "music", + "table": "track_artists" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "spotify_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"spotify_id\" is not null", + "with": "", + "method": "btree", + "concurrently": false, + "name": "tracks_spotify_id_key", + "entityType": "indexes", + "schema": "music", + "table": "tracks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "lower(\"name\")", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tracks_name_idx", + "entityType": "indexes", + "schema": "music", + "table": "tracks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "match_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tracks_match_key_idx", + "entityType": "indexes", + "schema": "music", + "table": "tracks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "device_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "components_device_idx", + "entityType": "indexes", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "components_category_idx", + "entityType": "indexes", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "specs", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "components_specs_gin", + "entityType": "indexes", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "installed_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "removed_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "components_timeline_idx", + "entityType": "indexes", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "import_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "orgs_import_key_key", + "entityType": "indexes", + "schema": "dataholders", + "table": "orgs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "orgs_category_idx", + "entityType": "indexes", + "schema": "dataholders", + "table": "orgs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "table_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "measure", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "cbs_obs_table_measure_idx", + "entityType": "indexes", + "schema": "stats", + "table": "cbs_obs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "level", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "area_code", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "elec_result_area_idx", + "entityType": "indexes", + "schema": "stats", + "table": "elec_result" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "dataset", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "geo", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "eurostat_obs_dataset_geo_idx", + "entityType": "indexes", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "started_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "fetch_run_source_idx", + "entityType": "indexes", + "schema": "stats", + "table": "fetch_run" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "series", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "fieldwork_end", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "op_poll_series_date_idx", + "entityType": "indexes", + "schema": "stats", + "table": "op_poll" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "year", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "vuo", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "chapter", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "rf_budget_table_chapter_idx", + "entityType": "indexes", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "theme", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "series_theme_idx", + "entityType": "indexes", + "schema": "stats", + "table": "series" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "series_source_idx", + "entityType": "indexes", + "schema": "stats", + "table": "series" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "iso3", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "wo_party_iso3_idx", + "entityType": "indexes", + "schema": "stats", + "table": "wo_party" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "match_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pubg_markers_match_idx", + "entityType": "indexes", + "schema": "games", + "table": "pubg_markers" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "room_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "number", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pubg_matches_room_number_idx", + "entityType": "indexes", + "schema": "games", + "table": "pubg_matches" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "map", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "started_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pubg_matches_map_idx", + "entityType": "indexes", + "schema": "games", + "table": "pubg_matches" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "bot_status_name_key", + "entityType": "indexes", + "schema": "ai", + "table": "bot_status" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "url", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "news_items_url_key", + "entityType": "indexes", + "schema": "ai", + "table": "news_items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "news_items_date_idx", + "entityType": "indexes", + "schema": "ai", + "table": "news_items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "provider", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "metric", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "usage_entries_day_key", + "entityType": "indexes", + "schema": "ai", + "table": "usage_entries" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "provider", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "metric", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "usage_entries_provider_idx", + "entityType": "indexes", + "schema": "ai", + "table": "usage_entries" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "title_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "ep_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "episodes_title_key", + "entityType": "indexes", + "schema": "movies", + "table": "episodes" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "title_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "season", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "episode", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "episodes_title_idx", + "entityType": "indexes", + "schema": "movies", + "table": "episodes" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_source_key", + "entityType": "indexes", + "schema": "movies", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "title_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_title_idx", + "entityType": "indexes", + "schema": "movies", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "watched_on", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_watched_idx", + "entityType": "indexes", + "schema": "movies", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "type", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "tmdb_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "recs_tmdb_key", + "entityType": "indexes", + "schema": "movies", + "table": "recs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "type", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "tmdb_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"tmdb_id\" IS NOT NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "titles_tmdb_key", + "entityType": "indexes", + "schema": "movies", + "table": "titles" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "match_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "titles_match_key", + "entityType": "indexes", + "schema": "movies", + "table": "titles" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "titles_status_idx", + "entityType": "indexes", + "schema": "movies", + "table": "titles" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "created_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "change_requests_status_idx", + "entityType": "indexes", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "task_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "change_requests_task_idx", + "entityType": "indexes", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_slug_key", + "entityType": "indexes", + "schema": "worldtodo", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "search", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "tasks_search_idx", + "entityType": "indexes", + "schema": "worldtodo", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "scale", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": "deleted_at IS NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_scale_status_idx", + "entityType": "indexes", + "schema": "worldtodo", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "beatmap_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "osu_goals_beatmap_idx", + "entityType": "indexes", + "schema": "games", + "table": "osu_goals" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "account_user_id_user_id_fkey", + "entityType": "fks", + "schema": "auth", + "table": "account" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "session_user_id_user_id_fkey", + "entityType": "fks", + "schema": "auth", + "table": "session" + }, + { + "nameExplicit": false, + "columns": [ + "task_id" + ], + "schemaTo": "site", + "tableTo": "tasks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "task_topics_task_id_tasks_id_fkey", + "entityType": "fks", + "schema": "site", + "table": "task_topics" + }, + { + "nameExplicit": false, + "columns": [ + "topic_id" + ], + "schemaTo": "site", + "tableTo": "topics", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "task_topics_topic_id_topics_id_fkey", + "entityType": "fks", + "schema": "site", + "table": "task_topics" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "catch_em_all_settings_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "catch_em_all_settings" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_encounters_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_encounters_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "nameExplicit": false, + "columns": [ + "location_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_locations", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_encounters_location_id_pokemon_locations_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "nameExplicit": false, + "columns": [ + "from_pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_evolutions_from_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "nameExplicit": false, + "columns": [ + "to_pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_evolutions_to_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_evolutions_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_game_entries_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_game_entries_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_game_entry_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_game_entries", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "catch_em_all_entries_HeABXvGNiB6D_fkey", + "entityType": "fks", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "catch_em_all_entries_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "catch_em_all_games_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "catch_em_all_games_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_items_game_id_tracker_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "tracker_items" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_progress_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_progress" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_progress_item_id_tracker_items_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_progress" + }, + { + "nameExplicit": false, + "columns": [ + "match_id" + ], + "schemaTo": "games", + "tableTo": "matches", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "match_players_match_id_matches_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "match_players" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "osu_entries_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "osu_entries" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_catches_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_catches_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_catches_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_dex_numbers_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_dex_numbers_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_game_research_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_game_research" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_journeys_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_journeys_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_learnsets_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_milestones_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_milestones_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_research_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_research" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_seen_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_seen" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_seen_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_seen" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_seen_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_seen" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_challenge_progress_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "nameExplicit": false, + "columns": [ + "challenge_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_challenges", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_challenge_progress_HtzyFtOyUAhk_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_challenges_game_id_tracker_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_ranks_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_ranks" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_ranks_game_id_tracker_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_ranks" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_weapon_ranks_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_weapon_ranks_item_id_tracker_items_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "nameExplicit": false, + "columns": [ + "sighting_id" + ], + "schemaTo": "animaldex", + "tableTo": "sightings", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "sighting_photos_sighting_id_sightings_id_fkey", + "entityType": "fks", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "nameExplicit": false, + "columns": [ + "animal_id" + ], + "schemaTo": "animaldex", + "tableTo": "animals", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "sightings_animal_id_animals_id_fkey", + "entityType": "fks", + "schema": "animaldex", + "table": "sightings" + }, + { + "nameExplicit": false, + "columns": [ + "table_id" + ], + "schemaTo": "meta", + "tableTo": "tables", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "columns_table_id_tables_id_fkey", + "entityType": "fks", + "schema": "meta", + "table": "columns" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "accounts_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "accounts" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "bank_sessions_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "bank_sessions" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "forecasts_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "forecasts" + }, + { + "nameExplicit": false, + "columns": [ + "account_id" + ], + "schemaTo": "money", + "tableTo": "accounts", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "forecasts_account_id_accounts_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "forecasts" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "insurances_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "insurances" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "projection_settings_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "projection_settings" + }, + { + "nameExplicit": false, + "columns": [ + "investment_account_id" + ], + "schemaTo": "money", + "tableTo": "accounts", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "projection_settings_investment_account_id_accounts_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "projection_settings" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "recurring_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "recurring" + }, + { + "nameExplicit": false, + "columns": [ + "account_id" + ], + "schemaTo": "money", + "tableTo": "accounts", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "recurring_account_id_accounts_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "recurring" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "transactions_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "transactions" + }, + { + "nameExplicit": false, + "columns": [ + "account_id" + ], + "schemaTo": "money", + "tableTo": "accounts", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "name": "transactions_account_id_accounts_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "transactions" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "utility_readings_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "utility_readings" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "utility_settings_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "utility_settings" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "wishlist_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "wishlist" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "cs", + "tableTo": "items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "item_dimensions_item_id_items_id_fkey", + "entityType": "fks", + "schema": "cs", + "table": "item_dimensions" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "cs", + "tableTo": "items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "price_observations_item_id_items_id_fkey", + "entityType": "fks", + "schema": "cs", + "table": "price_observations" + }, + { + "nameExplicit": false, + "columns": [ + "duplicate_of" + ], + "schemaTo": "house", + "tableTo": "listings", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "listings_duplicate_of_listings_id_fkey", + "entityType": "fks", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": false, + "columns": [ + "listing_id" + ], + "schemaTo": "house", + "tableTo": "listings", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "price_history_listing_id_listings_id_fkey", + "entityType": "fks", + "schema": "house", + "table": "price_history" + }, + { + "nameExplicit": false, + "columns": [ + "merged_into" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "deleted_works_merged_into_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "deleted_works" + }, + { + "nameExplicit": false, + "columns": [ + "work_id" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "files_work_id_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "files" + }, + { + "nameExplicit": false, + "columns": [ + "work_id" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "notes_work_id_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "notes" + }, + { + "nameExplicit": false, + "columns": [ + "file_id" + ], + "schemaTo": "books", + "tableTo": "files", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "notes_file_id_files_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "notes" + }, + { + "nameExplicit": false, + "columns": [ + "work_id" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "progress_work_id_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "progress" + }, + { + "nameExplicit": false, + "columns": [ + "file_id" + ], + "schemaTo": "books", + "tableTo": "files", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "progress_file_id_files_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "progress" + }, + { + "nameExplicit": false, + "columns": [ + "work_id" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "sessions_work_id_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "sessions" + }, + { + "nameExplicit": false, + "columns": [ + "file_id" + ], + "schemaTo": "books", + "tableTo": "files", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "sessions_file_id_files_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "sessions" + }, + { + "nameExplicit": false, + "columns": [ + "shelf_id" + ], + "schemaTo": "books", + "tableTo": "shelves", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "shelf_works_shelf_id_shelves_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "shelf_works" + }, + { + "nameExplicit": false, + "columns": [ + "work_id" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "shelf_works_work_id_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "shelf_works" + }, + { + "nameExplicit": false, + "columns": [ + "task_id" + ], + "schemaTo": "tasks", + "tableTo": "tasks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_task_id_tasks_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "goal_id" + ], + "schemaTo": "tasks", + "tableTo": "goals", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_goal_id_goals_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "area_id" + ], + "schemaTo": "tasks", + "tableTo": "areas", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "goals_area_id_areas_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "goals" + }, + { + "nameExplicit": false, + "columns": [ + "area_id" + ], + "schemaTo": "tasks", + "tableTo": "areas", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "tasks_area_id_areas_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": false, + "columns": [ + "goal_id" + ], + "schemaTo": "tasks", + "tableTo": "goals", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "tasks_goal_id_goals_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": false, + "columns": [ + "parent_id" + ], + "schemaTo": "tasks", + "tableTo": "tasks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tasks_parent_id_tasks_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": false, + "columns": [ + "parent_id" + ], + "schemaTo": "groceries", + "tableTo": "categories", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "categories_parent_id_categories_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "categories" + }, + { + "nameExplicit": false, + "columns": [ + "category_id" + ], + "schemaTo": "groceries", + "tableTo": "categories", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "groups_category_id_categories_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": false, + "columns": [ + "merged_into_id" + ], + "schemaTo": "groceries", + "tableTo": "groups", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "groups_merged_into_id_groups_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": false, + "columns": [ + "store_id" + ], + "schemaTo": "groceries", + "tableTo": "stores", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "import_runs_store_id_stores_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "import_runs" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "groceries", + "tableTo": "items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "item_prices_item_id_items_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "item_prices" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "groceries", + "tableTo": "items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "item_sizes_item_id_items_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "item_sizes" + }, + { + "nameExplicit": false, + "columns": [ + "store_id" + ], + "schemaTo": "groceries", + "tableTo": "stores", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "items_store_id_stores_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": false, + "columns": [ + "category_id" + ], + "schemaTo": "groceries", + "tableTo": "categories", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "items_category_id_categories_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": false, + "columns": [ + "group_id" + ], + "schemaTo": "groceries", + "tableTo": "groups", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "items_group_id_groups_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": false, + "columns": [ + "store_id" + ], + "schemaTo": "groceries", + "tableTo": "stores", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "manual_prices_store_id_stores_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "nameExplicit": false, + "columns": [ + "group_id" + ], + "schemaTo": "groceries", + "tableTo": "groups", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "manual_prices_group_id_groups_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "groceries", + "tableTo": "items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "manual_prices_item_id_items_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "nameExplicit": false, + "columns": [ + "model_id" + ], + "schemaTo": "cars", + "tableTo": "models", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_model_id_models_id_fkey", + "entityType": "fks", + "schema": "cars", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "brand_id" + ], + "schemaTo": "cars", + "tableTo": "brands", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "models_brand_id_brands_id_fkey", + "entityType": "fks", + "schema": "cars", + "table": "models" + }, + { + "nameExplicit": false, + "columns": [ + "model_id" + ], + "schemaTo": "cars", + "tableTo": "models", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "photos_model_id_models_id_fkey", + "entityType": "fks", + "schema": "cars", + "table": "photos" + }, + { + "nameExplicit": false, + "columns": [ + "model_id" + ], + "schemaTo": "cars", + "tableTo": "models", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "seen_model_id_models_id_fkey", + "entityType": "fks", + "schema": "cars", + "table": "seen" + }, + { + "nameExplicit": false, + "columns": [ + "model_id" + ], + "schemaTo": "cars", + "tableTo": "models", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "variants_model_id_models_id_fkey", + "entityType": "fks", + "schema": "cars", + "table": "variants" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "planes", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_type_id_types_id_fkey", + "entityType": "fks", + "schema": "planes", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "planes", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "photos_type_id_types_id_fkey", + "entityType": "fks", + "schema": "planes", + "table": "photos" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "planes", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "seen_type_id_types_id_fkey", + "entityType": "fks", + "schema": "planes", + "table": "seen" + }, + { + "nameExplicit": false, + "columns": [ + "maker_id" + ], + "schemaTo": "planes", + "tableTo": "makers", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "types_maker_id_makers_id_fkey", + "entityType": "fks", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": false, + "columns": [ + "family_id" + ], + "schemaTo": "planes", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "types_family_id_types_id_fkey", + "entityType": "fks", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": false, + "columns": [ + "species_id" + ], + "schemaTo": "wildlife", + "tableTo": "species", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_species_id_species_id_fkey", + "entityType": "fks", + "schema": "wildlife", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "species_id" + ], + "schemaTo": "wildlife", + "tableTo": "species", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "photos_species_id_species_id_fkey", + "entityType": "fks", + "schema": "wildlife", + "table": "photos" + }, + { + "nameExplicit": false, + "columns": [ + "species_id" + ], + "schemaTo": "wildlife", + "tableTo": "species", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "seen_species_id_species_id_fkey", + "entityType": "fks", + "schema": "wildlife", + "table": "seen" + }, + { + "nameExplicit": false, + "columns": [ + "group_id" + ], + "schemaTo": "wildlife", + "tableTo": "groups", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "species_group_id_groups_id_fkey", + "entityType": "fks", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "trains", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_type_id_types_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "trains", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "photos_type_id_types_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "photos" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "trains", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "seen_type_id_types_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "seen" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "trains", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "type_operators_type_id_types_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "type_operators" + }, + { + "nameExplicit": false, + "columns": [ + "operator_id" + ], + "schemaTo": "trains", + "tableTo": "operators", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "type_operators_operator_id_operators_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "type_operators" + }, + { + "nameExplicit": false, + "columns": [ + "maker_id" + ], + "schemaTo": "trains", + "tableTo": "makers", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "types_maker_id_makers_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": false, + "columns": [ + "family_id" + ], + "schemaTo": "trains", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "types_family_id_types_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": false, + "columns": [ + "artist_id" + ], + "schemaTo": "music", + "tableTo": "artists", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "albums_artist_id_artists_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "albums" + }, + { + "nameExplicit": false, + "columns": [ + "artist_id" + ], + "schemaTo": "music", + "tableTo": "artists", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "artist_tag_fetch_artist_id_artists_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "artist_tag_fetch" + }, + { + "nameExplicit": false, + "columns": [ + "artist_id" + ], + "schemaTo": "music", + "tableTo": "artists", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "artist_tags_artist_id_artists_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "artist_tags" + }, + { + "nameExplicit": false, + "columns": [ + "track_id" + ], + "schemaTo": "music", + "tableTo": "tracks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "now_playing_track_id_tracks_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "now_playing" + }, + { + "nameExplicit": false, + "columns": [ + "track_id" + ], + "schemaTo": "music", + "tableTo": "tracks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "plays_track_id_tracks_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "plays" + }, + { + "nameExplicit": false, + "columns": [ + "track_id" + ], + "schemaTo": "music", + "tableTo": "tracks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "track_artists_track_id_tracks_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "track_artists" + }, + { + "nameExplicit": false, + "columns": [ + "artist_id" + ], + "schemaTo": "music", + "tableTo": "artists", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "track_artists_artist_id_artists_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "track_artists" + }, + { + "nameExplicit": false, + "columns": [ + "album_id" + ], + "schemaTo": "music", + "tableTo": "albums", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "tracks_album_id_albums_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "tracks" + }, + { + "nameExplicit": false, + "columns": [ + "artist_id" + ], + "schemaTo": "music", + "tableTo": "artists", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "tracks_artist_id_artists_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "tracks" + }, + { + "nameExplicit": false, + "columns": [ + "device_id" + ], + "schemaTo": "hardware", + "tableTo": "devices", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "components_device_id_devices_id_fkey", + "entityType": "fks", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": false, + "columns": [ + "replaces_id" + ], + "schemaTo": "hardware", + "tableTo": "components", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "components_replaces_id_components_id_fkey", + "entityType": "fks", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": false, + "columns": [ + "mouse_id" + ], + "schemaTo": "hardware", + "tableTo": "components", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "sensitivities_mouse_id_components_id_fkey", + "entityType": "fks", + "schema": "hardware", + "table": "sensitivities" + }, + { + "nameExplicit": false, + "columns": [ + "source_id" + ], + "schemaTo": "stats", + "tableTo": "source", + "columnsTo": [ + "source_id" + ], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "name": "fetch_run_source_id_source_source_id_fkey", + "entityType": "fks", + "schema": "stats", + "table": "fetch_run" + }, + { + "nameExplicit": false, + "columns": [ + "series_id" + ], + "schemaTo": "stats", + "tableTo": "series", + "columnsTo": [ + "series_id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "obs_series_id_series_series_id_fkey", + "entityType": "fks", + "schema": "stats", + "table": "obs" + }, + { + "nameExplicit": false, + "columns": [ + "source_id" + ], + "schemaTo": "stats", + "tableTo": "source", + "columnsTo": [ + "source_id" + ], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "name": "series_source_id_source_source_id_fkey", + "entityType": "fks", + "schema": "stats", + "table": "series" + }, + { + "nameExplicit": false, + "columns": [ + "region_code" + ], + "schemaTo": "stats", + "tableTo": "region", + "columnsTo": [ + "region_code" + ], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "name": "series_region_code_region_region_code_fkey", + "entityType": "fks", + "schema": "stats", + "table": "series" + }, + { + "nameExplicit": false, + "columns": [ + "match_id" + ], + "schemaTo": "games", + "tableTo": "pubg_matches", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pubg_markers_match_id_pubg_matches_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pubg_markers" + }, + { + "nameExplicit": false, + "columns": [ + "room_id" + ], + "schemaTo": "games", + "tableTo": "pubg_rooms", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pubg_matches_room_id_pubg_rooms_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pubg_matches" + }, + { + "nameExplicit": false, + "columns": [ + "title_id" + ], + "schemaTo": "movies", + "tableTo": "titles", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "episodes_title_id_titles_id_fkey", + "entityType": "fks", + "schema": "movies", + "table": "episodes" + }, + { + "nameExplicit": false, + "columns": [ + "title_id" + ], + "schemaTo": "movies", + "tableTo": "titles", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "plays_title_id_titles_id_fkey", + "entityType": "fks", + "schema": "movies", + "table": "plays" + }, + { + "nameExplicit": false, + "columns": [ + "episode_id" + ], + "schemaTo": "movies", + "tableTo": "episodes", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "plays_episode_id_episodes_id_fkey", + "entityType": "fks", + "schema": "movies", + "table": "plays" + }, + { + "nameExplicit": false, + "columns": [ + "task_id" + ], + "schemaTo": "worldtodo", + "tableTo": "tasks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "name": "change_requests_task_id_tasks_id_fkey", + "entityType": "fks", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "nameExplicit": false, + "columns": [ + "category" + ], + "schemaTo": "worldtodo", + "tableTo": "categories", + "columnsTo": [ + "slug" + ], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "name": "tasks_category_categories_slug_fkey", + "entityType": "fks", + "schema": "worldtodo", + "table": "tasks" + }, + { + "columns": [ + "item_id", + "key" + ], + "nameExplicit": true, + "name": "item_dimensions_pkey", + "entityType": "pks", + "schema": "cs", + "table": "item_dimensions" + }, + { + "columns": [ + "source", + "currency", + "kind" + ], + "nameExplicit": true, + "name": "price_streams_pkey", + "entityType": "pks", + "schema": "cs", + "table": "price_streams" + }, + { + "columns": [ + "listing_id", + "observed_at" + ], + "nameExplicit": true, + "name": "price_history_pkey", + "entityType": "pks", + "schema": "house", + "table": "price_history" + }, + { + "columns": [ + "shelf_id", + "work_id" + ], + "nameExplicit": false, + "name": "shelf_works_pkey", + "entityType": "pks", + "schema": "books", + "table": "shelf_works" + }, + { + "columns": [ + "area", + "model_id" + ], + "nameExplicit": false, + "name": "activity_pkey", + "entityType": "pks", + "schema": "cars", + "table": "activity" + }, + { + "columns": [ + "area", + "type_id" + ], + "nameExplicit": false, + "name": "activity_pkey", + "entityType": "pks", + "schema": "planes", + "table": "activity" + }, + { + "columns": [ + "area", + "species_id" + ], + "nameExplicit": false, + "name": "activity_pkey", + "entityType": "pks", + "schema": "wildlife", + "table": "activity" + }, + { + "columns": [ + "area", + "type_id" + ], + "nameExplicit": false, + "name": "activity_pkey", + "entityType": "pks", + "schema": "trains", + "table": "activity" + }, + { + "columns": [ + "type_id", + "operator_id" + ], + "nameExplicit": false, + "name": "type_operators_pkey", + "entityType": "pks", + "schema": "trains", + "table": "type_operators" + }, + { + "columns": [ + "artist_id", + "tag" + ], + "nameExplicit": false, + "name": "artist_tags_pkey", + "entityType": "pks", + "schema": "music", + "table": "artist_tags" + }, + { + "columns": [ + "track_id", + "artist_id" + ], + "nameExplicit": false, + "name": "track_artists_pkey", + "entityType": "pks", + "schema": "music", + "table": "track_artists" + }, + { + "columns": [ + "ref_area", + "freq", + "period" + ], + "nameExplicit": false, + "name": "bis_policy_rate_pkey", + "entityType": "pks", + "schema": "stats", + "table": "bis_policy_rate" + }, + { + "columns": [ + "table_id", + "dimension", + "code" + ], + "nameExplicit": false, + "name": "cbs_code_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cbs_code" + }, + { + "columns": [ + "table_id", + "obs_id" + ], + "nameExplicit": false, + "name": "cbs_obs_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cbs_obs" + }, + { + "columns": [ + "period", + "item" + ], + "nameExplicit": false, + "name": "cw_cbcs_bop_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbcs_bop" + }, + { + "columns": [ + "year", + "isic" + ], + "nameExplicit": false, + "name": "cw_cbs_gdp_industry_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "columns": [ + "year", + "item_code" + ], + "nameExplicit": false, + "name": "cw_cbs_gov_finance_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "columns": [ + "year", + "sex", + "age_group", + "measure" + ], + "nameExplicit": false, + "name": "cw_cbs_lfs_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "columns": [ + "year", + "sex", + "age_group", + "kind" + ], + "nameExplicit": false, + "name": "cw_cbs_population_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "columns": [ + "period", + "measure", + "market" + ], + "nameExplicit": false, + "name": "cw_cbs_tourism_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbs_tourism" + }, + { + "columns": [ + "wave", + "topic", + "item", + "country" + ], + "nameExplicit": false, + "name": "eb_item_pkey", + "entityType": "pks", + "schema": "stats", + "table": "eb_item" + }, + { + "columns": [ + "country", + "neighbour", + "ts" + ], + "nameExplicit": false, + "name": "ec_crossborder_pkey", + "entityType": "pks", + "schema": "stats", + "table": "ec_crossborder" + }, + { + "columns": [ + "bzn", + "ts" + ], + "nameExplicit": false, + "name": "ec_dayahead_price_pkey", + "entityType": "pks", + "schema": "stats", + "table": "ec_dayahead_price" + }, + { + "columns": [ + "election_id", + "level", + "area_code", + "party" + ], + "nameExplicit": false, + "name": "elec_result_pkey", + "entityType": "pks", + "schema": "stats", + "table": "elec_result" + }, + { + "columns": [ + "election_id", + "level", + "area_code" + ], + "nameExplicit": false, + "name": "elec_turnout_pkey", + "entityType": "pks", + "schema": "stats", + "table": "elec_turnout" + }, + { + "columns": [ + "snapshot", + "area", + "label" + ], + "nameExplicit": false, + "name": "ep_label_agg_pkey", + "entityType": "pks", + "schema": "stats", + "table": "ep_label_agg" + }, + { + "columns": [ + "dataset", + "key", + "period" + ], + "nameExplicit": false, + "name": "eurostat_obs_pkey", + "entityType": "pks", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "columns": [ + "series_id", + "period" + ], + "nameExplicit": false, + "name": "fred_obs_pkey", + "entityType": "pks", + "schema": "stats", + "table": "fred_obs" + }, + { + "columns": [ + "date", + "country", + "theme" + ], + "nameExplicit": false, + "name": "gdelt_theme_vol_pkey", + "entityType": "pks", + "schema": "stats", + "table": "gdelt_theme_vol" + }, + { + "columns": [ + "geo", + "date", + "query" + ], + "nameExplicit": false, + "name": "gt_trending_pkey", + "entityType": "pks", + "schema": "stats", + "table": "gt_trending" + }, + { + "columns": [ + "place", + "slug" + ], + "nameExplicit": false, + "name": "hist_event_pkey", + "entityType": "pks", + "schema": "stats", + "table": "hist_event" + }, + { + "columns": [ + "place", + "slug" + ], + "nameExplicit": false, + "name": "hist_fact_pkey", + "entityType": "pks", + "schema": "stats", + "table": "hist_fact" + }, + { + "columns": [ + "place", + "date", + "name" + ], + "nameExplicit": false, + "name": "hist_holiday_pkey", + "entityType": "pks", + "schema": "stats", + "table": "hist_holiday" + }, + { + "columns": [ + "office_qid", + "person_qid", + "start_date" + ], + "nameExplicit": false, + "name": "hist_office_pkey", + "entityType": "pks", + "schema": "stats", + "table": "hist_office" + }, + { + "columns": [ + "place", + "person_qid" + ], + "nameExplicit": false, + "name": "hist_person_pkey", + "entityType": "pks", + "schema": "stats", + "table": "hist_person" + }, + { + "columns": [ + "vintage", + "indicator", + "country_iso3", + "year" + ], + "nameExplicit": false, + "name": "imf_weo_pkey", + "entityType": "pks", + "schema": "stats", + "table": "imf_weo" + }, + { + "columns": [ + "series_id", + "period" + ], + "nameExplicit": false, + "name": "obs_pkey", + "entityType": "pks", + "schema": "stats", + "table": "obs" + }, + { + "columns": [ + "series", + "poll_key", + "option" + ], + "nameExplicit": false, + "name": "op_poll_pkey", + "entityType": "pks", + "schema": "stats", + "table": "op_poll" + }, + { + "columns": [ + "page", + "revid" + ], + "nameExplicit": false, + "name": "op_wiki_snapshot_pkey", + "entityType": "pks", + "schema": "stats", + "table": "op_wiki_snapshot" + }, + { + "columns": [ + "country", + "year" + ], + "nameExplicit": false, + "name": "owid_energy_pkey", + "entityType": "pks", + "schema": "stats", + "table": "owid_energy" + }, + { + "columns": [ + "entity", + "year" + ], + "nameExplicit": false, + "name": "owid_maddison_pkey", + "entityType": "pks", + "schema": "stats", + "table": "owid_maddison" + }, + { + "columns": [ + "year", + "phase", + "row_key" + ], + "nameExplicit": false, + "name": "rf_budget_table_pkey", + "entityType": "pks", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "columns": [ + "toptier_code", + "fiscal_year" + ], + "nameExplicit": false, + "name": "usas_agency_fy_pkey", + "entityType": "pks", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "columns": [ + "record_date", + "classification_id" + ], + "nameExplicit": false, + "name": "ust_mts_outlays_pkey", + "entityType": "pks", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "columns": [ + "record_date", + "classification_id" + ], + "nameExplicit": false, + "name": "ust_mts_receipts_pkey", + "entityType": "pks", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "columns": [ + "indicator_id", + "country_iso3", + "year" + ], + "nameExplicit": false, + "name": "wb_indicator_pkey", + "entityType": "pks", + "schema": "stats", + "table": "wb_indicator" + }, + { + "columns": [ + "year", + "country" + ], + "nameExplicit": false, + "name": "whr_score_pkey", + "entityType": "pks", + "schema": "stats", + "table": "whr_score" + }, + { + "columns": [ + "iso3", + "wave" + ], + "nameExplicit": false, + "name": "wo_cultural_map_pkey", + "entityType": "pks", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "columns": [ + "party_id", + "year", + "source", + "dim" + ], + "nameExplicit": false, + "name": "wo_party_position_pkey", + "entityType": "pks", + "schema": "stats", + "table": "wo_party_position" + }, + { + "columns": [ + "iso3", + "wave", + "item_code", + "stat" + ], + "nameExplicit": false, + "name": "wo_value_score_pkey", + "entityType": "pks", + "schema": "stats", + "table": "wo_value_score" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "account_pkey", + "schema": "auth", + "table": "account", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "session_pkey", + "schema": "auth", + "table": "session", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "user_pkey", + "schema": "auth", + "table": "user", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "verification_pkey", + "schema": "auth", + "table": "verification", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "blog_articles_pkey", + "schema": "site", + "table": "blog_articles", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tasks_pkey", + "schema": "site", + "table": "tasks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "task_topics_pkey", + "schema": "site", + "table": "task_topics", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "topics_pkey", + "schema": "site", + "table": "topics", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "catch_em_all_settings_pkey", + "schema": "games", + "table": "catch_em_all_settings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_games_pkey", + "schema": "ref", + "table": "pokemon_games", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_pkey", + "schema": "ref", + "table": "pokemon", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_encounters_pkey", + "schema": "ref", + "table": "pokemon_encounters", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_evolutions_pkey", + "schema": "ref", + "table": "pokemon_evolutions", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_game_entries_pkey", + "schema": "ref", + "table": "pokemon_game_entries", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_locations_pkey", + "schema": "ref", + "table": "pokemon_locations", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "catch_em_all_entries_pkey", + "schema": "games", + "table": "catch_em_all_entries", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "catch_em_all_games_pkey", + "schema": "games", + "table": "catch_em_all_games", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_games_pkey", + "schema": "ref", + "table": "tracker_games", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_items_pkey", + "schema": "ref", + "table": "tracker_items", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_progress_pkey", + "schema": "games", + "table": "tracker_progress", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "library_pkey", + "schema": "games", + "table": "library", + "entityType": "pks" + }, + { + "columns": [ + "code" + ], + "nameExplicit": false, + "name": "cs2_share_codes_pkey", + "schema": "games", + "table": "cs2_share_codes", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "accounts_pkey", + "schema": "games", + "table": "accounts", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "match_players_pkey", + "schema": "games", + "table": "match_players", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "matches_pkey", + "schema": "games", + "table": "matches", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "seasons_pkey", + "schema": "games", + "table": "seasons", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "snapshots_pkey", + "schema": "games", + "table": "snapshots", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "osu_entries_pkey", + "schema": "games", + "table": "osu_entries", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_catches_pkey", + "schema": "games", + "table": "pokemon_catches", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_dex_numbers_pkey", + "schema": "ref", + "table": "pokemon_dex_numbers", + "entityType": "pks" + }, + { + "columns": [ + "game_id" + ], + "nameExplicit": false, + "name": "pokemon_game_research_pkey", + "schema": "ref", + "table": "pokemon_game_research", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_journeys_pkey", + "schema": "games", + "table": "pokemon_journeys", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_learnsets_pkey", + "schema": "ref", + "table": "pokemon_learnsets", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_milestones_pkey", + "schema": "games", + "table": "pokemon_milestones", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_moves_pkey", + "schema": "ref", + "table": "pokemon_moves", + "entityType": "pks" + }, + { + "columns": [ + "pokemon_id" + ], + "nameExplicit": false, + "name": "pokemon_research_pkey", + "schema": "ref", + "table": "pokemon_research", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_seen_pkey", + "schema": "games", + "table": "pokemon_seen", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_challenge_progress_pkey", + "schema": "games", + "table": "tracker_challenge_progress", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_challenges_pkey", + "schema": "ref", + "table": "tracker_challenges", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_ranks_pkey", + "schema": "games", + "table": "tracker_ranks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_weapon_ranks_pkey", + "schema": "games", + "table": "tracker_weapon_ranks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "animals_pkey", + "schema": "animaldex", + "table": "animals", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "sighting_photos_pkey", + "schema": "animaldex", + "table": "sighting_photos", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "sightings_pkey", + "schema": "animaldex", + "table": "sightings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "columns_pkey", + "schema": "meta", + "table": "columns", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "edit_log_pkey", + "schema": "meta", + "table": "edit_log", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tables_pkey", + "schema": "meta", + "table": "tables", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "accounts_pkey", + "schema": "money", + "table": "accounts", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "bank_sessions_pkey", + "schema": "money", + "table": "bank_sessions", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "forecasts_pkey", + "schema": "money", + "table": "forecasts", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "insurances_pkey", + "schema": "money", + "table": "insurances", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "projection_settings_pkey", + "schema": "money", + "table": "projection_settings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "recurring_pkey", + "schema": "money", + "table": "recurring", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "transactions_pkey", + "schema": "money", + "table": "transactions", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "utility_readings_pkey", + "schema": "money", + "table": "utility_readings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "utility_settings_pkey", + "schema": "money", + "table": "utility_settings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "wishlist_pkey", + "schema": "money", + "table": "wishlist", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "items_pkey", + "schema": "cs", + "table": "items", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "price_observations_pkey", + "schema": "cs", + "table": "price_observations", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "alert_rules_pkey", + "schema": "house", + "table": "alert_rules", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "listings_pkey", + "schema": "house", + "table": "listings", + "entityType": "pks" + }, + { + "columns": [ + "search_url" + ], + "nameExplicit": false, + "name": "searches_pkey", + "schema": "house", + "table": "searches", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "worker_runs_pkey", + "schema": "house", + "table": "worker_runs", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "appointments_pkey", + "schema": "health", + "table": "appointments", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "body_measurements_pkey", + "schema": "health", + "table": "body_measurements", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "medications_pkey", + "schema": "health", + "table": "medications", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "nutrition_daily_pkey", + "schema": "health", + "table": "nutrition_daily", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "sleep_pkey", + "schema": "health", + "table": "sleep", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "vaccinations_pkey", + "schema": "health", + "table": "vaccinations", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "workouts_pkey", + "schema": "health", + "table": "workouts", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "deleted_works_pkey", + "schema": "books", + "table": "deleted_works", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "files_pkey", + "schema": "books", + "table": "files", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "notes_pkey", + "schema": "books", + "table": "notes", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "progress_pkey", + "schema": "books", + "table": "progress", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "sessions_pkey", + "schema": "books", + "table": "sessions", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "shelves_pkey", + "schema": "books", + "table": "shelves", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "works_pkey", + "schema": "books", + "table": "works", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "activity_pkey", + "schema": "tasks", + "table": "activity", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "areas_pkey", + "schema": "tasks", + "table": "areas", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "goals_pkey", + "schema": "tasks", + "table": "goals", + "entityType": "pks" + }, + { + "columns": [ + "key" + ], + "nameExplicit": false, + "name": "metric_sources_pkey", + "schema": "tasks", + "table": "metric_sources", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tasks_pkey", + "schema": "tasks", + "table": "tasks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "categories_pkey", + "schema": "groceries", + "table": "categories", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "groups_pkey", + "schema": "groceries", + "table": "groups", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "import_runs_pkey", + "schema": "groceries", + "table": "import_runs", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "item_prices_pkey", + "schema": "groceries", + "table": "item_prices", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "item_sizes_pkey", + "schema": "groceries", + "table": "item_sizes", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "items_pkey", + "schema": "groceries", + "table": "items", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "manual_prices_pkey", + "schema": "groceries", + "table": "manual_prices", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "stats_snapshots_pkey", + "schema": "groceries", + "table": "stats_snapshots", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "stores_pkey", + "schema": "groceries", + "table": "stores", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "synonyms_pkey", + "schema": "groceries", + "table": "synonyms", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "links_pkey", + "schema": "home", + "table": "links", + "entityType": "pks" + }, + { + "columns": [ + "key" + ], + "nameExplicit": false, + "name": "snapshots_pkey", + "schema": "home", + "table": "snapshots", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "brands_pkey", + "schema": "cars", + "table": "brands", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "models_pkey", + "schema": "cars", + "table": "models", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "photos_pkey", + "schema": "cars", + "table": "photos", + "entityType": "pks" + }, + { + "columns": [ + "model_id" + ], + "nameExplicit": false, + "name": "seen_pkey", + "schema": "cars", + "table": "seen", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "variants_pkey", + "schema": "cars", + "table": "variants", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "makers_pkey", + "schema": "planes", + "table": "makers", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "photos_pkey", + "schema": "planes", + "table": "photos", + "entityType": "pks" + }, + { + "columns": [ + "type_id" + ], + "nameExplicit": false, + "name": "seen_pkey", + "schema": "planes", + "table": "seen", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "types_pkey", + "schema": "planes", + "table": "types", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "groups_pkey", + "schema": "wildlife", + "table": "groups", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "photos_pkey", + "schema": "wildlife", + "table": "photos", + "entityType": "pks" + }, + { + "columns": [ + "species_id" + ], + "nameExplicit": false, + "name": "seen_pkey", + "schema": "wildlife", + "table": "seen", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "species_pkey", + "schema": "wildlife", + "table": "species", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "makers_pkey", + "schema": "trains", + "table": "makers", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "operators_pkey", + "schema": "trains", + "table": "operators", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "photos_pkey", + "schema": "trains", + "table": "photos", + "entityType": "pks" + }, + { + "columns": [ + "type_id" + ], + "nameExplicit": false, + "name": "seen_pkey", + "schema": "trains", + "table": "seen", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "types_pkey", + "schema": "trains", + "table": "types", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "albums_pkey", + "schema": "music", + "table": "albums", + "entityType": "pks" + }, + { + "columns": [ + "artist_id" + ], + "nameExplicit": false, + "name": "artist_tag_fetch_pkey", + "schema": "music", + "table": "artist_tag_fetch", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "artists_pkey", + "schema": "music", + "table": "artists", + "entityType": "pks" + }, + { + "columns": [ + "key" + ], + "nameExplicit": false, + "name": "import_state_pkey", + "schema": "music", + "table": "import_state", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "now_playing_pkey", + "schema": "music", + "table": "now_playing", + "entityType": "pks" + }, + { + "columns": [ + "key" + ], + "nameExplicit": false, + "name": "osu_match_cache_pkey", + "schema": "music", + "table": "osu_match_cache", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "plays_pkey", + "schema": "music", + "table": "plays", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "spotify_auth_pkey", + "schema": "music", + "table": "spotify_auth", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracks_pkey", + "schema": "music", + "table": "tracks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "components_pkey", + "schema": "hardware", + "table": "components", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "devices_pkey", + "schema": "hardware", + "table": "devices", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "sensitivities_pkey", + "schema": "hardware", + "table": "sensitivities", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "setup_photos_pkey", + "schema": "hardware", + "table": "setup_photos", + "entityType": "pks" + }, + { + "columns": [ + "kind" + ], + "nameExplicit": false, + "name": "identity_pkey", + "schema": "dataholders", + "table": "identity", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "orgs_pkey", + "schema": "dataholders", + "table": "orgs", + "entityType": "pks" + }, + { + "columns": [ + "table_id" + ], + "nameExplicit": false, + "name": "cbs_table_pkey", + "schema": "stats", + "table": "cbs_table", + "entityType": "pks" + }, + { + "columns": [ + "period" + ], + "nameExplicit": false, + "name": "cw_cbs_cpi_pkey", + "schema": "stats", + "table": "cw_cbs_cpi", + "entityType": "pks" + }, + { + "columns": [ + "url" + ], + "nameExplicit": false, + "name": "cw_cbs_file_pkey", + "schema": "stats", + "table": "cw_cbs_file", + "entityType": "pks" + }, + { + "columns": [ + "election_id" + ], + "nameExplicit": false, + "name": "elec_election_pkey", + "schema": "stats", + "table": "elec_election", + "entityType": "pks" + }, + { + "columns": [ + "code" + ], + "nameExplicit": false, + "name": "eurostat_dataset_pkey", + "schema": "stats", + "table": "eurostat_dataset", + "entityType": "pks" + }, + { + "columns": [ + "run_id" + ], + "nameExplicit": false, + "name": "fetch_run_pkey", + "schema": "stats", + "table": "fetch_run", + "entityType": "pks" + }, + { + "columns": [ + "region_code" + ], + "nameExplicit": false, + "name": "region_pkey", + "schema": "stats", + "table": "region", + "entityType": "pks" + }, + { + "columns": [ + "series_id" + ], + "nameExplicit": false, + "name": "series_pkey", + "schema": "stats", + "table": "series", + "entityType": "pks" + }, + { + "columns": [ + "source_id" + ], + "nameExplicit": false, + "name": "source_pkey", + "schema": "stats", + "table": "source", + "entityType": "pks" + }, + { + "columns": [ + "id_no" + ], + "nameExplicit": false, + "name": "unesco_site_pkey", + "schema": "stats", + "table": "unesco_site", + "entityType": "pks" + }, + { + "columns": [ + "record_date" + ], + "nameExplicit": false, + "name": "ust_debt_daily_pkey", + "schema": "stats", + "table": "ust_debt_daily", + "entityType": "pks" + }, + { + "columns": [ + "party_id" + ], + "nameExplicit": false, + "name": "wo_compass_override_pkey", + "schema": "stats", + "table": "wo_compass_override", + "entityType": "pks" + }, + { + "columns": [ + "iso3" + ], + "nameExplicit": false, + "name": "wo_country_pkey", + "schema": "stats", + "table": "wo_country", + "entityType": "pks" + }, + { + "columns": [ + "sort" + ], + "nameExplicit": false, + "name": "wo_narrative_pkey", + "schema": "stats", + "table": "wo_narrative", + "entityType": "pks" + }, + { + "columns": [ + "party_id" + ], + "nameExplicit": false, + "name": "wo_party_pkey", + "schema": "stats", + "table": "wo_party", + "entityType": "pks" + }, + { + "columns": [ + "sort" + ], + "nameExplicit": false, + "name": "wo_source_pkey", + "schema": "stats", + "table": "wo_source", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pubg_markers_pkey", + "schema": "games", + "table": "pubg_markers", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pubg_matches_pkey", + "schema": "games", + "table": "pubg_matches", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pubg_rooms_pkey", + "schema": "games", + "table": "pubg_rooms", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "bot_status_pkey", + "schema": "ai", + "table": "bot_status", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "news_items_pkey", + "schema": "ai", + "table": "news_items", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "usage_entries_pkey", + "schema": "ai", + "table": "usage_entries", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "episodes_pkey", + "schema": "movies", + "table": "episodes", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "plays_pkey", + "schema": "movies", + "table": "plays", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "recs_pkey", + "schema": "movies", + "table": "recs", + "entityType": "pks" + }, + { + "columns": [ + "key" + ], + "nameExplicit": false, + "name": "settings_pkey", + "schema": "movies", + "table": "settings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "titles_pkey", + "schema": "movies", + "table": "titles", + "entityType": "pks" + }, + { + "columns": [ + "slug" + ], + "nameExplicit": false, + "name": "categories_pkey", + "schema": "worldtodo", + "table": "categories", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "change_requests_pkey", + "schema": "worldtodo", + "table": "change_requests", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tasks_pkey", + "schema": "worldtodo", + "table": "tasks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "osu_goals_pkey", + "schema": "games", + "table": "osu_goals", + "entityType": "pks" + }, + { + "nameExplicit": false, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "blog_articles_slug_unique", + "entityType": "uniques", + "schema": "site", + "table": "blog_articles" + }, + { + "nameExplicit": false, + "columns": [ + "task_id", + "topic_id" + ], + "nullsNotDistinct": false, + "name": "task_topics_task_id_topic_id_unique", + "entityType": "uniques", + "schema": "site", + "table": "task_topics" + }, + { + "nameExplicit": false, + "columns": [ + "from_pokemon_id", + "to_pokemon_id", + "game_id", + "method" + ], + "nullsNotDistinct": false, + "name": "pokemon_evolutions_from_pokemon_id_to_pokemon_id_game_id_method_unique", + "entityType": "uniques", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id", + "game_id" + ], + "nullsNotDistinct": false, + "name": "pokemon_game_entries_pokemon_id_game_id_unique", + "entityType": "uniques", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_game_entry_id", + "user_id" + ], + "nullsNotDistinct": false, + "name": "catch_em_all_entries_pokemon_game_entry_id_user_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id" + ], + "nullsNotDistinct": false, + "name": "catch_em_all_games_user_id_game_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "nameExplicit": false, + "columns": [ + "game_id", + "key" + ], + "nullsNotDistinct": false, + "name": "tracker_items_game_id_key_unique", + "entityType": "uniques", + "schema": "ref", + "table": "tracker_items" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "item_id", + "milestone" + ], + "nullsNotDistinct": false, + "name": "tracker_progress_user_id_item_id_milestone_unique", + "entityType": "uniques", + "schema": "games", + "table": "tracker_progress" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id", + "party_slot" + ], + "nullsNotDistinct": false, + "name": "pokemon_catches_user_id_game_id_party_slot_unique", + "entityType": "uniques", + "schema": "games", + "table": "pokemon_catches" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id", + "game_id", + "dex" + ], + "nullsNotDistinct": false, + "name": "pokemon_dex_numbers_pokemon_id_game_id_dex_unique", + "entityType": "uniques", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id" + ], + "nullsNotDistinct": false, + "name": "pokemon_journeys_user_id_game_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id", + "version_group" + ], + "nullsNotDistinct": false, + "name": "pokemon_learnsets_pokemon_id_version_group_unique", + "entityType": "uniques", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id", + "key" + ], + "nullsNotDistinct": false, + "name": "pokemon_milestones_user_id_game_id_key_unique", + "entityType": "uniques", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id", + "pokemon_id" + ], + "nullsNotDistinct": false, + "name": "pokemon_seen_user_id_game_id_pokemon_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "pokemon_seen" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "challenge_id" + ], + "nullsNotDistinct": false, + "name": "tracker_challenge_progress_user_id_challenge_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "nameExplicit": false, + "columns": [ + "game_id", + "key" + ], + "nullsNotDistinct": false, + "name": "tracker_challenges_game_id_key_unique", + "entityType": "uniques", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id" + ], + "nullsNotDistinct": false, + "name": "tracker_ranks_user_id_game_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "tracker_ranks" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "item_id" + ], + "nullsNotDistinct": false, + "name": "tracker_weapon_ranks_user_id_item_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "nameExplicit": true, + "columns": [ + "table_id", + "column_name" + ], + "nullsNotDistinct": false, + "name": "columns_table_id_column_name_key", + "entityType": "uniques", + "schema": "meta", + "table": "columns" + }, + { + "nameExplicit": true, + "columns": [ + "schema_name", + "table_name" + ], + "nullsNotDistinct": false, + "name": "tables_schema_name_table_name_key", + "entityType": "uniques", + "schema": "meta", + "table": "tables" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "name" + ], + "nullsNotDistinct": false, + "name": "accounts_user_id_name_unique", + "entityType": "uniques", + "schema": "money", + "table": "accounts" + }, + { + "nameExplicit": true, + "columns": [ + "external_uid" + ], + "nullsNotDistinct": false, + "name": "accounts_external_uid_key", + "entityType": "uniques", + "schema": "money", + "table": "accounts" + }, + { + "nameExplicit": true, + "columns": [ + "session_id" + ], + "nullsNotDistinct": false, + "name": "bank_sessions_session_id_key", + "entityType": "uniques", + "schema": "money", + "table": "bank_sessions" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "nullsNotDistinct": false, + "name": "projection_settings_user_id_unique", + "entityType": "uniques", + "schema": "money", + "table": "projection_settings" + }, + { + "nameExplicit": true, + "columns": [ + "account_id", + "external_id" + ], + "nullsNotDistinct": false, + "name": "transactions_account_external_id_key", + "entityType": "uniques", + "schema": "money", + "table": "transactions" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "kind" + ], + "nullsNotDistinct": false, + "name": "utility_settings_user_id_kind_unique", + "entityType": "uniques", + "schema": "money", + "table": "utility_settings" + }, + { + "nameExplicit": true, + "columns": [ + "device_id", + "model", + "order_number" + ], + "nullsNotDistinct": true, + "name": "components_dedupe_uq", + "entityType": "uniques", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": false, + "columns": [ + "token" + ], + "nullsNotDistinct": false, + "name": "session_token_key", + "schema": "auth", + "table": "session", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "email" + ], + "nullsNotDistinct": false, + "name": "user_email_key", + "schema": "auth", + "table": "user", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "nullsNotDistinct": false, + "name": "catch_em_all_settings_user_id_key", + "schema": "games", + "table": "catch_em_all_settings", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "source_id" + ], + "nullsNotDistinct": false, + "name": "pokemon_games_source_id_key", + "schema": "ref", + "table": "pokemon_games", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "pokemon_games_slug_key", + "schema": "ref", + "table": "pokemon_games", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "number" + ], + "nullsNotDistinct": false, + "name": "pokemon_number_key", + "schema": "ref", + "table": "pokemon", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "source_id" + ], + "nullsNotDistinct": false, + "name": "pokemon_locations_source_id_key", + "schema": "ref", + "table": "pokemon_locations", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "tracker_games_slug_key", + "schema": "ref", + "table": "tracker_games", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "library_slug_key", + "schema": "games", + "table": "library", + "entityType": "uniques" + }, + { + "nameExplicit": true, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "tables_slug_key", + "schema": "meta", + "table": "tables", + "entityType": "uniques" + }, + { + "nameExplicit": true, + "columns": [ + "date" + ], + "nullsNotDistinct": false, + "name": "nutrition_daily_date_key", + "schema": "health", + "table": "nutrition_daily", + "entityType": "uniques" + }, + { + "nameExplicit": true, + "columns": [ + "date" + ], + "nullsNotDistinct": false, + "name": "sleep_date_key", + "schema": "health", + "table": "sleep", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "components_slug_key", + "schema": "hardware", + "table": "components", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "name" + ], + "nullsNotDistinct": false, + "name": "devices_name_key", + "schema": "hardware", + "table": "devices", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "game" + ], + "nullsNotDistinct": false, + "name": "sensitivities_game_key", + "schema": "hardware", + "table": "sensitivities", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "id" + ], + "nullsNotDistinct": false, + "name": "wo_country_id_key", + "schema": "stats", + "table": "wo_country", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "code" + ], + "nullsNotDistinct": false, + "name": "pubg_rooms_code_key", + "schema": "games", + "table": "pubg_rooms", + "entityType": "uniques" + }, + { + "value": "\"status\" IN ('main','active','occasional','unknown')", + "name": "library_status_check", + "entityType": "checks", + "schema": "games", + "table": "library" + }, + { + "value": "\"kind\" IN ('video','puzzle')", + "name": "library_kind_check", + "entityType": "checks", + "schema": "games", + "table": "library" + }, + { + "value": "(\"current_rank\" IS NULL OR \"current_rank\" > 0) AND (\"peak_rank\" IS NULL OR \"peak_rank\" > 0)", + "name": "library_rank_check", + "entityType": "checks", + "schema": "games", + "table": "library" + }, + { + "value": "\"kind\" IN ('score','goal','training')", + "name": "osu_entries_kind_check", + "entityType": "checks", + "schema": "games", + "table": "osu_entries" + }, + { + "value": "\"level\" between 1 and 100", + "name": "pokemon_catches_level_check", + "entityType": "checks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "value": "\"party_slot\" between 1 and 6", + "name": "pokemon_catches_party_slot_check", + "entityType": "checks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "value": "cardinality(\"moves\") <= 4", + "name": "pokemon_catches_moves_check", + "entityType": "checks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "value": "\"stage\" IN ('story','postgame','collection')", + "name": "pokemon_catches_stage_check", + "entityType": "checks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "value": "\"stage\" IN ('story','postgame','collection')", + "name": "pokemon_journeys_stage_check", + "entityType": "checks", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "value": "\"current\" >= 0", + "name": "tracker_challenge_progress_current_check", + "entityType": "checks", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "value": "\"level\" between 1 and 10000", + "name": "tracker_ranks_level_check", + "entityType": "checks", + "schema": "games", + "table": "tracker_ranks" + }, + { + "value": "\"prestige\" between 0 and 1000", + "name": "tracker_ranks_prestige_check", + "entityType": "checks", + "schema": "games", + "table": "tracker_ranks" + }, + { + "value": "\"level\" between 1 and 10000", + "name": "tracker_weapon_ranks_level_check", + "entityType": "checks", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "value": "\"prestige\" between 0 and 1000", + "name": "tracker_weapon_ranks_prestige_check", + "entityType": "checks", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "value": "ui_type IN ('text','longtext','url','image','number','cents','date','datetime','bool','select','multiselect','fk','json')", + "name": "columns_ui_type_check", + "entityType": "checks", + "schema": "meta", + "table": "columns" + }, + { + "value": "action IN ('insert','update','delete','import','add_column')", + "name": "edit_log_action_check", + "entityType": "checks", + "schema": "meta", + "table": "edit_log" + }, + { + "value": "slug ~ '^[a-z0-9][a-z0-9-]{0,62}$'", + "name": "tables_slug_check", + "entityType": "checks", + "schema": "meta", + "table": "tables" + }, + { + "value": "kind IN ('list','core','ref')", + "name": "tables_kind_check", + "entityType": "checks", + "schema": "meta", + "table": "tables" + }, + { + "value": "kind IN ('spendable','investment')", + "name": "accounts_kind_check", + "entityType": "checks", + "schema": "money", + "table": "accounts" + }, + { + "value": "scope IN ('personal','joint')", + "name": "accounts_scope_check", + "entityType": "checks", + "schema": "money", + "table": "accounts" + }, + { + "value": "provider IN ('manual','enablebanking')", + "name": "accounts_provider_check", + "entityType": "checks", + "schema": "money", + "table": "accounts" + }, + { + "value": "status IN ('authorized','expired','revoked','error')", + "name": "bank_sessions_status_check", + "entityType": "checks", + "schema": "money", + "table": "bank_sessions" + }, + { + "value": "cadence IN ('weekly','monthly','yearly')", + "name": "insurances_cadence_check", + "entityType": "checks", + "schema": "money", + "table": "insurances" + }, + { + "value": "contribution_mode IN ('excess','fixed')", + "name": "projection_settings_contribution_mode_check", + "entityType": "checks", + "schema": "money", + "table": "projection_settings" + }, + { + "value": "cadence IN ('weekly','monthly','yearly')", + "name": "recurring_cadence_check", + "entityType": "checks", + "schema": "money", + "table": "recurring" + }, + { + "value": "source IN ('manual','csv','enablebanking')", + "name": "transactions_source_check", + "entityType": "checks", + "schema": "money", + "table": "transactions" + }, + { + "value": "kind IN ('electricity','gas','water')", + "name": "utility_readings_kind_check", + "entityType": "checks", + "schema": "money", + "table": "utility_readings" + }, + { + "value": "kind IN ('electricity','gas','water')", + "name": "utility_settings_kind_check", + "entityType": "checks", + "schema": "money", + "table": "utility_settings" + }, + { + "value": "offer IN ('rent', 'buy')", + "name": "alert_rules_offer_check", + "entityType": "checks", + "schema": "house", + "table": "alert_rules" + }, + { + "value": "offer IN ('rent', 'buy')", + "name": "listings_offer_check", + "entityType": "checks", + "schema": "house", + "table": "listings" + }, + { + "value": "price_eur IS NULL OR price_eur >= 0", + "name": "listings_price_eur_check", + "entityType": "checks", + "schema": "house", + "table": "listings" + }, + { + "value": "contact_status IS NULL OR contact_status IN ('waiting_on_me', 'not_contacted', 'waiting_on_them', 'viewing', 'closed')", + "name": "listings_contact_status_check", + "entityType": "checks", + "schema": "house", + "table": "listings" + }, + { + "value": "contact_by IS NULL OR contact_by IN ('me', 'them')", + "name": "listings_contact_by_check", + "entityType": "checks", + "schema": "house", + "table": "listings" + }, + { + "value": "\"type\" IN ('appointment','checkup','condition','test','procedure','other')", + "name": "appointments_type_check", + "entityType": "checks", + "schema": "health", + "table": "appointments" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "appointments_date_check", + "entityType": "checks", + "schema": "health", + "table": "appointments" + }, + { + "value": "\"weight_kg\" IS NOT NULL OR \"waist_cm\" IS NOT NULL OR \"body_fat_pct\" IS NOT NULL", + "name": "body_measurements_any_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "\"weight_kg\" IS NULL OR \"weight_kg\" BETWEEN 20 AND 400", + "name": "body_measurements_weight_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "\"waist_cm\" IS NULL OR \"waist_cm\" BETWEEN 30 AND 250", + "name": "body_measurements_waist_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "\"body_fat_pct\" IS NULL OR \"body_fat_pct\" BETWEEN 1 AND 75", + "name": "body_measurements_fat_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "(\"muscle_mass_kg\" IS NULL OR \"muscle_mass_kg\" BETWEEN 5 AND 250)\n\t\t\tAND (\"skeletal_muscle_kg\" IS NULL OR \"skeletal_muscle_kg\" BETWEEN 5 AND 200)\n\t\t\tAND (\"bone_mass_kg\" IS NULL OR \"bone_mass_kg\" BETWEEN 0.5 AND 20)\n\t\t\tAND (\"visceral_fat\" IS NULL OR \"visceral_fat\" BETWEEN 1 AND 60)\n\t\t\tAND (\"body_water_pct\" IS NULL OR \"body_water_pct\" BETWEEN 20 AND 85)\n\t\t\tAND (\"protein_pct\" IS NULL OR \"protein_pct\" BETWEEN 5 AND 40)\n\t\t\tAND (\"bmr_kcal\" IS NULL OR \"bmr_kcal\" BETWEEN 500 AND 6000)\n\t\t\tAND (\"bmi\" IS NULL OR \"bmi\" BETWEEN 10 AND 80)", + "name": "body_measurements_scale_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "body_measurements_date_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "medications_name_check", + "entityType": "checks", + "schema": "health", + "table": "medications" + }, + { + "value": "\"kind\" IN ('medication','supplement')", + "name": "medications_kind_check", + "entityType": "checks", + "schema": "health", + "table": "medications" + }, + { + "value": "\"stop_date\" IS NULL OR \"start_date\" IS NULL OR \"stop_date\" >= \"start_date\"", + "name": "medications_dates_check", + "entityType": "checks", + "schema": "health", + "table": "medications" + }, + { + "value": "\"kcal\" IS NULL OR \"kcal\" BETWEEN 0 AND 20000", + "name": "nutrition_daily_kcal_check", + "entityType": "checks", + "schema": "health", + "table": "nutrition_daily" + }, + { + "value": "\"protein_g\" IS NULL OR \"protein_g\" BETWEEN 0 AND 1000", + "name": "nutrition_daily_protein_check", + "entityType": "checks", + "schema": "health", + "table": "nutrition_daily" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "nutrition_daily_date_check", + "entityType": "checks", + "schema": "health", + "table": "nutrition_daily" + }, + { + "value": "\"wake_time\" > \"bedtime\"", + "name": "sleep_order_check", + "entityType": "checks", + "schema": "health", + "table": "sleep" + }, + { + "value": "\"wake_time\" - \"bedtime\" <= interval '24 hours'", + "name": "sleep_length_check", + "entityType": "checks", + "schema": "health", + "table": "sleep" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "sleep_date_check", + "entityType": "checks", + "schema": "health", + "table": "sleep" + }, + { + "value": "length(btrim(\"vaccine\")) > 0", + "name": "vaccinations_vaccine_check", + "entityType": "checks", + "schema": "health", + "table": "vaccinations" + }, + { + "value": "\"dose_no\" IS NULL OR \"dose_no\" BETWEEN 1 AND 20", + "name": "vaccinations_dose_no_check", + "entityType": "checks", + "schema": "health", + "table": "vaccinations" + }, + { + "value": "\"country\" IS NULL OR \"country\" ~ '^[A-Z]{2}$'", + "name": "vaccinations_country_check", + "entityType": "checks", + "schema": "health", + "table": "vaccinations" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "vaccinations_date_check", + "entityType": "checks", + "schema": "health", + "table": "vaccinations" + }, + { + "value": "length(btrim(\"exercise\")) > 0", + "name": "workouts_exercise_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"sets\" IS NULL OR \"sets\" BETWEEN 1 AND 100", + "name": "workouts_sets_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"reps\" IS NULL OR \"reps\" BETWEEN 0 AND 1000", + "name": "workouts_reps_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"load_kg\" IS NULL OR \"load_kg\" BETWEEN 0 AND 1000", + "name": "workouts_load_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"rpe\" IS NULL OR \"rpe\" BETWEEN 1 AND 10", + "name": "workouts_rpe_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "workouts_date_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"percent\" between 0 and 100", + "name": "progress_percent_check", + "entityType": "checks", + "schema": "books", + "table": "progress" + }, + { + "value": "\"rating\" is null or \"rating\" between 1 and 5", + "name": "progress_rating_check", + "entityType": "checks", + "schema": "books", + "table": "progress" + }, + { + "value": "(\"start_percent\" is null or \"start_percent\" between 0 and 100) and (\"end_percent\" is null or \"end_percent\" between 0 and 100)", + "name": "sessions_percent_check", + "entityType": "checks", + "schema": "books", + "table": "sessions" + }, + { + "value": "\"ended_at\" is null or \"ended_at\" >= \"started_at\"", + "name": "sessions_end_check", + "entityType": "checks", + "schema": "books", + "table": "sessions" + }, + { + "value": "\"year\" is null or \"year\" between 0 and 2100", + "name": "works_year_check", + "entityType": "checks", + "schema": "books", + "table": "works" + }, + { + "value": "\"task_id\" IS NOT NULL OR \"goal_id\" IS NOT NULL", + "name": "activity_target_check", + "entityType": "checks", + "schema": "tasks", + "table": "activity" + }, + { + "value": "\"kind\" IN ('created','status','edit','note','progress')", + "name": "activity_kind_check", + "entityType": "checks", + "schema": "tasks", + "table": "activity" + }, + { + "value": "\"slug\" ~ '^[a-z0-9][a-z0-9-]{0,62}$'", + "name": "areas_slug_check", + "entityType": "checks", + "schema": "tasks", + "table": "areas" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "areas_name_check", + "entityType": "checks", + "schema": "tasks", + "table": "areas" + }, + { + "value": "length(btrim(\"title\")) > 0", + "name": "goals_title_check", + "entityType": "checks", + "schema": "tasks", + "table": "goals" + }, + { + "value": "\"status\" IN ('active','achieved','dropped')", + "name": "goals_status_check", + "entityType": "checks", + "schema": "tasks", + "table": "goals" + }, + { + "value": "length(btrim(\"title\")) > 0", + "name": "tasks_title_check", + "entityType": "checks", + "schema": "tasks", + "table": "tasks" + }, + { + "value": "\"status\" IN ('todo','in_progress','done','dropped')", + "name": "tasks_status_check", + "entityType": "checks", + "schema": "tasks", + "table": "tasks" + }, + { + "value": "\"priority\" BETWEEN 0 AND 3", + "name": "tasks_priority_check", + "entityType": "checks", + "schema": "tasks", + "table": "tasks" + }, + { + "value": "\"parent_id\" IS NULL OR \"parent_id\" <> \"id\"", + "name": "tasks_parent_check", + "entityType": "checks", + "schema": "tasks", + "table": "tasks" + }, + { + "value": "\"due_time\" IS NULL OR \"due_date\" IS NOT NULL", + "name": "tasks_time_check", + "entityType": "checks", + "schema": "tasks", + "table": "tasks" + }, + { + "value": "\"slug\" ~ '^[a-z0-9][a-z0-9-]{0,62}$'", + "name": "categories_slug_check", + "entityType": "checks", + "schema": "groceries", + "table": "categories" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "categories_name_check", + "entityType": "checks", + "schema": "groceries", + "table": "categories" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "groups_name_check", + "entityType": "checks", + "schema": "groceries", + "table": "groups" + }, + { + "value": "\"unit\" IS NULL OR \"unit\" IN ('piece','kg','l')", + "name": "groups_unit_check", + "entityType": "checks", + "schema": "groceries", + "table": "groups" + }, + { + "value": "\"merged_into_id\" IS NULL OR \"merged_into_id\" <> \"id\"", + "name": "groups_not_self_merged", + "entityType": "checks", + "schema": "groceries", + "table": "groups" + }, + { + "value": "\"unit\" IS NULL OR \"unit\" IN ('piece','kg','l')", + "name": "items_unit_check", + "entityType": "checks", + "schema": "groceries", + "table": "items" + }, + { + "value": "\"price_cents\" IS NULL OR \"price_cents\" >= 0", + "name": "items_price_check", + "entityType": "checks", + "schema": "groceries", + "table": "items" + }, + { + "value": "\"price_cents\" > 0 AND \"price_cents\" < 1000000", + "name": "manual_prices_price_check", + "entityType": "checks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "value": "\"group_id\" IS NOT NULL OR \"item_id\" IS NOT NULL", + "name": "manual_prices_target_check", + "entityType": "checks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "value": "\"unit\" IS NULL OR \"unit\" IN ('piece','kg','l')", + "name": "manual_prices_unit_check", + "entityType": "checks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "value": "\"scope\" IN ('food','all')", + "name": "stats_snapshots_scope_check", + "entityType": "checks", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "value": "\"slug\" ~ '^[a-z0-9][a-z0-9-]{0,62}$'", + "name": "stores_slug_check", + "entityType": "checks", + "schema": "groceries", + "table": "stores" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "stores_name_check", + "entityType": "checks", + "schema": "groceries", + "table": "stores" + }, + { + "value": "\"term\" ~ '^[a-z0-9][a-z0-9 -]{0,40}$'", + "name": "synonyms_term_check", + "entityType": "checks", + "schema": "groceries", + "table": "synonyms" + }, + { + "value": "\"synonym\" ~ '^[a-z0-9][a-z0-9 -]{0,40}$'", + "name": "synonyms_synonym_check", + "entityType": "checks", + "schema": "groceries", + "table": "synonyms" + }, + { + "value": "\"term\" <> \"synonym\"", + "name": "synonyms_not_self", + "entityType": "checks", + "schema": "groceries", + "table": "synonyms" + }, + { + "value": "length(btrim(\"title\")) between 1 and 80", + "name": "links_title_check", + "entityType": "checks", + "schema": "home", + "table": "links" + }, + { + "value": "\"url\" ~ '^https?://' and length(\"url\") <= 2000", + "name": "links_url_check", + "entityType": "checks", + "schema": "home", + "table": "links" + }, + { + "value": "\"id\" = 1", + "name": "now_playing_single_row", + "entityType": "checks", + "schema": "music", + "table": "now_playing" + }, + { + "value": "\"source\" in ('spotify', 'lastfm', 'youtube', 'local')", + "name": "plays_source_check", + "entityType": "checks", + "schema": "music", + "table": "plays" + }, + { + "value": "\"origin\" in ('api', 'export', 'import', 'manual', 'nowplaying')", + "name": "plays_origin_check", + "entityType": "checks", + "schema": "music", + "table": "plays" + }, + { + "value": "\"id\" = 1", + "name": "spotify_auth_single_row", + "entityType": "checks", + "schema": "music", + "table": "spotify_auth" + }, + { + "value": "category in ('case', 'cpu', 'motherboard', 'ram', 'cpu_cooler', 'gpu', 'psu', 'storage', 'fan', 'lighting', 'monitor', 'mouse', 'keyboard', 'headset', 'audio', 'controller', 'accessory', 'microphone', 'mousepad', 'webcam', 'chair', 'other')", + "name": "components_category_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "status in ('in_use', 'planned', 'spare', 'retired', 'sold')", + "name": "components_status_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "quantity > 0", + "name": "components_quantity_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "section is null or section in ('pc', 'desk', 'audio', 'sim')", + "name": "components_section_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "usage is null or usage in ('current', 'stored', 'previous', 'work-issued', 'placeholder', 'planned', 'legacy', 'legacy-previous')", + "name": "components_usage_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "removed_at is null or installed_at is null or removed_at >= installed_at", + "name": "components_dates_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "unit_price_cents >= 0", + "name": "components_unit_price_cents_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "total_price_cents >= 0", + "name": "components_total_price_cents_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "(dpi is null or dpi > 0) and (measured_dpi is null or measured_dpi > 0)", + "name": "components_dpi_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "kind in ('desktop', 'laptop', 'server', 'vm', 'phone', 'tablet', 'monitor', 'other')", + "name": "devices_kind_check", + "entityType": "checks", + "schema": "hardware", + "table": "devices" + }, + { + "value": "status in ('active', 'spare', 'planned', 'retired', 'sold')", + "name": "devices_status_check", + "entityType": "checks", + "schema": "hardware", + "table": "devices" + }, + { + "value": "(price_cents is null or price_cents >= 0) and (monthly_cents is null or monthly_cents >= 0) and (budget_cents is null or budget_cents >= 0)", + "name": "devices_cents_check", + "entityType": "checks", + "schema": "hardware", + "table": "devices" + }, + { + "value": "cm_per_360 is null or cm_per_360 > 0", + "name": "sensitivities_cm_check", + "entityType": "checks", + "schema": "hardware", + "table": "sensitivities" + }, + { + "value": "yaw is null or yaw > 0", + "name": "sensitivities_yaw_check", + "entityType": "checks", + "schema": "hardware", + "table": "sensitivities" + }, + { + "value": "\"kind\" IN ('address','email','phone','iban')", + "name": "identity_kind_check", + "entityType": "checks", + "schema": "dataholders", + "table": "identity" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "orgs_name_check", + "entityType": "checks", + "schema": "dataholders", + "table": "orgs" + }, + { + "value": "\"address_status\" IN ('confirmed','likely','unknown')", + "name": "orgs_address_status_check", + "entityType": "checks", + "schema": "dataholders", + "table": "orgs" + }, + { + "value": "\"action\" IN ('update','close','check','none')", + "name": "orgs_action_check", + "entityType": "checks", + "schema": "dataholders", + "table": "orgs" + }, + { + "value": "\"priority\" IN ('must','should','nice')", + "name": "orgs_priority_check", + "entityType": "checks", + "schema": "dataholders", + "table": "orgs" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "bot_status_name_check", + "entityType": "checks", + "schema": "ai", + "table": "bot_status" + }, + { + "value": "\"section\" IN ('ai','software')", + "name": "news_items_section_check", + "entityType": "checks", + "schema": "ai", + "table": "news_items" + }, + { + "value": "length(btrim(\"title\")) > 0", + "name": "news_items_title_check", + "entityType": "checks", + "schema": "ai", + "table": "news_items" + }, + { + "value": "\"provider\" IN ('claude','chatgpt','gemini','api')", + "name": "usage_entries_provider_check", + "entityType": "checks", + "schema": "ai", + "table": "usage_entries" + }, + { + "value": "\"source\" IN ('scheduled','ccusage','export','manual')", + "name": "usage_entries_source_check", + "entityType": "checks", + "schema": "ai", + "table": "usage_entries" + }, + { + "value": "length(btrim(\"metric\")) > 0", + "name": "usage_entries_metric_check", + "entityType": "checks", + "schema": "ai", + "table": "usage_entries" + }, + { + "value": "\"who\" IN ('stan','juhee','both')", + "name": "plays_who_check", + "entityType": "checks", + "schema": "movies", + "table": "plays" + }, + { + "value": "\"platform\" IS NULL OR \"platform\" IN ('netflix','plex','cinema','other')", + "name": "plays_platform_check", + "entityType": "checks", + "schema": "movies", + "table": "plays" + }, + { + "value": "\"type\" IN ('movie','show')", + "name": "recs_type_check", + "entityType": "checks", + "schema": "movies", + "table": "recs" + }, + { + "value": "\"for_whom\" IN ('stan','juhee','both')", + "name": "recs_for_check", + "entityType": "checks", + "schema": "movies", + "table": "recs" + }, + { + "value": "length(btrim(\"title\")) > 0", + "name": "recs_title_check", + "entityType": "checks", + "schema": "movies", + "table": "recs" + }, + { + "value": "\"key\" IN ('visibility')", + "name": "settings_key_check", + "entityType": "checks", + "schema": "movies", + "table": "settings" + }, + { + "value": "\"type\" IN ('movie','show')", + "name": "titles_type_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"status\" IN ('watching','watched','watchlist','dropped')", + "name": "titles_status_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"rating\" IS NULL OR (\"rating\" >= 0.5 AND \"rating\" <= 5 AND \"rating\" * 2 = round(\"rating\" * 2))", + "name": "titles_rating_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"rewatch_count\" >= 0", + "name": "titles_rewatch_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"watched_by\" IS NULL OR \"watched_by\" IN ('stan','juhee','both')", + "name": "titles_who_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"platform\" IS NULL OR \"platform\" IN ('netflix','plex','cinema','other')", + "name": "titles_platform_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"source\" IN ('netflix','plex','letterboxd','manual','ju','site')", + "name": "titles_source_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"match_status\" IN ('pending','matched','manual','not_found')", + "name": "titles_match_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "length(btrim(\"title\")) > 0", + "name": "titles_title_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "char_length(\"reason\") BETWEEN 10 AND 1000", + "name": "change_requests_reason_check", + "entityType": "checks", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "value": "char_length(\"display_name\") <= 40", + "name": "change_requests_display_name_check", + "entityType": "checks", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "value": "((\"kind\" = 'add') = (\"task_id\" IS NULL))", + "name": "change_requests_task_check", + "entityType": "checks", + "schema": "worldtodo", + "table": "change_requests" + }, + { + "value": "char_length(\"title\") BETWEEN 5 AND 140", + "name": "tasks_title_check", + "entityType": "checks", + "schema": "worldtodo", + "table": "tasks" + }, + { + "value": "char_length(\"description\") <= 2000", + "name": "tasks_description_check", + "entityType": "checks", + "schema": "worldtodo", + "table": "tasks" + }, + { + "value": "\"lat\" BETWEEN -90 AND 90", + "name": "tasks_lat_check", + "entityType": "checks", + "schema": "worldtodo", + "table": "tasks" + }, + { + "value": "\"lon\" BETWEEN -180 AND 180", + "name": "tasks_lon_check", + "entityType": "checks", + "schema": "worldtodo", + "table": "tasks" + }, + { + "value": "cardinality(\"source_urls\") >= 1", + "name": "tasks_sources_check", + "entityType": "checks", + "schema": "worldtodo", + "table": "tasks" + }, + { + "value": "\"confidence\" IN ('high','medium')", + "name": "tasks_confidence_check", + "entityType": "checks", + "schema": "worldtodo", + "table": "tasks" + }, + { + "value": "\"goal\" IS NULL OR \"goal\" IN ('pass','fc')", + "name": "osu_goals_goal_check", + "entityType": "checks", + "schema": "games", + "table": "osu_goals" + }, + { + "value": "\"match_status\" IN ('matched','ambiguous','unmatched') AND (\"match_status\" <> 'matched' OR \"beatmap_id\" IS NOT NULL)", + "name": "osu_goals_match_check", + "entityType": "checks", + "schema": "games", + "table": "osu_goals" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "osu_goals_name_check", + "entityType": "checks", + "schema": "games", + "table": "osu_goals" + } + ], + "renames": [] +} \ No newline at end of file diff --git a/scripts/build-worldtodo-seed.py b/scripts/build-worldtodo-seed.py new file mode 100644 index 0000000..20898e2 --- /dev/null +++ b/scripts/build-worldtodo-seed.py @@ -0,0 +1,237 @@ +import json, re +AS_OF = "2026-10-26" +T = [] +def t(scale, category, title, description, location, sources, lat=None, lon=None, status="open", cc=None, source_date=None, confidence="high", note=None): + slug = re.sub(r'[^a-z0-9]+', '-', title.lower()).strip('-')[:70].rstrip('-') + d = dict(slug=slug, title=title, description=description, scale=scale, category=category, + location_name=location, country_code=cc, lat=lat, lon=lon, status=status, + source_urls=sources, source_date=source_date, as_of=AS_OF, confidence=confidence) + if note: d["verification_note"] = note + T.append(d) + +# ---------------- PLANET ---------------- +P="planet"; W="World" +t(P,"health","Interrupt the last wild poliovirus transmission in Afghanistan and Pakistan", + "Wild poliovirus type 1 is still endemic only in Afghanistan and Pakistan; GPEI/WHO counted 48 WPV1 cases in 2026 as of mid-October (42 Afghanistan, 6 Pakistan). Reach every missed child with vaccination so polio can be declared eradicated.", + "Afghanistan & Pakistan (global eradication)", ["https://polioeradication.org/about-polio/polio-this-week/","https://www.emro.who.int/polio-eradication/home/"], 31.0, 68.0, source_date="2026-10-18") +t(P,"health","Eradicate Guinea worm disease: stop the last human and animal infections", + "Only 10 human Guinea worm cases were reported worldwide in 2025 (Chad 4, Ethiopia 4, South Sudan 2), but 684 animal infections keep transmission alive. Finish containment, water filtration and animal surveillance in the six remaining countries.", + "Chad, Ethiopia, South Sudan, Cameroon, Mali, Angola", ["https://www.cartercenter.org/news/guinea-worm-announcement/","https://www.cartercenter.org/programs/guinea-worm/"], source_date="2026") +t(P,"environment","Agree and adopt a binding global treaty to end plastic pollution", + "UN plastics-treaty talks (INC) have not produced a treaty; INC-5.3 in Feb 2026 only elected a new chair, and the next substantive session, INC-5.4, is planned for 13–24 March 2027. Resolve the open disputes (production limits, chemicals of concern, decision rules) and adopt the treaty.", + W, ["https://www.unep.org/en/inc-plastic-pollution","https://www.france24.com/en/live-news/20261001-plastic-treaty-talks-chair-sees-deal-possible-in-march"], source_date="2026-10-01") +t(P,"environment","Designate the first marine protected areas under the High Seas Treaty", + "The BBNJ (High Seas) Agreement entered into force on 17 January 2026; its first COP is set for 11–22 January 2027 in New York. Set up the scientific body and designate the first high-seas protected areas so the treaty actually protects ocean life beyond national borders.", + "High seas (areas beyond national jurisdiction)", ["https://www.un.org/bbnjagreement/en","https://www.eli.org/vibrant-environment-blog/charting-new-waters-high-seas-treaty-after-two-months"], source_date="2026") +t(P,"food","Get food to the 645 million people who are chronically hungry", + "The UN SOFI 2026 report estimates 645 million people (7.8% of humanity) faced hunger in 2025. Progress is uneven, with hunger still rising in parts of Africa. Zero Hunger (SDG 2) by 2030 is off track.", + W, ["https://news.un.org/en/story/2026/07/1167987","https://www.fao.org/publications/fao-flagship-publications/the-state-of-food-security-and-nutrition-in-the-world/2026/en"], source_date="2026-07") +t(P,"energy","Connect the 655 million people who still have no electricity", + "Tracking SDG7 2026: 655 million people still lack electricity, more than 560 million of them in Sub-Saharan Africa. Electrification has to roughly triple in pace to reach universal access by 2030.", + W, ["https://www.esmap.org/news/tracking-sdg7-655-million-people-still-without-electricity-underscore-urgent-need-deliver","https://www.iea.org/news/655-million-people-still-living-without-electricity-underscore-urgent-need-to-deliver-on-universal-energy-access-target"], source_date="2026-06") +t(P,"health","Give the 2 billion people cooking on polluting fuels access to clean cooking", + "About 2 billion people still cook with polluting fuels such as wood, charcoal and kerosene, which causes deadly household air pollution. On current trends 1.8 billion will still do so in 2030. In Sub-Saharan Africa alone, 970 million people lack clean cooking.", + W, ["https://www.esmap.org/news/tracking-sdg7-655-million-people-still-without-electricity-underscore-urgent-need-deliver","https://unstats.un.org/sdgs/report/2026/Goal-07/"], source_date="2026-06") +t(P,"health","Vaccinate the 13.5 million 'zero-dose' children who got no routine vaccines", + "WHO/UNICEF estimates (released July 2026) show that 13.5 million infants received no DTP vaccine at all in 2025. That is still 674,000 more than the 2019 baseline. Reach them, mostly in conflict-affected and fragile settings.", + W, ["https://www.who.int/news/item/15-07-2026-global-childhood-immunization-coverage-inches-forward-despite-conflict-and-hesitancy---unicef--who"], source_date="2026-07-15") +t(P,"health","Cut malaria's 282 million cases a year and contain antimalarial drug resistance", + "The WHO World Malaria Report 2025 estimates 282 million cases and 610,000 deaths in 2024, both rising, with about 95% in Africa. Partial resistance to artemisinin threatens current treatments. Scale up vaccines, nets and new drugs.", + W, ["https://www.who.int/teams/global-malaria-programme/reports/world-malaria-report-2025/","https://www.who.int/en/news-room/fact-sheets/detail/malaria"], source_date="2025-12") +t(P,"water","Provide safely managed drinking water to the 2.1 billion people without it", + "One in four people worldwide (2.1 billion) still lack safely managed drinking water, and 106 million drink untreated surface water straight from rivers and lakes (WHO/UNICEF JMP).", + W, ["https://www.who.int/news/item/26-08-2025-1-in-4-people-globally-still-lack-access-to-safe-drinking-water---who--unicef","https://data.unicef.org/resources/jmp-report-2025/"], source_date="2025-08-26") +t(P,"climate","Close the gap on the Global Methane Pledge (-30% by 2030)", + "UNEP's Global Methane Status Report says methane emissions are still rising. Even if fully implemented, current national plans would deliver only about an 8% cut by 2030, not the pledged 30%. Fix leaks in oil and gas, landfills and agriculture.", + W, ["https://www.unep.org/en/news-and-stories/press-release/ministers-urge-decisive-methane-action-global-report-shows-progress"], source_date="2025-11") +t(P,"health","Cut deaths from antimicrobial resistance by 10% by 2030", + "In the 2024 UN political declaration, countries committed to cutting deaths associated with bacterial AMR by 10% by 2030, from a 2019 baseline of 4.95 million associated deaths. Deliver the surveillance, stewardship, antibiotic access and funding needed to get there.", + W, ["https://www.who.int/news/item/26-09-2024-world-leaders-commit-to-decisive-action-on-antimicrobial-resistance","https://press.un.org/en/2024/ga12642.doc.htm"], source_date="2024-09-26") +t(P,"infrastructure","Stop low Earth orbit filling up with space debris", + "ESA's Space Environment Report 2026 counts roughly 1.5 million objects of 1–10 cm in orbit, and its orbital Health Index got about ten times worse in one year. Enforce end-of-life deorbiting, prevent fragmentations and fund active debris removal.", + "Earth orbit", ["https://www.esa.int/Space_Safety/Space_Debris/ESA_Space_Environment_Report_2026"], source_date="2026-09") + +# ---------------- REGION ---------------- +R="region" +t(R,"climate","Scale up the Great Green Wall: from 1.66M toward 100M hectares restored across the Sahel", + "As of end-2025 the Great Green Wall Observatory reports 1.66 million hectares under restoration, against a 100-million-hectare target for 2030. A new US$78M programme for 2026 aims to restore 270,000+ hectares in nine countries. Finance and deliver the rest.", + "Sahel (Senegal to Djibouti)", ["https://www.unep.org/en/news-and-stories/press-release/new-us78-million-initiative-restore-land-improve-livelihoods-across","https://www.au.int/en/pressreleases/20260824/ambition-investment-calls-scaled-finance-great-green-wall"], 15.0, 5.0, source_date="2026-08") +t(R,"health","End the multi-country cholera outbreaks across Africa", + "WHO reported cholera cases in 16 African countries by mid-2026, led by DR Congo, South Sudan and Mozambique. Africa CDC runs a continental cholera response plan. Fund WASH, oral vaccines and case management to stop it.", + "Africa (DRC, South Sudan, Mozambique, Malawi, Zambia, Zimbabwe, Namibia…)", ["https://africacdc.org/news-item/president-hakainde-hichilema-au-cholera-champion-joins-partners-to-unveil-africas-new-continental-cholera-plan/","https://www.afro.who.int/news/southern-africa-faces-acute-surge-cholera-due-floods-displacement"], -5.0, 25.0, source_date="2026") +t(R,"environment","Drive Amazon deforestation from 3,335 km² a year to zero", + "INPE's PRODES estimate for Aug 2025–Jul 2026 is 3,335 km² cleared in Brazil's Legal Amazon, the lowest since 1988 but still more than 3,000 km² of forest lost a year. Hold enforcement and reach the zero-deforestation-by-2030 goal.", + "Amazon basin (Brazil's Legal Amazon)", ["https://www.gov.br/inpe/pt-br/assuntos/ultimas-noticias/brasil-alcanca-menores-taxas-de-desmatamento-da-serie-historica-na-amazonia-e-no-cerrado","https://terrabrasilis.dpi.inpe.br/app/dashboard/deforestation/biomes/legal_amazon/rates"], -5.0, -60.0, source_date="2026-10") +t(R,"environment","Control crown-of-thorns starfish outbreaks so the Great Barrier Reef can recover", + "The AIMS 2025/26 survey found hard coral cover recovering in the northern and central Great Barrier Reef but slipping in the south. The reef is still under pressure from cyclones, flooding and crown-of-thorns starfish. Keep culling and cut runoff.", + "Great Barrier Reef, Australia", ["https://www.aims.gov.au/monitoring-great-barrier-reef/gbr-condition-summary-2025-26","https://www.gbrmpa.gov.au/learn/reef-health/reef-health-updates"], -18.3, 147.7, cc="AU", source_date="2026") +t(R,"environment","Recover the WWII munitions dumped in the Baltic and North Seas", + "Germany's Baltic pilot recovered about 18 tonnes of sea-dumped munitions in 2024–25, a tiny fraction of what lies on the seabed corroding and leaking toxins. Next steps are an expanded Baltic phase, North Sea clearance and an offshore disposal platform due around end-2028.", + "Baltic Sea & North Sea", ["https://www.bundesumweltministerium.de/pressemitteilung/probephase-zur-munitionsbergung-erfolgreich-abgeschlossen","https://www.bundesumweltministerium.de/en/topics/marine-conservation/unexploded-munitions-in-the-sea"], 54.5, 11.0, source_date="2026") +t(R,"humanitarian","Fully fund food aid for Rohingya refugees in Cox's Bazar", + "Since April 2026 WFP has cut many of the roughly 1 million Rohingya refugees in Bangladesh to a tiered US$7–10 monthly food voucher, down from US$12, for lack of funding. Refugees report hardship and more negative coping. Restore full rations and fund the response.", + "Cox's Bazar, Bangladesh / Myanmar", ["https://www.wfp.org/news/wfp-introduces-needs-based-food-assistance-approach-rohingya-refugees-bangladesh","https://apnews.com/article/rohingya-bangladesh-aid-ration-cuts-wfp-8349d38f8f8b21c96e70b5e805468fd1"], 21.2, 92.15, source_date="2026") +t(R,"humanitarian","Clear Gaza's ~61 million tonnes of war rubble", + "UNDP estimates Gaza holds about 61 million tonnes of debris. Clearing most of it could take around seven years, and only with unimpeded access, heavy machinery, fuel and US$110M in up-front funding.", + "Gaza Strip", ["https://www.undp.org/stories/clearing-most-rubble-gaza-strip-possible-seven-years-under-right-conditions","https://www.reuters.com/world/middle-east/palestinians-use-gaza-rubble-restore-streets-us-rebuilding-plan-stalls-2026-04-27/"], 31.45, 34.4, source_date="2025-11-20") +t(R,"humanitarian","Stop migrants drowning on the Central Mediterranean route", + "IOM recorded 996 people dead or missing on the Central Mediterranean route by 15 Sept 2026, up from 844 in the same period of 2025, even though arrivals there fell by 55%. Restore search-and-rescue capacity and open safe routes.", + "Central Mediterranean (Libya/Tunisia – Italy/Malta)", ["https://www.iom.int/news/new-iom-data-migrant-arrivals-europe-fall-39-2026-while-deaths-continue-rise","https://missingmigrants.iom.int/data"], 35.0, 14.0, source_date="2026-09") +t(R,"humanitarian","Fund the response for 8.2 million people in need in the Lake Chad Basin", + "OCHA (9 Sept 2026): 8.2 million people need humanitarian help across Cameroon, Chad, Niger and Nigeria around Lake Chad, with more than 3.5 million forcibly displaced.", + "Lake Chad Basin (Cameroon, Chad, Niger, Nigeria)", ["https://reliefweb.int/report/cameroon/lake-chad-basin-humanitarian-overview-2026-9-september-2026"], 13.0, 14.0, source_date="2026-09-09") +t(R,"climate","Build end-to-end glacial-lake-outburst-flood warning systems in the Himalaya", + "Glacier melt across the Hindu Kush Himalaya is swelling glacial lakes. India runs only a pilot GLOF early-warning system (Sissu Lake) and has no end-to-end national system commissioned. ICIMOD is preparing a 2027–2030 regional programme on early warning.", + "Hindu Kush Himalaya (Afghanistan to Myanmar)", ["https://www.icimod.org/event/cryosphere-water/hkh-drr-hub-2026/","https://timesofindia.indiatimes.com/city/dehradun/ndma-moves-to-scale-up-glof-warning-system-after-sissu-pilot-review/articleshow/130415374.cms"], 30.0, 82.0, source_date="2026") +t(R,"humanitarian","Get water and food to drought-hit communities in Somalia, Kenya and Ethiopia", + "Failed Oct–Dec rains triggered severe drought across Somalia, northern Kenya and south-eastern Ethiopia. About 5 million people are affected in Somalia alone, and Oxfam reports water prices up 2,000% in the worst-hit areas.", + "Horn of Africa", ["https://www.unocha.org/publications/report/somalia/somalia-2025-2026-drought-emergency-situation-report-no-5","https://www.oxfam.org/en/press-releases/millions-people-across-somalia-kenya-and-ethiopia-facing-drought-crisis-cost-water"], 4.0, 43.0, source_date="2026-04") +t(R,"environment","Curb river sand mining that is pushing salt water into the Mekong Delta", + "A 2026 NTU Singapore study finds sand mining extracts 6–15× the river's natural sediment supply and drives saltwater intrusion further inland, on top of subsidence from groundwater pumping. Set and enforce sustainable extraction limits.", + "Mekong Delta (Vietnam/Cambodia)", ["https://www.ntu.edu.sg/nie/news-events/news/detail/sand-mining-is-destabilising-the-mekong-delta-far-more-than-previously-understood--nie--ntu-singapore-study-finds"], 10.0, 105.8, source_date="2026") + +# ---------------- COUNTRY ---------------- +C="country" +t(C,"humanitarian","Prevent famine in Sudan's Darfur and Kordofan", + "The IPC alert of 12 Oct 2026 warns of rapidly worsening conditions across Greater Darfur and Kordofan. Famine is highly likely in El Fasher, and access is severely restricted. Sudan's 2026 response plan asks US$2.9 billion and was badly underfunded.", + "Sudan", ["https://reliefweb.int/report/sudan/sudan-ipc-alert-new-evidence-reveals-rapidly-worsening-conditions-across-greater-darfur-and-kordofan-published-12-october-2026","https://fts.unocha.org/countries/212/summary/2026"], 13.6, 25.35, cc="SD", source_date="2026-10-12") +t(C,"safety","Demine Ukraine's ~132,000 km² of mine-contaminated land", + "As of Feb 2026, about 132,000 km² of Ukraine, nearly a quarter of the country, was potentially contaminated by mines and explosive remnants. Clearance teams return a few thousand hectares a month.", + "Ukraine", ["https://reliefweb.int/report/ukraine/landmines-use-contamination-and-civilian-harm-ukraine-factsheet-2026-enuk","https://demine.gov.ua/en"], 48.4, 31.2, cc="UA", source_date="2026-02") +t(C,"humanitarian","Help Haiti's 1.49 million displaced people return home safely", + "IOM counted 1,494,456 internally displaced people in Haiti (about 13% of the population) as of August 2026, driven by gang violence. Cholera also keeps recurring.", + "Haiti", ["https://reliefweb.int/report/haiti/iom-haiti-situation-report-august-2026"], 18.97, -72.29, cc="HT", source_date="2026-08") +t(C,"water","Get arsenic out of Bangladesh's drinking water", + "A 2025 survey estimates about 26 million Bangladeshis still drink groundwater above the WHO arsenic guideline (10 µg/L), about 15.5 million of them above the national 50 µg/L standard. Test wells and switch people to safe sources.", + "Bangladesh", ["https://www.medrxiv.org/content/10.64898/2026.10.06.26364882v1.full.pdf","https://www.bssnews.net/js-session/401178"], 23.7, 90.4, cc="BD", source_date="2026-10") +t(C,"water","Replace every lead drinking-water pipe in the United States", + "Under EPA's Lead and Copper Rule Improvements, most US water systems must start mandatory lead service line replacement by 1 Nov 2027 and finish by 31 Dec 2037.", + "United States", ["https://www.epa.gov/ground-water-and-drinking-water/planning-and-conducting-lead-service-line-replacement","https://www.federalregister.gov/documents/2024/10/30/2024-23549/national-primary-drinking-water-regulations-for-lead-and-copper-improvements-lcri"], 39.8, -98.6, cc="US", source_date="2026") +t(C,"water","Stop sewage spills into England's rivers and seas", + "Storm overflows in England still spilled 291,492 times in 2025, totalling around 1.8 million hours, even though that was down 35% on 2024 (Environment Agency).", + "England, UK", ["https://www.gov.uk/government/news/fewer-and-shorter-storm-overflow-spills-in-2025-new-monitoring-data-shows","https://commonslibrary.parliament.uk/research-briefings/cbp-10027/"], 52.5, -1.5, cc="GB", source_date="2026-03") +t(C,"infrastructure","Fix the Netherlands' electricity grid congestion", + "On 30 June 2026, Dutch regional grid operators had 15,498 requests to take power and 8,558 to feed it in waiting on queues because the grid is full (Netbeheer Nederland). Small consumers in congested areas have also been queued since 1 July 2026.", + "Netherlands", ["https://www.netbeheernederland.nl/artikelen/persbericht/bouw-versnelt-opnieuw-maar-de-vraag-loopt-nog-steeds-op","https://www.netbeheernederland.nl/sites/default/files/2026-10/stand_van_de_uitvoering_halfjaar_2026.pdf"], 52.2, 5.3, cc="NL", source_date="2026-10") +t(C,"housing","Close the Dutch housing shortage of 384,000 homes", + "The Primos forecast 2026 puts the Dutch statistical housing shortage at 384,000 homes (4.6% of stock). 213,000 extra homes would be needed immediately just to get down to the 2% target level.", + "Netherlands", ["https://www.tweedekamer.nl/kamerstukken/detail/detail?did=2026D34061&id=2026D34061"], 52.2, 5.3, cc="NL", source_date="2026-07") +t(C,"safety","Finish earthquake-strengthening the remaining ~8,500 homes in Groningen", + "The Nationaal Coördinator Groningen's 2026 plan still lists 8,583 addresses to strengthen against gas-extraction earthquakes, 1,278 of them heavy or demolish-and-rebuild cases.", + "Groningen, Netherlands", ["https://www.nationaalcoordinatorgroningen.nl/site/binaries/site-content/collections/documents/2025/12/jaarplan-ncg-2026/jaarplan-ncg-2026.pdf","https://www.oogtv.nl/2026/02/ncg-blij-over-aantal-veilig-beoordeelde-huizen-maar-versterking-of-nieuwbouw-begint-bij-13-procent-te-laat/"], 53.22, 6.57, cc="NL", source_date="2026") +t(C,"governance","Finish the last benefits-scandal (toeslagenaffaire) reviews", + "As of 25 Sept 2026, 103 parents were still waiting on their full review (integrale beoordeling) by the UHT: 90 in progress and 13 not yet started. Close them out fairly.", + "Netherlands", ["https://herstel.toeslagen.nl/dashboard-kinderopvangtoeslag/"], 52.08, 4.31, cc="NL", source_date="2026-09-25", confidence="medium", note="Small remaining backlog; may be finished soon, so re-check the dashboard.") +t(C,"infrastructure","Fund the renewal of ageing Dutch national bridges, tunnels and locks", + "Rijkswaterstaat manages about 5,500 concrete bridges and 88 lock complexes. Its maintenance and renewal job is bigger than its budget, with a reported shortfall of about €34.5bn for 2024–2038, and an Oct 2026 Kamerbrief re-prioritises the work.", + "Netherlands", ["https://www.rijkswaterstaat.nl/nieuws/archief/2026/10/kamerbrief-herprioritering-onderhoud-en-vernieuwing-infrastructuur","https://zoek.officielebekendmakingen.nl/ah-tk-20252026-914.html"], 52.2, 5.3, cc="NL", source_date="2026-10") +t(C,"infrastructure","Speed up Germany's motorway bridge repairs (target 400 a year, achieving ~170)", + "Germany aims to modernise 4,000 motorway bridge sections in ten years, about 400 a year. Only 157 were finished in 2025 and about 170 are expected in 2026.", + "Germany", ["https://baubote.de/tiefbau-infrastruktur/brueckensanierung-autobahn-zahlen-2025-2026","https://www.handelsblatt.com/mobilitaet/background-verkehr-und-smart-mobility/autobahnen-sind-deutschlands-bruecken-halb-verfallen-oder-halb-saniert/100263521.html"], 51.2, 10.4, cc="DE", source_date="2026") + +# ---------------- CITY ---------------- +Y="city" +t(Y,"infrastructure","Lower Gouda's inner-city groundwater level to stop subsidence damage", + "Gouda and Rijnland are working on 'Gouda Stevige Stad': lowering the water level in the lowest, subsiding parts of the historic centre by 25 cm. Sewers, water-level barriers and a pumping station must be ready first, and the first level reduction is expected in 2027.", + "Gouda (binnenstad), NL", ["https://www.gouda.nl/gouda-werkt-aan-de-stad/gouda-stevige-stad/","https://gouda.bestuurlijkeinformatie.nl/Document/View/ee2f89a0-8e2a-4176-b8a8-1e7caf2cd15c"], 52.0115, 4.7105, cc="NL", status="in_progress", source_date="2026") +t(Y,"infrastructure","Replace Amsterdam's failing historic quay walls", + "Amsterdam has replaced about 3.5 km of quay wall since 2021. In 2026 it is working on 14 quay projects (about 2,150 m) under its Bridges & Quay Walls programme. Hundreds of kilometres of old quays still need assessing and renewing.", + "Amsterdam, NL", ["https://aandegrachten.amsterdam/hier-werken-we-in-2026-aan-bruggen-en-kademuren/","https://www.amsterdam.nl/projecten/kademuren"], 52.3731, 4.8925, cc="NL", status="in_progress", source_date="2026") +t(Y,"infrastructure","Renovate Rotterdam's 55 movable bridges and locks", + "Rotterdam's ten-year 'Open/Dicht' programme will tackle overdue maintenance on 55 movable bridges and locks, including the Erasmusbrug. The first six go to tender in 2026.", + "Rotterdam, NL", ["https://www.infrasite.nl/aanbesteden/2026/09/02/rotterdam-gaat-55-bruggen-en-sluizen-renoveren-aanbesteding-voor-o-a-erasmusbrug-start-dit-jaar/"], 51.9244, 4.4778, cc="NL", status="in_progress", source_date="2026-09-02") +t(Y,"infrastructure","Repair Leiden's 13 km of ageing quay walls", + "Leiden has started a 15-year programme for 13 km of quay walls at 114 locations, starting with the worst. The first big works (Oude Vest, Herengracht, Kalvermarkt) start in 2027.", + "Leiden, NL", ["https://gemeente.leiden.nl/projecten/verbeteren-kades/","https://www.infrasite.nl/waterbouw-deltas/2026/07/01/leiden-start-miljoenenoperatie-voor-verouderde-kademuren-in-historische-binnenstad/"], 52.1595, 4.4909, cc="NL", source_date="2026-07") +t(Y,"environment","Stop PFAS emissions from the Chemours plant in Dordrecht", + "The province of Zuid-Holland is appealing at the Raad van State for stricter PFAS limits on Chemours, with a ruling expected in autumn 2026, while DCMR monitors PFAS in air and rainfall around Dordrecht.", + "Dordrecht, NL", ["https://www.zuid-holland.nl/onderwerpen/milieu/chemours/","https://www.dcmr.nl/actueel/dossiers/dossier-chemours-delrin-dupont-en-dow"], 51.8105, 4.6458, cc="NL", source_date="2026") +t(Y,"housing","Get Utrecht's ~3,000 homeless people into housing", + "About 3,000 people in Utrecht are homeless or at risk of homelessness (AD). The city promised 100 'Wonen Eerst' homes for homeless young people in 2026, and the average wait for social housing is close to 12 years.", + "Utrecht, NL", ["https://www.ad.nl/utrecht/aantal-dak-en-thuislozen-in-utrecht-groeit-naar-3000-dit-schrijnende-verhaal-schuilt-achter-de-cijfers~aecf1218/","https://momusmedia.nl/updates/utrecht-belooft-100-woningen-aan-dakloze-jongeren-hoe-staat-het-ervoor/"], 52.0907, 5.1216, cc="NL", source_date="2026", confidence="medium", note="AD article date not confirmed; figures from search summary.") +t(Y,"infrastructure","Rebuild Dresden's collapsed Carolabrücke", + "The Carolabrücke collapsed in Sept 2024 and was fully demolished by Sept 2025. Planners were contracted in Sept 2026, with construction planned from May 2028 and completion in the early 2030s.", + "Dresden, DE", ["https://www.dresden.de/de/stadtraum/zentrale-projekte/carolabruecke.php","https://www.dresden.de/de/rathaus/aktuelles/pressemitteilungen/2026/09/pm_096.php"], 51.0568, 13.7470, cc="DE", status="in_progress", source_date="2026-09") +t(Y,"infrastructure","Reopen Hammersmith Bridge in London", + "Hammersmith Bridge has been closed to motor vehicles since 2019. Full restoration was costed at about £300m, plans to reopen it to cars have been shelved, and a cheaper phased repair is now being pursued.", + "London, UK", ["https://tfl.gov.uk/travel-information/improvements-and-projects/hammersmith-bridge","https://www.bbc.co.uk/news/articles/c5yzqv29d1eo"], 51.4884, -0.2302, cc="GB", source_date="2026-10") +t(Y,"climate","Stop Jakarta sinking: enforce the groundwater ban and pipe in water", + "North Jakarta sinks on average about 3.5 cm a year, up to 20 cm in places, and roughly 40% of the city is below sea level. Enforce the tightened groundwater-extraction rules and expand piped water.", + "Jakarta, ID", ["https://www.thejakartapost.com/indonesia/2026/02/09/jakarta-tightens-groundwater-rule-to-curb-subsidence","https://www.straitstimes.com/asia/se-asia/jakarta-sinks-deeper-as-subsidence-worsens-flood-risks"], -6.1754, 106.8272, cc="ID", source_date="2026-02") +t(Y,"health","Clean up Delhi's toxic winter air", + "Delhi's AQI passed 300 on 23 Oct 2026 even with GRAP Stage I in force, as crop-stubble fires in Punjab and Haryana resumed. Cut stubble burning, construction dust and vehicle emissions.", + "Delhi, IN", ["https://www.indiatoday.in/amp/science/story/delhi-aqi-today-pollution-control-measures-grap-ncr-smog-3023247-2026-10-23"], 28.6139, 77.2090, cc="IN", source_date="2026-10-23") +t(Y,"water","Fix Mexico City's leaking water network", + "Mexico City loses an estimated 40–50% of its drinking water to leaks in the public network and homes. Aquifer over-pumping makes parts of the city sink by up to about 24 cm a year.", + "Mexico City, MX", ["https://www.jornada.com.mx/2026/08/14/capital/027n1cap","https://politica.expansion.mx/mexico/2026/10/19/cutzamala-llenado-abasto-agua-valle-de-mexico"], 19.4326, -99.1332, cc="MX", source_date="2026-10") +t(Y,"climate","Unblock Lagos drainage channels to end flash flooding", + "Lagos State approved dredging of 28 drainage channels and has removed 1,544 of 2,218 identified structures blocking drainage. Refuse dumping and wetland encroachment still cause floods.", + "Lagos, NG", ["https://punchng.com/sanwo-olu-approves-dredging-of-28-drainage-channels-to-tackle-lagos-floods/","https://punchng.com/lasg-removes-over-1500-structures-to-tackle-flooding/"], 6.5244, 3.3792, cc="NG", status="in_progress", source_date="2026") + +# ---------------- STREET / NEIGHBOURHOOD ---------------- +S="street" +t(S,"infrastructure","Fix the sunken path at the new footbridge on Tesselschadestraat, Gouda", + "Paving at one end of the footbridge in Korte Akkeren, built in 2025, sank in July 2026 when sand washed out, leaving a hole. The council fenced off the crossing and said it would repair it as soon as possible.", + "Tesselschadestraat, Korte Akkeren, Gouda", ["https://www.goudsepost.nl/nieuws/nieuws/471080/gat-voor-brug-tesselschadestraat-na-verzakking-tegels","https://www.omroepwest.nl/verkeer/5130955/gat-ontstaan-pal-voor-bruggetje-oeververbinding-afgesloten"], 52.0014, 4.6979, cc="NL", source_date="2026-07-24", confidence="medium", note="Reported in July 2026; no repair confirmation found, but it may have been fixed since.") +t(S,"safety","Slow down fast bikes and scooters on the Aschpotpad dog-walking area, Gouda", + "The Aschpotpad in Achterwillens runs straight through an off-leash dog area. A dog was hit and killed by a cyclist on 23 July 2026, and Leefbaar Gouda asked the council for speed-reducing measures such as narrowings and posts.", + "Aschpotpad, Achterwillens, Gouda", ["https://www.goudsepost.nl/nieuws/nieuws/473975/leefbaar-gouda-stelt-vragen-over-veiligheid-aschpotpad-na-dood-hondje"], 52.0257, 4.7217, cc="NL", source_date="2026-08-19") +t(S,"mobility","Stop rat-run traffic on Onder de Boompjes, Gouda", + "With the Koningin Wilhelminaweg works, drivers ignore the closure signs and cut through narrow Onder de Boompjes. Police wrote 16 tickets in one hour on 22 Oct 2026 and will check more often. A physical measure would fix it for good.", + "Onder de Boompjes, Gouda", ["https://www.goudsepost.nl/nieuws/nieuws/482518/politie-bekeurt-16-automobilisten-in-een-uur-op-onder-de-boompjes","https://www.ad.nl/gouda/veel-boetes-voor-sluipverkeer-bij-onder-de-boompjes~adc6ac57/"], 52.0106, 4.6980, cc="NL", source_date="2026-10-22") +t(S,"infrastructure","Fix the dangerous sunken pavement on Schoonegge, Rotterdam-Zuidwijk", + "A resident broke her wrist after falling on sunken, uneven tiles. The council has had at least ten reports but postponed repair to 2027 (tree roots, no contractor). The Pendrecht-Zuidwijk wijkraad asks for a temporary safe path now.", + "Schoonegge, Zuidwijk, Rotterdam", ["https://dagblad010.nl/Rotterdam%20&%20Regio/wijkraad-eist-opheldering-over-gevaarlijk-trottoir-in-rotterdam-zuid-"], 51.8717, 4.4915, cc="NL", source_date="2026-10-08") +t(S,"water","Repair the underground water leak causing sinkholes on Crooswijksestraat, Rotterdam", + "An underground water leak washed away sand and opened holes in pavements and streets around Crooswijksestraat and Hendrikstraat, and flooded crawl spaces. Streets are fenced off and Evides is repairing the leak (25 Oct 2026).", + "Crooswijksestraat / Hendrikstraat, Crooswijk, Rotterdam", ["https://www.ad.nl/rotterdam/gaten-in-stoepen-en-straten-door-ondergrondse-lekkage-crooswijk~a2a95e15/"], 51.9329, 4.4912, cc="NL", status="in_progress", source_date="2026-10-25", confidence="medium", note="Repair was under way on 25 Oct; it will likely be done within days.") +t(S,"waste","Tackle dumped furniture, rats and overflowing containers in Oud-Mathenesse, Rotterdam", + "Residents of Oud-Mathenesse report furniture dumped on the street, rats ripping open bin bags and litter everywhere. The council says it is not a major problem, so residents are documenting it themselves (24 Oct 2026).", + "Oud-Mathenesse, Rotterdam", ["https://www.inderegiorotterdam.nl/nieuws/ratten-gedumpte-meubels-en-volle-containers-bewoners-willen-afvalprobleem-in-oud-mathenesse-zichtbaar-maken"], 51.9135, 4.4300, cc="NL", source_date="2026-10-24", confidence="medium", note="Coordinates are approximate for the neighbourhood.") +t(S,"safety","Get help and shelter for people sleeping under the Hofbogen, Agniesebuurt, Rotterdam", + "Open drug use and dealing, litter and vandalism are concentrated along the Hofbogen between former Hofplein station and Eudokiaplein. The council added BOAs, cleaning and outreach in Oct 2026, but evenings remain a problem and shelter capacity is short.", + "Hofbogen, Agniesebuurt, Rotterdam", ["https://www.ad.nl/rotterdam/bewoners-klagen-al-langer-over-drugs-alcohol-en-vernieling-rotterdam-komt-nu-met-maatregelen-voor-de-agniesebuurt~a09e0ac8/"], 51.9295, 4.4745, cc="NL", status="in_progress", source_date="2026-10-19", confidence="medium", note="Coordinates are approximate.") +t(S,"infrastructure","Stop the Schenkviaduct leaking rusty water onto cars on Weteringkade, Den Haag", + "Since at least 2008 the Schenkviaduct has dripped leak water with concrete rot and rust onto parked cars. The council admits it is not solved, and the viaduct's renovation sits in its Meerjarenprogramma Kunstwerken 2026–2029.", + "Schenkviaduct / Weteringkade, Den Haag", ["https://www.omroepwest.nl/verkeer/5163344/zorgen-om-viaduct-in-den-haag-straks-stort-het-in"], 52.0737, 4.3254, cc="NL", source_date="2026-10-24") +t(S,"mobility","Agree and build a safer layout for Hobbemaplein by the Haagse Markt, Den Haag", + "The previous redesign lacked support. Den Haag restarted the plan in 2026 with about €8.5M to make the square safer for pedestrians, cyclists and public transport while keeping the market reachable.", + "Hobbemaplein, Transvaalkwartier, Den Haag", ["https://www.denhaag.nl/nl/denk-mee/herinrichting-hobbemaplein/"], 52.0668, 4.2969, cc="NL", status="in_progress", source_date="2026") +t(S,"infrastructure","Re-lay the broken paving along the tram tracks on Reguliersbreestraat, Amsterdam", + "Shopkeepers say people regularly fall on the crooked cobbles around the tram rails. GVB only patches it, and a structural fix is not planned for 2026 (Parool, 4 Oct 2026).", + "Reguliersbreestraat, Amsterdam", ["https://www.parool.nl/amsterdam/ondernemers-balen-van-scheve-straatstenen-in-reguliersbreestraat-mensen-vallen-met-regelmaat~b180b619/"], 52.3666, 4.8947, cc="NL", source_date="2026-10-04") +t(S,"infrastructure","Replace the moving quay wall at Oudeschans 1A–39, Amsterdam", + "The quay wall between Oosterse Kade and Keizersbrug was moving toward the water. A temporary sheet-pile safety structure went in during spring 2026, and full replacement is planned to start in 2028.", + "Oudeschans 1A–39, Amsterdam", ["https://www.amsterdam.nl/projecten/kademuren/maatregelen/oudeschans1a-39/"], 52.3713, 4.9052, cc="NL", status="in_progress", source_date="2026") +t(S,"mobility","Make the Meernbrug crossing in De Meern safe", + "Several traffic flows cross at the Meernbrug, and residents have been worried for years. Utrecht favours one-way traffic on the bridge, and a costed plan is due in Q1 2027 (commissie Leefomgeving, 8 Oct 2026).", + "Meernbrug, De Meern, Utrecht", ["https://openbestuur.nl/gemeente/utrecht/vergadering/2026-10-08-raad-zoekt-besteding-voor-half-miljoen-aan-verkeersveiligheid"], 52.0829, 5.0369, cc="NL", source_date="2026-10-08") +t(S,"safety","End the nightly fireworks and arson nuisance in Ondiep, Utrecht", + "Since September 2026, residents of Ondiep have faced heavy fireworks almost every night, burning bins and a vandalised parking meter. The council announced extra police, enforcement and changes to the public space.", + "Ondiep, Utrecht", ["https://www.rtvutrecht.nl/nieuws/4106957/bewoners-utrechtse-wijk-al-weken-geteisterd-door-overlast-lijkt-wel-oorlogsgebied","https://nos.nl/regio/utrecht/artikel/812003-utrecht-neemt-maatregelen-tegen-vuurwerkterreur-ondiep"], 52.1066, 5.1014, cc="NL", status="in_progress", source_date="2026-10-22") +t(S,"water","Clear the blocked drain flooding Raeburn Place / Allan Street, Edinburgh", + "A FixMyStreet report (24 Oct 2026) says a blocked drain at the junction of Raeburn Place and Allan Street floods the junction and 'has been an issue for some time'.", + "Raeburn Place, Stockbridge, Edinburgh", ["https://www.fixmystreet.com/report/10279290"], 55.959076, -3.213709, cc="GB", source_date="2026-10-24") +t(S,"waste","Remove the horsebox abandoned for years on St Clair Place, Leith", + "A FixMyStreet report (24 Oct 2026) says a horsebox has stood unmoved on St Clair Place for several years, with its roof window open.", + "St Clair Place, Leith, Edinburgh", ["https://www.fixmystreet.com/report/10278913"], 55.964045, -3.169505, cc="GB", source_date="2026-10-24") +t(S,"infrastructure","Make safe the broken manhole cover on Old Dalkeith Road, Edinburgh", + "Part of a manhole cover in the middle of the road between the Royal Infirmary and Ferniehill Road has fallen into the manhole, leaving it exposed (FixMyStreet, 25 Oct 2026).", + "Old Dalkeith Road, Edinburgh", ["https://www.fixmystreet.com/report/10283120"], 55.917126, -3.132213, cc="GB", source_date="2026-10-25") +t(S,"infrastructure","Fill the deep pothole with exposed jagged metal on Passage Road, Bristol", + "A deep pothole with exposed jagged metal has damaged a car. Bristol City Council raised an enquiry on 25 Oct 2026 (FixMyStreet).", + "Passage Road, Westbury on Trym, Bristol", ["https://www.fixmystreet.com/report/10283769"], 51.505769, -2.615863, cc="GB", source_date="2026-10-25") +t(S,"safety","Replace the broken glass pavement panel on Aldwych by Bush House, London", + "A broken glass panel set into the pavement at the Aldwych side entrance to Bush House Central Block leaves a hole that people can trip in or drop things into (FixMyStreet, 20 Oct 2026).", + "Aldwych, Westminster, London", ["https://www.fixmystreet.com/report/10261310"], 51.513011, -0.117094, cc="GB", source_date="2026-10-20") +t(S,"waste","Clear the fly-tipped sofa, doors and carpets beside 6A Turner Street, Gorton, Manchester", + "A three-seater sofa, an armchair, four wooden doors and four large carpets were dumped in the car park next to 6A Turner Street (FixMyStreet, 23 Oct 2026).", + "Turner Street, Gorton, Manchester", ["https://www.fixmystreet.com/report/10274767"], 53.463819, -2.171036, cc="GB", source_date="2026-10-23") + +out = {"as_of": AS_OF, "schema_version": 1, + "scales": ["planet","region","country","city","street"], + "categories": sorted({x["category"] for x in T}), + "tasks": T} +json.dump(out, open("/workspace/worldwide-todo/seed.json","w"), ensure_ascii=False, indent=2) +from collections import Counter +print(len(T), Counter(x["scale"] for x in T), Counter(x["status"] for x in T)) diff --git a/scripts/deploy-preflight.ts b/scripts/deploy-preflight.ts index 0666011..f9327b4 100644 --- a/scripts/deploy-preflight.ts +++ b/scripts/deploy-preflight.ts @@ -235,6 +235,33 @@ try { movies.public_usage ) throw new Error(`movies schema tables/grants are wrong: ${JSON.stringify(movies)}`); + // Worldwide todo list (public pages, requests and owner approvals go through the app): app + // role read/write, personal_ro none. 3 = categories, tasks, change_requests. + const WORLDTODO_TABLES = 3; + const [worldtodo] = await client` + select + count(*) filter (where has_table_privilege(c.oid, 'select, insert, update, delete')) as app_rw, + count(*) filter ( + where exists ( + select 1 from aclexplode(c.relacl) a join pg_roles r on r.oid = a.grantee + where r.rolname = 'personal_ro' + ) + ) as ro_read, + count(*) as tables, + has_schema_privilege('public', 'worldtodo', 'usage') as public_usage + from pg_class c join pg_namespace n on n.oid = c.relnamespace + where n.nspname = 'worldtodo' and c.relkind = 'r' + `; + if ( + Number(worldtodo.tables) !== WORLDTODO_TABLES || + Number(worldtodo.app_rw) !== WORLDTODO_TABLES || + Number(worldtodo.ro_read) !== 0 || + worldtodo.public_usage + ) + throw new Error(`worldtodo schema tables/grants are wrong: ${JSON.stringify(worldtodo)}`); + const [{ n: worldtodoTasks }] = await client`select count(*)::int as n from worldtodo.tasks`; + if (worldtodoTasks < 68) + throw new Error(`worldtodo.tasks has ${worldtodoTasks} rows, expected the 68 seed tasks`); // Energy tracker reads the ned-collector tables (SELECT only). const [energy] = await client` select count(*) as hours, max(valid_from) as latest from energy.ned_utilization @@ -244,7 +271,7 @@ try { if (!Number(energy.hours)) console.warn('Warning: energy.ned_utilization has no hourly data from the last 7 days'); console.log( - `health: ${health.tables} tables, tasks: ${tasks.tables} tables, groceries: ${groceries.tables} tables, stats: ${stats.tables} tables, ai: ${ai.tables} tables, movies: ${movies.tables} tables, app read/write, personal_ro none; energy: ${energy.hours} hourly rows, latest ${energy.latest ? new Date(energy.latest).toISOString() : 'none'}` + `health: ${health.tables} tables, tasks: ${tasks.tables} tables, groceries: ${groceries.tables} tables, stats: ${stats.tables} tables, ai: ${ai.tables} tables, movies: ${movies.tables} tables, worldtodo: ${worldtodo.tables} tables (${worldtodoTasks} tasks), app read/write, personal_ro none; energy: ${energy.hours} hourly rows, latest ${energy.latest ? new Date(energy.latest).toISOString() : 'none'}` ); const [catalog] = await client` select diff --git a/scripts/deploy-remote.sh b/scripts/deploy-remote.sh index 91db14f..51a95c7 100644 --- a/scripts/deploy-remote.sh +++ b/scripts/deploy-remote.sh @@ -171,6 +171,8 @@ if [ "$mode" = deploy ]; then run_database_script scripts/seed-pokemon-research.ts run_database_script scripts/seed-cod-challenges.ts run_database_script scripts/seed-cod-art.ts + # Worldwide todo list: categories + 68 sourced tasks, insert-only (never overwrites edits). + run_database_script scripts/seed-worldtodo.ts fi sudo docker run --rm --network backend --env-file "$environment" "$image" \ diff --git a/scripts/seed-worldtodo.ts b/scripts/seed-worldtodo.ts new file mode 100644 index 0000000..92a2cfc --- /dev/null +++ b/scripts/seed-worldtodo.ts @@ -0,0 +1,87 @@ +import { readFile } from 'node:fs/promises'; +import postgres from 'postgres'; + +// Seeds the Worldwide Todo List (schema worldtodo) from data/worldtodo-seed.json, built by +// scripts/build-worldtodo-seed.py (68 sourced tasks as of 2026-10-26). Idempotent: categories +// are upserted, tasks are inserted with ON CONFLICT (slug) DO NOTHING, so owner edits and +// approved deletes (soft, the row stays) are never overwritten. Runs on every deploy +// (scripts/deploy-remote.sh) as the schema owner; self-contained so it works in the app image. +// bun scripts/seed-worldtodo.ts + +if (!process.env.DB_URL) throw new Error('DB_URL is required'); + +type SeedTask = { + slug: string; + title: string; + description: string; + scale: string; + category: string; + location_name: string; + country_code: string | null; + lat: number | null; + lon: number | null; + status: string; + source_urls: string[]; + source_date: string | null; + as_of: string; + confidence: string; + verification_note?: string | null; +}; + +// Lucide icon key (#lib/worldtodo/icons) and an accent colour for the icon tile. +const CATEGORIES: Record = { + climate: { label: 'Climate', icon: 'thermometer', colour: '#ef4444' }, + environment: { label: 'Environment', icon: 'leaf', colour: '#22c55e' }, + energy: { label: 'Energy', icon: 'zap', colour: '#eab308' }, + food: { label: 'Food', icon: 'wheat', colour: '#d97706' }, + governance: { label: 'Governance', icon: 'landmark', colour: '#6366f1' }, + health: { label: 'Health', icon: 'heart-pulse', colour: '#ec4899' }, + housing: { label: 'Housing', icon: 'house', colour: '#f97316' }, + humanitarian: { label: 'Humanitarian', icon: 'hand-heart', colour: '#e11d48' }, + infrastructure: { label: 'Infrastructure', icon: 'construction', colour: '#0ea5e9' }, + mobility: { label: 'Mobility', icon: 'bike', colour: '#14b8a6' }, + safety: { label: 'Safety', icon: 'shield-alert', colour: '#f59e0b' }, + waste: { label: 'Waste', icon: 'recycle', colour: '#84cc16' }, + water: { label: 'Water', icon: 'droplet', colour: '#3b82f6' } +}; + +const seed = JSON.parse( + await readFile(new URL('../data/worldtodo-seed.json', import.meta.url), 'utf8') +) as { categories: string[]; tasks: SeedTask[] }; + +const client = postgres(process.env.DB_URL, { max: 1, onnotice: () => {} }); +try { + await client.begin(async (tx) => { + for (const slug of seed.categories) { + const c = CATEGORIES[slug] ?? { label: slug, icon: 'list-todo', colour: '#a3a3a3' }; + await tx`insert into worldtodo.categories (slug, label, icon, colour) + values (${slug}, ${c.label}, ${c.icon}, ${c.colour}) + on conflict (slug) do update set label = excluded.label, icon = excluded.icon, + colour = excluded.colour`; + } + let inserted = 0; + for (const t of seed.tasks) { + const rows = await tx` + insert into worldtodo.tasks (slug, title, description, scale, category, location_name, + country_code, lat, lon, status, source_urls, source_date, as_of, confidence, + verification_note) + values (${t.slug}, ${t.title}, ${t.description}, ${t.scale}::worldtodo.scale, + ${t.category}, ${t.location_name}, ${t.country_code ?? null}, ${t.lat ?? null}, + ${t.lon ?? null}, ${t.status}::worldtodo.status, ${t.source_urls}, + ${t.source_date ?? null}, ${t.as_of}, ${t.confidence ?? 'high'}, + ${t.verification_note ?? null}) + on conflict (slug) do nothing + returning id`; + inserted += rows.length; + } + const [{ n }] = await tx`select count(*)::int as n from worldtodo.tasks + where slug = any(${seed.tasks.map((t) => t.slug)})`; + if (n !== seed.tasks.length) + throw new Error(`Expected ${seed.tasks.length} seed tasks, found ${n}`); + console.log( + `Worldwide todo: ${seed.categories.length} categories, ${inserted} new of ${seed.tasks.length} seed tasks (all present)` + ); + }); +} finally { + await client.end(); +} diff --git a/src/env.ts b/src/env.ts index c0ef739..2e7217e 100644 --- a/src/env.ts +++ b/src/env.ts @@ -30,5 +30,8 @@ export const variables = defineEnvVars({ UBI_EMAIL: { schema: (input) => input ?? '' }, UBI_PASSWORD: { schema: (input) => input ?? '' }, GAMES_POLLER: { schema: (input) => input ?? '' }, - DB_URL: { schema: (input) => input ?? '' } + DB_URL: { schema: (input) => input ?? '' }, + // Cloudflare Turnstile for the worldwide todo list request form. + TURNSTILE_SECRET_KEY: { schema: (input) => input ?? '' }, + PUBLIC_TURNSTILE_SITE_KEY: { public: true, schema: (input) => input ?? '' } }); diff --git a/src/hooks.server.ts b/src/hooks.server.ts index e70829e..372997c 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -3,6 +3,7 @@ import { startMusicPoller } from '#lib/server/music/poller.js'; import { startGamesPoller } from '#lib/server/games/poller.js'; import { startOsuGoalsPoller } from '#lib/server/osu-goals/poller.js'; import { registerPubgMapChannel } from '#lib/server/pubg-map/live.js'; +import { registerWorldtodoChannels } from '#lib/server/worldtodo/live.js'; import { building } from '$app/env'; import { auth } from '#lib/server/auth.js'; import { isOwner, isOwnerOnlyPath, isOwnerWritePath } from '#lib/server/owner.js'; @@ -12,13 +13,14 @@ const analytics = /[\s\S]*?/; // Background jobs that live in the app process: the Spotify scrobbler (idle until connected) // the CS2 / PUBG / R6 match history poller and the osu! goals refresh. Also the WebSocket channels (served by -// server.js on the same Bun server): the PUBG drop map rooms. +// server.js on the same Bun server): the PUBG drop map rooms and the worldwide todo list. export const init: ServerInit = () => { if (!building) { startMusicPoller(); startGamesPoller(); startOsuGoalsPoller(); registerPubgMapChannel(); + registerWorldtodoChannels(); } }; diff --git a/src/lib/assets/projects/worldwide-todo-list.svg b/src/lib/assets/projects/worldwide-todo-list.svg new file mode 100644 index 0000000..a325517 --- /dev/null +++ b/src/lib/assets/projects/worldwide-todo-list.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/components/ProjectIcon.svelte b/src/lib/components/ProjectIcon.svelte index f719a1a..4b75d30 100644 --- a/src/lib/components/ProjectIcon.svelte +++ b/src/lib/components/ProjectIcon.svelte @@ -21,6 +21,7 @@ import Globe2 from 'lucide-svelte/icons/globe-2'; import Languages from 'lucide-svelte/icons/languages'; import ListChecks from 'lucide-svelte/icons/list-checks'; + import ListTodo from 'lucide-svelte/icons/list-todo'; import Music2 from 'lucide-svelte/icons/music-2'; import PawPrint from 'lucide-svelte/icons/paw-print'; import Trophy from 'lucide-svelte/icons/trophy'; @@ -40,6 +41,7 @@ 'cs prices': CandlestickChart, 'house tracker': House, lists: ListChecks, + 'worldwide todo list': ListTodo, health: HeartPulse, books: BookOpen, stats: ChartLine, diff --git a/src/lib/projects.ts b/src/lib/projects.ts index b91a699..c537884 100644 --- a/src/lib/projects.ts +++ b/src/lib/projects.ts @@ -6,6 +6,13 @@ export const projects = [ href: 'https://esports.vash.software', external: true }, + { + name: 'worldwide todo list', + subtitle: + 'real problems, planet to street, as a public todo list anyone can suggest changes to', + href: '/projects/worldwide-todo', + external: false + }, { name: 'osu! map finder', subtitle: 'find osu! maps for Spotify songs/albums/playlists', diff --git a/src/lib/seo.ts b/src/lib/seo.ts index 2d41827..854ae75 100644 --- a/src/lib/seo.ts +++ b/src/lib/seo.ts @@ -95,6 +95,11 @@ const publicPages: Record = { title: 'Pokémon locations', description: 'Every Pokémon location by region, with the Pokémon you can find there.' }, + '/projects/worldwide-todo': { + title: 'The worldwide todo list', + description: + 'A public todo list of real, sourced problems, from planet-scale to a single street. Anyone can suggest additions, edits and removals.' + }, '/projects/animaldex': { title: 'Animaldex', description: 'Find and add neighborhood animals on a map.' diff --git a/src/lib/server/db/schema/index.ts b/src/lib/server/db/schema/index.ts index 0cd2890..cf92375 100644 --- a/src/lib/server/db/schema/index.ts +++ b/src/lib/server/db/schema/index.ts @@ -30,4 +30,5 @@ export * from './stats'; export * from './pubg-map'; export * from './ai'; export * from './movies'; +export * from './worldtodo'; export * from './osu-goals'; diff --git a/src/lib/server/db/schema/schemas.ts b/src/lib/server/db/schema/schemas.ts index a08da18..be287fd 100644 --- a/src/lib/server/db/schema/schemas.ts +++ b/src/lib/server/db/schema/schemas.ts @@ -27,3 +27,4 @@ export const dataholdersSchema = pgSchema('dataholders'); export const statsSchema = pgSchema('stats'); export const aiSchema = pgSchema('ai'); export const moviesSchema = pgSchema('movies'); +export const worldtodoSchema = pgSchema('worldtodo'); diff --git a/src/lib/server/db/schema/worldtodo.ts b/src/lib/server/db/schema/worldtodo.ts new file mode 100644 index 0000000..5e8b301 --- /dev/null +++ b/src/lib/server/db/schema/worldtodo.ts @@ -0,0 +1,124 @@ +import { sql } from 'drizzle-orm'; +import { + bigint, + check, + customType, + date, + doublePrecision, + index, + jsonb, + text, + uniqueIndex +} from 'drizzle-orm/pg-core'; +import { worldtodoSchema } from './schemas'; +import { timestamptz } from './helpers'; + +// The Worldwide Todo List (/projects/worldwide-todo): a public list of real problems phrased +// as todos. Anyone can *request* an add, edit or delete (change_requests); nothing changes +// until the owner approves it in the queue. No submitter data is stored beyond an optional +// display name: no IP, email or user agent (rate limiting is in memory, see +// #lib/server/worldtodo/limit). Seeded by scripts/seed-worldtodo.ts from data/worldtodo-seed.json. + +// Kept in sync with #lib/worldtodo/shared (a unit test checks it); the schema folder is copied +// into the app image on its own for the scripts, so it must not import from outside it. +const WORLDTODO_SCALES = ['planet', 'region', 'country', 'city', 'street'] as const; +const WORLDTODO_STATUSES = ['open', 'in_progress', 'done'] as const; +const WORLDTODO_REQUEST_KINDS = ['add', 'edit', 'delete'] as const; +const WORLDTODO_REQUEST_STATUSES = ['pending', 'approved', 'rejected'] as const; + +const tsvector = customType<{ data: string }>({ dataType: () => 'tsvector' }); + +export const worldtodoScale = worldtodoSchema.enum('scale', WORLDTODO_SCALES); +export const worldtodoStatus = worldtodoSchema.enum('status', WORLDTODO_STATUSES); +export const worldtodoRequestKind = worldtodoSchema.enum('req_kind', WORLDTODO_REQUEST_KINDS); +export const worldtodoRequestStatus = worldtodoSchema.enum( + 'req_status', + WORLDTODO_REQUEST_STATUSES +); + +export const worldtodoCategories = worldtodoSchema.table('categories', { + slug: text('slug').primaryKey(), + label: text('label').notNull(), + /** Icon key in #lib/worldtodo/icons (a lucide icon). */ + icon: text('icon').notNull(), + /** Hex accent for the icon tile only. */ + colour: text('colour').notNull() +}); + +export const worldtodoTasks = worldtodoSchema.table( + 'tasks', + { + id: bigint('id', { mode: 'number' }).primaryKey().generatedByDefaultAsIdentity(), + slug: text('slug').notNull(), + title: text('title').notNull(), + description: text('description').notNull(), + scale: worldtodoScale('scale').notNull(), + category: text('category') + .notNull() + .references(() => worldtodoCategories.slug), + locationName: text('location_name').notNull(), + /** ISO 3166-1 alpha-2; null for planet-scale or multinational tasks. */ + countryCode: text('country_code'), + lat: doublePrecision('lat'), + lon: doublePrecision('lon'), + status: worldtodoStatus('status').notNull().default('open'), + sourceUrls: text('source_urls').array().notNull(), + /** Date of the main source as given ('2026-09', '2026-10-21'). */ + sourceDate: text('source_date'), + confidence: text('confidence').notNull().default('high'), + /** Owner-facing caveat, also shown subtly on the detail page. */ + verificationNote: text('verification_note'), + /** When the facts were last checked. */ + asOf: date('as_of').notNull(), + createdAt: timestamptz('created_at').notNull().defaultNow(), + updatedAt: timestamptz('updated_at').notNull().defaultNow(), + /** Soft delete (approved delete requests); hard purge is a manual owner action. */ + deletedAt: timestamptz('deleted_at'), + search: tsvector('search').generatedAlwaysAs( + sql`to_tsvector('simple', title || ' ' || description || ' ' || location_name)` + ) + }, + (t) => [ + uniqueIndex('tasks_slug_key').on(t.slug), + index('tasks_search_idx').using('gin', t.search), + index('tasks_scale_status_idx') + .on(t.scale, t.status) + .where(sql`deleted_at IS NULL`), + check('tasks_title_check', sql`char_length(${t.title}) BETWEEN 5 AND 140`), + check('tasks_description_check', sql`char_length(${t.description}) <= 2000`), + check('tasks_lat_check', sql`${t.lat} BETWEEN -90 AND 90`), + check('tasks_lon_check', sql`${t.lon} BETWEEN -180 AND 180`), + check('tasks_sources_check', sql`cardinality(${t.sourceUrls}) >= 1`), + check('tasks_confidence_check', sql`${t.confidence} IN ('high','medium')`) + ] +); + +export const worldtodoChangeRequests = worldtodoSchema.table( + 'change_requests', + { + id: bigint('id', { mode: 'number' }).primaryKey().generatedByDefaultAsIdentity(), + kind: worldtodoRequestKind('kind').notNull(), + /** Null for 'add'. */ + taskId: bigint('task_id', { mode: 'number' }).references(() => worldtodoTasks.id), + /** add: full task fields; edit: only changed fields; delete: {}. Whitelisted keys only. */ + payload: jsonb('payload').$type>().notNull().default({}), + /** What the owner actually applied (differs from payload after "edit & approve"). */ + applied: jsonb('applied').$type>(), + /** The task's updated_at when the request was filed, to flag stale requests. */ + taskUpdatedAt: timestamptz('task_updated_at'), + reason: text('reason').notNull(), + /** Optional, the ONLY submitter info stored; shown nowhere except the owner queue. */ + displayName: text('display_name'), + status: worldtodoRequestStatus('status').notNull().default('pending'), + ownerNote: text('owner_note'), + createdAt: timestamptz('created_at').notNull().defaultNow(), + decidedAt: timestamptz('decided_at') + }, + (t) => [ + index('change_requests_status_idx').on(t.status, t.createdAt), + index('change_requests_task_idx').on(t.taskId, t.status), + check('change_requests_reason_check', sql`char_length(${t.reason}) BETWEEN 10 AND 1000`), + check('change_requests_display_name_check', sql`char_length(${t.displayName}) <= 40`), + check('change_requests_task_check', sql`((${t.kind} = 'add') = (${t.taskId} IS NULL))`) + ] +); diff --git a/src/lib/server/owner.ts b/src/lib/server/owner.ts index 94ed934..e085d12 100644 --- a/src/lib/server/owner.ts +++ b/src/lib/server/owner.ts @@ -32,7 +32,10 @@ export const ownerOnlyPrefixes = [ '/trackers/ai/usage', '/lists/db', // Spotify OAuth for the listening tracker (connect + callback 404 for everyone else). - '/api/spotify' + '/api/spotify', + // Worldwide todo list: the list is public, the review queue and its API are mine only. + '/projects/worldwide-todo/queue', + '/projects/worldwide-todo/api/queue' ] as const; /** diff --git a/src/lib/server/worldtodo/decide.ts b/src/lib/server/worldtodo/decide.ts new file mode 100644 index 0000000..183bb7f --- /dev/null +++ b/src/lib/server/worldtodo/decide.ts @@ -0,0 +1,33 @@ +import type { TaskFields } from '#lib/worldtodo/shared.js'; +import { publishQueue, publishTask } from './live'; +import * as store from './store'; +import { plain } from './validate'; + +// Owner decisions (queue actions, API, direct edits). Applied in one transaction in the +// store, then published on the realtime channels. + +export const ownerNote = (v: unknown) => + plain(typeof v === 'string' ? v : '', true).slice(0, 1000) || null; + +async function publishApplied(applied: store.Applied) { + const found = applied.type === 'task.deleted' ? null : await store.getTask(applied.slug); + publishTask(applied.type, applied.slug, found?.task ?? null); + publishQueue(await store.pendingTotal()); +} + +export async function approveRequest(id: number, note: unknown, tweaked: TaskFields | null = null) { + const applied = await store.approve(id, ownerNote(note), tweaked); + await publishApplied(applied); + return applied; +} + +export async function rejectRequest(id: number, note: unknown) { + await store.reject(id, ownerNote(note)); + publishQueue(await store.pendingTotal()); +} + +export async function editTaskDirectly(slug: string, fields: TaskFields, note: unknown) { + const applied = await store.ownerEdit(slug, fields, ownerNote(note)); + await publishApplied(applied); + return applied; +} diff --git a/src/lib/server/worldtodo/limit.test.ts b/src/lib/server/worldtodo/limit.test.ts new file mode 100644 index 0000000..6aefb39 --- /dev/null +++ b/src/lib/server/worldtodo/limit.test.ts @@ -0,0 +1,37 @@ +import { describe, expect, it } from 'vitest'; +import { PER_DAY, PER_HOUR, createLimiter } from './limit'; + +describe('worldtodo rate limiter', () => { + it('allows 5 per hour, then answers with a Retry-After', () => { + let t = Date.UTC(2026, 9, 26, 10, 0, 0); + const l = createLimiter(() => t); + for (let i = 0; i < PER_HOUR; i++) expect(l.hit('1.2.3.4')).toBeNull(); + const wait = l.hit('1.2.3.4'); + expect(wait).toBeGreaterThan(3500); + expect(wait).toBeLessThanOrEqual(3600); + expect(l.hit('5.6.7.8')).toBeNull(); // other clients unaffected + t += 3_600_001; + expect(l.hit('1.2.3.4')).toBeNull(); + }); + + it('caps at 20 per day', () => { + let t = Date.UTC(2026, 9, 26, 0, 30, 0); + const l = createLimiter(() => t); + for (let i = 0; i < PER_DAY; i++) { + expect(l.hit('9.9.9.9')).toBeNull(); + t += 13 * 60_000; // ~4.6 per hour, under the hourly cap + } + expect(l.hit('9.9.9.9')).not.toBeNull(); + }); + + it('never keeps the raw IP and rotates the salt every UTC day', () => { + let t = Date.UTC(2026, 9, 26, 23, 59, 0); + const l = createLimiter(() => t); + const k1 = l.keyOf('1.2.3.4'); + expect(k1).not.toContain('1.2.3.4'); + expect(l.keyOf('1.2.3.4')).toBe(k1); + t += 120_000; // next UTC day + expect(l.keyOf('1.2.3.4')).not.toBe(k1); + expect(l.size()).toBe(0); + }); +}); diff --git a/src/lib/server/worldtodo/limit.ts b/src/lib/server/worldtodo/limit.ts new file mode 100644 index 0000000..73b1f96 --- /dev/null +++ b/src/lib/server/worldtodo/limit.ts @@ -0,0 +1,66 @@ +import { createHmac, randomBytes } from 'node:crypto'; + +// Rate limiting for public change requests: 5 per hour and 20 per day per client. +// The client key is an HMAC of the IP address with a random salt that lives only in this +// process's memory and rotates every UTC day, so a key can't be linked to an IP (or to +// yesterday's key) and nothing is ever written to Postgres or logs. Counters are per process +// and reset on restart, like the site's other limiters. + +export const PER_HOUR = 5; +export const PER_DAY = 20; +const HOUR = 3_600_000; +const DAY = 86_400_000; +const MAX_KEYS = 50_000; + +type State = { day: string; salt: Buffer; hits: Map }; + +export function createLimiter(now: () => number = Date.now) { + let state: State | null = null; + const current = () => { + const day = new Date(now()).toISOString().slice(0, 10); + if (!state || state.day !== day) state = { day, salt: randomBytes(32), hits: new Map() }; + return state; + }; + const keyOf = (ip: string) => + createHmac('sha256', current().salt).update(ip).digest('base64url').slice(0, 22); + + return { + /** The salted hash for an IP (exposed for tests; never stored). */ + keyOf, + /** + * Count one attempt. Returns null when allowed, or the seconds to wait (Retry-After). + * Blocked attempts are not counted. + */ + hit(ip: string): number | null { + const s = current(); + const key = keyOf(ip); + const t = now(); + const list = (s.hits.get(key) ?? []).filter((x) => t - x < DAY); + const lastHour = list.filter((x) => t - x < HOUR); + if (lastHour.length >= PER_HOUR) + return Math.max(1, Math.ceil((lastHour[0] + HOUR - t) / 1000)); + if (list.length >= PER_DAY) return Math.max(1, Math.ceil((list[0] + DAY - t) / 1000)); + list.push(t); + if (!s.hits.has(key) && s.hits.size >= MAX_KEYS) s.hits.delete(s.hits.keys().next().value!); + s.hits.set(key, list); + return null; + }, + /** Number of tracked keys (tests). */ + size: () => current().hits.size + }; +} + +export const limiter = createLimiter(); + +/** The client IP behind Cloudflare/Caddy, same order as server.js and the listening stream. */ +export function clientIp(request: Request, getClientAddress: () => string): string { + const h = request.headers; + const forwarded = + h.get('cf-connecting-ip') ?? h.get('x-forwarded-for')?.split(',')[0]?.trim() ?? ''; + if (forwarded) return forwarded; + try { + return getClientAddress(); + } catch { + return 'unknown'; + } +} diff --git a/src/lib/server/worldtodo/live.ts b/src/lib/server/worldtodo/live.ts new file mode 100644 index 0000000..046c11d --- /dev/null +++ b/src/lib/server/worldtodo/live.ts @@ -0,0 +1,86 @@ +import { registerChannel, type Socket } from '#lib/server/ws/hub.js'; +import { auth } from '#lib/server/auth.js'; +import { isOwner } from '#lib/server/owner.js'; +import type { LiveEvent, PublicTask } from '#lib/worldtodo/shared.js'; + +// Realtime for the Worldwide Todo List on the site WebSocket hub: +// - `worldtodo` (public, read-only): every approved change, as +// { type: 'task.added' | 'task.updated' | 'task.deleted', slug, task | null, at }. +// - `worldtodo-owner` (owner session only): { type: 'queue.changed', pending } when a request +// is filed or decided, so the queue page and the header badge refresh without polling. +// Clients send nothing; any message closes the socket. Pages fall back to polling (60 s) +// when the socket can't connect (e.g. `vite dev`, which has no Bun.serve). + +const MAX_PER_IP = 8; +const publicSockets = new Set(); +const ownerSockets = new Set(); +const perIp = new Map(); + +function track(set: Set) { + return { + open(ws: Socket) { + set.add(ws); + }, + message(ws: Socket) { + ws.close(1008, 'read only'); + }, + close(ws: Socket) { + set.delete(ws); + const n = (perIp.get(ws.data.ip) ?? 1) - 1; + if (n <= 0) perIp.delete(ws.data.ip); + else perIp.set(ws.data.ip, n); + } + }; +} + +function admit(ip: string): Response | null { + const n = perIp.get(ip) ?? 0; + if (n >= MAX_PER_IP) return new Response('Too Many Connections', { status: 429 }); + perIp.set(ip, n + 1); + return null; +} + +let registered = false; +export function registerWorldtodoChannels() { + if (registered) return; + registered = true; + registerChannel('worldtodo', { + async authorize(_request, _url, ip) { + return admit(ip) ?? {}; + }, + ...track(publicSockets) + }); + registerChannel('worldtodo-owner', { + async authorize(request, _url, ip) { + const session = await auth.api.getSession({ headers: request.headers }); + if (!isOwner({ locals: { user: session?.user ?? null } as App.Locals })) + return new Response('Not Found', { status: 404 }); + return admit(ip) ?? {}; + }, + ...track(ownerSockets) + }); +} + +function send(set: Set, msg: unknown) { + const text = JSON.stringify(msg); + for (const ws of set) { + try { + ws.send(text); + } catch { + /* closing socket */ + } + } +} + +export function publishTask(type: LiveEvent['type'], slug: string, task: PublicTask | null) { + send(publicSockets, { + type, + slug, + task: type === 'task.deleted' ? null : task, + at: new Date().toISOString() + } satisfies LiveEvent); +} + +export function publishQueue(pending: number) { + send(ownerSockets, { type: 'queue.changed', pending }); +} diff --git a/src/lib/server/worldtodo/requests.ts b/src/lib/server/worldtodo/requests.ts new file mode 100644 index 0000000..6674b81 --- /dev/null +++ b/src/lib/server/worldtodo/requests.ts @@ -0,0 +1,116 @@ +import { changedFields, type TaskFields } from '#lib/worldtodo/shared.js'; +import { limiter } from './limit'; +import { publishQueue } from './live'; +import * as store from './store'; +import { turnstileConfigured, verifyTurnstile } from './turnstile'; +import { looksLikeBot, parseRequest, type FieldErrors } from './validate'; + +// Filing a public change request (shared by the form action and the JSON API). Order: +// bot checks → validation (no network, so a typo never burns a Turnstile token or a rate +// slot) → rate limit (before Siteverify, so floods never reach Cloudflare) → global queue +// cap → Turnstile → insert. Nothing about the submitter is stored except the optional name. + +export const MAX_PENDING = 200; + +export type SubmitResult = + | { ok: true; id: number } + | { ok: false; status: number; message: string; errors?: FieldErrors; retryAfter?: number }; + +export async function submitRequest(opts: { + input: Record; + honeypot: unknown; + startedAt: unknown; + token: string; + ip: string; + now?: number; +}): Promise { + if (!turnstileConfigured()) + return { ok: false, status: 503, message: 'Requests are switched off right now.' }; + if (looksLikeBot(opts.honeypot, opts.startedAt, opts.now)) + return { + ok: false, + status: 400, + message: 'That was a bit quick. Wait a few seconds and send it again.' + }; + // API edits may be partial, so validate them on top of the task as it is now. + let base: Record | undefined; + if (opts.input.kind === 'edit' && typeof opts.input.task === 'string' && opts.input.task.trim()) { + const current = await store.getTask(opts.input.task.trim()); + if (current) base = { ...store.currentFields(current.task) }; + } + const parsed = parseRequest(opts.input, base); + if (!parsed.ok) + return { + ok: false, + status: 400, + message: 'Check the highlighted fields.', + errors: parsed.errors + }; + const req = parsed.value; + + let taskId: number | null = null; + let taskUpdatedAt: string | null = null; + let payload: Record = {}; + if (req.kind === 'add') { + if (!(await store.categoryExists(req.fields!.category))) + return { + ok: false, + status: 400, + message: 'Check the highlighted fields.', + errors: { category: 'Pick a category' } + }; + payload = { ...req.fields! }; + } else { + const found = await store.getTask(req.taskSlug); + if (!found) return { ok: false, status: 404, message: 'That task does not exist (anymore).' }; + taskId = found.task.id; + taskUpdatedAt = found.task.updatedAt; + if (req.kind === 'edit') { + const change = changedFields(store.currentFields(found.task), req.fields as TaskFields); + if (!Object.keys(change).length) + return { ok: false, status: 400, message: 'Nothing changed: edit at least one field.' }; + if (change.category && !(await store.categoryExists(change.category))) + return { + ok: false, + status: 400, + message: 'Check the highlighted fields.', + errors: { category: 'Pick a category' } + }; + payload = change as Record; + } + } + + const wait = limiter.hit(opts.ip); + if (wait !== null) + return { + ok: false, + status: 429, + message: `You've sent a lot of requests. Try again in ${Math.ceil(wait / 60)} min.`, + retryAfter: wait + }; + if ((await store.pendingTotal()) >= MAX_PENDING) + return { + ok: false, + status: 503, + message: 'The review queue is full right now. Please try again in a day or two.', + retryAfter: 86_400 + }; + if (!(await verifyTurnstile(opts.token))) + return { + ok: false, + status: 400, + message: 'The anti-bot check failed or expired. Try it again.', + errors: { turnstile: 'Complete the check' } + }; + + const row = await store.insertRequest({ + kind: req.kind, + taskId, + taskUpdatedAt, + payload, + reason: req.reason, + displayName: req.displayName + }); + publishQueue(await store.pendingTotal()); + return { ok: true, id: row.id }; +} diff --git a/src/lib/server/worldtodo/store.ts b/src/lib/server/worldtodo/store.ts new file mode 100644 index 0000000..3950c12 --- /dev/null +++ b/src/lib/server/worldtodo/store.ts @@ -0,0 +1,555 @@ +import type { TransactionSql } from 'postgres'; +// jsonb values are sent as JSON text with a ::jsonb cast: drizzle swaps the shared client's +// json serializers for pass-through ones, so sql.json() would send a raw object. +import { client as sql } from '#lib/server/db/index.js'; +import { + EDITABLE_FIELDS, + RESERVED_SLUGS, + changedFields, + type Category, + type PublicTask, + type RequestKind, + type RequestStatus, + type TaskFields +} from '#lib/worldtodo/shared.js'; + +// Postgres access for the Worldwide Todo List (schema worldtodo). Hand-written SQL on the +// shared postgres.js pool; every write that applies a request runs in one transaction. + +const TASK_COLUMNS = sql` + t.id, t.slug, t.title, t.description, t.scale::text as scale, t.category, + t.location_name, t.country_code, t.lat, t.lon, t.status::text as status, t.source_urls, + t.source_date, t.confidence, t.verification_note, t.as_of::text as as_of, + t.created_at, t.updated_at, t.deleted_at`; + +type Row = Record; +// The shared client returns timestamptz as Postgres text ("2026-10-26 01:13:36.1+00") because +// drizzle swaps in pass-through parsers, so normalise to ISO here. +function toDate(v: unknown): Date | null { + if (v instanceof Date) return v; + if (!v) return null; + const d = new Date( + String(v) + .replace(' ', 'T') + .replace(/([+-]\d\d)$/, '$1:00') + ); + return Number.isNaN(d.getTime()) ? null : d; +} +const iso = (v: unknown) => toDate(v)?.toISOString() ?? ''; + +export function toTask(r: Row): PublicTask { + return { + id: Number(r.id), + slug: String(r.slug), + title: String(r.title), + description: String(r.description), + scale: r.scale as PublicTask['scale'], + category: String(r.category), + locationName: String(r.location_name), + countryCode: (r.country_code as string | null) ?? null, + lat: r.lat === null || r.lat === undefined ? null : Number(r.lat), + lon: r.lon === null || r.lon === undefined ? null : Number(r.lon), + status: r.status as PublicTask['status'], + sourceUrls: (r.source_urls as string[]) ?? [], + sourceDate: (r.source_date as string | null) ?? null, + confidence: r.confidence === 'medium' ? 'medium' : 'high', + verificationNote: (r.verification_note as string | null) ?? null, + asOf: String(r.as_of), + createdAt: iso(r.created_at), + updatedAt: iso(r.updated_at), + ...(r.pending !== undefined ? { pending: Number(r.pending) } : {}) + }; +} + +export async function listCategories(): Promise { + const rows = await sql`select slug, label, icon, colour from worldtodo.categories order by label`; + return rows.map((r) => ({ + slug: r.slug, + label: r.label, + icon: r.icon, + colour: r.colour + })); +} + +export type Sort = 'updated' | 'scale' | 'title'; +export type ListFilter = { + scale?: string; + category?: string; + /** 'todo' (open + in progress, the default), 'open', 'in_progress', 'done' or 'all'. */ + status?: string; + q?: string; +}; + +function likeEscape(s: string) { + return s.replace(/[\\%_]/g, (c) => `\\${c}`); +} + +function whereFor(f: ListFilter, opts: { skipScale?: boolean } = {}) { + const parts = [sql`t.deleted_at is null`]; + if (f.scale && !opts.skipScale) parts.push(sql`t.scale = ${f.scale}::worldtodo.scale`); + if (f.category) parts.push(sql`t.category = ${f.category}`); + const status = f.status || 'todo'; + if (status === 'todo') parts.push(sql`t.status <> 'done'`); + else if (status !== 'all') parts.push(sql`t.status = ${status}::worldtodo.status`); + const q = (f.q ?? '').trim().slice(0, 100); + if (q) { + const like = `%${likeEscape(q)}%`; + parts.push( + sql`(t.search @@ websearch_to_tsquery('simple', ${q}) or t.title ilike ${like} + or t.location_name ilike ${like} or t.description ilike ${like})` + ); + } + return parts.reduce((acc, p, i) => (i === 0 ? p : sql`${acc} and ${p}`)); +} + +const SCALE_ORDER = sql`array_position(array['planet','region','country','city','street']::worldtodo.scale[], t.scale)`; + +function orderFor(sort: Sort) { + if (sort === 'title') return sql`lower(t.title) asc, t.id asc`; + if (sort === 'scale') return sql`${SCALE_ORDER} asc, lower(t.title) asc, t.id asc`; + return sql`t.updated_at desc, t.id desc`; +} + +function cursorKey(sort: Sort, r: Row): unknown[] { + if (sort === 'title') return [String(r.title).toLowerCase(), Number(r.id)]; + if (sort === 'scale') return [Number(r.scale_pos), String(r.title).toLowerCase(), Number(r.id)]; + return [iso(r.updated_at), Number(r.id)]; +} + +function afterCursor(sort: Sort, cursor: string | undefined) { + if (!cursor) return null; + try { + const k = JSON.parse(Buffer.from(cursor, 'base64url').toString()) as unknown[]; + if (sort === 'title' && k.length === 2) + return sql`(lower(t.title), t.id) > (${String(k[0])}, ${Number(k[1])})`; + if (sort === 'scale' && k.length === 3) + return sql`(${SCALE_ORDER}, lower(t.title), t.id) > (${Number(k[0])}, ${String(k[1])}, ${Number(k[2])})`; + if (sort === 'updated' && k.length === 2) + return sql`(t.updated_at, t.id) < (${String(k[0])}::timestamptz, ${Number(k[1])})`; + } catch { + /* bad cursor: start from the top */ + } + return null; +} + +/** Paged list (keyset cursor), excludes deleted tasks; each task carries its pending count. */ +export async function listTasks( + f: ListFilter, + sort: Sort = 'updated', + limit = 50, + cursor?: string +): Promise<{ tasks: PublicTask[]; nextCursor: string | null }> { + const after = afterCursor(sort, cursor); + const where = after ? sql`${whereFor(f)} and ${after}` : whereFor(f); + const rows = await sql` + select ${TASK_COLUMNS}, ${SCALE_ORDER} as scale_pos, + (select count(*) from worldtodo.change_requests r + where r.task_id = t.id and r.status = 'pending')::int as pending + from worldtodo.tasks t + where ${where} + order by ${orderFor(sort)} + limit ${limit + 1}`; + const more = rows.length > limit; + const page = rows.slice(0, limit); + return { + tasks: page.map(toTask), + nextCursor: + more && page.length + ? Buffer.from(JSON.stringify(cursorKey(sort, page.at(-1)!))).toString('base64url') + : null + }; +} + +/** Counts for the hero (per status) and the scale strip (per scale, other filters applied). */ +export async function counts(f: ListFilter) { + const [byStatus, byScale] = await Promise.all([ + sql`select status::text as status, count(*)::int as n from worldtodo.tasks + where deleted_at is null group by status`, + sql`select t.scale::text as scale, count(*)::int as n from worldtodo.tasks t + where ${whereFor(f, { skipScale: true })} group by t.scale` + ]); + const status: Record = { open: 0, in_progress: 0, done: 0 }; + for (const r of byStatus) status[r.status] = r.n; + const scale: Record = {}; + for (const r of byScale) scale[r.scale] = r.n; + return { status, scale }; +} + +export async function getTask(slug: string, includeDeleted = false) { + const [row] = await sql` + select ${TASK_COLUMNS}, + (select count(*) from worldtodo.change_requests r + where r.task_id = t.id and r.status = 'pending')::int as pending + from worldtodo.tasks t + where t.slug = ${slug} ${includeDeleted ? sql`` : sql`and t.deleted_at is null`}`; + if (!row) return null; + return { task: toTask(row), deletedAt: row.deleted_at ? iso(row.deleted_at) : null }; +} + +/** Summary of a request that is safe to show publicly: never the reason or display name. */ +export function publicSummary(kind: RequestKind, payload: Record | null) { + if (kind === 'delete') return 'Request to remove this task'; + if (kind === 'add') return 'New task'; + const keys = Object.keys(payload ?? {}).filter((k) => + (EDITABLE_FIELDS as readonly string[]).includes(k) + ); + const names = keys.map((k) => k.replace('_urls', 's').replace('_', ' ')); + return names.length ? `Changes ${names.join(', ')}` : 'Edit'; +} + +export async function taskActivity(taskId: number) { + const rows = await sql` + select id, kind::text as kind, status::text as status, payload, applied, owner_note, + created_at, decided_at + from worldtodo.change_requests + where task_id = ${taskId} and status in ('approved', 'pending') + order by coalesce(decided_at, created_at) desc + limit 100`; + const history = rows + .filter((r) => r.status === 'approved') + .map((r) => ({ + id: Number(r.id), + kind: r.kind as RequestKind, + summary: publicSummary(r.kind, (r.applied ?? r.payload) as Record), + ownerNote: (r.owner_note as string | null) ?? null, + at: iso(r.decided_at ?? r.created_at) + })); + const pending = rows + .filter((r) => r.status === 'pending') + .map((r) => ({ + id: Number(r.id), + kind: r.kind as RequestKind, + summary: publicSummary(r.kind, r.payload as Record), + at: iso(r.created_at) + })); + return { history, pending }; +} + +/** The add request that created a task (if any), for the "added" line in its history. */ +export async function pendingTotal(): Promise { + const [r] = + await sql`select count(*)::int as n from worldtodo.change_requests where status = 'pending'`; + return r.n; +} + +export async function categoryExists(slug: string) { + const [r] = await sql`select 1 from worldtodo.categories where slug = ${slug}`; + return !!r; +} + +export async function insertRequest(input: { + kind: RequestKind; + taskId: number | null; + taskUpdatedAt: string | null; + payload: Record; + reason: string; + displayName: string | null; +}) { + const [r] = await sql` + insert into worldtodo.change_requests + (kind, task_id, task_updated_at, payload, reason, display_name) + values (${input.kind}::worldtodo.req_kind, ${input.taskId}, ${input.taskUpdatedAt}, + ${JSON.stringify(input.payload)}::jsonb, ${input.reason}, ${input.displayName}) + returning id, created_at`; + return { id: Number(r.id), createdAt: iso(r.created_at) }; +} + +export async function requestStatus(id: number) { + const [r] = await sql` + select r.id, r.kind::text as kind, r.status::text as status, r.created_at, r.decided_at, + r.owner_note, t.slug, t.title, t.deleted_at + from worldtodo.change_requests r + left join worldtodo.tasks t on t.id = coalesce(r.task_id, (r.applied->>'_task_id')::bigint) + where r.id = ${id}`; + if (!r) return null; + return { + id: Number(r.id), + kind: r.kind as RequestKind, + status: r.status as RequestStatus, + createdAt: iso(r.created_at), + decidedAt: r.decided_at ? iso(r.decided_at) : null, + ownerNote: r.status === 'pending' ? null : ((r.owner_note as string | null) ?? null), + // Only link a task the public can already see (an approved add, or the edited task). + task: + r.slug && !r.deleted_at && (r.kind !== 'add' || r.status === 'approved') + ? { slug: String(r.slug), title: String(r.title) } + : null + }; +} + +export type QueueItem = { + id: number; + kind: RequestKind; + status: RequestStatus; + payload: Record; + applied: Record | null; + reason: string; + displayName: string | null; + ownerNote: string | null; + createdAt: string; + decidedAt: string | null; + task: PublicTask | null; + taskDeleted: boolean; + stale: boolean; + similar: { slug: string; title: string; similarity: number }[]; +}; + +async function similarTitles(title: string, excludeId: number | null) { + if (!title) return []; + try { + const rows = await sql` + select slug, title, public.similarity(title, ${title}) as s + from worldtodo.tasks + where deleted_at is null and public.similarity(title, ${title}) > 0.4 + ${excludeId ? sql`and id <> ${excludeId}` : sql``} + order by s desc limit 3`; + return rows.map((r) => ({ + slug: String(r.slug), + title: String(r.title), + similarity: Number(r.s) + })); + } catch { + return []; // pg_trgm is optional + } +} + +export async function queue(status: RequestStatus, limit = 100): Promise { + const order = status === 'pending' ? sql`r.created_at asc` : sql`r.decided_at desc nulls last`; + // Request columns are aliased: TASK_COLUMNS brings its own id, status and created_at. + const rows = await sql` + select r.id as req_id, r.kind::text as kind, r.status::text as req_status, r.payload, + r.applied, r.reason, r.display_name, r.owner_note, r.created_at as req_created_at, + r.decided_at, r.task_updated_at, ${TASK_COLUMNS}, t.id as t_id + from worldtodo.change_requests r + left join worldtodo.tasks t on t.id = coalesce(r.task_id, (r.applied->>'_task_id')::bigint) + where r.status = ${status}::worldtodo.req_status + order by ${order} + limit ${limit}`; + return Promise.all( + rows.map(async (r) => { + const task = r.t_id ? toTask({ ...r, id: r.t_id }) : null; + const deleted = !!r.deleted_at; + const stale = + r.kind !== 'add' && + (deleted || + !!( + r.task_updated_at && + r.updated_at && + (toDate(r.updated_at)?.getTime() ?? 0) > (toDate(r.task_updated_at)?.getTime() ?? 0) + 1 + )); + const payload = (r.payload ?? {}) as Record; + const title = String(payload.title ?? ''); + return { + id: Number(r.req_id), + kind: r.kind as RequestKind, + status: r.req_status as RequestStatus, + payload, + applied: (r.applied as Record | null) ?? null, + reason: String(r.reason), + displayName: (r.display_name as string | null) ?? null, + ownerNote: (r.owner_note as string | null) ?? null, + createdAt: iso(r.req_created_at), + decidedAt: r.decided_at ? iso(r.decided_at) : null, + task, + taskDeleted: deleted, + stale: status === 'pending' && stale, + similar: + status === 'pending' && title && r.kind !== 'delete' + ? await similarTitles(title, task?.id ?? null) + : [] + } satisfies QueueItem; + }) + ); +} + +export class DecisionError extends Error { + constructor( + message: string, + public status = 400 + ) { + super(message); + } +} + +function slugBase(title: string) { + return ( + title + .toLowerCase() + .normalize('NFKD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, '') + .slice(0, 70) + .replace(/-+$/g, '') || 'task' + ); +} + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +type Tx = TransactionSql<{}>; + +async function uniqueTaskSlug(tx: Tx, title: string) { + const base = slugBase(title); + let slug = RESERVED_SLUGS.has(base) ? `${base}-2` : base; + let n = RESERVED_SLUGS.has(base) ? 3 : 2; + while ((await tx`select 1 from worldtodo.tasks where slug = ${slug}`).length) + slug = `${base}-${n++}`; + return slug; +} + +/** Full field set for an add (payload) with defaults. */ +function addFields(p: Record): TaskFields { + return { + title: String(p.title ?? ''), + description: String(p.description ?? ''), + scale: p.scale as TaskFields['scale'], + category: String(p.category ?? ''), + location_name: String(p.location_name ?? ''), + country_code: (p.country_code as string | null) ?? null, + lat: (p.lat as number | null) ?? null, + lon: (p.lon as number | null) ?? null, + status: (p.status as TaskFields['status']) ?? 'open', + source_urls: (p.source_urls as string[]) ?? [] + }; +} + +const today = () => new Date().toISOString().slice(0, 10); + +export type Applied = { type: 'task.added' | 'task.updated' | 'task.deleted'; slug: string }; + +/** + * Approve a pending request: apply the add, edit or delete, set updated_at, mark the request + * approved with the optional note, all in one transaction. `tweaked` (edit & approve) replaces + * the payload: for an add the full field set, for an edit the proposed field set (diffed here). + */ +export async function approve( + id: number, + note: string | null, + tweaked: TaskFields | null +): Promise { + return sql.begin(async (tx) => { + const [req] = await tx` + select id, kind::text as kind, status::text as status, task_id, payload + from worldtodo.change_requests where id = ${id} for update`; + if (!req) throw new DecisionError('Request not found', 404); + if (req.status !== 'pending') throw new DecisionError('This request was already decided'); + const payload = (req.payload ?? {}) as Record; + if (req.kind === 'add') { + const fields = tweaked ?? addFields(payload); + const [cat] = await tx`select 1 from worldtodo.categories where slug = ${fields.category}`; + if (!cat) throw new DecisionError('Unknown category'); + const slug = await uniqueTaskSlug(tx, fields.title); + const [task] = await tx` + insert into worldtodo.tasks (slug, title, description, scale, category, location_name, + country_code, lat, lon, status, source_urls, as_of, confidence) + values (${slug}, ${fields.title}, ${fields.description}, ${fields.scale}::worldtodo.scale, + ${fields.category}, ${fields.location_name}, ${fields.country_code}, ${fields.lat}, + ${fields.lon}, ${fields.status}::worldtodo.status, ${fields.source_urls}, + ${today()}, 'medium') + returning id`; + await tx` + update worldtodo.change_requests + set status = 'approved', decided_at = now(), owner_note = ${note}, + applied = ${JSON.stringify({ ...fields, _task_id: Number(task.id) })}::jsonb + where id = ${id}`; + return { type: 'task.added', slug } satisfies Applied; + } + const [row] = await tx` + select ${TASK_COLUMNS} from worldtodo.tasks t where t.id = ${req.task_id} for update`; + if (!row) throw new DecisionError('The task no longer exists', 409); + const current = toTask(row); + if (req.kind === 'delete') { + if (!row.deleted_at) + await tx`update worldtodo.tasks set deleted_at = now(), updated_at = now() where id = ${current.id}`; + await tx` + update worldtodo.change_requests + set status = 'approved', decided_at = now(), owner_note = ${note}, applied = '{}'::jsonb + where id = ${id}`; + return { type: 'task.deleted', slug: current.slug } satisfies Applied; + } + // edit + if (row.deleted_at) throw new DecisionError('The task was removed; reject this edit', 409); + const proposed = tweaked ?? { ...currentFields(current), ...pick(payload) }; + const change = changedFields(currentFields(current), proposed); + if (!Object.keys(change).length) throw new DecisionError('Nothing would change'); + if (change.category) { + const [cat] = await tx`select 1 from worldtodo.categories where slug = ${change.category}`; + if (!cat) throw new DecisionError('Unknown category'); + } + const next = { ...currentFields(current), ...change }; + await tx` + update worldtodo.tasks set + title = ${next.title}, description = ${next.description}, + scale = ${next.scale}::worldtodo.scale, category = ${next.category}, + location_name = ${next.location_name}, country_code = ${next.country_code}, + lat = ${next.lat}, lon = ${next.lon}, status = ${next.status}::worldtodo.status, + source_urls = ${next.source_urls}, as_of = ${today()}, updated_at = now() + where id = ${current.id}`; + await tx` + update worldtodo.change_requests + set status = 'approved', decided_at = now(), owner_note = ${note}, + applied = ${JSON.stringify(change)}::jsonb + where id = ${id}`; + return { type: 'task.updated', slug: current.slug } satisfies Applied; + }) as Promise; +} + +export async function reject(id: number, note: string | null) { + const rows = await sql` + update worldtodo.change_requests + set status = 'rejected', decided_at = now(), owner_note = ${note} + where id = ${id} and status = 'pending' + returning id`; + if (!rows.length) { + const [r] = + await sql`select status::text as status from worldtodo.change_requests where id = ${id}`; + throw new DecisionError( + r ? 'This request was already decided' : 'Request not found', + r ? 400 : 404 + ); + } +} + +/** Direct owner edit: applied at once and logged as an auto-approved request. */ +export async function ownerEdit(slug: string, proposed: TaskFields, note: string | null) { + const found = await getTask(slug); + if (!found) throw new DecisionError('Task not found', 404); + const change = changedFields(currentFields(found.task), proposed); + if (!Object.keys(change).length) throw new DecisionError('Nothing would change'); + const req = await insertRequest({ + kind: 'edit', + taskId: found.task.id, + taskUpdatedAt: found.task.updatedAt, + payload: change as Record, + reason: 'Direct edit by the owner.', + displayName: null + }); + return approve(req.id, note ?? 'Direct owner edit', null); +} + +export function currentFields(t: PublicTask): TaskFields { + return { + title: t.title, + description: t.description, + scale: t.scale, + category: t.category, + location_name: t.locationName, + country_code: t.countryCode, + lat: t.lat, + lon: t.lon, + status: t.status, + source_urls: t.sourceUrls + }; +} + +/** Whitelist payload keys to the editable fields. */ +export function pick(p: Record): Partial { + const out: Record = {}; + for (const k of EDITABLE_FIELDS) if (k in p) out[k] = p[k]; + return out as Partial; +} + +export async function sitemapSlugs() { + const rows = + await sql`select slug, updated_at from worldtodo.tasks where deleted_at is null order by id`; + return rows.map((r) => ({ slug: String(r.slug), updatedAt: iso(r.updated_at) })); +} diff --git a/src/lib/server/worldtodo/turnstile.ts b/src/lib/server/worldtodo/turnstile.ts new file mode 100644 index 0000000..de608c0 --- /dev/null +++ b/src/lib/server/worldtodo/turnstile.ts @@ -0,0 +1,32 @@ +import { TURNSTILE_SECRET_KEY } from '$app/env/private'; +import { PUBLIC_TURNSTILE_SITE_KEY } from '$app/env/public'; + +// Cloudflare Turnstile on the request form, checked server-side through Siteverify. +// Widget "stanrunge.dev worldwide todo list" (managed mode, domain stanrunge.dev). +// Without both keys, request submission is switched off and the form says so. + +const SITEVERIFY = 'https://challenges.cloudflare.com/turnstile/v0/siteverify'; + +export const turnstileSiteKey = () => PUBLIC_TURNSTILE_SITE_KEY || ''; +export const turnstileConfigured = () => !!(TURNSTILE_SECRET_KEY && PUBLIC_TURNSTILE_SITE_KEY); + +export async function verifyTurnstile( + token: string, + fetcher: typeof fetch = fetch +): Promise { + if (!turnstileConfigured() || !token || token.length > 2048) return false; + try { + const body = new URLSearchParams({ secret: TURNSTILE_SECRET_KEY, response: token }); + const res = await fetcher(SITEVERIFY, { + method: 'POST', + body, + signal: AbortSignal.timeout(8000) + }); + if (!res.ok) return false; + const data = (await res.json()) as { success?: boolean }; + return data.success === true; + } catch (e) { + console.error('[worldtodo] turnstile siteverify failed', (e as Error).message); + return false; + } +} diff --git a/src/lib/server/worldtodo/validate.test.ts b/src/lib/server/worldtodo/validate.test.ts new file mode 100644 index 0000000..aa1c6ff --- /dev/null +++ b/src/lib/server/worldtodo/validate.test.ts @@ -0,0 +1,126 @@ +import { describe, expect, it } from 'vitest'; +import { looksLikeBot, normaliseUrl, parseRequest, plain } from './validate'; + +const add = { + kind: 'add', + title: 'Fix the broken streetlights on Main Street', + description: 'Half the lights have been out since August.\n\nPlease fix.', + scale: 'street', + category: 'safety', + location_name: 'Main Street, Gouda', + country_code: 'nl', + lat: '52.01', + lon: '4.71', + status: 'open', + source_urls: ['https://example.org/news', '', 'https://example.org/news'], + reason: 'I walk here every evening and it is dark.', + display_name: '' +}; + +describe('worldtodo request validation', () => { + it('accepts a valid add, strips HTML and normalises', () => { + const r = parseRequest(add); + expect(r.ok).toBe(true); + if (!r.ok) return; + expect(r.value.fields?.title).toBe('Fix the broken streetlights on Main Street'); + expect(r.value.fields?.description).not.toContain('<'); + expect(r.value.fields?.country_code).toBe('NL'); + expect(r.value.fields?.lat).toBe(52.01); + expect(r.value.fields?.source_urls).toEqual(['https://example.org/news']); + expect(r.value.displayName).toBeNull(); + }); + + it('requires sources for add and edit, and a reason of 10+ chars', () => { + const r = parseRequest({ ...add, source_urls: [], reason: 'short' }); + expect(r.ok).toBe(false); + if (r.ok) return; + expect(r.errors.source_urls).toBeTruthy(); + expect(r.errors.reason).toBeTruthy(); + }); + + it('rejects non-http URLs, too many URLs and overlong URLs', () => { + expect(normaliseUrl('javascript:alert(1)')).toBeNull(); + expect(normaliseUrl('ftp://example.org/x')).toBeNull(); + expect(normaliseUrl(`https://example.org/${'a'.repeat(500)}`)).toBeNull(); + expect(normaliseUrl('https://example.org/ok')).toBe('https://example.org/ok'); + const many = Array.from({ length: 6 }, (_, i) => `https://e${i}.org/`); + const r = parseRequest({ ...add, source_urls: many }); + expect(r.ok).toBe(false); + }); + + it('needs both coordinates or neither, in range', () => { + expect(parseRequest({ ...add, lon: '' }).ok).toBe(false); + expect(parseRequest({ ...add, lat: '91' }).ok).toBe(false); + expect(parseRequest({ ...add, lat: '', lon: '' }).ok).toBe(true); + }); + + it('delete needs only a task and a reason', () => { + const r = parseRequest({ + kind: 'delete', + task: 'some-task', + reason: 'It was fixed last week.' + }); + expect(r.ok).toBe(true); + if (r.ok) expect(r.value.fields).toBeNull(); + expect(parseRequest({ kind: 'delete', reason: 'It was fixed last week.' }).ok).toBe(false); + }); + + it('caps the display name at 40 characters', () => { + expect(parseRequest({ ...add, display_name: 'x'.repeat(41) }).ok).toBe(false); + const r = parseRequest({ ...add, display_name: ' Anna ' }); + expect(r.ok && r.value.displayName).toBe('Anna'); + }); + + it('flags the honeypot and too-fast submissions', () => { + const now = 1_000_000; + expect(looksLikeBot('', now - 10_000, now)).toBe(false); + expect(looksLikeBot('http://spam', now - 10_000, now)).toBe(true); + expect(looksLikeBot('', now - 1000, now)).toBe(true); + expect(looksLikeBot('', 'garbage', now)).toBe(true); + }); + + it('plain() keeps paragraphs but drops control characters', () => { + expect(plain('a\u0000b\r\n\r\n\r\nc', true)).toBe('a b\n\nc'); + expect(plain(' one\ntwo ')).toBe('one two'); + }); + + it('add without the optional keys defaults them (JSON API)', () => { + const { country_code, lat, lon, status, display_name, ...minimal } = add; + void [country_code, lat, lon, status, display_name]; + const r = parseRequest(minimal); + expect(r.ok).toBe(true); + if (!r.ok) return; + expect(r.value.fields).toMatchObject({ + country_code: null, + lat: null, + lon: null, + status: 'open' + }); + }); + + it('a partial edit is validated on top of the current task', () => { + const base = { + title: 'Fix the broken streetlights on Main Street', + description: 'Out since August.', + scale: 'street', + category: 'safety', + location_name: 'Main Street, Gouda', + country_code: 'NL', + lat: 52.01, + lon: 4.71, + status: 'open', + source_urls: ['https://example.org/news'] + }; + const r = parseRequest( + { + kind: 'edit', + task: 'main-street', + status: 'in_progress', + reason: 'Works started on Monday.' + }, + base + ); + expect(r.ok).toBe(true); + if (r.ok) expect(r.value.fields).toMatchObject({ ...base, status: 'in_progress' }); + }); +}); diff --git a/src/lib/server/worldtodo/validate.ts b/src/lib/server/worldtodo/validate.ts new file mode 100644 index 0000000..36b104c --- /dev/null +++ b/src/lib/server/worldtodo/validate.ts @@ -0,0 +1,247 @@ +import { z } from 'zod'; +import { + WORLDTODO_REQUEST_KINDS, + WORLDTODO_SCALES, + WORLDTODO_STATUSES, + type RequestKind, + type TaskFields +} from '#lib/worldtodo/shared.js'; + +// Validation for public change requests (form action and JSON API share it). Everything is +// plain text: HTML tags and control characters are stripped, Markdown is never rendered. +// Source URLs must be http(s) and are stored as given (never fetched on submit). + +export const MAX_URLS = 5; +export const MAX_URL_LENGTH = 500; +/** Minimum time between opening the form and submitting it (cheap bot filter). */ +export const MIN_FILL_MS = 3000; + +/** Plain text: no tags, no control characters, trimmed. `multiline` keeps line breaks. */ +export function plain(value: unknown, multiline = false): string { + if (typeof value !== 'string') return ''; + let s = value.replace(/<[^>]*>?/g, '').replace(/[<>]/g, ''); + s = s.replace(/\r\n?/g, '\n'); + // eslint-disable-next-line no-control-regex + s = s.replace(multiline ? /[\u0000-\u0009\u000b-\u001f\u007f]/g : /[\u0000-\u001f\u007f]/g, ' '); + s = multiline + ? s + .split('\n') + .map((l) => l.replace(/[ \t]+/g, ' ').trim()) + .join('\n') + .replace(/\n{3,}/g, '\n\n') + : s.replace(/\s+/g, ' '); + return s.trim(); +} + +export function normaliseUrl(raw: string): string | null { + const s = raw.trim(); + if (!s || s.length > MAX_URL_LENGTH) return null; + try { + const u = new URL(s); + if (u.protocol !== 'http:' && u.protocol !== 'https:') return null; + if (!u.hostname.includes('.')) return null; + return s; + } catch { + return null; + } +} + +const optionalNumber = (min: number, max: number, label: string) => + z.union([z.string(), z.number(), z.null(), z.undefined()]).transform((v, ctx) => { + if (v === null || v === undefined || (typeof v === 'string' && v.trim() === '')) return null; + const n = typeof v === 'number' ? v : Number(v); + if (!Number.isFinite(n) || n < min || n > max) { + ctx.addIssue({ code: 'custom', message: `${label} must be between ${min} and ${max}` }); + return z.NEVER; + } + return Math.round(n * 1e6) / 1e6; + }); + +export const fieldsSchema = z + .object({ + title: z + .string({ message: 'Add a title' }) + .transform((v) => plain(v)) + .pipe( + z + .string() + .min(5, 'Title needs at least 5 characters') + .max(140, 'Title can be at most 140 characters') + ), + description: z + .string({ message: 'Add a description' }) + .transform((v) => plain(v, true)) + .pipe( + z + .string() + .min(10, 'Description needs at least 10 characters') + .max(2000, 'Description can be at most 2000 characters') + ), + scale: z.enum(WORLDTODO_SCALES, { message: 'Pick a scale' }), + category: z + .string({ message: 'Pick a category' }) + .trim() + .regex(/^[a-z][a-z0-9-]{1,30}$/, 'Pick a category'), + location_name: z + .string({ message: 'Add a location' }) + .transform((v) => plain(v)) + .pipe( + z + .string() + .min(2, 'Location needs at least 2 characters') + .max(120, 'Location can be at most 120 characters') + ), + country_code: z.union([z.string(), z.null(), z.undefined()]).transform((v, ctx) => { + const s = (v ?? '').trim().toUpperCase(); + if (!s) return null; + if (!/^[A-Z]{2}$/.test(s)) { + ctx.addIssue({ code: 'custom', message: 'Country code is two letters, e.g. NL' }); + return z.NEVER; + } + return s; + }), + lat: optionalNumber(-90, 90, 'Latitude'), + lon: optionalNumber(-180, 180, 'Longitude'), + status: z.enum(WORLDTODO_STATUSES, { message: 'Pick a status' }), + source_urls: z.array(z.string()).transform((list, ctx) => { + const filled = list.map((s) => s.trim()).filter(Boolean); + if (filled.length > MAX_URLS) { + ctx.addIssue({ code: 'custom', message: `At most ${MAX_URLS} source links` }); + return z.NEVER; + } + const out: string[] = []; + for (const raw of filled) { + const url = normaliseUrl(raw); + if (!url) { + ctx.addIssue({ + code: 'custom', + message: `Source links must be http(s) URLs of at most ${MAX_URL_LENGTH} characters` + }); + return z.NEVER; + } + if (!out.includes(url)) out.push(url); + } + if (!out.length) { + ctx.addIssue({ code: 'custom', message: 'Add at least one source link' }); + return z.NEVER; + } + return out; + }) + }) + .superRefine((v, ctx) => { + if ((v.lat === null) !== (v.lon === null)) + ctx.addIssue({ code: 'custom', path: ['lat'], message: 'Give both latitude and longitude' }); + }); + +const metaSchema = z.object({ + kind: z.enum(WORLDTODO_REQUEST_KINDS, { message: 'Unknown request type' }), + task: z.string().trim().max(120).optional().default(''), + reason: z + .string() + .transform((v) => plain(v, true)) + .pipe( + z + .string() + .min(10, 'Reason needs at least 10 characters') + .max(1000, 'Reason can be at most 1000 characters') + ), + display_name: z + .union([z.string(), z.null(), z.undefined()]) + .transform((v) => plain(v ?? '').slice(0, 200)) + .pipe(z.string().max(40, 'Display name can be at most 40 characters')) + .transform((v) => v || null) +}); + +export type ParsedRequest = { + kind: RequestKind; + taskSlug: string; + fields: TaskFields | null; + reason: string; + displayName: string | null; +}; + +export type FieldErrors = Record; + +/** Raw input (from FormData or JSON) → a validated request, or field errors. */ +export function parseRequest( + input: Record, + base?: Record +): { ok: true; value: ParsedRequest } | { ok: false; errors: FieldErrors } { + const errors: FieldErrors = {}; + // Optional keys are defaulted here: zod 4 treats a missing key in front of a transform as + // required. + const meta = metaSchema.safeParse({ + ...input, + task: input.task ?? '', + display_name: input.display_name ?? '' + }); + if (!meta.success) + for (const issue of meta.error.issues) + errors[String(issue.path[0] ?? 'form')] ??= issue.message; + const kind = meta.success ? meta.data.kind : (input.kind as RequestKind); + if ((kind === 'edit' || kind === 'delete') && !(meta.success && meta.data.task)) + errors.task ??= 'Which task is this about?'; + let fields: TaskFields | null = null; + if (kind === 'add' || kind === 'edit') { + // Edits may send only the fields that change: the rest comes from the current task. + // Optional keys are defaulted for the same zod 4 reason as above. + const merged = { ...(kind === 'edit' ? base : undefined), ...input }; + const urls = merged.source_urls; + const parsed = fieldsSchema.safeParse({ + ...merged, + country_code: merged.country_code ?? '', + lat: merged.lat ?? '', + lon: merged.lon ?? '', + status: merged.status ?? (kind === 'add' ? 'open' : undefined), + source_urls: Array.isArray(urls) ? urls : typeof urls === 'string' ? [urls] : [] + }); + if (parsed.success) fields = parsed.data; + else + for (const issue of parsed.error.issues) + errors[String(issue.path[0] ?? 'form')] ??= issue.message; + } + if (Object.keys(errors).length || !meta.success) return { ok: false, errors }; + return { + ok: true, + value: { + kind: meta.data.kind, + taskSlug: meta.data.task, + fields, + reason: meta.data.reason, + displayName: meta.data.display_name + } + }; +} + +/** FormData → the raw input record parseRequest takes. */ +export function formInput(form: FormData): Record { + const out: Record = {}; + for (const key of [ + 'kind', + 'task', + 'title', + 'description', + 'scale', + 'category', + 'location_name', + 'country_code', + 'lat', + 'lon', + 'status', + 'reason', + 'display_name' + ]) { + const v = form.get(key); + if (typeof v === 'string') out[key] = v; + } + out.source_urls = form.getAll('source_urls').filter((v): v is string => typeof v === 'string'); + return out; +} + +/** Honeypot filled in, or submitted faster than a person could. */ +export function looksLikeBot(honeypot: unknown, startedAt: unknown, now = Date.now()): boolean { + if (typeof honeypot === 'string' && honeypot.trim()) return true; + const started = Number(startedAt); + if (!Number.isFinite(started) || started <= 0) return true; + return now - started < MIN_FILL_MS; +} diff --git a/src/lib/worldtodo/IconTile.svelte b/src/lib/worldtodo/IconTile.svelte new file mode 100644 index 0000000..92a29f0 --- /dev/null +++ b/src/lib/worldtodo/IconTile.svelte @@ -0,0 +1,41 @@ + + + + + diff --git a/src/lib/worldtodo/StatusPill.svelte b/src/lib/worldtodo/StatusPill.svelte new file mode 100644 index 0000000..21e7437 --- /dev/null +++ b/src/lib/worldtodo/StatusPill.svelte @@ -0,0 +1,39 @@ + + +{STATUS_LABELS[status]} + + diff --git a/src/lib/worldtodo/TaskCard.svelte b/src/lib/worldtodo/TaskCard.svelte new file mode 100644 index 0000000..330ea81 --- /dev/null +++ b/src/lib/worldtodo/TaskCard.svelte @@ -0,0 +1,125 @@ + + + + + + + {SCALE_INFO[task.scale].label} · {category?.label ?? task.category} + + +

{task.title}

+ {task.locationName} + {task.description} + + updated {relativeTime(task.updatedAt, now) || 'just now'} + {task.sourceUrls.length} source{task.sourceUrls.length === 1 ? '' : 's'} + {#if task.pending}{task.pending} pending{/if} + +
+ + diff --git a/src/lib/worldtodo/TaskFieldsEditor.svelte b/src/lib/worldtodo/TaskFieldsEditor.svelte new file mode 100644 index 0000000..3e962ee --- /dev/null +++ b/src/lib/worldtodo/TaskFieldsEditor.svelte @@ -0,0 +1,401 @@ + + +
+
+ + + Phrase it as something to do, e.g. “Repair the …”. {title.length}/140 + {#if err('title')}{err('title')}{/if} +
+ +
+ + + What is wrong, what would “done” look like, and who could do it. Plain text. {description.length}/2000 + {#if err('description')}{err('description')}{/if} +
+ +
+ Scale +
+ {#each WORLDTODO_SCALES as s (s)} + + {/each} +
+ {#if err('scale')}{err('scale')}{/if} +
+ +
+
+ + + {#if err('category')}{err('category')}{/if} +
+
+ + + {#if err('status')}{err('status')}{/if} +
+
+ +
+
+ + + {#if err('location_name')}{err('location_name')}{/if} +
+
+ + + {#if err('country_code')}{err('country_code')}{/if} +
+
+ +
+ Map position (optional) +
+
+ + + {#if err('lat')}{err('lat')}{/if} +
+
+ + + {#if err('lon')}{err('lon')}{/if} +
+
+
+ +
+ Sources (1–5 links) + A news article, report or official page that backs this up. + {#each urls, i (i)} +
+ + {#if urls.length > 1} + + {/if} +
+ {/each} + {#if urls.length < 5} + + {/if} + {#if err('source_urls')}{err('source_urls')}{/if} +
+
+ + diff --git a/src/lib/worldtodo/Turnstile.svelte b/src/lib/worldtodo/Turnstile.svelte new file mode 100644 index 0000000..fc360c7 --- /dev/null +++ b/src/lib/worldtodo/Turnstile.svelte @@ -0,0 +1,71 @@ + + + + +
+{#if failed} +

+ The anti-bot check couldn't load. Check your connection or blockers and reload. +

+{/if} + + + diff --git a/src/lib/worldtodo/icons.ts b/src/lib/worldtodo/icons.ts new file mode 100644 index 0000000..19102cd --- /dev/null +++ b/src/lib/worldtodo/icons.ts @@ -0,0 +1,52 @@ +import type { Component } from 'svelte'; +import Bike from 'lucide-svelte/icons/bike'; +import Building2 from 'lucide-svelte/icons/building-2'; +import Construction from 'lucide-svelte/icons/construction'; +import Droplet from 'lucide-svelte/icons/droplet'; +import Earth from 'lucide-svelte/icons/earth'; +import Flag from 'lucide-svelte/icons/flag'; +import HandHeart from 'lucide-svelte/icons/hand-heart'; +import HeartPulse from 'lucide-svelte/icons/heart-pulse'; +import House from 'lucide-svelte/icons/house'; +import Landmark from 'lucide-svelte/icons/landmark'; +import Leaf from 'lucide-svelte/icons/leaf'; +import ListTodo from 'lucide-svelte/icons/list-todo'; +import MapIcon from 'lucide-svelte/icons/map'; +import MapPin from 'lucide-svelte/icons/map-pin'; +import Recycle from 'lucide-svelte/icons/recycle'; +import ShieldAlert from 'lucide-svelte/icons/shield-alert'; +import Thermometer from 'lucide-svelte/icons/thermometer'; +import Wheat from 'lucide-svelte/icons/wheat'; +import Zap from 'lucide-svelte/icons/zap'; +import type { Scale } from './shared'; + +// Colourful icons on the black-and-white base: categories use the icon key and accent colour +// stored in worldtodo.categories, scales have fixed gradients. Always paired with a text label. + +type Icon = typeof Earth | Component; + +export const CATEGORY_ICONS: Record = { + thermometer: Thermometer, + leaf: Leaf, + zap: Zap, + wheat: Wheat, + landmark: Landmark, + 'heart-pulse': HeartPulse, + house: House, + 'hand-heart': HandHeart, + construction: Construction, + bike: Bike, + 'shield-alert': ShieldAlert, + recycle: Recycle, + droplet: Droplet +}; +export const categoryIcon = (key: string | undefined): Icon => + (key && CATEGORY_ICONS[key]) || ListTodo; + +export const SCALE_ICONS: Record = { + planet: { icon: Earth, gradient: 'linear-gradient(135deg, #38bdf8, #16a34a)' }, + region: { icon: MapIcon, gradient: 'linear-gradient(135deg, #a78bfa, #4f46e5)' }, + country: { icon: Flag, gradient: 'linear-gradient(135deg, #fb7185, #dc2626)' }, + city: { icon: Building2, gradient: 'linear-gradient(135deg, #fbbf24, #ea580c)' }, + street: { icon: MapPin, gradient: 'linear-gradient(135deg, #2dd4bf, #0f766e)' } +}; diff --git a/src/lib/worldtodo/live.ts b/src/lib/worldtodo/live.ts new file mode 100644 index 0000000..93cba26 --- /dev/null +++ b/src/lib/worldtodo/live.ts @@ -0,0 +1,54 @@ +// Browser side of the worldtodo realtime channels: connect to /ws/, reconnect with +// backoff (1 s → 30 s), and report whether the socket is up so pages can fall back to polling. +// Returns a stop function (call it from an $effect cleanup). + +export function subscribe( + channel: 'worldtodo' | 'worldtodo-owner', + onMessage: (msg: unknown) => void, + onState: (up: boolean) => void = () => {} +): () => void { + let ws: WebSocket | null = null; + let stopped = false; + let delay = 1000; + let timer: ReturnType | undefined; + + const connect = () => { + if (stopped) return; + const proto = location.protocol === 'https:' ? 'wss:' : 'ws:'; + try { + ws = new WebSocket(`${proto}//${location.host}/ws/${channel}`); + } catch { + return retry(); + } + ws.onopen = () => { + delay = 1000; + onState(true); + }; + ws.onmessage = (e) => { + try { + onMessage(JSON.parse(String(e.data))); + } catch { + /* ignore malformed frames */ + } + }; + ws.onclose = () => { + onState(false); + retry(); + }; + }; + const retry = () => { + if (stopped) return; + clearTimeout(timer); + timer = setTimeout(connect, delay + Math.random() * 500); + delay = Math.min(delay * 2, 30_000); + }; + connect(); + return () => { + stopped = true; + clearTimeout(timer); + if (ws) { + ws.onclose = null; + ws.close(); + } + }; +} diff --git a/src/lib/worldtodo/shared.test.ts b/src/lib/worldtodo/shared.test.ts new file mode 100644 index 0000000..22ce975 --- /dev/null +++ b/src/lib/worldtodo/shared.test.ts @@ -0,0 +1,83 @@ +import { describe, expect, it } from 'vitest'; +import { + WORLDTODO_REQUEST_KINDS, + WORLDTODO_REQUEST_STATUSES, + WORLDTODO_SCALES, + WORLDTODO_STATUSES, + changedFields, + matchesFilters, + type PublicTask, + type TaskFields +} from './shared'; +import { + worldtodoRequestKind, + worldtodoRequestStatus, + worldtodoScale, + worldtodoStatus +} from '#lib/server/db/schema/worldtodo.js'; +import seed from '../../../data/worldtodo-seed.json'; + +const base: TaskFields = { + title: 'Repair the bridge', + description: 'The bridge is broken and needs fixing.', + scale: 'city', + category: 'infrastructure', + location_name: 'Gouda', + country_code: 'NL', + lat: 52, + lon: 4.7, + status: 'open', + source_urls: ['https://example.org/a'] +}; + +describe('worldtodo shared', () => { + it('keeps the schema enums in sync with the shared constants', () => { + expect(worldtodoScale.enumValues).toEqual([...WORLDTODO_SCALES]); + expect(worldtodoStatus.enumValues).toEqual([...WORLDTODO_STATUSES]); + expect(worldtodoRequestKind.enumValues).toEqual([...WORLDTODO_REQUEST_KINDS]); + expect(worldtodoRequestStatus.enumValues).toEqual([...WORLDTODO_REQUEST_STATUSES]); + }); + + it('returns only the changed fields', () => { + expect(changedFields(base, { ...base })).toEqual({}); + expect(changedFields(base, { ...base, status: 'done', lat: 52 })).toEqual({ status: 'done' }); + expect( + changedFields(base, { ...base, source_urls: ['https://example.org/a', 'https://b.org'] }) + ).toEqual({ source_urls: ['https://example.org/a', 'https://b.org'] }); + expect(changedFields(base, { country_code: null })).toEqual({ country_code: null }); + }); + + it('matches list filters like the server', () => { + const t = { + slug: 'x', + title: 'Repair the bridge', + description: 'd', + locationName: 'Gouda', + scale: 'city', + category: 'infrastructure', + status: 'done' + } as PublicTask; + const f = { scale: '', category: '', status: 'todo', q: '' }; + expect(matchesFilters(t, f)).toBe(false); + expect(matchesFilters(t, { ...f, status: 'all' })).toBe(true); + expect(matchesFilters(t, { ...f, status: 'done', q: 'gouda bridge' })).toBe(true); + expect(matchesFilters(t, { ...f, status: 'all', scale: 'planet' })).toBe(false); + }); + + it('ships the full, sourced seed (68 tasks with the expected spread)', () => { + const tasks = seed.tasks; + expect(tasks).toHaveLength(68); + expect(new Set(tasks.map((t) => t.slug)).size).toBe(68); + const by = (k: 'scale' | 'status') => + tasks.reduce>((a, t) => ((a[t[k]] = (a[t[k]] ?? 0) + 1), a), {}); + expect(by('scale')).toEqual({ planet: 13, region: 12, country: 12, city: 12, street: 19 }); + expect(by('status')).toEqual({ open: 58, in_progress: 10 }); + for (const t of tasks) { + expect(t.source_urls.length).toBeGreaterThan(0); + expect(seed.categories).toContain(t.category); + expect(['request', 'requests', 'queue', 'api']).not.toContain(t.slug); + expect(t.title.length).toBeGreaterThanOrEqual(5); + expect(t.title.length).toBeLessThanOrEqual(140); + } + }); +}); diff --git a/src/lib/worldtodo/shared.ts b/src/lib/worldtodo/shared.ts new file mode 100644 index 0000000..9d1accd --- /dev/null +++ b/src/lib/worldtodo/shared.ts @@ -0,0 +1,180 @@ +// Shared (client + server) constants and types for the Worldwide Todo List. + +export const WORLDTODO_SCALES = ['planet', 'region', 'country', 'city', 'street'] as const; +export type Scale = (typeof WORLDTODO_SCALES)[number]; +export const WORLDTODO_STATUSES = ['open', 'in_progress', 'done'] as const; +export type Status = (typeof WORLDTODO_STATUSES)[number]; +export const WORLDTODO_REQUEST_KINDS = ['add', 'edit', 'delete'] as const; +export type RequestKind = (typeof WORLDTODO_REQUEST_KINDS)[number]; +export const WORLDTODO_REQUEST_STATUSES = ['pending', 'approved', 'rejected'] as const; +export type RequestStatus = (typeof WORLDTODO_REQUEST_STATUSES)[number]; + +/** The only keys a request payload may carry (checked server-side). */ +export const EDITABLE_FIELDS = [ + 'title', + 'description', + 'scale', + 'category', + 'location_name', + 'country_code', + 'lat', + 'lon', + 'status', + 'source_urls' +] as const; +export type EditableField = (typeof EDITABLE_FIELDS)[number]; + +export const FIELD_LABELS: Record = { + title: 'Title', + description: 'Description', + scale: 'Scale', + category: 'Category', + location_name: 'Location', + country_code: 'Country code', + lat: 'Latitude', + lon: 'Longitude', + status: 'Status', + source_urls: 'Sources' +}; + +export const SCALE_INFO: Record = { + planet: { label: 'Planet', emoji: '🌍' }, + region: { label: 'Region', emoji: '🗺️' }, + country: { label: 'Country', emoji: '🏳️' }, + city: { label: 'City', emoji: '🏙️' }, + street: { label: 'Street', emoji: '🛣️' } +}; + +export const STATUS_LABELS: Record = { + open: 'Open', + in_progress: 'In progress', + done: 'Done' +}; + +/** Slugs that are routes under /projects/worldwide-todo, never task slugs. */ +export const RESERVED_SLUGS = new Set(['request', 'requests', 'queue', 'api']); + +/** A task as the public sees it (list, detail, realtime events). */ +export type PublicTask = { + id: number; + slug: string; + title: string; + description: string; + scale: Scale; + category: string; + locationName: string; + countryCode: string | null; + lat: number | null; + lon: number | null; + status: Status; + sourceUrls: string[]; + sourceDate: string | null; + confidence: 'high' | 'medium'; + verificationNote: string | null; + asOf: string; + createdAt: string; + updatedAt: string; + pending?: number; +}; + +export type Category = { slug: string; label: string; icon: string; colour: string }; + +export type LiveEvent = { + type: 'task.added' | 'task.updated' | 'task.deleted'; + slug: string; + task: PublicTask | null; + at: string; +}; + +/** Field values in the editable shape (snake_case keys, as in payloads). */ +export type TaskFields = { + title: string; + description: string; + scale: Scale; + category: string; + location_name: string; + country_code: string | null; + lat: number | null; + lon: number | null; + status: Status; + source_urls: string[]; +}; + +export function fieldsOf(task: PublicTask): TaskFields { + return { + title: task.title, + description: task.description, + scale: task.scale, + category: task.category, + location_name: task.locationName, + country_code: task.countryCode, + lat: task.lat, + lon: task.lon, + status: task.status, + source_urls: task.sourceUrls + }; +} + +const same = (a: unknown, b: unknown) => JSON.stringify(a ?? null) === JSON.stringify(b ?? null); + +/** Only the fields of `next` that differ from `current`. */ +export function changedFields(current: TaskFields, next: Partial): Partial { + const out: Record = {}; + for (const key of EDITABLE_FIELDS) { + if (key in next && !same(current[key], next[key])) out[key] = next[key]; + } + return out as Partial; +} + +export function formatValue(key: EditableField, value: unknown): string { + if (value === null || value === undefined || value === '') return '—'; + if (key === 'source_urls' && Array.isArray(value)) return value.join('\n'); + if (key === 'status') return STATUS_LABELS[value as Status] ?? String(value); + if (key === 'scale') return SCALE_INFO[value as Scale]?.label ?? String(value); + return String(value); +} + +/** Does a task match the list filters (used for live updates on open list pages)? */ +export function matchesFilters( + task: PublicTask, + f: { scale: string; category: string; status: string; q: string } +): boolean { + if (f.scale && task.scale !== f.scale) return false; + if (f.category && task.category !== f.category) return false; + if (f.status === 'todo' && task.status === 'done') return false; + if (['open', 'in_progress', 'done'].includes(f.status) && task.status !== f.status) return false; + if (f.q) { + const hay = `${task.title} ${task.description} ${task.locationName}`.toLowerCase(); + if ( + !f.q + .toLowerCase() + .split(/\s+/) + .filter(Boolean) + .every((w) => hay.includes(w)) + ) + return false; + } + return true; +} + +export function relativeTime(iso: string, now = Date.now()): string { + const s = Math.round((now - new Date(iso).getTime()) / 1000); + if (s < 60) return 'just now'; + const units: [number, string][] = [ + [60, 'minute'], + [3600, 'hour'], + [86400, 'day'], + [2592000, 'month'], + [31536000, 'year'] + ]; + let label = ''; + for (let i = units.length - 1; i >= 0; i--) { + const [size, name] = units[i]; + if (s >= size) { + const n = Math.floor(s / size); + label = `${n} ${name}${n === 1 ? '' : 's'} ago`; + break; + } + } + return label; +} diff --git a/src/routes/projects/worldwide-todo/+layout.server.ts b/src/routes/projects/worldwide-todo/+layout.server.ts new file mode 100644 index 0000000..f2cac7c --- /dev/null +++ b/src/routes/projects/worldwide-todo/+layout.server.ts @@ -0,0 +1,12 @@ +import { isOwner } from '#lib/server/owner.js'; +import { listCategories, pendingTotal } from '#lib/server/worldtodo/store.js'; +import type { LayoutServerLoad } from './$types'; + +export const load: LayoutServerLoad = async (event) => { + const owner = isOwner(event); + const [categories, pending] = await Promise.all([ + listCategories(), + owner ? pendingTotal() : Promise.resolve(0) + ]); + return { owner, categories, pendingCount: pending }; +}; diff --git a/src/routes/projects/worldwide-todo/+layout.svelte b/src/routes/projects/worldwide-todo/+layout.svelte new file mode 100644 index 0000000..b930560 --- /dev/null +++ b/src/routes/projects/worldwide-todo/+layout.svelte @@ -0,0 +1,215 @@ + + +
+
+ +
+

projects

+

the worldwide todo list

+

+ Real problems, phrased as todos. Anyone can suggest changes; Stan reviews them. +

+
+
+ +
+ {@render children()} +
+
+ + diff --git a/src/routes/projects/worldwide-todo/+page.server.ts b/src/routes/projects/worldwide-todo/+page.server.ts new file mode 100644 index 0000000..d9a885f --- /dev/null +++ b/src/routes/projects/worldwide-todo/+page.server.ts @@ -0,0 +1,35 @@ +import { counts, listTasks, type Sort } from '#lib/server/worldtodo/store.js'; +import { WORLDTODO_SCALES } from '#lib/worldtodo/shared.js'; +import type { PageServerLoad } from './$types'; + +const STATUSES = ['todo', 'open', 'in_progress', 'done', 'all']; +const SORTS: Sort[] = ['updated', 'scale', 'title']; + +// Filters live in the query string (shareable, SSR, works without JS). A GET form submits +// toggle buttons that come before hidden copies of the current values, so the first value of +// each name wins. +export const load: PageServerLoad = async ({ url, parent }) => { + const first = (key: string) => url.searchParams.getAll(key)[0]?.trim() ?? ''; + const { categories } = await parent(); + const scale = (WORLDTODO_SCALES as readonly string[]).includes(first('scale')) + ? first('scale') + : ''; + const category = categories.some((c) => c.slug === first('category')) ? first('category') : ''; + const status = STATUSES.includes(first('status')) ? first('status') : 'todo'; + const sort = (SORTS as string[]).includes(first('sort')) ? (first('sort') as Sort) : 'updated'; + const q = first('q').slice(0, 100); + const filter = { scale, category, status, q }; + const [list, totals] = await Promise.all([listTasks(filter, sort, 500), counts(filter)]); + return { + filter, + sort, + tasks: list.tasks, + counts: totals, + seo: { + title: 'The worldwide todo list', + description: + 'A public todo list of real, sourced problems, from planet-scale to a single street. Anyone can suggest additions, edits and removals.', + index: !scale && !category && status === 'todo' && !q && sort === 'updated' + } + }; +}; diff --git a/src/routes/projects/worldwide-todo/+page.svelte b/src/routes/projects/worldwide-todo/+page.svelte new file mode 100644 index 0000000..0124a4e --- /dev/null +++ b/src/routes/projects/worldwide-todo/+page.svelte @@ -0,0 +1,470 @@ + + +
+

+ {data.counts.status.open} open tasks · + {data.counts.status.in_progress} in progress · + {data.counts.status.done} done +

+

+ {total} real, sourced problems from planet-scale down to a single street. Spot something wrong, outdated + or missing? Suggest a change; nothing changes until it's reviewed. +

+
+ +
+
+ {#each WORLDTODO_SCALES as s (s)} + {@const on = f.scale === s} + + {/each} +
+ +
+ {#each data.categories as c (c.slug)} + {@const on = f.category === c.slug} + + {/each} +
+ +
+
+ {#each statusTabs as s (s.key)} + + {/each} +
+ + + +
+ + + {#if f.scale}{/if} + {#if f.category}{/if} + {#if f.status !== 'todo'}{/if} +
+ +

+ {tasks.length} task{tasks.length === 1 ? '' : 's'}{#if f.q} matching “{f.q}”{/if} + {#if f.scale || f.category || f.q || f.status !== 'todo'} + · clear filters + {/if} +

+

{announce}

+ + +{#if !tasks.length} +

Nothing matches these filters.

+{/if} + + diff --git a/src/routes/projects/worldwide-todo/[slug]/+page.server.ts b/src/routes/projects/worldwide-todo/[slug]/+page.server.ts new file mode 100644 index 0000000..5b8c077 --- /dev/null +++ b/src/routes/projects/worldwide-todo/[slug]/+page.server.ts @@ -0,0 +1,19 @@ +import { error } from '@sveltejs/kit'; +import { getTask, taskActivity } from '#lib/server/worldtodo/store.js'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ params }) => { + if (params.slug.length > 120) error(404, 'Not Found'); + const found = await getTask(params.slug); + if (!found) error(404, 'Not Found'); + const activity = await taskActivity(found.task.id); + return { + task: found.task, + history: activity.history, + pending: activity.pending, + seo: { + title: `${found.task.title} · worldwide todo list`, + description: found.task.description.slice(0, 200) + } + }; +}; diff --git a/src/routes/projects/worldwide-todo/[slug]/+page.svelte b/src/routes/projects/worldwide-todo/[slug]/+page.svelte new file mode 100644 index 0000000..812ba92 --- /dev/null +++ b/src/routes/projects/worldwide-todo/[slug]/+page.svelte @@ -0,0 +1,502 @@ + + +

{announce}

+ + +{#if removed} +
+ This task was just removed. +
+{/if} + +
+
+ {SCALE_INFO[t.scale].label} + {cat?.label ?? t.category} + + {#if t.confidence === 'medium'}medium confidence{/if} +
+

{t.title}

+

+ {t.locationName}{#if t.countryCode} · {t.countryCode}{/if} +

+ + {#if data.pending.length} +
+
+ {/if} + +
+
+

{t.description}

+

Sources

+
    + {#each t.sourceUrls as url (url)} +
  • + {host(url)} +
  • + {/each} +
+

+ Facts as of {fmtDate(t.asOf)}{#if t.sourceDate} · source dated {t.sourceDate}{/if} · updated + {relativeTime(t.updatedAt, now) || 'just now'} +

+ {#if t.verificationNote}

Note: {t.verificationNote}

{/if} + +
+ {#if map} + +
+ {#each map.tiles as tile (tile.src)} + + {/each} + +
+ © OpenStreetMap contributors +
+ {/if} +
+
+ +
+

+
    + {#each data.history as h (h.id)} +
  1. + + {kindLabel[h.kind]} · {h.summary}{#if h.ownerNote} + — “{h.ownerNote}”{/if} + +
  2. + {/each} +
  3. + + Listed · on the worldwide todo list + +
  4. +
+
+ + diff --git a/src/routes/projects/worldwide-todo/api/categories/+server.ts b/src/routes/projects/worldwide-todo/api/categories/+server.ts new file mode 100644 index 0000000..7b4962a --- /dev/null +++ b/src/routes/projects/worldwide-todo/api/categories/+server.ts @@ -0,0 +1,6 @@ +import { json } from '@sveltejs/kit'; +import { listCategories } from '#lib/server/worldtodo/store.js'; +import type { RequestHandler } from './$types'; + +export const GET: RequestHandler = async () => + json(await listCategories(), { headers: { 'cache-control': 'public, max-age=300' } }); diff --git a/src/routes/projects/worldwide-todo/api/queue/+server.ts b/src/routes/projects/worldwide-todo/api/queue/+server.ts new file mode 100644 index 0000000..ee4093d --- /dev/null +++ b/src/routes/projects/worldwide-todo/api/queue/+server.ts @@ -0,0 +1,12 @@ +import { json } from '@sveltejs/kit'; +import { requireOwner } from '#lib/server/owner.js'; +import { queue } from '#lib/server/worldtodo/store.js'; +import type { RequestHandler } from './$types'; + +// Owner: full requests with the current task (for diffs), stale flags and similar titles. +export const GET: RequestHandler = async (event) => { + requireOwner(event); + const raw = event.url.searchParams.get('status') ?? 'pending'; + const status = (['pending', 'approved', 'rejected'] as const).find((s) => s === raw) ?? 'pending'; + return json(await queue(status), { headers: { 'cache-control': 'private, no-store' } }); +}; diff --git a/src/routes/projects/worldwide-todo/api/queue/[id]/approve/+server.ts b/src/routes/projects/worldwide-todo/api/queue/[id]/approve/+server.ts new file mode 100644 index 0000000..783962a --- /dev/null +++ b/src/routes/projects/worldwide-todo/api/queue/[id]/approve/+server.ts @@ -0,0 +1,32 @@ +import { error, json } from '@sveltejs/kit'; +import { requireOwner } from '#lib/server/owner.js'; +import { approveRequest } from '#lib/server/worldtodo/decide.js'; +import { DecisionError } from '#lib/server/worldtodo/store.js'; +import { fieldsSchema } from '#lib/server/worldtodo/validate.js'; +import type { TaskFields } from '#lib/worldtodo/shared.js'; +import type { RequestHandler } from './$types'; + +// Owner: body { note?, payload? } where payload is the full tweaked field set. +export const POST: RequestHandler = async (event) => { + requireOwner(event); + const id = Number(event.params.id); + if (!Number.isSafeInteger(id) || id <= 0) error(404, 'Not Found'); + const body = ((await event.request.json().catch(() => ({}))) ?? {}) as { + note?: string; + payload?: Record; + }; + let tweaked: TaskFields | null = null; + if (body.payload) { + const parsed = fieldsSchema.safeParse(body.payload); + if (!parsed.success) + return json({ error: parsed.error.issues.map((i) => i.message) }, { status: 400 }); + tweaked = parsed.data as TaskFields; + } + try { + const applied = await approveRequest(id, body.note, tweaked); + return json({ ok: true, ...applied }); + } catch (e) { + if (e instanceof DecisionError) return json({ error: e.message }, { status: e.status }); + throw e; + } +}; diff --git a/src/routes/projects/worldwide-todo/api/queue/[id]/reject/+server.ts b/src/routes/projects/worldwide-todo/api/queue/[id]/reject/+server.ts new file mode 100644 index 0000000..b164290 --- /dev/null +++ b/src/routes/projects/worldwide-todo/api/queue/[id]/reject/+server.ts @@ -0,0 +1,20 @@ +import { error, json } from '@sveltejs/kit'; +import { requireOwner } from '#lib/server/owner.js'; +import { rejectRequest } from '#lib/server/worldtodo/decide.js'; +import { DecisionError } from '#lib/server/worldtodo/store.js'; +import type { RequestHandler } from './$types'; + +// Owner: body { note? }. +export const POST: RequestHandler = async (event) => { + requireOwner(event); + const id = Number(event.params.id); + if (!Number.isSafeInteger(id) || id <= 0) error(404, 'Not Found'); + const body = ((await event.request.json().catch(() => ({}))) ?? {}) as { note?: string }; + try { + await rejectRequest(id, body.note); + return json({ ok: true }); + } catch (e) { + if (e instanceof DecisionError) return json({ error: e.message }, { status: e.status }); + throw e; + } +}; diff --git a/src/routes/projects/worldwide-todo/api/requests/+server.ts b/src/routes/projects/worldwide-todo/api/requests/+server.ts new file mode 100644 index 0000000..4797a2f --- /dev/null +++ b/src/routes/projects/worldwide-todo/api/requests/+server.ts @@ -0,0 +1,41 @@ +import { json } from '@sveltejs/kit'; +import { clientIp } from '#lib/server/worldtodo/limit.js'; +import { submitRequest } from '#lib/server/worldtodo/requests.js'; +import type { RequestHandler } from './$types'; + +// POST /projects/worldwide-todo/api/requests (public + Turnstile). JSON body: +// { kind, task?, title?, description?, scale?, category?, location_name?, country_code?, lat?, +// lon?, status?, source_urls?: string[], reason, display_name?, started, website?, turnstile } +// 201 { id, statusUrl } | 400 { error, fields? } | 429 (Retry-After) | 503. +export const POST: RequestHandler = async ({ request, getClientAddress }) => { + if (!request.headers.get('content-type')?.includes('application/json')) + return json({ error: 'Send JSON' }, { status: 415 }); + const text = await request.text(); + if (text.length > 20_000) return json({ error: 'Too large' }, { status: 413 }); + let body: Record; + try { + body = JSON.parse(text); + if (!body || typeof body !== 'object' || Array.isArray(body)) throw new Error(); + } catch { + return json({ error: 'Invalid JSON' }, { status: 400 }); + } + const result = await submitRequest({ + input: body, + honeypot: body.website, + startedAt: body.started, + token: typeof body.turnstile === 'string' ? body.turnstile : '', + ip: clientIp(request, getClientAddress) + }); + if (result.ok) + return json( + { id: result.id, statusUrl: `/projects/worldwide-todo/requests/${result.id}` }, + { status: 201 } + ); + return json( + { error: result.message, ...(result.errors ? { fields: result.errors } : {}) }, + { + status: result.status, + headers: result.retryAfter ? { 'retry-after': String(result.retryAfter) } : undefined + } + ); +}; diff --git a/src/routes/projects/worldwide-todo/api/requests/[id]/+server.ts b/src/routes/projects/worldwide-todo/api/requests/[id]/+server.ts new file mode 100644 index 0000000..4d33cc2 --- /dev/null +++ b/src/routes/projects/worldwide-todo/api/requests/[id]/+server.ts @@ -0,0 +1,18 @@ +import { error, json } from '@sveltejs/kit'; +import { requestStatus } from '#lib/server/worldtodo/store.js'; +import type { RequestHandler } from './$types'; + +// Minimal public status: kind, status, created_at, decided_at, owner_note. +export const GET: RequestHandler = async ({ params }) => { + if (!/^\d{1,12}$/.test(params.id)) error(404, 'Not Found'); + const r = await requestStatus(Number(params.id)); + if (!r) error(404, 'Not Found'); + return json({ + id: r.id, + kind: r.kind, + status: r.status, + created_at: r.createdAt, + decided_at: r.decidedAt, + owner_note: r.ownerNote + }); +}; diff --git a/src/routes/projects/worldwide-todo/api/tasks/+server.ts b/src/routes/projects/worldwide-todo/api/tasks/+server.ts new file mode 100644 index 0000000..ae2f9ca --- /dev/null +++ b/src/routes/projects/worldwide-todo/api/tasks/+server.ts @@ -0,0 +1,26 @@ +import { json } from '@sveltejs/kit'; +import { listTasks, type Sort } from '#lib/server/worldtodo/store.js'; +import type { RequestHandler } from './$types'; + +// GET /projects/worldwide-todo/api/tasks?scale=&category=&status=&q=&sort=&cursor= +// 50 per page, keyset cursor (nextCursor), deleted tasks excluded. status defaults to 'todo' +// (open + in progress); 'all', 'open', 'in_progress' or 'done' otherwise. +export const GET: RequestHandler = async ({ url }) => { + const p = (k: string) => url.searchParams.get(k)?.trim() ?? ''; + const scale = ['planet', 'region', 'country', 'city', 'street'].includes(p('scale')) + ? p('scale') + : ''; + const status = ['todo', 'open', 'in_progress', 'done', 'all'].includes(p('status')) + ? p('status') + : 'todo'; + const sort: Sort = + (['updated', 'scale', 'title'] as const).find((s) => s === p('sort')) ?? 'updated'; + const category = /^[a-z][a-z0-9-]{1,30}$/.test(p('category')) ? p('category') : ''; + const page = await listTasks( + { scale, category, status, q: p('q').slice(0, 100) }, + sort, + 50, + p('cursor').slice(0, 500) || undefined + ); + return json(page, { headers: { 'cache-control': 'public, max-age=30' } }); +}; diff --git a/src/routes/projects/worldwide-todo/api/tasks/[slug]/+server.ts b/src/routes/projects/worldwide-todo/api/tasks/[slug]/+server.ts new file mode 100644 index 0000000..974a5d7 --- /dev/null +++ b/src/routes/projects/worldwide-todo/api/tasks/[slug]/+server.ts @@ -0,0 +1,49 @@ +import { error, json } from '@sveltejs/kit'; +import { requireOwner } from '#lib/server/owner.js'; +import { editTaskDirectly } from '#lib/server/worldtodo/decide.js'; +import { + DecisionError, + currentFields, + getTask, + taskActivity +} from '#lib/server/worldtodo/store.js'; +import { fieldsSchema } from '#lib/server/worldtodo/validate.js'; +import type { TaskFields } from '#lib/worldtodo/shared.js'; +import type { RequestHandler } from './$types'; + +// GET: the task, its approved history and pending requests (summaries only). +export const GET: RequestHandler = async ({ params }) => { + const found = await getTask(params.slug); + if (!found) error(404, 'Not Found'); + const activity = await taskActivity(found.task.id); + return json({ + task: found.task, + history: activity.history, + pendingCount: activity.pending.length, + pending: activity.pending + }); +}; + +// PATCH (owner): direct edit, body { fields: Partial, note? }. Logged as an +// auto-approved edit request; published like any approval. +export const PATCH: RequestHandler = async (event) => { + requireOwner(event); + const body = (await event.request.json().catch(() => null)) as { + fields?: Record; + note?: string; + } | null; + if (!body?.fields || typeof body.fields !== 'object') error(400, 'Body needs { fields }'); + const found = await getTask(event.params.slug); + if (!found) error(404, 'Not Found'); + const parsed = fieldsSchema.safeParse({ ...currentFields(found.task), ...body.fields }); + if (!parsed.success) + return json({ error: parsed.error.issues.map((i) => i.message) }, { status: 400 }); + try { + const applied = await editTaskDirectly(event.params.slug, parsed.data as TaskFields, body.note); + const fresh = await getTask(applied.slug); + return json({ ok: true, task: fresh?.task ?? null }); + } catch (e) { + if (e instanceof DecisionError) return json({ error: e.message }, { status: e.status }); + throw e; + } +}; diff --git a/src/routes/projects/worldwide-todo/queue/+page.server.ts b/src/routes/projects/worldwide-todo/queue/+page.server.ts new file mode 100644 index 0000000..874fb49 --- /dev/null +++ b/src/routes/projects/worldwide-todo/queue/+page.server.ts @@ -0,0 +1,79 @@ +import { fail } from '@sveltejs/kit'; +import { requireOwner } from '#lib/server/owner.js'; +import { approveRequest, rejectRequest } from '#lib/server/worldtodo/decide.js'; +import { DecisionError, queue } from '#lib/server/worldtodo/store.js'; +import { fieldsSchema, formInput } from '#lib/server/worldtodo/validate.js'; +import { client as sql } from '#lib/server/db/index.js'; +import type { TaskFields } from '#lib/worldtodo/shared.js'; +import type { Actions, PageServerLoad } from './$types'; + +// Owner moderation queue. Owner-only three times over: hooks.server.ts refuses non-GET +// requests from anyone else (ownerOnlyPrefixes), and every load and action calls requireOwner, +// which answers 404 like an unknown URL. SvelteKit's origin check covers CSRF. + +const TABS = ['pending', 'approved', 'rejected'] as const; + +export const load: PageServerLoad = async (event) => { + requireOwner(event); + event.depends('worldtodo:queue'); + const raw = event.url.searchParams.get('status') ?? 'pending'; + const status = (TABS as readonly string[]).includes(raw) + ? (raw as (typeof TABS)[number]) + : 'pending'; + const [items, totals] = await Promise.all([ + queue(status), + sql`select status::text as status, count(*)::int as n from worldtodo.change_requests group by status` + ]); + const counts: Record = { pending: 0, approved: 0, rejected: 0 }; + for (const r of totals) counts[r.status] = r.n; + return { + status, + items, + counts, + seo: { title: 'Queue · worldwide todo list', description: 'Owner queue', index: false } + }; +}; + +const idOf = (form: FormData) => { + const id = Number(form.get('id')); + return Number.isSafeInteger(id) && id > 0 ? id : null; +}; + +async function run(id: number | null, fn: (id: number) => Promise, done: string) { + if (!id) return fail(400, { id, message: 'Missing request id' }); + try { + await fn(id); + return { id, ok: done }; + } catch (e) { + if (e instanceof DecisionError) return fail(e.status, { id, message: e.message }); + throw e; + } +} + +export const actions: Actions = { + approve: async (event) => { + requireOwner(event); + const form = await event.request.formData(); + return run(idOf(form), (id) => approveRequest(id, form.get('note')), 'Approved'); + }, + tweak: async (event) => { + requireOwner(event); + const form = await event.request.formData(); + const parsed = fieldsSchema.safeParse(formInput(form)); + if (!parsed.success) + return fail(400, { + id: idOf(form), + message: parsed.error.issues.map((i) => i.message).join(' · ') + }); + return run( + idOf(form), + (id) => approveRequest(id, form.get('note'), parsed.data as TaskFields), + 'Approved with tweaks' + ); + }, + reject: async (event) => { + requireOwner(event); + const form = await event.request.formData(); + return run(idOf(form), (id) => rejectRequest(id, form.get('note')), 'Rejected'); + } +}; diff --git a/src/routes/projects/worldwide-todo/queue/+page.svelte b/src/routes/projects/worldwide-todo/queue/+page.svelte new file mode 100644 index 0000000..1ad57a4 --- /dev/null +++ b/src/routes/projects/worldwide-todo/queue/+page.svelte @@ -0,0 +1,576 @@ + + + + +
+
+

Review queue

+ {#if data.status === 'pending'} +

+ j/k move · a approve · e edit & approve · + r reject +

+ {/if} +
+ + + {#if form?.ok}

{form.ok} #{form.id}.

{/if} + + {#if !data.items.length} +

Nothing {data.status} right now.

+ {:else} +
    + {#each data.items as item, i (item.id)} +
  1. +
    (selected = i)} + aria-labelledby="req-{item.id}-h" + > +
    + {kindLabel[item.kind]} +

    + {#if item.task} + {item.task.title} + {:else} + {String(item.payload.title ?? 'New task')} + {/if} +

    + #{item.id} · {relativeTime(item.createdAt, now) || 'just now'} +
    + {#if item.stale} +

    +

    + {/if} + {#if item.similar.length} +

    +

    + {/if} + + {#if diff(item).length} + + + + + {#each diff(item) as row (row.key)} + + + + + + {/each} + +
    Changes
    FieldOldNew
    {FIELD_LABELS[row.key]}{#if row.old !== '—'}Old: {row.old}{:else}—{/if}{#if row.new !== '—'}New: {row.new}{:else}—{/if}
    + {/if} + +
    +
    Reason
    +
    {item.reason}
    + {#if item.displayName}
    From
    +
    {item.displayName}
    {/if} + {#if sources(item).length} +
    Sources
    +
    + {#each sources(item) as url (url)} + {host(url)} + {/each} +
    + {/if} + {#if item.ownerNote}
    Note
    +
    {item.ownerNote}
    {/if} +
    + + {#if item.status === 'pending'} + {#if form?.message && form.id === item.id} + + {/if} +
    { + busy = item.id; + return async ({ update }) => { + await update(); + busy = null; + tweaking = null; + }; + }} + > + + {#if tweaking === item.id} +
    + +
    + {/if} + +
    + {#if tweaking === item.id} + + + {:else} + + {#if item.kind !== 'delete'} + + {/if} + {/if} + +
    +
    + {:else if item.decidedAt} +

    + {item.status === 'approved' ? 'Approved' : 'Rejected'} + {relativeTime(item.decidedAt, now) || 'just now'} +

    + {/if} +
    +
  2. + {/each} +
+ {/if} +
+ + diff --git a/src/routes/projects/worldwide-todo/request/+page.server.ts b/src/routes/projects/worldwide-todo/request/+page.server.ts new file mode 100644 index 0000000..efe8386 --- /dev/null +++ b/src/routes/projects/worldwide-todo/request/+page.server.ts @@ -0,0 +1,59 @@ +import { error, fail, redirect } from '@sveltejs/kit'; +import { clientIp } from '#lib/server/worldtodo/limit.js'; +import { MAX_PENDING, submitRequest } from '#lib/server/worldtodo/requests.js'; +import { getTask, pendingTotal } from '#lib/server/worldtodo/store.js'; +import { turnstileConfigured, turnstileSiteKey } from '#lib/server/worldtodo/turnstile.js'; +import { formInput } from '#lib/server/worldtodo/validate.js'; +import type { Actions, PageServerLoad } from './$types'; + +const KINDS = ['add', 'edit', 'delete'] as const; +type Kind = (typeof KINDS)[number]; + +export const load: PageServerLoad = async ({ url }) => { + const raw = url.searchParams.get('kind') ?? 'add'; + const kind: Kind = (KINDS as readonly string[]).includes(raw) ? (raw as Kind) : 'add'; + let task = null; + if (kind !== 'add') { + const slug = url.searchParams.get('task') ?? ''; + const found = slug && slug.length <= 120 ? await getTask(slug) : null; + if (!found) error(404, 'Not Found'); + task = found.task; + } + return { + kind, + task, + siteKey: turnstileSiteKey(), + enabled: turnstileConfigured(), + queueFull: (await pendingTotal()) >= MAX_PENDING, + startedAt: Date.now(), + seo: { + title: + kind === 'add' + ? 'Suggest a task · worldwide todo list' + : `${kind === 'edit' ? 'Suggest an edit' : 'Request removal'} · worldwide todo list`, + description: 'Suggest a change to the worldwide todo list. Every request is reviewed.', + index: false + } + }; +}; + +export const actions: Actions = { + default: async ({ request, getClientAddress, setHeaders }) => { + const form = await request.formData(); + const input = formInput(form); + const result = await submitRequest({ + input, + honeypot: form.get('website'), + startedAt: form.get('started'), + token: String(form.get('cf-turnstile-response') ?? ''), + ip: clientIp(request, getClientAddress) + }); + if (result.ok) redirect(303, `/projects/worldwide-todo/requests/${result.id}?new=1`); + if (result.retryAfter) setHeaders({ 'retry-after': String(result.retryAfter) }); + return fail(result.status, { + message: result.message, + errors: result.errors ?? {}, + values: input + }); + } +}; diff --git a/src/routes/projects/worldwide-todo/request/+page.svelte b/src/routes/projects/worldwide-todo/request/+page.svelte new file mode 100644 index 0000000..32c2eab --- /dev/null +++ b/src/routes/projects/worldwide-todo/request/+page.svelte @@ -0,0 +1,299 @@ + + +
+

{heading}

+ {#if data.task} +

+ {data.kind === 'edit' ? 'Editing' : 'Removing'} + {data.task.title} +

+ {/if} + + {#if !data.enabled} +

+ Requests are switched off right now. Please check back later. +

+ {:else if data.queueFull} +

+ The review queue is full right now. Please try again in a day or two. +

+ {:else} +
{ + sending = true; + return async ({ update, result }) => { + await update({ reset: false }); + sending = false; + if (result.type === 'failure') attempt++; + }; + }} + novalidate + > + {#if form?.message} + + {/if} + + + {#if data.task}{/if} + + + + {#if data.kind !== 'delete'} + {#key attempt} + + {/key} + {/if} + +
+ + + {data.kind === 'delete' + ? 'Why should it go? E.g. it was fixed (link it!), it is a duplicate, or it is wrong.' + : 'Why this change? 10–1000 characters, only Stan sees it.'} + {#if errors.reason}{errors.reason}{/if} +
+ +
+ + + Shown nowhere except the review queue. + {#if errors.display_name}{errors.display_name}{/if} +
+ +
+ + {#key attempt} + + {/key} + {#if errors.turnstile}{errors.turnstile}{/if} +
+ + +

+ Privacy: we store your request and the optional display name, nothing else: no IP address, + email or browser details. Spam protection by Cloudflare Turnstile. Rate limits use a salted, + daily-rotating hash of your IP that is kept in memory only. +

+ + {/if} +
+ + diff --git a/src/routes/projects/worldwide-todo/requests/[id]/+page.server.ts b/src/routes/projects/worldwide-todo/requests/[id]/+page.server.ts new file mode 100644 index 0000000..a718f82 --- /dev/null +++ b/src/routes/projects/worldwide-todo/requests/[id]/+page.server.ts @@ -0,0 +1,20 @@ +import { error } from '@sveltejs/kit'; +import { requestStatus } from '#lib/server/worldtodo/store.js'; +import type { PageServerLoad } from './$types'; + +// Public request status: kind, status, dates and the owner's note once decided. Never the +// reason, the payload or the display name. +export const load: PageServerLoad = async ({ params, url }) => { + if (!/^\d{1,12}$/.test(params.id)) error(404, 'Not Found'); + const req = await requestStatus(Number(params.id)); + if (!req) error(404, 'Not Found'); + return { + req, + justSent: url.searchParams.has('new'), + seo: { + title: `Request #${req.id} · worldwide todo list`, + description: 'Request status', + index: false + } + }; +}; diff --git a/src/routes/projects/worldwide-todo/requests/[id]/+page.svelte b/src/routes/projects/worldwide-todo/requests/[id]/+page.svelte new file mode 100644 index 0000000..44ab639 --- /dev/null +++ b/src/routes/projects/worldwide-todo/requests/[id]/+page.svelte @@ -0,0 +1,116 @@ + + +
+ {#if data.justSent && r.status === 'pending'} +

Thanks, your request is waiting for review.

+ {/if} +

Request #{r.id}

+
+ + {#if r.status === 'approved'} +
+
Type
+
{kind[r.kind]}
+ {#if r.task} +
Task
+
{r.task.title}
+ {/if} +
Sent
+
+ {#if r.decidedAt} +
Decided
+
+ {/if} + {#if r.ownerNote} +
Note
+
{r.ownerNote}
+ {/if} +
+
+

+ Bookmark this page to check back. Back to the list +

+
+ + diff --git a/src/routes/sitemap.xml/+server.ts b/src/routes/sitemap.xml/+server.ts index 003bbce..ff5fb71 100644 --- a/src/routes/sitemap.xml/+server.ts +++ b/src/routes/sitemap.xml/+server.ts @@ -7,6 +7,7 @@ import { COURSES } from '#lib/language-learner/courses/index.js'; import { gameTrackers } from '#lib/projects.js'; import { and, eq, isNull, ne } from 'drizzle-orm'; import { getVisibility } from '#lib/server/movies/site.js'; +import { sitemapSlugs } from '#lib/server/worldtodo/store.js'; import type { RequestHandler } from './$types'; const staticPaths = [ @@ -49,6 +50,7 @@ const staticPaths = [ '/projects/game-tracker/pokemon', '/projects/game-tracker/osu', '/projects/game-tracker/pokemon/locations', + '/projects/worldwide-todo', '/projects/animaldex', '/projects/derby', '/projects/spotify-beatmap-finder', @@ -70,7 +72,7 @@ function escapeXml(value: string): string { } export const GET: RequestHandler = async () => { - const [articles, lists, books, moviesVisibility] = await Promise.all([ + const [articles, lists, books, moviesVisibility, worldtodo] = await Promise.all([ db .select({ slug: blogArticles.slug, updatedAt: blogArticles.updatedAt }) .from(blogArticles) @@ -81,7 +83,8 @@ export const GET: RequestHandler = async () => { .from(bookWorks) // Articles are links to other sites; their pages here are thin. .where(and(ne(bookWorks.kind, 'article'), isNull(bookWorks.archivedAt))), - getVisibility() + getVisibility(), + sitemapSlugs().catch(() => []) ]); const entries: { path: string; lastmod?: string }[] = [ ...staticPaths @@ -96,6 +99,10 @@ export const GET: RequestHandler = async () => { ...books.map((book) => ({ path: `/trackers/books/${book.id}`, lastmod: book.updatedAt.toISOString() + })), + ...worldtodo.map((task) => ({ + path: `/projects/worldwide-todo/${encodeURIComponent(task.slug)}`, + lastmod: task.updatedAt })) ]; const body = `\n\n${entries diff --git a/src/routes/start/+page.svelte b/src/routes/start/+page.svelte index 82c0508..2e5bc91 100644 --- a/src/routes/start/+page.svelte +++ b/src/routes/start/+page.svelte @@ -15,7 +15,7 @@ import TrackerIcon from '#lib/components/TrackerIcon.svelte'; import PrivateLock from '#lib/components/PrivateLock.svelte'; import Sparkline from '#lib/components/Sparkline.svelte'; - import { visibleTrackers } from '#lib/projects.js'; + import { projects, visibleTrackers } from '#lib/projects.js'; let { data, form } = $props(); @@ -337,7 +337,9 @@ .flatMap((t) => [t, ...(t.children ?? [])]) .map((t) => ({ name: t.name, href: t.href, kind: 'tracker' })), ...extraHits.map((t) => ({ ...t, kind: 'tracker' })), - ...statsHits.map((t) => ({ ...t, kind: 'stats' })) + ...statsHits.map((t) => ({ ...t, kind: 'stats' })), + ...projects.map((p) => ({ name: p.name, href: p.href, kind: 'project' })), + { name: 'Worldwide todo queue', href: '/projects/worldwide-todo/queue', kind: 'project' } ]); const hits = $derived.by(() => { const q = query.trim().toLowerCase(); @@ -569,6 +571,9 @@ > {/if} stats + todo queue {#if data.weight}{data.weight.kg} kg{/if}