@tricoteuses/senat
Version:
Handle French Sénat's open data
223 lines (222 loc) • 8.11 kB
JavaScript
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();
}