Skip to content

Commit fc4eecf

Browse files
🚚 (core): move userinfo_to_username to core schema (#497)
1 parent 46d14cd commit fc4eecf

File tree

10 files changed

+45
-26
lines changed

10 files changed

+45
-26
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
3+
import { expect, test } from "bun:test";
4+
import { z_username } from "./z_username";
5+
6+
//
7+
8+
test("transform userinfo to username", () => {
9+
expect(
10+
z_username.parse({
11+
given_name: "Jean",
12+
usual_name: "Mich",
13+
}),
14+
).toEqual("Jean Mich");
15+
});
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
3+
import { z } from "zod";
4+
5+
//
6+
7+
export const z_username = z
8+
.object({
9+
given_name: z.string().default(""),
10+
usual_name: z.string().default(""),
11+
})
12+
.transform(({ given_name, usual_name }) => {
13+
return `${given_name} ${usual_name}`;
14+
});

packages/~/app/layout/src/__snapshots__/main.test.tsx.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ exports[`Main Layout 1`] = `
8585
"
8686
class="flex min-h-screen flex-col"
8787
>
88-
<div class="flex flex-1 flex-col"><div class="flex min-h-full flex-grow flex-col"><header role="banner" class="fr-header"><div class="fr-header__body"><div class="fr-container"><div class="fr-header__body-row"><div class="fr-header__brand fr-enlarge-link"><div class="fr-header__brand-top"><div class="fr-header__logo"><p class="fr-logo">République<br/>Française</p></div></div><div class="fr-header__service"><a href="/" title="Accueil "><p class="fr-header__service-title">Hyyypertool</p></a><p class="fr-header__service-tagline">hyyyyyyyypertool</p></div></div><div class="fr-header__tools"><div class="fr-header__tools-links"><ul class="fr-btns-group"><li><a class="fr-btn fr-btn--sm fr-btn--tertiary-no-outline fr-fi-logout-box-r-line fr-btn--icon-left" href="/auth/logout">undefined undefined</a></li></ul></div></div></div></div></div><div class="fr-header__menu fr-modal"><div class="fr-container"><nav class="fr-nav" id="navigation-494" role="navigation" aria-label="Menu principal"><ul class="fr-nav__list"><li class="fr-nav__item"><a class="fr-nav__link" href="/moderations" target="_self">Moderations</a></li><li class="fr-nav__item"><a class="fr-nav__link" href="/users" target="_self">Utilisateurs</a></li><li class="fr-nav__item"><a class="fr-nav__link" href="/organizations" target="_self">Organisations</a></li><li class="fr-nav__item"><a class="fr-nav__link" href="/organizations/domains" target="_self">Domaines à verifier</a></li></ul></nav></div></div></header><div class="relative flex flex-1 flex-col">✅</div></div></div>
88+
<div class="flex flex-1 flex-col"><div class="flex min-h-full flex-grow flex-col"><header role="banner" class="fr-header"><div class="fr-header__body"><div class="fr-container"><div class="fr-header__body-row"><div class="fr-header__brand fr-enlarge-link"><div class="fr-header__brand-top"><div class="fr-header__logo"><p class="fr-logo">République<br/>Française</p></div></div><div class="fr-header__service"><a href="/" title="Accueil "><p class="fr-header__service-title">Hyyypertool</p></a><p class="fr-header__service-tagline">hyyyyyyyypertool</p></div></div><div class="fr-header__tools"><div class="fr-header__tools-links"><ul class="fr-btns-group"><li><a class="fr-btn fr-btn--sm fr-btn--tertiary-no-outline fr-fi-logout-box-r-line fr-btn--icon-left" href="/auth/logout">Lara Croft</a></li></ul></div></div></div></div></div><div class="fr-header__menu fr-modal"><div class="fr-container"><nav class="fr-nav" id="navigation-494" role="navigation" aria-label="Menu principal"><ul class="fr-nav__list"><li class="fr-nav__item"><a class="fr-nav__link" href="/moderations" target="_self">Moderations</a></li><li class="fr-nav__item"><a class="fr-nav__link" href="/users" target="_self">Utilisateurs</a></li><li class="fr-nav__item"><a class="fr-nav__link" href="/organizations" target="_self">Organisations</a></li><li class="fr-nav__item"><a class="fr-nav__link" href="/organizations/domains" target="_self">Domaines à verifier</a></li></ul></nav></div></div></header><div class="relative flex flex-1 flex-col">✅</div></div></div>
8989
<footer class="container mx-auto flex flex-row justify-between p-2">
9090
<div>© 2222 🇫🇷</div>
9191
<a

packages/~/app/layout/src/main.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ beforeAll(() => {
1717
test("Main Layout", async () => {
1818
const app = new Hono()
1919
.use(set_config({}))
20-
.use(set_userinfo({}))
20+
.use(set_userinfo({ given_name: "Lara", usual_name: "Croft" }))
2121
.use(set_nonce("nonce"))
2222
.use(jsxRenderer(Main_Layout))
2323
.get("/", (c) => {

packages/~/app/layout/src/main.tsx

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//
22

3+
import { z_username } from "@~/app.core/schema/z_username";
34
import type { UserInfoVariables_Context } from "@~/app.middleware/set_userinfo";
45
import { urls } from "@~/app.urls";
56
import type { PropsWithChildren } from "hono/jsx";
@@ -11,7 +12,7 @@ export function Main_Layout({ children }: PropsWithChildren) {
1112
const {
1213
var: { userinfo },
1314
} = useRequestContext<UserInfoVariables_Context>();
14-
const username = userinfo_to_username(userinfo);
15+
const username = z_username.parse(userinfo);
1516
return (
1617
<Root_Layout>
1718
<div class="flex min-h-full flex-grow flex-col">
@@ -38,17 +39,6 @@ export function Main_Layout({ children }: PropsWithChildren) {
3839
);
3940
}
4041

41-
/**
42-
* @todo(dougalsduteil) Move this to another package
43-
*/
44-
export function userinfo_to_username(userinfo: {
45-
given_name: string;
46-
usual_name: string;
47-
}) {
48-
const { given_name, usual_name } = userinfo;
49-
return `${given_name} ${usual_name}`;
50-
}
51-
5242
//
5343

5444
function Brand() {

packages/~/moderations/lib/src/usecase/create_and_send_email_to_user.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22

33
import { NotFoundError } from "@~/app.core/error";
4-
import { userinfo_to_username } from "@~/app.layout";
4+
import { z_username } from "@~/app.core/schema/z_username";
55
import { create_conversation } from "@~/crisp.lib";
66
import { update_moderation_by_id } from "@~/moderations.repository/update_moderation_by_id";
77
import type {
@@ -22,9 +22,9 @@ export async function create_and_send_email_to_user(
2222
where: (table, { eq }) => eq(table.id, moderation.user_id),
2323
});
2424
if (!user) throw new NotFoundError(`User not found`);
25-
const nickname = userinfo_to_username({
26-
given_name: user.given_name ?? "",
27-
usual_name: user.family_name ?? "",
25+
const nickname = z_username.parse({
26+
given_name: user.given_name,
27+
usual_name: user.family_name,
2828
});
2929
const { session_id } = await create_conversation(crisp_config, {
3030
email: to,

packages/~/moderations/lib/src/usecase/mark_moderatio_as_rejected.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//
22

3-
import { userinfo_to_username } from "@~/app.layout";
3+
import { z_username } from "@~/app.core/schema/z_username";
44
import type { AgentConnect_UserInfo } from "@~/app.middleware/session";
55
import type { get_moderation_dto } from "@~/moderations.repository/get_moderation";
66
import { update_moderation_by_id } from "@~/moderations.repository/update_moderation_by_id";
@@ -19,7 +19,7 @@ export async function mark_moderatio_as_rejected({
1919
pg: MonComptePro_PgDatabase;
2020
}) {
2121
const { comment, id: moderation_id } = moderation;
22-
const moderated_by = userinfo_to_username(userinfo);
22+
const moderated_by = z_username.parse(userinfo);
2323

2424
await update_moderation_by_id(pg, {
2525
comment: append_comment(comment, {

packages/~/moderations/lib/src/usecase/mark_moderation_as.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//
22

3-
import { userinfo_to_username } from "@~/app.layout";
3+
import { z_username } from "@~/app.core/schema/z_username";
44
import type { AgentConnect_UserInfo } from "@~/app.middleware/session";
55
import { update_moderation_by_id } from "@~/moderations.repository/update_moderation_by_id";
66
import type { MonComptePro_PgDatabase, schema } from "@~/moncomptepro.database";
@@ -21,7 +21,7 @@ export async function mark_moderation_as(
2121
type: Comment_Type["type"],
2222
) {
2323
const { comment, id: moderation_id } = moderation;
24-
const username = userinfo_to_username(userinfo);
24+
const username = z_username.parse(userinfo);
2525
const moderated_by = `${username} <${userinfo.email}>`;
2626

2727
await update_moderation_by_id(pg, {

packages/~/moderations/lib/src/usecase/respond_to_ticket.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22

33
import { NotFoundError } from "@~/app.core/error";
4-
import { userinfo_to_username } from "@~/app.layout";
4+
import { z_username } from "@~/app.core/schema/z_username";
55
import { get_user, is_crisp_ticket, send_message } from "@~/crisp.lib";
66
import { get_full_ticket, send_zammad_response } from "@~/zammad.lib";
77
import {
@@ -48,7 +48,7 @@ async function respond_in_conversation(
4848
get_user(crisp_config, { email: userinfo.email }),
4949
);
5050
const user = found_user ?? {
51-
nickname: userinfo_to_username(userinfo),
51+
nickname: z_username.parse(userinfo),
5252
email: userinfo.email,
5353
};
5454

packages/~/moderations/lib/src/usecase/send_rejected_message_to_user.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { NotFoundError } from "@~/app.core/error";
2-
import { userinfo_to_username } from "@~/app.layout";
2+
import { z_username } from "@~/app.core/schema/z_username";
33
import { to as await_to } from "await-to-js";
44
import consola from "consola";
55
import type {
@@ -16,7 +16,7 @@ export async function send_rejected_message_to_user(
1616
{ message: text_body, subject }: RejectedMessage,
1717
) {
1818
const { moderation, userinfo } = context;
19-
const username = userinfo_to_username(userinfo);
19+
const username = z_username.parse(userinfo);
2020
const body = text_body.concat(` \n\n${username}`);
2121
const to = moderation.user.email;
2222

0 commit comments

Comments
 (0)