From 4afdb5edb61c9b8620e3b848fc4e8338654d2a8c Mon Sep 17 00:00:00 2001 From: Douglas DUTEIL Date: Thu, 3 Oct 2024 14:00:03 +0200 Subject: [PATCH] fix(organization): display the libelle of NAF/APE again --- .../src/set_context_variables.test.ts | 66 +++++++++++-------- .../middleware/src/set_context_variables.ts | 8 +-- packages/~/moderations/api/src/:id/context.ts | 2 + packages/~/moderations/api/src/:id/index.tsx | 26 ++++++++ packages/~/moderations/api/src/:id/page.tsx | 4 +- .../~/organizations/api/src/:id/Fiche.tsx | 4 +- .../~/organizations/api/src/:id/context.ts | 2 + .../~/organizations/api/src/:id/index.tsx | 23 ++++++- .../src/usecase/GetFicheOrganizationById.ts | 39 +++++++++++ .../organizations/ui/src/info/About.test.tsx | 31 +++++---- .../~/organizations/ui/src/info/About.tsx | 34 ++++------ .../info/__snapshots__/About.test.tsx.snap | 58 ++++++++++++---- 12 files changed, 215 insertions(+), 82 deletions(-) create mode 100644 packages/~/organizations/lib/src/usecase/GetFicheOrganizationById.ts diff --git a/packages/~/app/middleware/src/set_context_variables.test.ts b/packages/~/app/middleware/src/set_context_variables.test.ts index ffb929e3..499523f5 100644 --- a/packages/~/app/middleware/src/set_context_variables.test.ts +++ b/packages/~/app/middleware/src/set_context_variables.test.ts @@ -8,11 +8,6 @@ import { set_context_variables } from "./set_context_variables"; // test("set direct variables", async () => { - interface CloudEnv extends Env { - Variables: { - cloud: string; - }; - } const app = new Hono().get( "/", set_context_variables(() => ({ cloud: "☁️" })), @@ -26,46 +21,65 @@ test("set direct variables", async () => { expect(await res.json()).toEqual({ cloud: "☁️" }); }); +test("set multiple direct variables", async () => { + const app = new Hono().get( + "/", + set_context_variables(() => ({ cloud: "☁️" })), + set_context_variables(() => ({ sun: "🌞" })), + async ({ json, var: { cloud, sun } }) => { + return json({ cloud, sun }); + }, + ); + + const res = await app.request("/"); + expect(res.status).toBe(200); + expect(await res.json()).toEqual({ cloud: "☁️", sun: "🌞" }); +}); + test("set variables using parent context", async () => { - interface RootEnv extends Env { - Variables: { - sun: string; - }; - } - interface CloudEnv extends Env { - Variables: { - cloud: string; - }; - } - const app = new Hono().get( + const app = new Hono().get( "/", contextStorage(), - set_context_variables(() => { + set_context_variables(() => { const { var: { sun }, - } = getContext(); + } = getContext(); return { sun: sun ?? "🌞" }; }), - set_context_variables(({ var: {} }) => { + set_context_variables(() => { const { req, var: { sun }, - } = getContext(); - - return { cloud: req.query("search") === "sun" ? sun : "☁️" }; + } = getContext(); + const cloud = req.query("search") === "sun" ? sun : "☁️"; + return { cloud }; }), - async ({ json, var: { cloud } }) => { - return json({ cloud }); + async ({ json, var: { cloud, sun } }) => { + return json({ cloud, sun }); }, ); { const res = await app.request("/"); expect(res.status).toBe(200); - expect(await res.json()).toEqual({ cloud: "☁️" }); + expect(await res.json()).toEqual({ cloud: "☁️", sun: "🌞" }); } { const res = await app.request("/?search=sun"); expect(res.status).toBe(200); - expect(await res.json()).toEqual({ cloud: "🌞" }); + expect(await res.json()).toEqual({ cloud: "🌞", sun: "🌞" }); } }); + +// + +interface CloudEnv extends Env { + Variables: { + cloud: string; + }; +} + +interface SunEnv extends Env { + Variables: { + sun: string; + }; +} diff --git a/packages/~/app/middleware/src/set_context_variables.ts b/packages/~/app/middleware/src/set_context_variables.ts index f2b34024..f20ac807 100644 --- a/packages/~/app/middleware/src/set_context_variables.ts +++ b/packages/~/app/middleware/src/set_context_variables.ts @@ -1,6 +1,6 @@ // -import type { Context, Env } from "hono"; +import type { Env } from "hono"; import { createMiddleware } from "hono/factory"; import type { Input } from "hono/types"; @@ -11,14 +11,12 @@ export function set_context_variables< TPath extends string = string, TInput extends Input = {}, >( - fn: ( - ctx: Context, - ) => + fn: () => | NonNullable | PromiseLike>, ) { return createMiddleware(async (ctx, next) => { - const context_variables = await fn(ctx); + const context_variables = await fn(); for (const [key, value] of Object.entries(context_variables)) ctx.set(key as keyof TEnv["Variables"], value); return next(); diff --git a/packages/~/moderations/api/src/:id/context.ts b/packages/~/moderations/api/src/:id/context.ts index 9fe26a8d..b7fe0a63 100644 --- a/packages/~/moderations/api/src/:id/context.ts +++ b/packages/~/moderations/api/src/:id/context.ts @@ -4,6 +4,7 @@ import { NotFoundError } from "@~/app.core/error"; import type { App_Context } from "@~/app.middleware/context"; import { urls } from "@~/app.urls"; import { schema, type MonComptePro_PgDatabase } from "@~/moncomptepro.database"; +import type { GetFicheOrganizationByIdHandler } from "@~/organizations.lib/usecase/GetFicheOrganizationById"; import { type get_domain_count_dto } from "@~/organizations.repository/get_domain_count"; import { type get_organization_members_count_dto } from "@~/organizations.repository/get_organization_members_count"; import { and, eq } from "drizzle-orm"; @@ -24,6 +25,7 @@ export interface ContextVariablesType extends Env { domain: string; moderation: get_moderation_dto; organization_member: get_organization_member_dto; + organization_fiche: Awaited>; query_organization_members_count: Promise; query_domain_count: Promise; }; diff --git a/packages/~/moderations/api/src/:id/index.tsx b/packages/~/moderations/api/src/:id/index.tsx index f7277732..9ebc6f61 100644 --- a/packages/~/moderations/api/src/:id/index.tsx +++ b/packages/~/moderations/api/src/:id/index.tsx @@ -5,6 +5,8 @@ import { NotFoundError } from "@~/app.core/error"; import { Entity_Schema } from "@~/app.core/schema"; import { z_email_domain } from "@~/app.core/schema/z_email_domain"; import { Main_Layout } from "@~/app.layout/index"; +import { set_context_variables } from "@~/app.middleware/set_context_variables"; +import { GetFicheOrganizationById } from "@~/organizations.lib/usecase/GetFicheOrganizationById"; import { get_domain_count } from "@~/organizations.repository/get_domain_count"; import { get_organization_members_count } from "@~/organizations.repository/get_organization_members_count"; import { to } from "await-to-js"; @@ -15,6 +17,7 @@ import { get_moderation, get_organization_member, type ContextType, + type ContextVariablesType, } from "./context"; import duplicate_warning_router from "./duplicate_warning"; import moderation_email_router from "./email/index"; @@ -93,6 +96,29 @@ export default new Hono() ); return next(); }, + async function set_context(ctx, next) { + const { + domain, + moderation, + organization_member, + query_domain_count, + query_organization_members_count, + } = ctx.var; + const get_fiche_organization_by_id = GetFicheOrganizationById({ + pg: ctx.var.moncomptepro_pg, + }); + const organization_fiche = await get_fiche_organization_by_id( + moderation.organization_id, + ); + return set_context_variables(() => ({ + domain, + moderation, + organization_fiche, + organization_member, + query_domain_count, + query_organization_members_count, + }))(ctx as any, next); + }, function GET({ render }) { return render(); }, diff --git a/packages/~/moderations/api/src/:id/page.tsx b/packages/~/moderations/api/src/:id/page.tsx index 1e6d96d0..e11ac56c 100644 --- a/packages/~/moderations/api/src/:id/page.tsx +++ b/packages/~/moderations/api/src/:id/page.tsx @@ -19,7 +19,7 @@ import { usePageRequestContext } from "./context"; export default async function Moderation_Page() { const { - var: { moderation }, + var: { moderation, organization_fiche }, } = usePageRequestContext(); return ( @@ -70,7 +70,7 @@ export default async function Moderation_Page() { 🏛 Organisation - + diff --git a/packages/~/organizations/api/src/:id/Fiche.tsx b/packages/~/organizations/api/src/:id/Fiche.tsx index 22f0432c..44903f65 100644 --- a/packages/~/organizations/api/src/:id/Fiche.tsx +++ b/packages/~/organizations/api/src/:id/Fiche.tsx @@ -8,12 +8,12 @@ import { usePageRequestContext } from "./context"; export async function Fiche() { const { - var: { organization }, + var: { organization, organization_fiche }, } = usePageRequestContext(); return (
- +
); diff --git a/packages/~/organizations/api/src/:id/context.ts b/packages/~/organizations/api/src/:id/context.ts index ce952d8d..b369c98e 100644 --- a/packages/~/organizations/api/src/:id/context.ts +++ b/packages/~/organizations/api/src/:id/context.ts @@ -3,6 +3,7 @@ import type { App_Context } from "@~/app.middleware/context"; import { urls } from "@~/app.urls"; import type { Organization } from "@~/organizations.lib/entities/Organization"; +import type { GetFicheOrganizationByIdHandler } from "@~/organizations.lib/usecase/GetFicheOrganizationById"; import { type get_organization_members_count_dto } from "@~/organizations.repository/get_organization_members_count"; import type { Env, InferRequestType } from "hono"; import { useRequestContext } from "hono/jsx-renderer"; @@ -29,6 +30,7 @@ type FicheOrganization = Pick< export interface ContextVariablesType extends Env { Variables: { organization: FicheOrganization; + organization_fiche: Awaited>; query_organization_members_count: Promise; }; } diff --git a/packages/~/organizations/api/src/:id/index.tsx b/packages/~/organizations/api/src/:id/index.tsx index 30a0d1aa..8e6b2a00 100644 --- a/packages/~/organizations/api/src/:id/index.tsx +++ b/packages/~/organizations/api/src/:id/index.tsx @@ -4,13 +4,16 @@ import { zValidator } from "@hono/zod-validator"; import { NotFoundError } from "@~/app.core/error"; import { Entity_Schema } from "@~/app.core/schema"; import { Main_Layout } from "@~/app.layout"; +import { set_context_variables } from "@~/app.middleware/set_context_variables"; +import { GetFicheOrganizationById } from "@~/organizations.lib/usecase/GetFicheOrganizationById"; import { GetOrganizationById } from "@~/organizations.repository"; import { get_organization_members_count } from "@~/organizations.repository/get_organization_members_count"; import { to as await_to } from "await-to-js"; import { Hono } from "hono"; +import { getContext } from "hono/context-storage"; import { jsxRenderer } from "hono/jsx-renderer"; import organization_procedures_router from "./$procedures"; -import type { ContextType } from "./context"; +import type { ContextType, ContextVariablesType } from "./context"; import organization_domains_router from "./domains"; import organization_members_router from "./members"; import { Organization_NotFound } from "./not-found"; @@ -76,6 +79,24 @@ export default new Hono() ); return next(); }, + async function set_context(ctx, next) { + const { + var: { moncomptepro_pg }, + } = getContext(); + const { id: organization_id } = ctx.req.valid("param"); + const get_fiche_organization_by_id = GetFicheOrganizationById({ + pg: moncomptepro_pg, + }); + const organization_fiche = + await get_fiche_organization_by_id(organization_id); + + return set_context_variables(() => ({ + query_organization_members_count: + ctx.var.query_organization_members_count, + organization: ctx.var.organization, + organization_fiche, + }))(ctx as any, next); + }, async function GET({ render }) { return render(); }, diff --git a/packages/~/organizations/lib/src/usecase/GetFicheOrganizationById.ts b/packages/~/organizations/lib/src/usecase/GetFicheOrganizationById.ts new file mode 100644 index 00000000..e786c589 --- /dev/null +++ b/packages/~/organizations/lib/src/usecase/GetFicheOrganizationById.ts @@ -0,0 +1,39 @@ +// + +import { NotFoundError } from "@~/app.core/error"; +import type { MonCompteProDatabaseCradle } from "@~/moncomptepro.database"; + +export function GetFicheOrganizationById({ pg }: MonCompteProDatabaseCradle) { + return async function get_fiche_organization_by_id(id: number) { + const organization = await pg.query.organizations.findFirst({ + columns: { + cached_activite_principale: true, + cached_adresse: true, + cached_categorie_juridique: true, + cached_code_officiel_geographique: true, + cached_code_postal: true, + cached_enseigne: true, + cached_est_active: true, + cached_etat_administratif: true, + cached_libelle_activite_principale: true, + cached_libelle_categorie_juridique: true, + cached_libelle_tranche_effectif: true, + cached_libelle: true, + cached_nom_complet: true, + cached_tranche_effectifs: true, + created_at: true, + id: true, + siret: true, + updated_at: true, + }, + where: (table, { eq }) => eq(table.id, id), + }); + + if (!organization) throw new NotFoundError("Organization not found."); + return organization; + }; +} + +export type GetFicheOrganizationByIdHandler = ReturnType< + typeof GetFicheOrganizationById +>; diff --git a/packages/~/organizations/ui/src/info/About.test.tsx b/packages/~/organizations/ui/src/info/About.test.tsx index 88e3f2ea..d949399c 100644 --- a/packages/~/organizations/ui/src/info/About.test.tsx +++ b/packages/~/organizations/ui/src/info/About.test.tsx @@ -12,20 +12,27 @@ test("render about section", async () => { render( , ), diff --git a/packages/~/organizations/ui/src/info/About.tsx b/packages/~/organizations/ui/src/info/About.tsx index 92f71040..42d2fd48 100644 --- a/packages/~/organizations/ui/src/info/About.tsx +++ b/packages/~/organizations/ui/src/info/About.tsx @@ -3,30 +3,14 @@ import { button } from "@~/app.ui/button"; import { LocalTime } from "@~/app.ui/time/LocalTime"; import { hx_urls } from "@~/app.urls"; -import type { Organization } from "@~/organizations.lib/entities/Organization"; +import type { GetFicheOrganizationByIdHandler } from "@~/organizations.lib/usecase/GetFicheOrganizationById"; import { type JSX } from "hono/jsx"; import { InactiveWarning } from "./InactiveWarning"; // type Props = JSX.IntrinsicElements["section"] & { - organization: Pick< - Organization, - | "cached_activite_principale" - | "cached_adresse" - | "cached_code_postal" - | "cached_est_active" - | "cached_etat_administratif" - | "cached_libelle_categorie_juridique" - | "cached_libelle_tranche_effectif" - | "cached_libelle" - | "cached_nom_complet" - | "cached_tranche_effectifs" - | "created_at" - | "id" - | "siret" - | "updated_at" - >; + organization: Awaited>; }; export async function About(props: Props) { @@ -48,7 +32,10 @@ export async function About(props: Props) {
  • Nature juridique :{" "} - {organization.cached_libelle_categorie_juridique} + + {organization.cached_libelle_categorie_juridique} ( + {organization.cached_categorie_juridique}) +
  • Dénomination : {organization.cached_libelle} @@ -57,7 +44,10 @@ export async function About(props: Props) { Nom complet : {organization.cached_nom_complet}
  • - NAF/APE : {organization.cached_libelle_categorie_juridique} + Enseigne : {organization.cached_enseigne} +
  • +
  • + NAF/APE : {organization.cached_libelle_activite_principale}
  • Tranche d'effectif :{" "} @@ -86,6 +76,10 @@ export async function About(props: Props) {
  • Adresse : {organization.cached_adresse}
  • +
  • + Code officiel géographique :{" "} + {organization.cached_code_officiel_geographique} +
  • Siret : {organization.siret} (
    -