@tricoteuses/senat
Version:
Handle French Sénat's open data
90 lines (89 loc) • 4.27 kB
JavaScript
import { jsonArrayFrom } from "kysely/helpers/postgres";
import { dbSenat } from "../databases";
import { expandToRows, rtrim, toDateString } from "./util";
function reponses(questionId) {
return jsonArrayFrom(dbSenat
.withSchema("questions")
.selectFrom("tam_reponses")
.where("tam_reponses.idque", "=", questionId)
.select(({ ref }) => [
toDateString(ref("tam_reponses.datejorep")).as("date_reponse_JO"),
"tam_reponses.pagejorep as page_JO",
toDateString(ref("tam_reponses.errdate")).as("date_erratum_JO"),
"tam_reponses.minreplib as ministere_reponse",
"tam_reponses.minrepid as ministere_reponse_id",
"tam_reponses.urlrep as url",
"tam_reponses.txtrep as texte",
"tam_reponses.txterrrep as texte_erratum",
])
.orderBy("tam_reponses.datejorep", "asc"));
}
function themes(questionId) {
return jsonArrayFrom(dbSenat
.withSchema("questions")
.with("question_theme", (db) => db
.selectFrom("tam_questions")
.select(({ eb, ref, val }) => [
"id as question_id",
eb.cast(expandToRows(ref("tam_questions.themes"), val("#(\\d+)")), "smallint").as("theme_id"),
]))
.selectFrom("the")
.leftJoin("question_theme", "the.thenouidt", "question_theme.theme_id")
.where("question_theme.question_id", "=", questionId)
.select("the.thelib as libelle")
.orderBy("the.thenouidt", "asc"));
}
const findAllQuery = dbSenat
.withSchema("questions")
.selectFrom("tam_questions")
.leftJoin("tam_ministeres", "tam_questions.mindepotid", "tam_ministeres.minid")
.leftJoin("sortquestion", (join) => join.onRef("tam_questions.sorquecod", "=", (eb) => eb.cast("sortquestion.sorquecod", "bigint")))
.leftJoin("naturequestion", "tam_questions.natquecod", "naturequestion.natquecod")
.leftJoin("etatquestion", (join) => join.onRef("tam_questions.etaquecod", "=", (eb) => eb.cast("etatquestion.etaquecod", "bigint")))
.select(({ ref }) => [
"tam_questions.repub as republique",
"tam_questions.legislature as legislature",
"tam_questions.natquecod as nature",
"naturequestion.natquelib as nature_libelle",
"tam_questions.numero as numero",
"tam_questions.reference as reference",
"tam_questions.titre as titre",
"tam_questions.nom as nom",
"tam_questions.prenom as prenom",
"tam_questions.nomtechnique as nom_technique",
"tam_questions.codequalite as civilite",
"tam_questions.matricule as matricule",
"tam_questions.cirnum as circonscription_numero",
"tam_questions.circonscription as circonscription",
"tam_questions.groupe as groupe",
"tam_questions.ratgrp as type_appartenance",
toDateString(ref("tam_questions.datejodepot")).as("date_publication_JO"),
"tam_questions.pagejodepot as page_JO",
rtrim(ref("tam_questions.mindepotlib")).as("ministere_depot"),
"tam_questions.mindepotid as ministere_depot_id",
toDateString(ref("tam_ministeres.datedebut")).as("ministere_depot_date_debut"),
toDateString(ref("tam_questions.datejotran")).as("date_transmission"),
"tam_questions.mintranlib as ministere_transmission",
toDateString(ref("tam_questions.datejorep1")).as("date_reponse_JO"),
toDateString(ref("tam_questions.dateerr")).as("date_erratum_JO"),
"tam_questions.pageerr as page_erratum_JO",
"tam_questions.minreplib1 as ministere_reponse",
toDateString(ref("tam_questions.datecloture")).as("date_cloture"),
toDateString(ref("tam_questions.datesignal")).as("date_signalement"),
"tam_questions.refquerappelee as reference_question_rappelee",
//"tam_questions.url as url", // TODO ?
"tam_questions.txtque as texte",
"tam_questions.txterrque as texte_erratum",
"tam_questions.rubrique as rubrique",
"sortquestion.sorquelib as sort",
"sortquestion.sorquecod as sort_code",
"sortquestion.sorquenumtri as sort_tri",
"etatquestion.etaquelib as etat_libelle",
"etatquestion.etaquecod as etat_code",
"etatquestion.etaquenumtri as etat_tri",
themes(ref("tam_questions.id")).as("themes"),
reponses(ref("tam_questions.id")).as("reponses"),
]);
export function findAll() {
return findAllQuery.stream();
}