Skip to content

Commit d1868fb

Browse files
committed
feat: add isInvited endpoint to check waitlist invitation status
1 parent aa2a59c commit d1868fb

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed

packages/backend/src/waitlist/controller/waitlist.controller.test.ts renamed to packages/backend/src/waitlist/controller/waitlist.controller-add.test.ts

File renamed without changes.
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import request from "supertest";
2+
3+
describe("GET /api/invited", () => {
4+
beforeEach(() => {
5+
jest.resetModules();
6+
jest.clearAllMocks();
7+
});
8+
9+
it("should return 400 if email is invalid", async () => {
10+
// Arrange
11+
jest.doMock("../service/waitlist.service", () => ({
12+
__esModule: true,
13+
default: {
14+
isInvited: jest.fn(),
15+
},
16+
}));
17+
const { WaitlistController } = await import("./waitlist.controller");
18+
const express = (await import("express")).default;
19+
const app = express();
20+
app.use(express.json());
21+
app.get("/api/invited", WaitlistController.isInvited);
22+
23+
// Act
24+
const res = await request(app).get("/api/invited").query({ email: "" });
25+
26+
// Assert
27+
expect(res.status).toBe(400);
28+
expect(res.error).toBeDefined();
29+
});
30+
31+
it("should return true if email was invited", async () => {
32+
// Arrange
33+
jest.doMock("../service/waitlist.service", () => ({
34+
__esModule: true,
35+
default: {
36+
isInvited: jest.fn().mockResolvedValue(true), // user is invited
37+
},
38+
}));
39+
const { WaitlistController } = await import("./waitlist.controller");
40+
const express = (await import("express")).default;
41+
const app = express();
42+
app.use(express.json());
43+
app.get("/api/invited", WaitlistController.isInvited);
44+
45+
// Act
46+
const res = await request(app)
47+
.get("/api/invited")
48+
.query({ email: "was-invited@bar.com" });
49+
50+
// Assert
51+
expect(res.status).toBe(200);
52+
const data = res.body;
53+
expect(data.isInvited).toBeDefined();
54+
expect(data.isInvited).toBe(true);
55+
});
56+
57+
it("should return false if email was not invited", async () => {
58+
// Arrange
59+
jest.doMock("../service/waitlist.service", () => ({
60+
__esModule: true,
61+
default: {
62+
isInvited: jest.fn().mockResolvedValue(false), // user is not invited
63+
},
64+
}));
65+
const { WaitlistController } = await import("./waitlist.controller");
66+
const express = (await import("express")).default;
67+
const app = express();
68+
app.use(express.json());
69+
app.get("/api/invited", WaitlistController.isInvited);
70+
71+
// Act
72+
const res = await request(app)
73+
.get("/api/invited")
74+
.query({ email: "not-invited@bar.com" });
75+
76+
// Assert
77+
expect(res.status).toBe(200);
78+
const data = res.body;
79+
expect(data.isInvited).toBeDefined();
80+
expect(data.isInvited).toBe(false);
81+
});
82+
});

packages/backend/src/waitlist/controller/waitlist.controller.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,20 @@ export class WaitlistController {
4747
return res.status(500).json({ error: "Server error" });
4848
}
4949
}
50+
51+
static async isInvited(
52+
req: Request<unknown, unknown, unknown, { email: string }>,
53+
res: Response<{ isInvited: boolean }>,
54+
) {
55+
const email = req.query.email;
56+
if (!email) {
57+
logger.error("Could not check if invited due to missing request email");
58+
return res.status(400).json({
59+
isInvited: false,
60+
});
61+
}
62+
63+
const isInvited = await WaitlistService.isInvited(email);
64+
return res.status(200).json({ isInvited });
65+
}
5066
}

0 commit comments

Comments
 (0)