UNPKG

@tricoteuses/senat

Version:

Handle French Sénat's open data

223 lines (222 loc) 8.11 kB
import { sql } from "kysely"; import { jsonArrayFrom } from "kysely/helpers/postgres"; import { dbDosleg } from "../databases"; import { concat, removeSubstring, rtrim, toDateString } from "./util"; function orderOrdreOrigineTexte(expr) { return sql `array_position(array['0','2','1'], ${expr})`; } function datesSeances(lectureAssembleeId) { return jsonArrayFrom(dbDosleg .selectFrom("date_seance") .where("date_seance.lecidt", "=", lectureAssembleeId) .select(({ ref }) => [ toDateString(ref("date_seance.date_s")).as("date"), ])); } function auteursRapport(rapportId) { return jsonArrayFrom(dbDosleg .selectFrom("auteur") .leftJoin("ecr", "ecr.autcod", "auteur.autcod") .where("ecr.rapcod", "=", rapportId) .select([ "auteur.prenom as prenom", "auteur.nomuse as nom_usuel", "auteur.autmat as matricule", ]) .orderBy("ecr.ecrnumtri", "asc")); } function rapports(lectureAssembleeId) { return jsonArrayFrom(dbDosleg .selectFrom("rap") .leftJoin("lecassrap", "lecassrap.rapcod", "rap.rapcod") .leftJoin("denrap", "denrap.coddenrap", "rap.coddenrap") .where("lecassrap.lecassidt", "=", lectureAssembleeId) .select(({ eb, ref, val }) => [ "rap.rapnum as numero", eb .case() .when("rap.typurl", "=", "I") .then(removeSubstring(ref("rap.rapurl"), val(".html"))) .else(null) .end() .as("id"), eb .case() .when("rap.typurl", "=", "I") .then(concat(val("https://www.senat.fr/rap/"), rtrim(ref("rap.rapurl")))) .else(rtrim(ref("rap.rapurl"))) .end() .as("url"), rtrim(ref("denrap.libdenrap")).as("type"), toDateString(ref("rap.date_depot")).as("date"), "sesann as session", auteursRapport(ref("rap.rapcod")).as("auteurs"), ])); } function auteursTexte(texteId) { return jsonArrayFrom(dbDosleg .selectFrom("auteur") .leftJoin("ecr", "ecr.autcod", "auteur.autcod") .where("ecr.texcod", "=", texteId) .select([ "auteur.prenom as prenom", "auteur.nomuse as nom_usuel", "auteur.autmat as matricule", ]) .orderBy("ecr.ecrnumtri", "asc")); } function textes(lectureAssembleeId) { return jsonArrayFrom(dbDosleg .selectFrom("texte") .leftJoin("oritxt", "oritxt.oritxtcod", "texte.oritxtcod") .leftJoin("typtxt", "typtxt.typtxtcod", "texte.typtxtcod") .where("texte.lecassidt", "=", lectureAssembleeId) .select(({ eb, ref, val }) => [ "texte.texnum as numero", eb .case() .when("texte.typurl", "=", "I") .then(removeSubstring(ref("texte.texurl"), val(".html"))) .else(null) .end() .as("id"), eb .case() .when("texte.typurl", "=", "I") .then(concat(val("https://www.senat.fr/leg/"), rtrim(ref("texte.texurl")))) .else(rtrim(ref("texte.texurl"))) .end() .as("url"), rtrim(ref("oritxt.oritxtlib")).as("origine"), rtrim(ref("typtxt.typtxtlib")).as("type"), toDateString(ref("texte.txtoritxtdat")).as("date"), "sesann as session", auteursTexte(ref("texte.texcod")).as("auteurs"), ]) .orderBy(({ ref }) => orderOrdreOrigineTexte(ref("oritxt.oriordre")))); } function lecturesAssemblee(lectureId) { return jsonArrayFrom(dbDosleg .selectFrom("lecass") .where("lecass.lecidt", "=", lectureId) .leftJoin("ass", "ass.codass", "lecass.codass") .leftJoin("org", "org.orgcod", "lecass.orgcod") .select(({ ref }) => [ rtrim(ref("ass.libass")).as("assemblee"), "org.orgnom as libelle_organisme", "org.senorgcod as code_organisme", "lecass.ordreass as ordre_lecture_assemblee", "lecass.sesann as session", textes(ref("lecass.lecassidt")).as("textes"), rapports(ref("lecass.lecassidt")).as("rapports"), datesSeances(ref("lecass.lecassidt")).as("dates_seances"), ]) .orderBy("lecass.ordreass", "asc")); } function lectures(loiId) { return jsonArrayFrom(dbDosleg .selectFrom("lecture") .leftJoin("typlec", "typlec.typleccod", "lecture.typleccod") .where("lecture.loicod", "=", loiId) .select(({ ref }) => [ rtrim(ref("typlec.typleclib")).as("type_lecture"), rtrim(ref("lecture.leccom")).as("libelle"), "typlec.typlecord as ordre_lecture", lecturesAssemblee(ref("lecture.lecidt")).as("lectures_assemblee"), ]) .orderBy("typlec.typlecord", "asc")); } function themes(loiId) { return jsonArrayFrom(dbDosleg .selectFrom("the") .leftJoin("loithe", "loithe.thecle", "the.thecle") .where("loithe.loicod", "=", loiId) .select([ "the.thelib as libelle", ])); } const findAllQuery = dbDosleg .selectFrom("loi") .leftJoin("typloi", "typloi.typloicod", "loi.typloicod") .leftJoin("etaloi", "etaloi.etaloicod", "loi.etaloicod") .select(({ eb, ref, val }) => [ "loi.signet as signet", concat(val("https://www.senat.fr/dossier-legislatif/"), ref("loi.signet"), val(".html")).as("url"), concat(rtrim(ref("typloi.typloiden")), val(" "), rtrim(ref("loi.loitit"))).as("titre"), rtrim(ref("loi.loient")).as("titre_court"), rtrim(ref("typloi.groupe")).as("code_nature_dossier"), rtrim(ref("typloi.typloilib")).as("libelle_type_dossier"), rtrim(ref("etaloi.etaloilib")).as("etat_dossier"), "loi.url_an as url_dossier_assemblee_nationale", toDateString(ref("loi.date_decision")).as("date_decision_CoC"), "loi.num_decision as num_decision_CoC", "loi.deccocurl as url_decision_CoC", toDateString(ref("loi.saisine_date")).as("date_saisine_CoC"), "loi.saisine_par as condition_saisine_CoC", toDateString(ref("loi.date_loi")).as("date_promulgation"), "loi.numero as numero_loi", eb .case() .when("loi.loititjo", "is not", null) .then(concat(rtrim(ref("typloi.typloiden")), val(" "), rtrim(ref("loi.loititjo")))) .else("") .end() .as("titre_JO"), toDateString(ref("loi.loidatjo")).as("date_publication_JO"), "loi.loinumjo as numero_JO", "loi.url_jo as url_JO", lectures(ref("loi.loicod")).as("lectures"), themes(ref("loi.loicod")).as("themes"), ]) .$narrowType(); export function findAll() { return findAllQuery.stream(); } export function findSenatTexteUrls(sessions = []) { const sessionsStr = sessions.map(session => String(session)); return dbDosleg .selectFrom("texte") .where("texurl", "is not", null) .where("typurl", "=", "I") .$if(sessions.length > 0, (qb) => qb.where("sesann", "in", sessionsStr)) .select(({ eb, ref }) => [ "sesann as session", rtrim(ref("texurl")).as("url"), eb .case() .when("oritxtcod", "=", "1") .then(true) .else(false) .end() .as("hasExposeDesMotifs"), ]) .$narrowType() .stream(); } export function findSenatRapportUrls(sessions = []) { const sessionsStr = sessions.map(session => String(session)); return dbDosleg .selectFrom("rap") .where("rapurl", "is not", null) .where("typurl", "=", "I") .$if(sessions.length > 0, (qb) => qb.where("sesann", "in", sessionsStr)) .select(({ ref }) => [ "sesann as session", rtrim(ref("rapurl")).as("url"), ]) .$narrowType() .stream(); } const findAuteursQuery = dbDosleg .selectFrom("auteur") .select([ "autcod as code", "nomuse as nom", "prenom as prenom", "autmat as matricule", ]); export async function findAuteur(auteurCode) { return findAuteursQuery .where("autcod", "=", auteurCode) .executeTakeFirst(); }