Skip to content

Commit f8f51b2

Browse files
#1425: small permissions refactor
1 parent 389b76b commit f8f51b2

6 files changed

Lines changed: 15 additions & 18 deletions

File tree

src/backend/src/services/reimbursement-requests.services.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -454,16 +454,12 @@ export default class ReimbursementRequestService {
454454
* @returns the created vendor
455455
*/
456456
static async createVendor(submitter: User, name: string) {
457-
const validateCreateVendorSubmitter = async (submitter: User): Promise<void> => {
458-
const failedAuthorizationException = new AccessDeniedException(
459-
'Only admins, finance leads, and finance heads can create vendors.'
460-
);
461-
462-
const isAuthorized = isAdmin(submitter.role) || (await isUserLeadOrHeadOfFinanceTeam(submitter));
463-
if (!isAuthorized) throw failedAuthorizationException;
464-
};
457+
const failedAuthorizationException = new AccessDeniedException(
458+
'Only admins, finance leads, and finance heads can create vendors.'
459+
);
465460

466-
await validateCreateVendorSubmitter(submitter);
461+
const isAuthorized = isAdmin(submitter.role) || (await isUserLeadOrHeadOfFinanceTeam(submitter));
462+
if (!isAuthorized) throw failedAuthorizationException;
467463

468464
const vendor = await prisma.vendor.create({
469465
data: {

src/backend/src/transformers/auth-user.transformer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { AuthenticatedUser } from 'shared';
33
import authUserQueryArgs from '../prisma-query-args/auth-user.query-args';
44
import {
55
isAuthUserHeadOfFinance,
6-
isAuthUserLeadForFinance,
6+
isAuthUserAtLeastLeadForFinance,
77
isAuthUserOnFinance
88
} from '../utils/reimbursement-requests.utils';
99

@@ -20,7 +20,7 @@ const authenticatedUserTransformer = (user: Prisma.UserGetPayload<typeof authUse
2020
favoritedProjectsId: user.favoriteProjects.map((project) => project.projectId),
2121
isFinance: isAuthUserOnFinance(user),
2222
isHeadOfFinance: isAuthUserHeadOfFinance(user),
23-
isFinanceLead: isAuthUserLeadForFinance(user),
23+
isAtLeastFinanceLead: isAuthUserAtLeastLeadForFinance(user),
2424
changeRequestsToReviewId: user.changeRequestsToReview.map((changeRequest) => changeRequest.crId)
2525
};
2626
};

src/backend/src/utils/reimbursement-requests.utils.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ export const validateUserIsPartOfFinanceTeam = async (user: User) => {
230230
*/
231231
export const isUserOnFinanceTeam = async (user: User): Promise<boolean> => {
232232
if (!process.env.FINANCE_TEAM_ID) {
233-
console.warn('FINANCE_TEAM_ID not in env');
233+
throw new Error('FINANCE_TEAM_ID not in env');
234234
}
235235

236236
const financeTeam = await prisma.team.findUnique({
@@ -246,7 +246,7 @@ export const isUserOnFinanceTeam = async (user: User): Promise<boolean> => {
246246
* Determines if a user is lead or head of the finance team.
247247
*
248248
* To be used for Prisma input validation of a plain User, as opposed to
249-
* <code>isAuthUserLeadForFinance</code>, which uses the additional fields
249+
* <code>isAuthUserAtLeastLeadForFinance</code>, which uses the additional fields
250250
* produced by authUserQueryArgs that are not in the User type by default.
251251
*
252252
* @param user the user to authenticate
@@ -255,7 +255,7 @@ export const isUserOnFinanceTeam = async (user: User): Promise<boolean> => {
255255
*/
256256
export const isUserLeadOrHeadOfFinanceTeam = async (user: User): Promise<boolean> => {
257257
if (!process.env.FINANCE_TEAM_ID) {
258-
console.error('FINANCE_TEAM_ID not in env');
258+
throw new Error('FINANCE_TEAM_ID not in env');
259259
}
260260

261261
const financeTeam = await prisma.team.findUnique({
@@ -284,7 +284,7 @@ export const isAuthUserOnFinance = (user: Prisma.UserGetPayload<typeof authUserQ
284284
* @param user the user to check
285285
* @returns Whether they are a finance lead.
286286
*/
287-
export const isAuthUserLeadForFinance = (user: Prisma.UserGetPayload<typeof authUserQueryArgs>) => {
287+
export const isAuthUserAtLeastLeadForFinance = (user: Prisma.UserGetPayload<typeof authUserQueryArgs>) => {
288288
if (!process.env.FINANCE_TEAM_ID) return false;
289289
const financeTeamId = process.env.FINANCE_TEAM_ID;
290290
const { teamAsHead, teamsAsLead } = user;

src/frontend/src/pages/AdminToolsPage/AdminToolsPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const AdminToolsPage: React.FC = () => {
1818
<PageLayout title="Admin Tools">
1919
{isHead(currentUser.role) && <AdminToolsUserManagement />}
2020
{isAdmin(currentUser.role) && <AdminToolsSlackUpcomingDeadlines />}
21-
{(isAdmin(currentUser.role) || currentUser.isFinanceLead) && <AdminToolsFinanceConfig />}
21+
{(isAdmin(currentUser.role) || currentUser.isAtLeastFinanceLead) && <AdminToolsFinanceConfig />}
2222
{isAdmin(currentUser.role) && <TeamsTools />}
2323
</PageLayout>
2424
);

src/frontend/src/utils/users.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ export const userToAutocompleteOption = (user: User): { label: string; id: numbe
1717
* @returns whether they can view Admin Tools
1818
*/
1919
export const canAccessAdminTools = (user?: AuthenticatedUser): boolean => {
20-
return isHead(user?.role) || user?.isFinanceLead || false;
20+
if (!user || !user.isAtLeastFinanceLead) return false;
21+
return isHead(user.role) || user.isAtLeastFinanceLead;
2122
};

src/shared/src/types/user-types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export interface AuthenticatedUser {
4242
favoritedProjectsId: number[];
4343
changeRequestsToReviewId: number[];
4444
isHeadOfFinance?: boolean;
45-
isFinanceLead?: boolean;
45+
isAtLeastFinanceLead?: boolean;
4646
}
4747

4848
export interface UserSettings {

0 commit comments

Comments
 (0)