From 7f63adf740b23a6135752edf2bd5aa6ddb0261a9 Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Fri, 8 May 2026 16:24:12 +0200 Subject: [PATCH] feat(auth): userSignedUpEvent contract --- .../src/events/user-signed-up.event.test.ts | 49 +++++++++++++++++++ .../auth/src/events/user-signed-up.event.ts | 18 +++++++ packages/auth/src/index.ts | 5 ++ 3 files changed, 72 insertions(+) create mode 100644 packages/auth/src/events/user-signed-up.event.test.ts create mode 100644 packages/auth/src/events/user-signed-up.event.ts diff --git a/packages/auth/src/events/user-signed-up.event.test.ts b/packages/auth/src/events/user-signed-up.event.test.ts new file mode 100644 index 0000000..8d7ee09 --- /dev/null +++ b/packages/auth/src/events/user-signed-up.event.test.ts @@ -0,0 +1,49 @@ +// packages/auth/src/events/user-signed-up.event.test.ts +import { describe, it, expect } from "vitest"; +import { userSignedUpEventSchema, userSignedUpEvent } from "@/events/user-signed-up.event"; + +describe("userSignedUpEvent", () => { + it("has the correct wire name", () => { + expect(userSignedUpEvent.name).toBe("auth.user.signed-up"); + }); + + it("accepts a valid payload", () => { + const payload = { + userId: "user_123", + email: "alice@example.com", + signedUpAt: "2026-05-08T12:00:00.000Z", + }; + expect(() => userSignedUpEventSchema.parse(payload)).not.toThrow(); + }); + + it("rejects invalid email", () => { + expect(() => + userSignedUpEventSchema.parse({ + userId: "u1", + email: "not-an-email", + signedUpAt: "2026-05-08T12:00:00.000Z", + }), + ).toThrow(); + }); + + it("rejects invalid datetime", () => { + expect(() => + userSignedUpEventSchema.parse({ + userId: "u1", + email: "alice@example.com", + signedUpAt: "yesterday", + }), + ).toThrow(); + }); + + it("rejects unknown fields (strict)", () => { + expect(() => + userSignedUpEventSchema.parse({ + userId: "u1", + email: "alice@example.com", + signedUpAt: "2026-05-08T12:00:00.000Z", + extraField: "no", + }), + ).toThrow(); + }); +}); diff --git a/packages/auth/src/events/user-signed-up.event.ts b/packages/auth/src/events/user-signed-up.event.ts new file mode 100644 index 0000000..0d26d36 --- /dev/null +++ b/packages/auth/src/events/user-signed-up.event.ts @@ -0,0 +1,18 @@ +// packages/auth/src/events/user-signed-up.event.ts +import { z } from "zod"; +import { defineEvent } from "@repo/core-events"; + +export const userSignedUpEventSchema = z + .object({ + userId: z.string(), + email: z.string().email(), + signedUpAt: z.string().datetime(), + }) + .strict(); + +export type UserSignedUpEvent = z.infer; + +export const userSignedUpEvent = defineEvent( + "auth.user.signed-up", + userSignedUpEventSchema, +); diff --git a/packages/auth/src/index.ts b/packages/auth/src/index.ts index 98cbaa6..b153fe8 100644 --- a/packages/auth/src/index.ts +++ b/packages/auth/src/index.ts @@ -37,3 +37,8 @@ export type { ISignUpController } from "./interface-adapters/controllers/sign-up export type { ISignOutController } from "./interface-adapters/controllers/sign-out.controller"; // +export { + userSignedUpEvent, + userSignedUpEventSchema, + type UserSignedUpEvent, +} from "./events/user-signed-up.event";