diff --git a/e2e/features/moderations/jean_bon_join_abracadabra.feature b/e2e/features/moderations/jean_bon_join_abracadabra.feature index 2b7bc67f..a5a22caa 100644 --- a/e2e/features/moderations/jean_bon_join_abracadabra.feature +++ b/e2e/features/moderations/jean_bon_join_abracadabra.feature @@ -16,8 +16,10 @@ Fonctionnalité: Moderation blockante à accepter Quand sur la même ligne je clique sur "➡️" Alors je vois "Jean Bon veut rejoindre l'organisation « Abracadabra » avec l’adresse jeanbon@yopmail.com" + Quand je clique sur "🌐 1 domaine connu dans l'organisation" + Scénario: Domaine interne - Soit le tableau sous le title "Domaines de l'organisation" + Soit le tableau sous le title "🌐 1 domaine connu dans l'organisation" * je vois la ligne "yopmail.com" dans le tableau * sur la même ligne je vois "❓" * sur la même ligne je vois "Menu" @@ -40,7 +42,7 @@ Fonctionnalité: Moderation blockante à accepter Alors sur la même ligne je vois "✅" Scénario: Domaine externe - Soit le tableau sous le title "Domaines de l'organisation" + Soit le tableau sous le title "🌐 1 domaine connu dans l'organisation" * je vois la ligne "yopmail.com" dans le tableau Quand j'ouvre le menu déroulant sur la même ligne * je clique sur le bouton "❎ Domaine externe" diff --git a/e2e/features/moderations/marie_bon_join_bosch.feature b/e2e/features/moderations/marie_bon_join_bosch.feature index d9974360..12812503 100644 --- a/e2e/features/moderations/marie_bon_join_bosch.feature +++ b/e2e/features/moderations/marie_bon_join_bosch.feature @@ -19,7 +19,7 @@ Fonctionnalité: Moderation non blockante Alors je vois "Marie Bon a rejoint une organisation avec un domain non vérifié « Robert bosch france » avec l’adresse marie.bon@fr.bosch.com" Scénario: Le nom de domaine est vérifié - Soit le tableau sous le title "Domaines de l'organisation" + Soit le tableau sous le title "domaine connu dans l'organisation" * le tableau est vide Quand je clique sur "Je valide ce membre ✅" Quand je clique sur "J’autorise le domaine fr.bosch.com pour toute l’organisation" @@ -30,7 +30,7 @@ Fonctionnalité: Moderation non blockante * je vois la ligne de table "57206768400017" Quand sur la même ligne je clique sur "✅" - Soit le tableau sous le title "Domaines de l'organisation" + Soit le tableau sous le title "domaine connu dans l'organisation" * je vois la ligne "fr.bosch.com" dans le tableau * sur la même ligne je vois "✅" diff --git a/e2e/features/organizations/dinum.feature b/e2e/features/organizations/dinum.feature index 3e09beeb..437a39e5 100644 --- a/e2e/features/organizations/dinum.feature +++ b/e2e/features/organizations/dinum.feature @@ -26,8 +26,8 @@ Fonctionnalité: Page organisation * je vois "État administratif : A (liste état administratif INSEE)" * je vois "Siret : 13002526500013 (Voir la fiche annuaire entreprise de cette organisation)" - # Scénario: Domaines de l'organisation DINUM - Soit le tableau sous le title "Domaines de l'organisation" + # Scénario: domaine connu dans l'organisation DINUM + Soit le tableau sous le title "domaine connu dans l'organisation" * je vois la ligne "beta.gouv.fr" dans le tableau * sur la même ligne je vois "✅" * sur la même ligne je vois "verified" diff --git a/e2e/features/organizations/yes_we_hack_domain_verification.feature b/e2e/features/organizations/yes_we_hack_domain_verification.feature index 9de309a4..79d7b55d 100644 --- a/e2e/features/organizations/yes_we_hack_domain_verification.feature +++ b/e2e/features/organizations/yes_we_hack_domain_verification.feature @@ -21,7 +21,7 @@ Fonctionnalité: Page organisation - domaine à vérifier Alors je vois "A propos de « Yes we hack »" * je vois "Dénomination : Yes we hack" - Soit le tableau sous le title "Domaines de l'organisation" + Soit le tableau sous le title "domaine connu dans l'organisation" * je vois la ligne "yeswehack.com" dans le tableau * sur la même ligne je vois "❓" diff --git a/packages/~/moderations/api/src/:id/Domain_Organization.tsx b/packages/~/moderations/api/src/:id/Domain_Organization.tsx index 69ebb703..39d86e73 100644 --- a/packages/~/moderations/api/src/:id/Domain_Organization.tsx +++ b/packages/~/moderations/api/src/:id/Domain_Organization.tsx @@ -3,6 +3,7 @@ import { hyper_ref } from "@~/app.core/html"; import { hx_trigger_from_body } from "@~/app.core/htmx"; import { Loader } from "@~/app.ui/loader/Loader"; +import { formattedPlural } from "@~/app.ui/plurial"; import { hx_urls } from "@~/app.urls"; import { ORGANISATION_EVENTS } from "@~/organizations.lib/event"; import { usePageRequestContext } from "./context"; @@ -14,28 +15,40 @@ export async function Domain_Organization() { const { var: { moderation: { organization }, + query_domain_count, }, } = usePageRequestContext(); + const count = await query_domain_count; return (
-

