Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update prisma to support stagging #60

Merged
merged 1 commit into from
Oct 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading