Skip to content

Commit 5ea1a6d

Browse files
authored
Merge pull request #507 from trycompai/main
PROD
2 parents aef45fa + f749106 commit 5ea1a6d

6 files changed

Lines changed: 170 additions & 21 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"use server";
2+
3+
import { auth } from "@/utils/auth";
4+
import { db } from "@comp/db";
5+
6+
export const addEmployeeWithoutInvite = async ({
7+
email,
8+
organizationId,
9+
}: {
10+
email: string;
11+
organizationId: string;
12+
}) => {
13+
try {
14+
let userId = "";
15+
const existingUser = await db.user.findUnique({
16+
where: {
17+
email,
18+
},
19+
});
20+
21+
if (!existingUser) {
22+
const newUser = await db.user.create({
23+
data: {
24+
emailVerified: false,
25+
email,
26+
name: email.split("@")[0],
27+
},
28+
});
29+
30+
userId = newUser.id;
31+
}
32+
33+
const member = await auth.api.addMember({
34+
body: {
35+
userId: existingUser?.id ?? userId,
36+
organizationId,
37+
role: "employee",
38+
},
39+
});
40+
41+
return { success: true, data: member };
42+
} catch (error) {
43+
console.error("Error adding employee:", error);
44+
return { success: false, error: "Failed to add employee" };
45+
}
46+
};

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/all/components/InviteMembersModal.tsx

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import { Input } from "@comp/ui/input";
3434
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@comp/ui/tabs";
3535
import { MultiRoleCombobox } from "./MultiRoleCombobox";
3636
import { authClient } from "@/utils/auth-client";
37+
import { addEmployeeWithoutInvite } from "../actions/addEmployeeWithoutInvite";
3738

