Skip to content

Commit 531b543

Browse files
authored
Merge pull request #318 from IQSS/300-user-roles
Add GetUserSelectableRoles use case
2 parents 9cd2389 + 87d384a commit 531b543

File tree

12 files changed

+265
-0
lines changed

12 files changed

+265
-0
lines changed

docs/useCases.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ The different use cases currently available in the package are classified below,
7575
- [Delete Current API Token](#delete-current-api-token)
7676
- [Recreate Current API Token](#recreate-current-api-token)
7777
- [Register User](#register-user)
78+
- [Roles](#Roles)
79+
- [Roles read use cases](#roles-read-use-cases)
80+
- [Get User Selectable Roles](#get-user-selectable-roles)
7881
- [Info](#Info)
7982
- [Get Dataverse Backend Version](#get-dataverse-backend-version)
8083
- [Get Maximum Embargo Duration In Months](#get-maximum-embargo-duration-in-months)
@@ -1842,6 +1845,28 @@ registerUser.execute(userDTO)
18421845

18431846
_See [use case](../src/users/domain/useCases/RegisterUser.ts) implementation_.
18441847

1848+
## Roles
1849+
1850+
### Get User Selectable Roles
1851+
1852+
Returns a [Role](../src/roles/domain/models/Role.ts) array that the calling user can use as filters when searching within their data.
1853+
1854+
##### Example call:
1855+
1856+
```typescript
1857+
import { getUserSelectableRoles } from '@iqss/dataverse-client-javascript'
1858+
1859+
/* ... */
1860+
1861+
getUserSelectableRoles.execute().then((roles: Role[]) => {
1862+
/* ... */
1863+
})
1864+
1865+
/* ... */
1866+
```
1867+
1868+
_See [use case](../src/roles/domain/useCases/GetUserSelectableRoles.ts) implementation_.
1869+
18451870
## Info
18461871

18471872
#### Get Dataverse Backend Version

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export * from './core'
22
export * from './info'
33
export * from './users'
4+
export * from './roles'
45
export * from './auth'
56
export * from './datasets'
67
export * from './collections'

src/roles/domain/models/Role.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface Role {
2+
id: number
3+
name: string
4+
alias: string
5+
description: string
6+
permissions: string[]
7+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { Role } from '../models/Role'
2+
3+
export interface IRolesRepository {
4+
getUserSelectableRoles(): Promise<Role[]>
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface RolePayload {
2+
id: number
3+
name: string
4+
alias: string
5+
description: string
6+
permissions: string[]
7+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { AxiosResponse } from 'axios'
2+
import { Role } from '../../models/Role'
3+
import { RolePayload } from './RolePayload'
4+
5+
export const transformRolesUserSelectableResponseToRoles = (response: AxiosResponse): Role[] => {
6+
const roleUserSelectablePayload = response.data.data as RolePayload[]
7+
8+
return roleUserSelectablePayload.map((role: RolePayload) => ({
9+
id: role.id,
10+
name: role.name,
11+
alias: role.alias,
12+
description: role.description,
13+
permissions: role.permissions
14+
}))
15+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { Role } from '../models/Role'
3+
import { IRolesRepository } from '../repositories/IRolesRepository'
4+
5+
export class GetUserSelectableRoles implements UseCase<Role[]> {
6+
constructor(private readonly rolesRepository: IRolesRepository) {}
7+
8+
/**
9+
* Returns the appropriate roles that the calling user can use as filters when searching within their data.
10+
*
11+
* @returns {Promise<Role[]>} - A promise that resolves to an array of Role instances.
12+
*/
13+
async execute(): Promise<Role[]> {
14+
return (await this.rolesRepository.getUserSelectableRoles()) as Role[]
15+
}
16+
}

src/roles/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { RolesRepository } from './infra/repositories/RolesRepository'
2+
import { GetUserSelectableRoles } from './domain/useCases/GetUserSelectableRoles'
3+
4+
const rolesRepository = new RolesRepository()
5+
6+
const getUserSelectableRoles = new GetUserSelectableRoles(rolesRepository)
7+
8+
export { getUserSelectableRoles }
9+
10+
export { Role } from './domain/models/Role'
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'
2+
import { IRolesRepository } from '../../domain/repositories/IRolesRepository'
3+
import { Role } from '../../domain/models/Role'
4+
import { transformRolesUserSelectableResponseToRoles } from '../../domain/repositories/transformers/roleTransformers'
5+
6+
export class RolesRepository extends ApiRepository implements IRolesRepository {
7+
private readonly rolesResourceName: string = 'roles'
8+
public async getUserSelectableRoles(): Promise<Role[]> {
9+
return this.doGet(`/${this.rolesResourceName}/userSelectable`, true)
10+
.then((response) => transformRolesUserSelectableResponseToRoles(response))
11+
.catch((error) => {
12+
throw error
13+
})
14+
}
15+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import {
2+
ApiConfig,
3+
DataverseApiAuthMechanism
4+
} from '../../../src/core/infra/repositories/ApiConfig'
5+
import { TestConstants } from '../../testHelpers/TestConstants'
6+
import { RolesRepository } from '../../../src/roles/infra/repositories/RolesRepository'
7+
import { createSuperAdminRoleArray } from '../../testHelpers/roles/roleHelper'
8+
9+
describe('RolesRepository', () => {
10+
const sut: RolesRepository = new RolesRepository()
11+
12+
describe('getUserSelectableRoles', () => {
13+
test('should return list of selectable roles for authenticated user', async () => {
14+
ApiConfig.init(
15+
TestConstants.TEST_API_URL,
16+
DataverseApiAuthMechanism.API_KEY,
17+
process.env.TEST_API_KEY
18+
)
19+
const actual = await sut.getUserSelectableRoles()
20+
expect(actual).toStrictEqual(createSuperAdminRoleArray())
21+
})
22+
})
23+
})

0 commit comments

Comments
 (0)