🌐 Domaines de l'organisation

- -
-
- -
-
+
+ +

+ 🌐 {count}{" "} + {formattedPlural(count, { + one: "domaine connu", + other: "domaine connus", + })}{" "} + dans l'organisation +

+
+
+
+ +
+
+
); } diff --git a/packages/~/moderations/api/src/:id/context.ts b/packages/~/moderations/api/src/:id/context.ts index 5a81f5d1..9fe26a8d 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 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"; import type { Env, InferRequestType } from "hono"; @@ -24,6 +25,7 @@ export interface ContextVariablesType extends Env { moderation: get_moderation_dto; organization_member: get_organization_member_dto; query_organization_members_count: Promise; + query_domain_count: Promise; }; } export type ContextType = App_Context & ContextVariablesType; diff --git a/packages/~/moderations/api/src/:id/index.tsx b/packages/~/moderations/api/src/:id/index.tsx index 3bad4a2c..f7277732 100644 --- a/packages/~/moderations/api/src/:id/index.tsx +++ b/packages/~/moderations/api/src/:id/index.tsx @@ -5,6 +5,7 @@ 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 { 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"; import { Hono } from "hono"; @@ -68,6 +69,18 @@ export default new Hono() set("organization_member", organization_member); return next(); }, + async function set_query_domain_count( + { set, var: { moderation, moncomptepro_pg } }, + next, + ) { + set( + "query_domain_count", + get_domain_count(moncomptepro_pg, { + organization_id: moderation.organization_id, + }), + ); + return next(); + }, async function set_query_organization_members_count( { set, var: { moderation, moncomptepro_pg } }, next, diff --git a/packages/~/organizations/api/src/:id/page.tsx b/packages/~/organizations/api/src/:id/page.tsx index 9e0d1496..edd3e862 100644 --- a/packages/~/organizations/api/src/:id/page.tsx +++ b/packages/~/organizations/api/src/:id/page.tsx @@ -29,7 +29,7 @@ export default async function Page() { -

🌐 Domaines de l'organisation

+

🌐 domaine connu dans l'organisation

{ + const unicorn_organization_id = await create_unicorn_organization(pg); + + const domain_unicorn = await get_domain_count(pg, { + organization_id: unicorn_organization_id, + }); + + expect(domain_unicorn).toEqual(0); +}); + +test("returns 1 member", async () => { + const unicorn_organization_id = await create_unicorn_organization(pg); + + const domain_unicorn = await get_domain_count(pg, { + organization_id: unicorn_organization_id, + }); + + expect(domain_unicorn).toBe(1); +}); + +test.only("returns 3 domains", async () => { + const unicorn_organization_id = await create_unicorn_organization(pg); + await pg.insert(schema.email_domains).values({ + domain: "bi.corn", + organization_id: unicorn_organization_id, + }); + await pg.insert(schema.email_domains).values({ + domain: "xorn.corn", + organization_id: unicorn_organization_id, + }); + + const domain_unicorn = await get_domain_count(pg, { + organization_id: unicorn_organization_id, + }); + + expect(domain_unicorn).toBe(3); +}); diff --git a/packages/~/organizations/repository/src/get_domain_count.ts b/packages/~/organizations/repository/src/get_domain_count.ts new file mode 100644 index 00000000..bbc4c46f --- /dev/null +++ b/packages/~/organizations/repository/src/get_domain_count.ts @@ -0,0 +1,24 @@ +// + +import { schema, type MonComptePro_PgDatabase } from "@~/moncomptepro.database"; +import { count as drizzle_count, eq } from "drizzle-orm"; + +// + +export async function get_domain_count( + pg: MonComptePro_PgDatabase, + { organization_id }: { organization_id: number }, +) { + const [{ value: count }] = await pg + .select({ value: drizzle_count() }) + .from(schema.email_domains) + .innerJoin( + schema.organizations, + eq(schema.email_domains.organization_id, schema.organizations.id), + ) + .where(eq(schema.organizations.id, organization_id)); + + return count; +} + +export type get_domain_count_dto = Awaited>;