3839
// --- Constants for Roles ---
3940
const selectableRoles = [
@@ -110,7 +111,12 @@ export function InviteMembersModal({
110111
resolver: zodResolver(formSchema),
111112
defaultValues: {
112113
mode: "manual",
113-
manualInvites: [{ email: "", roles: DEFAULT_ROLES }],
114+
manualInvites: [
115+
{
116+
email: "",
117+
roles: DEFAULT_ROLES,
118+
},
119+
],
114120
csvFile: undefined,
115121
},
116122
mode: "onChange",
@@ -165,15 +171,25 @@ export function InviteMembersModal({
165171

166172
// Process each invitation sequentially
167173
for (const invite of values.manualInvites) {
174+
const isEmployeeOnly =
175+
invite.roles.length === 1 &&
176+
invite.roles[0] === "employee";
168177
try {
169-
// Use authClient to send the invitation
170-
await authClient.organization.inviteMember({
171-
email: invite.email,
172-
role:
173-
invite.roles.length === 1
174-
? invite.roles[0]
175-
: invite.roles,
176-
});
178+
if (isEmployeeOnly) {
179+
await addEmployeeWithoutInvite({
180+
organizationId,
181+
email: invite.email,
182+
});
183+
} else {
184+
// Use authClient to send the invitation
185+
await authClient.organization.inviteMember({
186+
email: invite.email,
187+
role:
188+
invite.roles.length === 1
189+
? invite.roles[0]
190+
: invite.roles,
191+
});
192+
}
177193
successCount++;
178194
} catch (error) {
179195
console.error(
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { OrganizationSwitcher } from "@/components/organization-switcher";
2+
import { auth } from "@/utils/auth";
3+
import { db } from "@comp/db";
4+
import { headers } from "next/headers";
5+
import Link from "next/link";
6+
import { redirect } from "next/navigation";
7+
8+
export default async function NoAccess() {
9+
const session = await auth.api.getSession({
10+
headers: await headers(),
11+
});
12+
13+
if (!session || !session.session.activeOrganizationId) {
14+
return redirect("/");
15+
}
16+
17+
const organizations = await db.organization.findMany({
18+
where: {
19+
members: {
20+
some: {
21+
userId: session.user.id,
22+
},
23+
},
24+
},
25+
});
26+
27+
const currentOrg = await db.organization.findUnique({
28+
where: {
29+
id: session.session.activeOrganizationId,
30+
},
31+
});
32+
33+
return (
34+
<div className="flex flex-col items-center justify-center h-screen bg-foreground/05 gap-4">
35+
<h1 className="text-2xl font-bold">Access Denied</h1>
36+
<div className="flex flex-col text-center">
37+
<p>
38+
<b>Employees</b> don't have access to app.trycomp.ai, did
39+
you mean to go to{" "}
40+
<Link
41+
href="https://portal.trycomp.ai"
42+
className="underline text-primary"
43+
>
44+
portal.trycomp.ai
45+
</Link>
46+
?
47+
</p>
48+
<p>
49+
Please select another organization or contact your
50+
organization administrator.
51+
</p>
52+
</div>
53+
<div>
54+
<OrganizationSwitcher
55+
organizations={organizations}
56+
organization={currentOrg}
57+
/>
58+
</div>
59+
</div>
60+
);
61+
}

apps/app/src/app/[locale]/(app)/setup/page.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ export default async function Page() {
3535
where: {
3636
email: session.user.email,
3737
status: "pending",
38+
role: {
39+
not: {
40+
contains: "employee",
41+
},
42+
},
3843
},
3944
});
4045

apps/app/src/app/[locale]/page.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { auth } from "@/utils/auth";
2+
import { db } from "@comp/db";
23
import { headers } from "next/headers";
34
import { redirect } from "next/navigation";
45

@@ -17,5 +18,20 @@ export default async function RootPage() {
1718
return redirect("/setup");
1819
}
1920

21+
const member = await db.member.findFirst({
22+
where: {
23+
organizationId: orgId,
24+
userId: session.user.id,
25+
},
26+
});
27+
28+
if (member?.role === "employee") {
29+
return redirect("/no-access");
30+
}
31+
32+
if (!member) {
33+
return redirect("/setup");
34+
}
35+
2036
return redirect(`/${orgId}/implementation`);
2137
}

yarn.lock

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,18 +1420,19 @@
14201420
picocolors "^1.0.0"
14211421
sisteransi "^1.0.5"
14221422

1423-
"@comp/analytics@packages/analytics":
1423+
"@comp/analytics@^workspace:packages/analytics":
14241424
version "workspace:packages/analytics"
14251425
resolved "workspace:packages/analytics"
14261426
dependencies:
14271427
posthog-js "^1.215.3"
14281428
posthog-node "^4.4.1"
14291429

1430-
"@comp/app@apps/app", "@comp/app@workspace:*":
1430+
"@comp/app@^workspace:apps/app", "@comp/app@workspace:*":
14311431
version "workspace:apps/app"
14321432
resolved "workspace:apps/app"
14331433
devDependencies:
14341434
"@comp/db" "workspace:*"
1435+
devDependencies:
14351436
"@trigger.dev/build" "3.3.17"
14361437
"@types/node" "^22.15.2"
14371438
"@types/react" "19.1.2"
@@ -1447,9 +1448,11 @@
14471448
"@aws-sdk/client-s3" "^3.796.0"
14481449
"@aws-sdk/s3-request-presigner" "^3.800.0"
14491450
"@browserbasehq/sdk" "^2.5.0"
1451+
dependencies:
14501452
"@comp/data" "workspace:*"
14511453
"@comp/db" "workspace:*"
14521454
"@comp/notifications" "workspace:*"
1455+
dependencies:
14531456
"@date-fns/tz" "^1.2.0"
14541457
"@dnd-kit/core" "^6.3.1"
14551458
"@dnd-kit/modifiers" "^9.0.0"
@@ -1527,25 +1530,27 @@
15271530
yarn "^1.22.22"
15281531
zustand "^5.0.3"
15291532

1530-
"@comp/data@packages/data", "@comp/data@workspace:*":
1533+
"@comp/data@^workspace:packages/data", "@comp/data@workspace:*":
15311534
version "workspace:packages/data"
15321535
resolved "workspace:packages/data"
15331536
devDependencies:
15341537
"@comp/db" "workspace:*"
1538+
devDependencies:
15351539
tsup "^8.4.0"
15361540
typescript "^5.8.2"
15371541

1538-
"@comp/db@packages/db", "@comp/db@workspace:*":
1542+
"@comp/db@^workspace:packages/db", "@comp/db@workspace:*":
15391543
version "workspace:packages/db"
15401544
resolved "workspace:packages/db"
15411545
devDependencies:
15421546
"@comp/tsconfig" "workspace:*"
1547+
devDependencies:
15431548
typescript "^5.8.2"
15441549
dependencies:
15451550
"@prisma/client" "6.6.0"
15461551
prisma "^6.6.0"
15471552

1548-
"@comp/email@packages/email":
1553+
"@comp/email@^workspace:packages/email":
15491554
version "workspace:packages/email"
15501555
resolved "workspace:packages/email"
15511556
devDependencies:
@@ -1566,7 +1571,7 @@
15661571
react-email "3.0.4"
15671572
responsive-react-email "^0.0.5"
15681573

1569-
"@comp/integrations@packages/integrations":
1574+
"@comp/integrations@^workspace:packages/integrations":
15701575
version "workspace:packages/integrations"
15711576
resolved "workspace:packages/integrations"
15721577
devDependencies:
@@ -1589,14 +1594,14 @@
15891594
sharp "^0.33.5"
15901595
zod "^3.24.2"
15911596

1592-
"@comp/kv@packages/kv":
1597+
"@comp/kv@^workspace:packages/kv":
15931598
version "workspace:packages/kv"
15941599
resolved "workspace:packages/kv"
15951600
dependencies:
15961601
"@upstash/redis" "^1.34.2"
15971602
server-only "0.0.1"
15981603

1599-
"@comp/notifications@packages/notifications", "@comp/notifications@workspace:*":
1604+
"@comp/notifications@^workspace:packages/notifications", "@comp/notifications@workspace:*":
16001605
version "workspace:packages/notifications"
16011606
resolved "workspace:packages/notifications"
16021607
devDependencies:
@@ -1605,7 +1610,7 @@
16051610
"@novu/node" "^2.0.1"
16061611
nanoid "5.1.0"
16071612

1608-
"@comp/portal@apps/portal":
1613+
"@comp/portal@^workspace:apps/portal":
16091614
version "workspace:apps/portal"
16101615
resolved "workspace:apps/portal"
16111616
devDependencies:
@@ -1626,11 +1631,11 @@
16261631
react-dom "^19.1.0"
16271632
react-otp-input "^3.1.1"
16281633

1629-
"@comp/tsconfig@packages/tsconfig", "@comp/tsconfig@workspace:*":
1634+
"@comp/tsconfig@^workspace:packages/tsconfig", "@comp/tsconfig@workspace:*":
16301635
version "workspace:packages/tsconfig"
16311636
resolved "workspace:packages/tsconfig"
16321637

1633-
"@comp/ui@packages/ui", "@comp/ui@workspace:*":
1638+
"@comp/ui@^workspace:packages/ui", "@comp/ui@workspace:*":
16341639
version "workspace:packages/ui"
16351640
resolved "workspace:packages/ui"
16361641
devDependencies:
@@ -1694,7 +1699,7 @@
16941699
use-callback-ref "^1.3.3"
16951700
vaul "^1.0.0"
16961701

1697-
"@comp/utils@packages/utils", "@comp/utils@workspace:*":
1702+
"@comp/utils@^workspace:packages/utils", "@comp/utils@workspace:*":
16981703
version "workspace:packages/utils"
16991704
resolved "workspace:packages/utils"
17001705
devDependencies:

0 commit comments

Comments
 (0)