Skip to content

Commit

Permalink
update prisma to support stagging (#60)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexfauquette authored Oct 25, 2024
1 parent a69c4df commit 33e864d
Show file tree
Hide file tree
Showing 16 changed files with 502 additions and 150 deletions.
30 changes: 10 additions & 20 deletions app/[legislature]/dossier/[id]/debat/DebateFilterBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,8 @@ import Typography from "@mui/material/Typography";
import ArrowBackIcon from "@mui/icons-material/ArrowBack";
import ArrowForwardIcon from "@mui/icons-material/ArrowForward";
import { Agenda } from "@prisma/client";
import Button from "@mui/material/Button";
import Menu from "@mui/material/Menu";
import Link from "next/link";

type Debat = {
uid: string;
libelleCourtLieu: string | null;
libelleLongLieu: string | null;
timestampDebut: Date;
compteRenduRef: string;
};

type DebateFilterBarProps = {
reunions: Pick<
Agenda,
Expand All @@ -35,7 +25,7 @@ type DebateFilterBarProps = {
| "libelleLongLieu"
| "timestampDebut"
| "timestampFin"
| "compteRenduRef"
| "compteRenduRefUid"
>[];
// setDebateRef: (newRef: string) => void;
// debats: Debat[];
Expand All @@ -46,14 +36,14 @@ export const DebateFilterBar = (props: DebateFilterBarProps) => {
const sceanceUid = useSelectedLayoutSegment();

const reunionIndex = reunions.findIndex(
(reunion) => reunion.compteRenduRef === sceanceUid
(reunion) => reunion.compteRenduRefUid === sceanceUid
);
if (!sceanceUid || reunionIndex < 0) {
if (reunions.length > 0) {
if (sceanceUid) {
permanentRedirect(`${reunions[0].compteRenduRef}`);
permanentRedirect(`${reunions[0].compteRenduRefUid}`);
} else {
permanentRedirect(`debat/${reunions[0].compteRenduRef}`);
permanentRedirect(`debat/${reunions[0].compteRenduRefUid}`);
}
}
}
Expand Down Expand Up @@ -86,18 +76,18 @@ export const DebateFilterBar = (props: DebateFilterBarProps) => {
<Select value={sceanceUid} displayEmpty sx={{ flex: 1 }}>
{reunions.map(
({
compteRenduRef,
compteRenduRefUid,
libelleCourtLieu,
libelleLongLieu,
timestampDebut,
}) => {
return (
// @ts-ignore
<MenuItem
key={compteRenduRef}
value={compteRenduRef}
key={compteRenduRefUid}
value={compteRenduRefUid}
component={Link}
href={compteRenduRef}
href={compteRenduRefUid}
>
<Typography
variant="caption"
Expand Down Expand Up @@ -141,7 +131,7 @@ export const DebateFilterBar = (props: DebateFilterBarProps) => {
href={
reunionIndex <= 0
? ""
: reunions[reunionIndex - 1].compteRenduRef!
: reunions[reunionIndex - 1].compteRenduRefUid!
}
disabled={reunionIndex <= 0}
>
Expand All @@ -153,7 +143,7 @@ export const DebateFilterBar = (props: DebateFilterBarProps) => {
href={
reunionIndex >= reunions.length - 1
? ""
: reunions[reunionIndex + 1].compteRenduRef!
: reunions[reunionIndex + 1].compteRenduRefUid!
}
disabled={reunionIndex >= reunions.length - 1}
>
Expand Down
14 changes: 7 additions & 7 deletions app/[legislature]/dossier/[id]/debat/[compteRenduRef]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import * as React from "react";
import { prisma } from "@/prisma";
import { DebateSummary } from "@/app/[legislature]/dossier/[id]/debat/[compteRenduRef]/DebateSummary";
import { DebateSummary } from "./DebateSummary";
import { SUMMARY_CODES } from "@/components/const";
import { DebateTranscript } from "./DebateTranscript";

async function getParagraphesUnCached(
compteRenduRef: string,
compteRenduRefUid: string,
dossierUid: string
) {
try {
const agenda = await prisma.agenda.findFirst({
where: {
compteRenduRef,
compteRenduRefUid,
},
include: {
pointsOdj: {
Expand All @@ -35,7 +35,7 @@ async function getParagraphesUnCached(

const paragraphes = await prisma.paragraphe.findMany({
where: {
debatRefUid: compteRenduRef,
debatRefUid: compteRenduRefUid,
valeurPtsOdj: index.toString(),
},
include: {
Expand All @@ -56,18 +56,18 @@ async function getParagraphesUnCached(
const getParagraphes = React.cache(getParagraphesUnCached);

export default async function Page({ params }: any) {
const { id: dossierUid, compteRenduRef } = params;
const { id: dossierUid, compteRenduRefUid } = params;

const { agenda, paragraphes } = await getParagraphes(
compteRenduRef,
compteRenduRefUid,
dossierUid
);

if (!paragraphes || paragraphes.length === 0) {
return <p>Aucun debat trouvé pour cette seance.</p>;
}

let lastId = 'init';
let lastId = "init";

const wordsCounts: Record<string, number> = paragraphes.reduce(
(acc, paragraphe) => {
Expand Down
8 changes: 4 additions & 4 deletions app/[legislature]/dossier/[id]/debat/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ async function getReunionsUnCached(uid: string) {
libelleLongLieu: true,
timestampDebut: true,
timestampFin: true,
compteRenduRef: true,
compteRenduRefUid: true,
pointsOdj: {
where: {
etat: { equals: "Confirmé" },
Expand Down Expand Up @@ -59,7 +59,7 @@ async function getReunionsUnCached(uid: string) {
libelleLongLieu,
timestampDebut,
timestampFin,
compteRenduRef,
compteRenduRefUid,
} = act.agendaRef;

return {
Expand All @@ -68,12 +68,12 @@ async function getReunionsUnCached(uid: string) {
libelleLongLieu,
timestampDebut,
timestampFin,
compteRenduRef,
compteRenduRefUid,
pointIndex,
};
})
.filter((agenda) => agenda !== null) // Extracted just for TS to understand
.filter((agenda) => agenda.compteRenduRef !== null)
.filter((agenda) => agenda.compteRenduRefUid !== null)
.filter(
// Otherwise we have an issue. TODO: throw an error instead of silently failing.
(agenda) => agenda.pointIndex > 0 && agenda.timestampDebut
Expand Down
112 changes: 62 additions & 50 deletions prisma/models/acteur.prisma
Original file line number Diff line number Diff line change
@@ -1,79 +1,91 @@
/// Personne physique ayant été élue ou nommée dans un organe.
model Acteur {
/// Identifiant unique.
uid String @id
uid String @id
/// Jeu de données de provenance (numéro de législature)
dataset Int
dataset Int
/// Prénom.
prenom String
prenom String
/// Nom.
nom String
nom String
/// Civilité.
civ String
civ String
/// Date de naissance.
dateNais DateTime?
dateNais DateTime?
/// Date de décès.
dateDeces DateTime?
dateDeces DateTime?
/// Ville de naissance.
villeNais String?
villeNais String?
/// Département de naissance.
depNais String?
depNais String?
/// Pays de naissance.
paysNais String?
paysNais String?
/// Profession.
profession String?
profession String?
/// Catégorie socio professionelle de l'INSEE.
catSocPro String?
catSocPro String?
/// Famille socio professionelle de l'INSEE.
famSocPro String?
slug String
famSocPro String?
slug String
/// URL de la déclaration d'intérêt de l'acteur sur le site de la Haute Autorité pour la Transparence dans la Vie Publique.
uriHatvp String?
uriHatvp String?
/// Deputé en poste actuellement.
actif Boolean? @default(false)
actif Boolean? @default(false)
/// Groupe parlementaire du député.
groupeParlementaireUid String?
groupeParlementaireUid String?
/// Mandat principal du député, c'est à dire s'il est actif ou non.
mandatPrincipalUid String? @unique
mandatPrincipalUid String? @unique
/// Organe de circonscription
circonscriptionUid String?
circonscriptionUid String?
/// Identifiant unique de la commission permanente et active de cet acteur.
commissionPermanenteRefUid String?
commissionPermanenteRefUid String?
/// URL de l'image de l'acteur
urlImage String?
/// Chambre du parlementaire (assemblée ou sénat)
chambre String?
compteTwitter String?
groupeParlementaire Organe? @relation("Acteur_GroupeParlementaire", fields: [groupeParlementaireUid], references: [uid])
mandatPrincipal Mandat? @relation("Acteur_MandatPrincipal", fields: [mandatPrincipalUid], references: [uid])
circonscription Organe? @relation("Acteur_Circonscription", fields: [circonscriptionUid], references: [uid])
chambre String?
compteTwitter String?
groupeParlementaire Organe? @relation("Acteur_GroupeParlementaire", fields: [groupeParlementaireUid], references: [uid])
mandatPrincipal Mandat? @relation("Acteur_MandatPrincipal", fields: [mandatPrincipalUid], references: [uid])
circonscription Organe? @relation("Acteur_Circonscription", fields: [circonscriptionUid], references: [uid])
/// Commission permanente et active de cet acteur.
commissionPermanente Organe? @relation(fields: [commissionPermanenteRefUid], references: [uid])
commissionPermanente Organe? @relation(fields: [commissionPermanenteRefUid], references: [uid])
/// Fonction de cet acteur au sein de sa commission permanente.
fonctionCommissionPermanente String?
auteurActeLegislatif ActeLegislatif[] @relation("ActeLegislatif_auteurMotion")
reunionsDemandees ActeurDemandeur[]
adressesElectroniques AdresseElectronique[]
adressesPostales AdressePostale[]
amendements Amendement[]
coSignataireAmendement CoSignataireAmendement[]
auteurs Auteur[]
auteursMotion AuteurMotion[]
coSignataireDocument CoSignataireDocument[]
documents Document[]
dysfonctionnements Dysfonctionnement[]
initiateurActeLegislatif InitiateurActeLegislatif[]
initiateurDossiers InitiateurDossier[]
mandats Mandat[] @relation("Mandat_Acteur")
votes Vote[]
misesAuPoint MiseAuPoint[]
reunions ParticipantReunion[]
auditionsReunions PersonneAuditionneeReunion[]
questions Question[]
rapporteurs Rapporteur[]
suppletions Suppleant[]
interventions Paragraphe[]
auteurActeLegislatif ActeLegislatif[] @relation("ActeLegislatif_auteurMotion")
reunionsDemandees ActeurDemandeur[]
adressesElectroniques AdresseElectronique[]
adressesPostales AdressePostale[]
amendements Amendement[]
coSignataireAmendement CoSignataireAmendement[]
auteurs Auteur[]
auteursMotion AuteurMotion[]
coSignataireDocument CoSignataireDocument[]
documents Document[]
dysfonctionnements Dysfonctionnement[]
initiateurActeLegislatif InitiateurActeLegislatif[]
initiateurDossiers InitiateurDossier[]
mandats Mandat[] @relation("Mandat_Acteur")
collaborateurs Collaborateur[]
votes Vote[]
misesAuPoint MiseAuPoint[]
reunions ParticipantReunion[]
auditionsReunions PersonneAuditionneeReunion[]
questions Question[]
rapporteurs Rapporteur[]
suppletions Suppleant[]
interventions Paragraphe[]
/// Les dossiers de cet acteur.
dossiers Dossier[]
vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, ((immutable_unaccent((COALESCE(prenom, ''::text))::character varying) || ' '::text) || immutable_unaccent((COALESCE(nom, ''::text))::character varying)))"))
dossiers Dossier[]
vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, ((immutable_unaccent((COALESCE(prenom, ''::text))::character varying) || ' '::text) || immutable_unaccent((COALESCE(nom, ''::text))::character varying)))"))
/// Nombre d'amendements pour cet acteur.
nombreAmendements Int @default(0)
/// Nombre d'interventions pour cet acteur.
nombreInterventions Int @default(0)
/// Nombre de questions pour cet acteur.
nombreQuestions Int @default(0)
/// Lois présentées au nom de cet acteur (e.g. un premier ministre).
loisPortees TexteLoi[] @relation("loisPortees")
Expand Down
34 changes: 20 additions & 14 deletions prisma/models/agenda.prisma
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/// Toutes les réunions de commissions, les séances publiques, les groupes d'amitiés `etc <organe.html#code-du-type-d-organe>`__. Réunion qui a lieu dans une salle réservée dans le système informatique de l’assemblée nationale, y compris les séances publiques qui ont lieu dans l'hémicycle. Cela peut aussi être une réunion dite internationale qui a lieu hors de l'assemblée.
model Agenda {
/// Identifiant unique.
uid String @id
uid String @id
/// Jeu de données de provenance (numéro de législature)
dataset Int
/// Type de la réunion
Expand All @@ -22,7 +22,7 @@ model Agenda {
captationVideo Boolean?
visioConference Boolean?
/// Identifiant unique du compte rendu d'une séance publique. Uniquement si xsiType égal à 'seance_type'.
compteRenduRef String?
compteRenduRefUid String?
/// Date à laquelle la séance publique a lieu.
dateSeance DateTime?
/// Le contenu de ce champ n'est pas défini.
Expand Down Expand Up @@ -56,26 +56,32 @@ model Agenda {
/// Texte court décrivant l'objet de la réunion.
resumeOdj String[]
/// Nombre de participants à la réunion
nombreParticipants Int? @default(0)
nombreParticipants Int? @default(0)
organeReunionRefUid String?
/// Organes à l'initiative de la réunion.
organeDemandeurRefUid String?
vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, immutable_unaccent((((COALESCE(immutable_array_to_string(\"convocationOdj\", ' '::text), ''::text) || ' '::text) || immutable_unaccent((COALESCE(immutable_array_to_string(\"resumeOdj\", ' '::text), ''::text))::character varying)))::character varying))"))
actesLegislatif ActeLegislatif[]
acteursDemandeurs ActeurDemandeur[]
organeDemandeurRef Organe? @relation("OrganeDemandeur", fields: [organeDemandeurRefUid], references: [uid])
organeReunionRef Organe? @relation("OrganeReunion", fields: [organeReunionRefUid], references: [uid])
participantsInternes ParticipantReunion[]
personnesAuditionnees PersonneAuditionneeReunion[]
pointsOdj PointOdj[]
scrutins Scrutin[]
amendements Amendement[]
debats Debat[]
/// Vrai si la réunion contient (au moins) une audition.
contientAudition Boolean @default(false)
vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, immutable_unaccent((((COALESCE(immutable_array_to_string(\"convocationOdj\", ' '::text), ''::text) || ' '::text) || immutable_unaccent((COALESCE(immutable_array_to_string(\"resumeOdj\", ' '::text), ''::text))::character varying)))::character varying))"))
compteRenduRef Debat? @relation(fields: [compteRenduRefUid], references: [uid])
organeDemandeurRef Organe? @relation("OrganeDemandeur", fields: [organeDemandeurRefUid], references: [uid])
organeReunionRef Organe? @relation("OrganeReunion", fields: [organeReunionRefUid], references: [uid])
actesLegislatif ActeLegislatif[]
acteursDemandeurs ActeurDemandeur[]
participantsInternes ParticipantReunion[]
personnesAuditionnees PersonneAuditionneeReunion[]
pointsOdj PointOdj[]
scrutins Scrutin[]
amendements Amendement[]
@@index([dataset])
@@index([vecteurRecherche], type: Gin)
@@index([organeDemandeurRefUid])
@@index([organeReunionRefUid])
@@index([compteRenduRefUid])
@@index([dateSeance])
}

/// Point de l'ordre du jour.
Expand Down
Loading

0 comments on commit 33e864d

Please sign in to comment.