diff --git a/app/services/gerichtsfinder/checkURLs.ts b/app/services/gerichtsfinder/checkURLs.ts index aa1be97fb..fa59c43d0 100644 --- a/app/services/gerichtsfinder/checkURLs.ts +++ b/app/services/gerichtsfinder/checkURLs.ts @@ -1,14 +1,21 @@ import fs from "node:fs"; import path from "node:path"; -import { http, https } from "follow-redirects"; +import { type FollowResponse, http, https } from "follow-redirects"; import pMap from "p-map"; import { getEncrypted } from "./encryptedStorage"; import type { GerbehFile } from "./convertJsonDataTable"; import { normalizeURL } from "../../util/strings"; +import { type IncomingMessage } from "node:http"; -const manualReplacements = { +const manualReplacements: Record = { "www.amtsgericht-straubing.de": "https://www.justiz.bayern.de/gerichte-und-behoerden/amtsgerichte/straubing/", + "www.saarland.de/amtsgericht_saarlouis.htm": + "https://www.saarland.de/agsls/DE/home/home_node.html", + "www.justiz.bayern.de/gericht/ag-aoe": + "https://www.justiz.bayern.de/gerichte-und-behoerden/amtsgerichte/altoetting/", + "https://ordentliche-gerichtsbarkeit.hessen.de/AG-Koenigstein": + "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-frankfurt-am-main/amtsgericht-koenigstein-im-taunus", }; const OUTFILE = path.resolve( @@ -25,19 +32,48 @@ function allCourtURLs() { return Object.values(gerbehDb).map((court) => court?.URL1 ?? ""); } +function warnIfNot200( + intialUrl: string, + response: IncomingMessage & FollowResponse, +) { + if (response.statusCode && response.statusCode !== 200) + console.warn( + `Warning: ${intialUrl} was forwarded to ${response.responseUrl} with statuscode ${response.statusCode}`, + ); +} + function checkUrl(urlString: string) { - // First follow https, then follow http + // 1. try manual replacement or https, 2. try http, 3. try strip www. subdomain (for example www.ag-badliebenwerda.brandenburg.de) return new Promise<[string, string]>((resolve) => https - .get(normalizeURL(urlString, "https"), (response) => { - resolve([urlString, response.responseUrl]); - }) + .get( + manualReplacements[urlString] ?? normalizeURL(urlString, "https"), + (response) => { + warnIfNot200(urlString, response); + resolve([urlString, response.responseUrl]); + }, + ) .on("error", () => { http .get(normalizeURL(urlString, "http"), (response) => { + warnIfNot200(urlString, response); resolve([urlString, response.responseUrl]); }) - .on("error", () => resolve([urlString, ""])); + .on("error", () => { + https + .get( + normalizeURL(urlString.replace("www.", ""), "https"), + (response) => { + warnIfNot200(urlString, response); + resolve([urlString, response.responseUrl]); + }, + ) + .on("error", () => { + if (urlString) + console.error(`No valid redirect found for ${urlString}`); + resolve([urlString, ""]); + }); + }); }), ); } @@ -46,12 +82,7 @@ async function checkAllURLS() { const urls = allCourtURLs(); const uniqueURLs = Array.from(new Set(urls)); console.log(`Checking a total of ${uniqueURLs.length} unique URLs...`); - const checkedURLs = await pMap(uniqueURLs, checkUrl, { concurrency }); - const urlMap = Object.fromEntries(checkedURLs); - for (const [url, correction] of Object.entries(manualReplacements)) { - urlMap[url] = correction; - } - return urlMap; + return Object.fromEntries(await pMap(uniqueURLs, checkUrl, { concurrency })); } async function writeURLMap() { diff --git a/app/services/gerichtsfinder/data/sanitizedURLs.json b/app/services/gerichtsfinder/data/sanitizedURLs.json index 937767399..04b0b8b4c 100644 --- a/app/services/gerichtsfinder/data/sanitizedURLs.json +++ b/app/services/gerichtsfinder/data/sanitizedURLs.json @@ -254,7 +254,7 @@ "https://ag-seligenstadt-justiz.hessen.de": "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-darmstadt/amtsgericht-seligenstadt", "https://ag-badhomburg-justiz.hessen.de": "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-frankfurt-am-main/amtsgericht-bad-homburg-v-d-hoehe", "https://ag-frankfurt-justiz.hessen.de": "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-frankfurt-am-main/amtsgericht-frankfurt-am-main", - "https://ordentliche-gerichtsbarkeit.hessen.de/AG-Koenigstein": "https://ordentliche-gerichtsbarkeit.hessen.de/AG-Koenigstein", + "https://ordentliche-gerichtsbarkeit.hessen.de/AG-Koenigstein": "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-frankfurt-am-main/amtsgericht-koenigstein-im-taunus", "https://ag-badhersfeld-justiz.hessen.de": "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-fulda/amtsgericht-bad-hersfeld", "https://ag-fulda-justiz.hessen.de": "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-fulda/amtsgericht-fulda", "https://ag-huenfeld-justiz.hessen.de": "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-fulda/amtsgericht-huenfeld", @@ -282,50 +282,50 @@ "https://ag-idstein-justiz.hessen.de": "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-wiesbaden/amtsgericht-idstein", "https://ag-ruedesheim-justiz.hessen.de": "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-wiesbaden/amtsgericht-ruedesheim-am-rhein", "https://ag-wiesbaden-justiz.hessen.de": "https://ordentliche-gerichtsbarkeit.hessen.de/landgerichtsbezirk-wiesbaden/amtsgericht-wiesbaden", - "www.agkh.justiz.rlp.de": "https://agkh.justiz.rlp.de/de/startseite/", - "www.agio.justiz.rlp.de": "https://agio.justiz.rlp.de/de/startseite/", + "www.agkh.justiz.rlp.de": "https://agkh.justiz.rlp.de/", + "www.agio.justiz.rlp.de": "https://agio.justiz.rlp.de/", "www.agsim.justiz.rlp.de": "https://agsim.justiz.rlp.de/de/startseite/", "www.agsob.justiz.rlp.de": "https://agsob.justiz.rlp.de/de/startseite/", "www.agak.justiz.rlp.de": "https://agak.justiz.rlp.de/de/startseite/", - "www.agand.justiz.rlp.de": "https://agand.justiz.rlp.de/de/startseite/", + "www.agand.justiz.rlp.de": "https://agand.justiz.rlp.de/", "www.agaw.justiz.rlp.de": "https://agaw.justiz.rlp.de/de/startseite/", - "www.agbd.justiz.rlp.de": "https://agbd.justiz.rlp.de/de/startseite/", - "www.agcoc.justiz.rlp.de": "https://agcoc.justiz.rlp.de/de/startseite/", - "www.agdz.justiz.rlp.de": "https://agdz.justiz.rlp.de/de/startseite/", + "www.agbd.justiz.rlp.de": "https://agbd.justiz.rlp.de/", + "www.agcoc.justiz.rlp.de": "https://agcoc.justiz.rlp.de/", + "www.agdz.justiz.rlp.de": "https://agdz.justiz.rlp.de/", "www.agko.justiz.rlp.de": "https://agko.justiz.rlp.de/de/startseite/", "www.aglah.justiz.rlp.de": "https://aglah.justiz.rlp.de/de/startseite/", - "www.aglin.justiz.rlp.de": "https://aglin.justiz.rlp.de/de/startseite/", - "www.agmy.justiz.rlp.de": "https://agmy.justiz.rlp.de/de/startseite/", + "www.aglin.justiz.rlp.de": "https://aglin.justiz.rlp.de/", + "www.agmy.justiz.rlp.de": "https://agmy.justiz.rlp.de/", "www.agmon.justiz.rlp.de": "https://agmon.justiz.rlp.de/de/startseite/", "www.agnr.justiz.rlp.de": "https://agnr.justiz.rlp.de/de/startseite/", - "www.aggoa.justiz.rlp.de": "https://aggoa.justiz.rlp.de/de/startseite/", - "www.agsin.justiz.rlp.de": "https://agsin.justiz.rlp.de/de/startseite/", - "www.agwes.justiz.rlp.de": "https://agwes.justiz.rlp.de/de/startseite/", - "www.agaz.justiz.rlp.de": "https://agaz.justiz.rlp.de/de/startseite/", + "www.aggoa.justiz.rlp.de": "https://aggoa.justiz.rlp.de/", + "www.agsin.justiz.rlp.de": "https://agsin.justiz.rlp.de/", + "www.agwes.justiz.rlp.de": "https://agwes.justiz.rlp.de/", + "www.agaz.justiz.rlp.de": "https://agaz.justiz.rlp.de/", "www.agbi.justiz.rlp.de": "https://agbi.justiz.rlp.de/de/startseite/", "www.agmz.justiz.rlp.de": "https://agmz.justiz.rlp.de/de/startseite/", "www.agwo.justiz.rlp.de": "https://agwo.justiz.rlp.de/de/startseite/", - "www.agber.justiz.rlp.de": "https://agber.justiz.rlp.de/de/startseite/", - "www.agbit.justiz.rlp.de": "https://agbit.justiz.rlp.de/de/startseite/", - "www.agdau.justiz.rlp.de": "https://agdau.justiz.rlp.de/de/startseite/", - "www.agher.justiz.rlp.de": "https://agher.justiz.rlp.de/de/startseite/", - "www.agpru.justiz.rlp.de": "https://agpru.justiz.rlp.de/de/startseite/", - "www.agsaa.justiz.rlp.de": "https://agsaa.justiz.rlp.de/de/startseite/", - "www.agtr.justiz.rlp.de": "https://agtr.justiz.rlp.de/de/startseite/", - "www.agwil.justiz.rlp.de": "https://agwil.justiz.rlp.de/de/startseite/", + "www.agber.justiz.rlp.de": "https://agber.justiz.rlp.de/", + "www.agbit.justiz.rlp.de": "https://agbit.justiz.rlp.de/", + "www.agdau.justiz.rlp.de": "https://agdau.justiz.rlp.de/", + "www.agher.justiz.rlp.de": "https://agher.justiz.rlp.de/", + "www.agpru.justiz.rlp.de": "https://agpru.justiz.rlp.de/", + "www.agsaa.justiz.rlp.de": "https://agsaa.justiz.rlp.de/", + "www.agtr.justiz.rlp.de": "https://agtr.justiz.rlp.de/", + "www.agwil.justiz.rlp.de": "https://agwil.justiz.rlp.de/", "www.agduw.justiz.rlp.de": "https://agduw.justiz.rlp.de/de/startseite/", "www.agft.justiz.rlp.de": "https://agft.justiz.rlp.de/de/startseite/", - "www.aggru.justiz.rlp.de": "https://aggru.justiz.rlp.de/de/startseite/", - "www.aglu.justiz.rlp.de": "https://aglu.justiz.rlp.de/de/startseite/", + "www.aggru.justiz.rlp.de": "https://aggru.justiz.rlp.de/", + "www.aglu.justiz.rlp.de": "https://aglu.justiz.rlp.de/", "www.agnw.justiz.rlp.de": "https://agnw.justiz.rlp.de/de/startseite/", "www.agsp.justiz.rlp.de": "https://agsp.justiz.rlp.de/de/startseite/", - "www.agkl.justiz.rlp.de": "https://agkl.justiz.rlp.de/de/startseite/", - "www.agkus.justiz.rlp.de": "https://agkus.justiz.rlp.de/de/startseite/", - "www.agro.justiz.rlp.de": "https://agro.justiz.rlp.de/de/startseite/", - "www.agger.justiz.rlp.de": "https://agger.justiz.rlp.de/de/startseite/", - "www.agkan.justiz.rlp.de": "https://agkan.justiz.rlp.de/de/startseite/", - "www.agld.justiz.rlp.de": "https://agld.justiz.rlp.de/de/startseite/", - "www.agbbz.justiz.rlp.de": "https://agbbz.justiz.rlp.de/de/startseite/", + "www.agkl.justiz.rlp.de": "https://agkl.justiz.rlp.de/", + "www.agkus.justiz.rlp.de": "https://agkus.justiz.rlp.de/", + "www.agro.justiz.rlp.de": "https://agro.justiz.rlp.de/", + "www.agger.justiz.rlp.de": "https://agger.justiz.rlp.de/", + "www.agkan.justiz.rlp.de": "https://agkan.justiz.rlp.de/", + "www.agld.justiz.rlp.de": "https://agld.justiz.rlp.de/", + "www.agbbz.justiz.rlp.de": "https://agbbz.justiz.rlp.de/", "www.aglst.justiz.rlp.de": "https://aglst.justiz.rlp.de/de/startseite/", "www.agps.justiz.rlp.de": "https://agps.justiz.rlp.de/de/startseite/", "www.agzw.justiz.rlp.de": "https://agzw.justiz.rlp.de/de/startseite/", @@ -487,7 +487,7 @@ "www.justiz.bayern.de/gericht/ag/wor/": "https://www.justiz.bayern.de/gerichte-und-behoerden/amtsgerichte/wolfratshausen/", "www.amtsgericht-freyung.de": "https://www.justiz.bayern.de/gerichte-und-behoerden/amtsgerichte/freyung/", "www.justiz.bayern.de/gericht/ag/pa": "https://www.justiz.bayern.de/gerichte-und-behoerden/amtsgerichte/passau/", - "www.justiz.bayern.de/gericht/ag-aoe": "https://www.justiz.bayern.de/gericht/ag-aoe/", + "www.justiz.bayern.de/gericht/ag-aoe": "https://www.justiz.bayern.de/gerichte-und-behoerden/amtsgerichte/altoetting/", "www.justiz.bayern.de/gericht/ag/lf/": "https://www.justiz.bayern.de/gerichte-und-behoerden/amtsgerichte/laufen/", "www.justiz.bayern.de/gericht/ag/mue/": "https://www.justiz.bayern.de/gerichte-und-behoerden/amtsgerichte/muehldorf-am-inn/", "www.justiz.bayern.de/gericht/ag/ro/": "https://www.justiz.bayern.de/gerichte-und-behoerden/amtsgerichte/rosenheim/", @@ -514,7 +514,7 @@ "www.ag-nk.saarland.de": "https://www.saarland.de/agnk/DE/home/home_node.html", "www.ag-otw.saarland.de": "https://www.saarland.de/agotw/DE/home/home_node.html", "www.ag-sb.saarland.de": "https://www.saarland.de/agsb/DE/home/home_node.html", - "www.saarland.de/amtsgericht_saarlouis.htm": "https://www.saarland.de/amtsgericht_saarlouis.htm", + "www.saarland.de/amtsgericht_saarlouis.htm": "https://www.saarland.de/agsls/DE/home/home_node.html", "www.ag-igb.saarland.de": "https://www.saarland.de/agigb/DE/home/home_node.html", "www.ag-wnd.saarland.de": "https://www.saarland.de/agwnd/DE/home/home_node.html", "www.ag-vk.saarland.de": "https://www.saarland.de/agvk/DE/home/home_node.html",