Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions packages/user-management/__tests__/permissions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,22 @@ describe('Permissions', () => {
assert.equal(isPrincipal(testCaseUser, { schoolId: user.schools[1].schoolId }), false)
})

test('check if principal with undefined school', () => {
const invalidTestCaseUser1 = { ...modifyUser(user, 0, [], true), schools: [...user.schools, undefined] }
// @ts-expect-error testing with invalid data in user schools
assert.equal(isPrincipal(invalidTestCaseUser1, { schoolId: user.schools[0].schoolId }), false)

const invalidTestCaseUser2 = { ...modifyUser(user, 0, [], true), schools: [...user.schools, undefined] }
// @ts-expect-error testing with invalid data in user schools
assert.equal(isPrincipal(invalidTestCaseUser2, { schoolId: undefined }), false)
})

test.only('check if principal with undefined schools', () => {
const invalidTestCaseUser1 = { ...modifyUser(user, 0, [], true), schools: undefined }
// @ts-expect-error testing with invalid data in user schools
assert.equal(isPrincipal(invalidTestCaseUser1, { schoolId: user.schools[0].schoolId }), false)
})

test('check if a user has a permission in given school', () => {
const testCaseUser = modifyUser(user, 0, ['observations'])
assert.equal(hasPermission(testCaseUser, 'observations', { schoolId: testCaseUser.schools[0].schoolId }), true)
Expand Down
10 changes: 7 additions & 3 deletions packages/user-management/src/user-checks.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
import { applicationPermissions, AppPerm, Perm, PermissionGrant, PermissionOptions, User, UserSchool } from './index'

function userSchools(user: User, options?: PermissionOptions): UserSchool[] {
return options?.schoolId ? user.schools.filter(school => school.schoolId === options.schoolId) : user.schools
return user.schools
? options?.schoolId
? user.schools.filter(school => school?.schoolId === options.schoolId)
: user.schools
: []
}

export function userPermissionGrants(user: User, options?: PermissionOptions): PermissionGrant[] {
return userSchools(user, options).flatMap(school => school.permissions)
return userSchools(user, options).flatMap(school => school?.permissions ?? [])
}

export function userPermissions(user: User, options?: PermissionOptions): Perm[] {
return userPermissionGrants(user, options).map(grant => grant.permission)
}

export function isPrincipal(user: User, options?: PermissionOptions): boolean {
return userSchools(user, options).find(school => school.principal) !== undefined
return userSchools(user, options).find(school => school?.principal) !== undefined
}

export function hasPermission(user: User, requiredPermission: Perm | '*', options?: PermissionOptions): boolean {
Expand Down