Skip to content

Commit b50a94f

Browse files
authored
Created the orgAdminProcedure (#574)
Created a procedure to separate the logic checking if the user in the organization is an administrator
1 parent 32dced5 commit b50a94f

File tree

6 files changed

+29
-94
lines changed

6 files changed

+29
-94
lines changed

apps/platform/trpc/routers/orgRouter/mail/domainsRouter.ts

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { z } from 'zod';
2-
import { router, orgProcedure } from '~platform/trpc/trpc';
2+
import { router, orgProcedure, orgAdminProcedure } from '~platform/trpc/trpc';
33
import { and, eq } from '@u22n/database/orm';
44
import {
55
domains,
@@ -15,7 +15,7 @@ import { updateDnsRecords } from '~platform/utils/updateDnsRecords';
1515
import { iCanHazCallerFactory } from '../iCanHaz/iCanHazRouter';
1616

1717
export const domainsRouter = router({
18-
createNewDomain: orgProcedure
18+
createNewDomain: orgAdminProcedure
1919
.input(
2020
z.object({
2121
domainName: z.string().min(3).max(255)
@@ -41,14 +41,6 @@ export const domainsRouter = router({
4141
const newPublicId = typeIdGenerator('domains');
4242
const domainName = input.domainName.toLowerCase();
4343

44-
const isAdmin = await isAccountAdminOfOrg(org);
45-
if (!isAdmin) {
46-
throw new TRPCError({
47-
code: 'UNAUTHORIZED',
48-
message: 'You are not an admin'
49-
});
50-
}
51-
5244
const dnsData = await lookupNS(domainName);
5345
if (
5446
dnsData.success === false &&
@@ -175,7 +167,7 @@ export const domainsRouter = router({
175167
};
176168
}),
177169

178-
getDomain: orgProcedure
170+
getDomain: orgAdminProcedure
179171
.input(
180172
z.object({
181173
domainPublicId: typeIdValidator('domains')
@@ -196,14 +188,6 @@ export const domainsRouter = router({
196188
// Handle when adding database replicas
197189
const dbReplica = db;
198190

199-
const isAdmin = await isAccountAdminOfOrg(org);
200-
if (!isAdmin) {
201-
throw new TRPCError({
202-
code: 'UNAUTHORIZED',
203-
message: 'You are not an admin'
204-
});
205-
}
206-
207191
const domainResponse = await dbReplica.query.domains.findFirst({
208192
where: and(
209193
eq(domains.publicId, domainPublicId),
@@ -226,7 +210,7 @@ export const domainsRouter = router({
226210
};
227211
}),
228212

229-
getDomainDns: orgProcedure
213+
getDomainDns: orgAdminProcedure
230214
.input(
231215
z.object({
232216
domainPublicId: typeIdValidator('domains')
@@ -237,14 +221,6 @@ export const domainsRouter = router({
237221
const orgId = org?.id;
238222
const { domainPublicId } = input;
239223

240-
const isAdmin = await isAccountAdminOfOrg(org);
241-
if (!isAdmin) {
242-
throw new TRPCError({
243-
code: 'UNAUTHORIZED',
244-
message: 'You are not an admin'
245-
});
246-
}
247-
248224
return updateDnsRecords({ domainPublicId, orgId }, db);
249225
}),
250226

apps/platform/trpc/routers/orgRouter/mail/emailIdentityRouter.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { z } from 'zod';
2-
import { router, orgProcedure } from '~platform/trpc/trpc';
2+
import { router, orgProcedure, orgAdminProcedure } from '~platform/trpc/trpc';
33
import {
44
and,
55
eq,
@@ -87,7 +87,7 @@ export const emailIdentityRouter = router({
8787
available: true
8888
};
8989
}),
90-
createNewEmailIdentity: orgProcedure
90+
createNewEmailIdentity: orgAdminProcedure
9191
.input(
9292
z.object({
9393
emailUsername: z.string().min(1).max(255),
@@ -119,14 +119,6 @@ export const emailIdentityRouter = router({
119119

120120
const emailUsername = input.emailUsername.toLowerCase();
121121

122-
const isAdmin = await isAccountAdminOfOrg(org);
123-
if (!isAdmin) {
124-
throw new TRPCError({
125-
code: 'UNAUTHORIZED',
126-
message: 'You are not an admin'
127-
});
128-
}
129-
130122
if (!routeToOrgMemberPublicIds && !routeToTeamsPublicIds) {
131123
throw new TRPCError({
132124
code: 'BAD_REQUEST',

apps/platform/trpc/routers/orgRouter/setup/profileRouter.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { z } from 'zod';
2-
import { router, orgProcedure } from '~platform/trpc/trpc';
2+
import { router, orgProcedure, orgAdminProcedure } from '~platform/trpc/trpc';
33
import { eq } from '@u22n/database/orm';
44
import { orgs } from '@u22n/database/schema';
55
import { typeIdValidator } from '@u22n/utils/typeid';
@@ -45,7 +45,7 @@ export const orgProfileRouter = router({
4545
};
4646
}),
4747

48-
setOrgProfile: orgProcedure
48+
setOrgProfile: orgAdminProcedure
4949
.input(
5050
z.object({
5151
orgName: z.string().min(3).max(32)
@@ -62,14 +62,6 @@ export const orgProfileRouter = router({
6262
const orgId = org?.id;
6363
const { orgName } = input;
6464

65-
const isAdmin = await isAccountAdminOfOrg(org);
66-
if (!isAdmin) {
67-
throw new TRPCError({
68-
code: 'UNAUTHORIZED',
69-
message: 'You are not an admin'
70-
});
71-
}
72-
7365
await db
7466
.update(orgs)
7567
.set({

apps/platform/trpc/routers/orgRouter/users/invitesRouter.ts

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import {
33
router,
44
orgProcedure,
55
accountProcedure,
6-
publicProcedure
6+
publicProcedure,
7+
orgAdminProcedure
78
} from '~platform/trpc/trpc';
89
import { eq } from '@u22n/database/orm';
910
import {
@@ -472,7 +473,7 @@ export const invitesRouter = router({
472473
orgShortCode: queryInvitesResponse.org.shortcode
473474
};
474475
}),
475-
invalidateInvite: orgProcedure
476+
invalidateInvite: orgAdminProcedure
476477
.input(
477478
z.object({
478479
invitePublicId: typeIdValidator('orgInvitations')
@@ -487,14 +488,6 @@ export const invitesRouter = router({
487488
}
488489
const { db, org } = ctx;
489490

490-
const isAdmin = await isAccountAdminOfOrg(org);
491-
if (!isAdmin) {
492-
throw new TRPCError({
493-
code: 'UNAUTHORIZED',
494-
message: 'You are not an admin'
495-
});
496-
}
497-
498491
await db
499492
.update(orgInvitations)
500493
.set({
@@ -506,7 +499,7 @@ export const invitesRouter = router({
506499
success: true
507500
};
508501
}),
509-
refreshInvite: orgProcedure
502+
refreshInvite: orgAdminProcedure
510503
.input(
511504
z.object({
512505
invitePublicId: typeIdValidator('orgInvitations')
@@ -521,14 +514,6 @@ export const invitesRouter = router({
521514
}
522515
const { db, org } = ctx;
523516

524-
const isAdmin = await isAccountAdminOfOrg(org);
525-
if (!isAdmin) {
526-
throw new TRPCError({
527-
code: 'UNAUTHORIZED',
528-
message: 'You are not an admin'
529-
});
530-
}
531-
532517
await db
533518
.update(orgInvitations)
534519
.set({

apps/platform/trpc/routers/orgRouter/users/teamsRouter.ts

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { z } from 'zod';
2-
import { router, orgProcedure } from '~platform/trpc/trpc';
2+
import { router, orgProcedure, orgAdminProcedure } from '~platform/trpc/trpc';
33
import { eq, and } from '@u22n/database/orm';
44
import { teams } from '@u22n/database/schema';
55
import { typeIdGenerator, typeIdValidator } from '@u22n/utils/typeid';
@@ -9,7 +9,7 @@ import { TRPCError } from '@trpc/server';
99
import { addOrgMemberToTeamHandler } from './teamsHandler';
1010

1111
export const teamsRouter = router({
12-
createTeam: orgProcedure
12+
createTeam: orgAdminProcedure
1313
.input(
1414
z.object({
1515
teamName: z.string().min(2).max(50),
@@ -30,14 +30,6 @@ export const teamsRouter = router({
3030
const { teamName, teamDescription, teamColor } = input;
3131
const newPublicId = typeIdGenerator('teams');
3232

33-
const isAdmin = await isAccountAdminOfOrg(org);
34-
if (!isAdmin) {
35-
throw new TRPCError({
36-
code: 'UNAUTHORIZED',
37-
message: 'You are not an admin'
38-
});
39-
}
40-
4133
await db.insert(teams).values({
4234
publicId: newPublicId,
4335
name: teamName,
@@ -176,7 +168,7 @@ export const teamsRouter = router({
176168
team: teamQuery
177169
};
178170
}),
179-
addOrgMemberToTeam: orgProcedure
171+
addOrgMemberToTeam: orgAdminProcedure
180172
.input(
181173
z.object({
182174
teamPublicId: typeIdValidator('teams'),
@@ -193,14 +185,6 @@ export const teamsRouter = router({
193185
const { org, db } = ctx;
194186
const { teamPublicId, orgMemberPublicId } = input;
195187

196-
const isAdmin = await isAccountAdminOfOrg(org);
197-
if (!isAdmin) {
198-
throw new TRPCError({
199-
code: 'UNAUTHORIZED',
200-
message: 'You are not an admin'
201-
});
202-
}
203-
204188
const newTeamMemberPublicId = await addOrgMemberToTeamHandler(db, {
205189
orgId: org.id,
206190
teamPublicId: teamPublicId,
@@ -212,7 +196,7 @@ export const teamsRouter = router({
212196
publicId: newTeamMemberPublicId
213197
};
214198
}),
215-
updateTeamMembers: orgProcedure
199+
updateTeamMembers: orgAdminProcedure
216200
.input(
217201
z.object({
218202
teamPublicId: typeIdValidator('teams'),
@@ -229,13 +213,6 @@ export const teamsRouter = router({
229213
const { org, db } = ctx;
230214
const { teamPublicId, orgMemberPublicIds } = input;
231215

232-
const isAdmin = await isAccountAdminOfOrg(org);
233-
if (!isAdmin) {
234-
throw new TRPCError({
235-
code: 'UNAUTHORIZED',
236-
message: 'You are not an admin'
237-
});
238-
}
239216
const teamMembers = await db.query.teams.findFirst({
240217
where: and(eq(teams.publicId, teamPublicId), eq(teams.orgId, org.id)),
241218
columns: {},

apps/platform/trpc/trpc.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { validateOrgShortCode } from '~platform/utils/orgShortCode';
44
import type { TrpcContext } from '~platform/ctx';
55
import { z } from 'zod';
66
import { env } from '~platform/env';
7+
import { isAccountAdminOfOrg } from '~platform/utils/account';
78

89
export const trpcContext = initTRPC
910
.context<TrpcContext>()
@@ -49,6 +50,7 @@ export const publicProcedure = trpcContext.procedure.use(
4950
);
5051

5152
export const accountProcedure = publicProcedure.use(isAccountAuthenticated);
53+
5254
export const orgProcedure = publicProcedure
5355
.use(isAccountAuthenticated)
5456
.input(z.object({ orgShortCode: z.string() }))
@@ -98,6 +100,17 @@ export const orgProcedure = publicProcedure
98100
})
99101
);
100102

103+
export const orgAdminProcedure = orgProcedure.use(async ({ ctx, next }) => {
104+
const isAdmin = await isAccountAdminOfOrg(ctx.org);
105+
if (!isAdmin) {
106+
throw new TRPCError({
107+
code: 'UNAUTHORIZED',
108+
message: 'You need to be an administrator'
109+
});
110+
}
111+
return next();
112+
});
113+
101114
export const turnstileProcedure = publicProcedure
102115
.input(z.object({ turnstileToken: z.string().optional() }))
103116
.use(async ({ input, ctx, next }) => {

0 commit comments

Comments
 (0)