From 66c123a64fd2bdd5558295e00cc8c4cf2fea01d2 Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Mon, 29 Apr 2024 14:22:14 +0100 Subject: [PATCH 1/9] feat: get working version --- .../packit/controllers/RoleController.kt | 25 +++++++++++++++ .../packit/controllers/UserController.kt | 2 +- .../src/main/kotlin/packit/model/Packet.kt | 3 +- .../main/kotlin/packit/model/Permission.kt | 2 +- api/app/src/main/kotlin/packit/model/Role.kt | 2 +- api/app/src/main/kotlin/packit/model/Tag.kt | 2 +- .../packit/model/{ => dto}/CreateBasicUser.kt | 2 +- .../kotlin/packit/model/dto/CreateRole.kt | 9 ++++++ .../packit/repository/PermissionRepository.kt | 3 ++ .../packit/repository/RoleRepository.kt | 3 +- .../packit/service/PermissionService.kt | 31 +++++++++++++++++++ .../main/kotlin/packit/service/RoleService.kt | 26 +++++++++++----- .../main/kotlin/packit/service/UserService.kt | 2 +- .../src/main/resources/application.properties | 2 +- .../src/main/resources/errorBundle.properties | 1 + .../controllers/UserControllerTest.kt | 2 +- .../unit/controllers/UserControllerTest.kt | 2 +- .../packit/unit/service/RoleServiceTest.kt | 8 ++--- .../packit/unit/service/UserServiceTest.kt | 2 +- 19 files changed, 105 insertions(+), 24 deletions(-) create mode 100644 api/app/src/main/kotlin/packit/controllers/RoleController.kt rename api/app/src/main/kotlin/packit/model/{ => dto}/CreateBasicUser.kt (94%) create mode 100644 api/app/src/main/kotlin/packit/model/dto/CreateRole.kt create mode 100644 api/app/src/main/kotlin/packit/service/PermissionService.kt diff --git a/api/app/src/main/kotlin/packit/controllers/RoleController.kt b/api/app/src/main/kotlin/packit/controllers/RoleController.kt new file mode 100644 index 00000000..c1007241 --- /dev/null +++ b/api/app/src/main/kotlin/packit/controllers/RoleController.kt @@ -0,0 +1,25 @@ +package packit.controllers + +import org.springframework.http.ResponseEntity +import org.springframework.security.access.prepost.PreAuthorize +import org.springframework.stereotype.Controller +import org.springframework.validation.annotation.Validated +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import packit.model.dto.CreateRole +import packit.service.RoleService + +@Controller +@PreAuthorize("hasAuthority('user.manage')") +@RequestMapping("/role") +class RoleController(private val roleService: RoleService) +{ + @PostMapping("/create") + fun createRole(@RequestBody @Validated createRole: CreateRole): ResponseEntity> + { + roleService.createRole(createRole) + + return ResponseEntity.ok(mapOf("message" to "Role created")) + } +} \ No newline at end of file diff --git a/api/app/src/main/kotlin/packit/controllers/UserController.kt b/api/app/src/main/kotlin/packit/controllers/UserController.kt index c1d16307..f62e3563 100644 --- a/api/app/src/main/kotlin/packit/controllers/UserController.kt +++ b/api/app/src/main/kotlin/packit/controllers/UserController.kt @@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import packit.AppConfig import packit.exceptions.PackitException -import packit.model.CreateBasicUser +import packit.model.dto.CreateBasicUser import packit.service.UserService @Controller diff --git a/api/app/src/main/kotlin/packit/model/Packet.kt b/api/app/src/main/kotlin/packit/model/Packet.kt index 92aefaf8..4cae07d3 100644 --- a/api/app/src/main/kotlin/packit/model/Packet.kt +++ b/api/app/src/main/kotlin/packit/model/Packet.kt @@ -25,8 +25,7 @@ class Packet( inverseJoinColumns = [JoinColumn(name = "tag_id")] ) var tags: MutableList = mutableListOf(), - - @OneToMany(mappedBy = "packet") + @OneToMany(mappedBy = "packet", cascade = [CascadeType.ALL]) var rolePermissions: MutableList = mutableListOf() ) diff --git a/api/app/src/main/kotlin/packit/model/Permission.kt b/api/app/src/main/kotlin/packit/model/Permission.kt index b079ba7a..fc3346ef 100644 --- a/api/app/src/main/kotlin/packit/model/Permission.kt +++ b/api/app/src/main/kotlin/packit/model/Permission.kt @@ -7,7 +7,7 @@ import jakarta.persistence.* class Permission( var name: String, var description: String, - @OneToMany(mappedBy = "permission") + @OneToMany(mappedBy = "permission", cascade = [CascadeType.ALL]) var rolePermissions: MutableList = mutableListOf(), @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/api/app/src/main/kotlin/packit/model/Role.kt b/api/app/src/main/kotlin/packit/model/Role.kt index 23a6c55f..790f4a34 100644 --- a/api/app/src/main/kotlin/packit/model/Role.kt +++ b/api/app/src/main/kotlin/packit/model/Role.kt @@ -6,7 +6,7 @@ import jakarta.persistence.* @Table(name = "`role`") class Role( var name: String, - @OneToMany(mappedBy = "role", fetch = FetchType.EAGER) + @OneToMany(mappedBy = "role", fetch = FetchType.EAGER, cascade = [CascadeType.ALL]) var rolePermissions: MutableList = mutableListOf(), @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY) var users: MutableList = mutableListOf(), diff --git a/api/app/src/main/kotlin/packit/model/Tag.kt b/api/app/src/main/kotlin/packit/model/Tag.kt index 9146c99f..9b1fd26b 100644 --- a/api/app/src/main/kotlin/packit/model/Tag.kt +++ b/api/app/src/main/kotlin/packit/model/Tag.kt @@ -8,7 +8,7 @@ class Tag( val name: String, @ManyToMany(mappedBy = "tags") var packets: MutableList = mutableListOf(), - @OneToMany(mappedBy = "tag") + @OneToMany(mappedBy = "tag", cascade = [CascadeType.ALL]) var rolePermissions: MutableList = mutableListOf(), @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/api/app/src/main/kotlin/packit/model/CreateBasicUser.kt b/api/app/src/main/kotlin/packit/model/dto/CreateBasicUser.kt similarity index 94% rename from api/app/src/main/kotlin/packit/model/CreateBasicUser.kt rename to api/app/src/main/kotlin/packit/model/dto/CreateBasicUser.kt index 95389802..b166c50c 100644 --- a/api/app/src/main/kotlin/packit/model/CreateBasicUser.kt +++ b/api/app/src/main/kotlin/packit/model/dto/CreateBasicUser.kt @@ -1,4 +1,4 @@ -package packit.model +package packit.model.dto import jakarta.validation.constraints.Email import jakarta.validation.constraints.Size diff --git a/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt b/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt new file mode 100644 index 00000000..3c9af663 --- /dev/null +++ b/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt @@ -0,0 +1,9 @@ +package packit.model.dto + +import org.jetbrains.annotations.NotNull + +data class CreateRole( + @field:NotNull + val name: String, + val permissions: List = listOf() +) \ No newline at end of file diff --git a/api/app/src/main/kotlin/packit/repository/PermissionRepository.kt b/api/app/src/main/kotlin/packit/repository/PermissionRepository.kt index 060525e2..e3cea30f 100644 --- a/api/app/src/main/kotlin/packit/repository/PermissionRepository.kt +++ b/api/app/src/main/kotlin/packit/repository/PermissionRepository.kt @@ -6,3 +6,6 @@ import packit.model.Permission @Repository interface PermissionRepository : JpaRepository +{ + fun findByNameIn(names: List): List +} diff --git a/api/app/src/main/kotlin/packit/repository/RoleRepository.kt b/api/app/src/main/kotlin/packit/repository/RoleRepository.kt index b6f890c0..2f00b710 100644 --- a/api/app/src/main/kotlin/packit/repository/RoleRepository.kt +++ b/api/app/src/main/kotlin/packit/repository/RoleRepository.kt @@ -8,6 +8,7 @@ import packit.model.Role interface RoleRepository : JpaRepository { fun findByName(name: String): Role? - fun existsByName(name: String): Boolean + fun findByNameIn(names: List): List + } diff --git a/api/app/src/main/kotlin/packit/service/PermissionService.kt b/api/app/src/main/kotlin/packit/service/PermissionService.kt new file mode 100644 index 00000000..f0cc047e --- /dev/null +++ b/api/app/src/main/kotlin/packit/service/PermissionService.kt @@ -0,0 +1,31 @@ +package packit.service + +import org.springframework.http.HttpStatus +import org.springframework.stereotype.Service +import packit.exceptions.PackitException +import packit.model.Permission +import packit.repository.PermissionRepository + +interface PermissionService +{ + fun checkMatchingPermissions(permissionsToCheck: List): List +} + + +@Service +class BasePermissionService( + private val permissionRepository: PermissionRepository +) : PermissionService +{ + override fun checkMatchingPermissions(permissionsToCheck: List): List + { + val matchedPermissions = permissionRepository.findByNameIn(permissionsToCheck) + + if (matchedPermissions.size != permissionsToCheck.size) + { + throw PackitException("invalidPermissionsProvided", HttpStatus.BAD_REQUEST) + } + return matchedPermissions + } + +} \ No newline at end of file diff --git a/api/app/src/main/kotlin/packit/service/RoleService.kt b/api/app/src/main/kotlin/packit/service/RoleService.kt index e0b4e885..45fd7aa3 100644 --- a/api/app/src/main/kotlin/packit/service/RoleService.kt +++ b/api/app/src/main/kotlin/packit/service/RoleService.kt @@ -5,22 +5,26 @@ import org.springframework.security.core.GrantedAuthority import org.springframework.security.core.authority.SimpleGrantedAuthority import org.springframework.stereotype.Service import packit.exceptions.PackitException +import packit.model.Permission import packit.model.Role import packit.model.RolePermission +import packit.model.dto.CreateRole import packit.repository.RoleRepository interface RoleService { fun getUsernameRole(username: String): Role fun getAdminRole(): Role - fun saveRole(roleName: String) + fun saveRole(roleName: String, permissions: List) fun checkMatchingRoles(rolesToCheck: List): List fun getGrantedAuthorities(roles: List): MutableList + fun createRole(createRole: CreateRole) } @Service class BaseRoleService( - private val roleRepository: RoleRepository + private val roleRepository: RoleRepository, + private val permissionService: PermissionService ) : RoleService { override fun getUsernameRole(username: String): Role @@ -45,26 +49,34 @@ class BaseRoleService( return roleRepository.save(Role(name = "ADMIN")) } - override fun saveRole(roleName: String) + override fun createRole(createRole: CreateRole) + { + val permissions = permissionService.checkMatchingPermissions(createRole.permissions) + + saveRole(createRole.name, permissions) + } + + override fun saveRole(roleName: String, permissions: List) { if (roleRepository.existsByName(roleName)) { throw PackitException("roleAlreadyExists") } val role = Role(name = roleName) + role.rolePermissions = permissions.map { RolePermission(permission = it, role = role) } + .toMutableList() roleRepository.save(role) } override fun checkMatchingRoles(rolesToCheck: List): List { - val allRoles = roleRepository.findAll() - val foundRoles = rolesToCheck.mapNotNull { name -> allRoles.find { it.name == name } } + val matchedRoles = roleRepository.findByNameIn(rolesToCheck) - if (foundRoles.size != rolesToCheck.size) + if (matchedRoles.size != rolesToCheck.size) { throw PackitException("invalidRolesProvided", HttpStatus.BAD_REQUEST) } - return foundRoles + return matchedRoles } /** diff --git a/api/app/src/main/kotlin/packit/service/UserService.kt b/api/app/src/main/kotlin/packit/service/UserService.kt index 8eee8498..046c562a 100644 --- a/api/app/src/main/kotlin/packit/service/UserService.kt +++ b/api/app/src/main/kotlin/packit/service/UserService.kt @@ -4,8 +4,8 @@ import org.springframework.http.HttpStatus import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.stereotype.Service import packit.exceptions.PackitException -import packit.model.CreateBasicUser import packit.model.User +import packit.model.dto.CreateBasicUser import packit.repository.UserRepository import java.time.Instant diff --git a/api/app/src/main/resources/application.properties b/api/app/src/main/resources/application.properties index 1f2306bb..be01fe3f 100644 --- a/api/app/src/main/resources/application.properties +++ b/api/app/src/main/resources/application.properties @@ -19,7 +19,7 @@ db.password=${PACKIT_DB_PASSWORD:changeme} #Auth auth.jwt.secret=${PACKIT_JWT_SECRET:changesecretkey} auth.oauth2.redirect.url=${PACKIT_AUTH_REDIRECT_URL:http://localhost:3000/redirect/} -auth.method=${PACKIT_AUTH_METHOD:github} +auth.method=${PACKIT_AUTH_METHOD:basic} auth.expiryDays=${PACKIT_JWT_EXPIRY_DAYS:1} auth.enabled=${PACKIT_AUTH_ENABLED:true} auth.githubAPIOrg=${PACKIT_AUTH_GITHUB_ORG:mrc-ide} diff --git a/api/app/src/main/resources/errorBundle.properties b/api/app/src/main/resources/errorBundle.properties index 42e4a5e6..344bae67 100644 --- a/api/app/src/main/resources/errorBundle.properties +++ b/api/app/src/main/resources/errorBundle.properties @@ -10,6 +10,7 @@ githubLoginDisabled=GitHub login is disabled basicLoginDisabled=Basic login is disabled insufficientPrivileges=You do not have sufficient privileges for attempted action invalidRolesProvided=Invalid roles provided +invalidPermissionsProvided=Invalid permissions provided userAlreadyExists=User already exists userNotFound=User not found roleAlreadyExists=Role already exists diff --git a/api/app/src/test/kotlin/packit/integration/controllers/UserControllerTest.kt b/api/app/src/test/kotlin/packit/integration/controllers/UserControllerTest.kt index 0a0f2910..36a8c17c 100644 --- a/api/app/src/test/kotlin/packit/integration/controllers/UserControllerTest.kt +++ b/api/app/src/test/kotlin/packit/integration/controllers/UserControllerTest.kt @@ -7,7 +7,7 @@ import org.springframework.test.context.TestPropertySource import org.springframework.test.context.jdbc.Sql import packit.integration.IntegrationTest import packit.integration.WithAuthenticatedUser -import packit.model.CreateBasicUser +import packit.model.dto.CreateBasicUser import packit.repository.UserRepository import kotlin.test.Test import kotlin.test.assertEquals diff --git a/api/app/src/test/kotlin/packit/unit/controllers/UserControllerTest.kt b/api/app/src/test/kotlin/packit/unit/controllers/UserControllerTest.kt index bcac8aa5..87a079d7 100644 --- a/api/app/src/test/kotlin/packit/unit/controllers/UserControllerTest.kt +++ b/api/app/src/test/kotlin/packit/unit/controllers/UserControllerTest.kt @@ -8,7 +8,7 @@ import org.springframework.http.HttpStatus import packit.AppConfig import packit.controllers.UserController import packit.exceptions.PackitException -import packit.model.CreateBasicUser +import packit.model.dto.CreateBasicUser import packit.service.UserService import kotlin.test.Test import kotlin.test.assertEquals diff --git a/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt b/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt index 1b7753fb..6e2afd03 100644 --- a/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt +++ b/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt @@ -79,7 +79,7 @@ class RoleServiceTest whenever(roleRepository.existsByName("roleName")).thenReturn(true) assertThrows(PackitException::class.java) { - roleService.saveRole("roleName") + roleService.saveRole("roleName", listOf()) } } @@ -88,12 +88,12 @@ class RoleServiceTest { whenever(roleRepository.existsByName("roleName")).thenReturn(false) - roleService.saveRole("roleName") + roleService.saveRole("roleName", listOf()) verify(roleRepository).save( argThat { - this.name == "roleName" - } + this.name == "roleName" + } ) } diff --git a/api/app/src/test/kotlin/packit/unit/service/UserServiceTest.kt b/api/app/src/test/kotlin/packit/unit/service/UserServiceTest.kt index 2cf2006c..d2aa919b 100644 --- a/api/app/src/test/kotlin/packit/unit/service/UserServiceTest.kt +++ b/api/app/src/test/kotlin/packit/unit/service/UserServiceTest.kt @@ -7,9 +7,9 @@ import org.mockito.kotlin.* import org.springframework.http.HttpStatus import org.springframework.security.crypto.password.PasswordEncoder import packit.exceptions.PackitException -import packit.model.CreateBasicUser import packit.model.Role import packit.model.User +import packit.model.dto.CreateBasicUser import packit.repository.UserRepository import packit.service.BaseUserService import packit.service.RoleService From 82d3a529fa8838422f6ab7f2f79867f2e626518b Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Mon, 29 Apr 2024 15:47:51 +0100 Subject: [PATCH 2/9] Add test implementation for TestNG and update authentication method --- api/app/build.gradle.kts | 1 + .../packit/repository/RoleRepository.kt | 1 - .../main/kotlin/packit/service/RoleService.kt | 3 +- .../src/main/resources/application.properties | 2 +- .../unit/service/PermissionServiceTest.kt | 50 +++++++++++++++++++ .../packit/unit/service/RoleServiceTest.kt | 39 ++++++++++++--- 6 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 api/app/src/test/kotlin/packit/unit/service/PermissionServiceTest.kt diff --git a/api/app/build.gradle.kts b/api/app/build.gradle.kts index e80dc9be..f18b7e61 100644 --- a/api/app/build.gradle.kts +++ b/api/app/build.gradle.kts @@ -54,6 +54,7 @@ dependencies { implementation("com.auth0:java-jwt:4.4.0") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.flywaydb:flyway-core") + testImplementation("org.testng:testng:7.1.0") developmentOnly("org.springframework.boot:spring-boot-devtools") runtimeOnly("org.postgresql:postgresql") diff --git a/api/app/src/main/kotlin/packit/repository/RoleRepository.kt b/api/app/src/main/kotlin/packit/repository/RoleRepository.kt index 2f00b710..d6f8a339 100644 --- a/api/app/src/main/kotlin/packit/repository/RoleRepository.kt +++ b/api/app/src/main/kotlin/packit/repository/RoleRepository.kt @@ -10,5 +10,4 @@ interface RoleRepository : JpaRepository fun findByName(name: String): Role? fun existsByName(name: String): Boolean fun findByNameIn(names: List): List - } diff --git a/api/app/src/main/kotlin/packit/service/RoleService.kt b/api/app/src/main/kotlin/packit/service/RoleService.kt index 45fd7aa3..1b85bbfa 100644 --- a/api/app/src/main/kotlin/packit/service/RoleService.kt +++ b/api/app/src/main/kotlin/packit/service/RoleService.kt @@ -15,7 +15,6 @@ interface RoleService { fun getUsernameRole(username: String): Role fun getAdminRole(): Role - fun saveRole(roleName: String, permissions: List) fun checkMatchingRoles(rolesToCheck: List): List fun getGrantedAuthorities(roles: List): MutableList fun createRole(createRole: CreateRole) @@ -56,7 +55,7 @@ class BaseRoleService( saveRole(createRole.name, permissions) } - override fun saveRole(roleName: String, permissions: List) + internal fun saveRole(roleName: String, permissions: List = listOf()) { if (roleRepository.existsByName(roleName)) { diff --git a/api/app/src/main/resources/application.properties b/api/app/src/main/resources/application.properties index be01fe3f..1f2306bb 100644 --- a/api/app/src/main/resources/application.properties +++ b/api/app/src/main/resources/application.properties @@ -19,7 +19,7 @@ db.password=${PACKIT_DB_PASSWORD:changeme} #Auth auth.jwt.secret=${PACKIT_JWT_SECRET:changesecretkey} auth.oauth2.redirect.url=${PACKIT_AUTH_REDIRECT_URL:http://localhost:3000/redirect/} -auth.method=${PACKIT_AUTH_METHOD:basic} +auth.method=${PACKIT_AUTH_METHOD:github} auth.expiryDays=${PACKIT_JWT_EXPIRY_DAYS:1} auth.enabled=${PACKIT_AUTH_ENABLED:true} auth.githubAPIOrg=${PACKIT_AUTH_GITHUB_ORG:mrc-ide} diff --git a/api/app/src/test/kotlin/packit/unit/service/PermissionServiceTest.kt b/api/app/src/test/kotlin/packit/unit/service/PermissionServiceTest.kt new file mode 100644 index 00000000..06da9af9 --- /dev/null +++ b/api/app/src/test/kotlin/packit/unit/service/PermissionServiceTest.kt @@ -0,0 +1,50 @@ +package packit.unit.service + +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.assertThrows +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import packit.exceptions.PackitException +import packit.model.Permission +import packit.repository.PermissionRepository +import packit.service.BasePermissionService +import kotlin.test.Test +import kotlin.test.assertEquals + +class PermissionServiceTest +{ + private lateinit var permissionRepository: PermissionRepository + private lateinit var basePermissionService: BasePermissionService + + @BeforeEach + fun setup() + { + permissionRepository = mock() + basePermissionService = BasePermissionService(permissionRepository) + } + + @Test + fun `checkMatchingPermissions returns matched permissions when all permissions exist`() + { + val permissionsToCheck = listOf("p1", "p2") + val matchedPermissions = listOf(Permission("p1", "d1"), Permission("p2", "d2")) + whenever(permissionRepository.findByNameIn(permissionsToCheck)).thenReturn(matchedPermissions) + + val result = basePermissionService.checkMatchingPermissions(permissionsToCheck) + + assertEquals(matchedPermissions, result) + } + + @Test + fun `checkMatchingPermissions throws PackitException when not all permissions exist`() + { + val permissionsToCheck = listOf("p1", "p2") + val matchedPermissions = listOf(Permission("p1", "d2")) + whenever(permissionRepository.findByNameIn(permissionsToCheck)).thenReturn(matchedPermissions) + + assertThrows { + basePermissionService.checkMatchingPermissions(permissionsToCheck) + } + } + +} \ No newline at end of file diff --git a/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt b/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt index 6e2afd03..a7fce835 100644 --- a/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt +++ b/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt @@ -11,20 +11,24 @@ import packit.model.Packet import packit.model.Permission import packit.model.Role import packit.model.RolePermission +import packit.model.dto.CreateRole import packit.repository.RoleRepository import packit.service.BaseRoleService +import packit.service.PermissionService import kotlin.test.assertTrue class RoleServiceTest { private lateinit var roleRepository: RoleRepository private lateinit var roleService: BaseRoleService + private lateinit var permissionService: PermissionService @BeforeEach fun setup() { roleRepository = mock() - roleService = BaseRoleService(roleRepository) + permissionService = mock() + roleService = BaseRoleService(roleRepository, permissionService) } @Test @@ -73,6 +77,25 @@ class RoleServiceTest verify(roleRepository).save(any()) } + @Test + fun `createRole creates role with matching permissions`() + { + val createRole = CreateRole(name = "newRole", permissions = listOf("p1", "p2")) + val permissions = + listOf(Permission(name = "p1", description = "d1"), Permission(name = "p2", description = "d2")) + whenever(permissionService.checkMatchingPermissions(createRole.permissions)).thenReturn(permissions) + whenever(roleRepository.existsByName(createRole.name)).thenReturn(false) + + roleService.createRole(createRole) + + verify(roleRepository).save( + argThat { + this.name == createRole.name + this.rolePermissions.size == 2 + } + ) + } + @Test fun `saveRole throws exception if role already exists`() { @@ -84,15 +107,19 @@ class RoleServiceTest } @Test - fun `saveRole saves role when does not exist`() + fun `saveRole saves role with permissions when does not exist`() { + val roleName = "roleName" + val permissions = + listOf(Permission(name = "p1", description = "d1"), Permission(name = "p2", description = "d2")) whenever(roleRepository.existsByName("roleName")).thenReturn(false) - roleService.saveRole("roleName", listOf()) + roleService.saveRole(roleName, permissions) verify(roleRepository).save( argThat { - this.name == "roleName" + this.name == roleName + this.rolePermissions.size == 2 } ) } @@ -102,7 +129,7 @@ class RoleServiceTest { val rolesToCheck = listOf("role1", "role2") val allRoles = listOf(Role(name = "role1")) - whenever(roleRepository.findAll()).thenReturn(allRoles) + whenever(roleRepository.findByNameIn(rolesToCheck)).thenReturn(allRoles) assertThrows(PackitException::class.java) { roleService.checkMatchingRoles(rolesToCheck) @@ -114,7 +141,7 @@ class RoleServiceTest { val rolesToCheck = listOf("role1", "role2") val allRoles = listOf(Role(name = "role1"), Role(name = "role2")) - whenever(roleRepository.findAll()).thenReturn(allRoles) + whenever(roleRepository.findByNameIn(rolesToCheck)).thenReturn(allRoles) val result = roleService.checkMatchingRoles(rolesToCheck) From 2d15547c5c92aa84e19a3045404e5fa53fe93294 Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Tue, 30 Apr 2024 10:26:35 +0100 Subject: [PATCH 3/9] Fix role controller and permission service --- .../packit/controllers/RoleController.kt | 2 +- .../kotlin/packit/model/dto/CreateRole.kt | 2 +- .../packit/service/PermissionService.kt | 4 +- .../controllers/RoleControllerTest.kt | 66 +++++++++++++++++++ .../controllers/UserControllerTest.kt | 2 +- .../unit/service/PermissionServiceTest.kt | 3 +- .../src/test/resources/delete-test-users.sql | 8 ++- 7 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt diff --git a/api/app/src/main/kotlin/packit/controllers/RoleController.kt b/api/app/src/main/kotlin/packit/controllers/RoleController.kt index c1007241..4cf1d145 100644 --- a/api/app/src/main/kotlin/packit/controllers/RoleController.kt +++ b/api/app/src/main/kotlin/packit/controllers/RoleController.kt @@ -22,4 +22,4 @@ class RoleController(private val roleService: RoleService) return ResponseEntity.ok(mapOf("message" to "Role created")) } -} \ No newline at end of file +} diff --git a/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt b/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt index 3c9af663..86e0e177 100644 --- a/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt +++ b/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt @@ -6,4 +6,4 @@ data class CreateRole( @field:NotNull val name: String, val permissions: List = listOf() -) \ No newline at end of file +) diff --git a/api/app/src/main/kotlin/packit/service/PermissionService.kt b/api/app/src/main/kotlin/packit/service/PermissionService.kt index f0cc047e..0197a3a0 100644 --- a/api/app/src/main/kotlin/packit/service/PermissionService.kt +++ b/api/app/src/main/kotlin/packit/service/PermissionService.kt @@ -11,7 +11,6 @@ interface PermissionService fun checkMatchingPermissions(permissionsToCheck: List): List } - @Service class BasePermissionService( private val permissionRepository: PermissionRepository @@ -27,5 +26,4 @@ class BasePermissionService( } return matchedPermissions } - -} \ No newline at end of file +} diff --git a/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt b/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt new file mode 100644 index 00000000..2e2b5f20 --- /dev/null +++ b/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt @@ -0,0 +1,66 @@ +package packit.integration.controllers + +import com.fasterxml.jackson.databind.ObjectMapper +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpStatus +import org.springframework.test.context.jdbc.Sql +import packit.integration.IntegrationTest +import packit.integration.WithAuthenticatedUser +import packit.model.dto.CreateRole +import packit.repository.RoleRepository +import kotlin.test.assertEquals +import kotlin.test.assertNotNull + +@Sql("/delete-test-users.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) +class RoleControllerTest : IntegrationTest() +{ + @Autowired + private lateinit var roleRepository: RoleRepository + private val createTestRoleBody = ObjectMapper().writeValueAsString( + CreateRole( + name = "testRole", + permissions = listOf("packet.run", "packet.read") + ) + ) + + @Test + @WithAuthenticatedUser(authorities = ["user.manage"]) + fun `users with manage authority can create roles`() + { + val result = restTemplate.postForEntity( + "/role/create", + getTokenizedHttpEntity(data = createTestRoleBody), + String::class.java + ) + + assertSuccess(result) + assertNotNull(roleRepository.findByName("testRole")) + } + + @Test + @WithAuthenticatedUser(authorities = ["none"]) + fun `user without user manage permission cannot create roles`() + { + val result = restTemplate.postForEntity( + "/role/create", + getTokenizedHttpEntity(data = createTestRoleBody), + String::class.java + ) + + assertEquals(result.statusCode, HttpStatus.UNAUTHORIZED) + } + + @Test + @WithAuthenticatedUser(authorities = ["user.manage"]) + fun `reject request if createRole body is invalid`() + { + val result = restTemplate.postForEntity( + "/role/create", + getTokenizedHttpEntity(data = "{}"), + String::class.java + ) + + assertEquals(result.statusCode, HttpStatus.BAD_REQUEST) + } +} diff --git a/api/app/src/test/kotlin/packit/integration/controllers/UserControllerTest.kt b/api/app/src/test/kotlin/packit/integration/controllers/UserControllerTest.kt index 36a8c17c..6345e361 100644 --- a/api/app/src/test/kotlin/packit/integration/controllers/UserControllerTest.kt +++ b/api/app/src/test/kotlin/packit/integration/controllers/UserControllerTest.kt @@ -44,7 +44,7 @@ class UserControllerTest : IntegrationTest() @Test @WithAuthenticatedUser(authorities = ["none"]) - fun `non-admin user cannot create basic users`() + fun `user without user manage permission cannot create basic users`() { val result = restTemplate.postForEntity( "/user/basic/create", diff --git a/api/app/src/test/kotlin/packit/unit/service/PermissionServiceTest.kt b/api/app/src/test/kotlin/packit/unit/service/PermissionServiceTest.kt index 06da9af9..a4ec5f0b 100644 --- a/api/app/src/test/kotlin/packit/unit/service/PermissionServiceTest.kt +++ b/api/app/src/test/kotlin/packit/unit/service/PermissionServiceTest.kt @@ -46,5 +46,4 @@ class PermissionServiceTest basePermissionService.checkMatchingPermissions(permissionsToCheck) } } - -} \ No newline at end of file +} diff --git a/api/app/src/test/resources/delete-test-users.sql b/api/app/src/test/resources/delete-test-users.sql index 1b1706df..03c0bdd2 100644 --- a/api/app/src/test/resources/delete-test-users.sql +++ b/api/app/src/test/resources/delete-test-users.sql @@ -1,4 +1,8 @@ --- delete all users except super admin +-- delete all users and roles except super admin DELETE FROM "user" -WHERE display_name NOT IN ('Super Admin'); \ No newline at end of file +WHERE display_name != 'Super Admin'; + +DELETE +FROM "role" +WHERE name != 'ADMIN' \ No newline at end of file From 409d6c9cd6940038d4e36a1653e4bfb8d7ea2216 Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Tue, 30 Apr 2024 10:29:01 +0100 Subject: [PATCH 4/9] chore: move models to dto folder --- .../src/main/kotlin/packit/model/PacketGroupSummary.kt | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 api/app/src/main/kotlin/packit/model/PacketGroupSummary.kt diff --git a/api/app/src/main/kotlin/packit/model/PacketGroupSummary.kt b/api/app/src/main/kotlin/packit/model/PacketGroupSummary.kt deleted file mode 100644 index 1ef14aaa..00000000 --- a/api/app/src/main/kotlin/packit/model/PacketGroupSummary.kt +++ /dev/null @@ -1,10 +0,0 @@ -package packit.model - -// Projection class for PacketRepository.findPacketGroupSummaryByName -interface PacketGroupSummary -{ - fun getName(): String - fun getPacketCount(): Int - fun getLatestId(): String - fun getLatestTime(): Double -} From c9ac5ae4d988ae179fe8fb228f16ab2296e6de8a Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Tue, 30 Apr 2024 10:29:26 +0100 Subject: [PATCH 5/9] chore: move to dto modelss --- .../main/kotlin/packit/controllers/LoginController.kt | 4 ++-- .../main/kotlin/packit/controllers/PacketController.kt | 2 +- .../kotlin/packit/model/{ => dto}/LoginWithPassword.kt | 2 +- .../kotlin/packit/model/{ => dto}/LoginWithToken.kt | 2 +- .../kotlin/packit/model/{ => dto}/OutpackMetadata.kt | 4 +++- .../main/kotlin/packit/model/dto/PacketGroupSummary.kt | 10 ++++++++++ .../main/kotlin/packit/repository/PacketRepository.kt | 2 +- .../main/kotlin/packit/service/BasePacketService.kt | 6 +++++- .../main/kotlin/packit/service/BasicLoginService.kt | 2 +- .../kotlin/packit/service/GithubAPILoginService.kt | 2 +- .../main/kotlin/packit/service/OutpackServerClient.kt | 2 +- .../integration/controllers/LoginControllerTest.kt | 4 ++-- .../packit/unit/controllers/LoginControllerTest.kt | 4 ++-- .../packit/unit/controllers/PacketControllerTest.kt | 1 + .../packit/unit/service/BasicLoginServiceTest.kt | 2 +- .../packit/unit/service/GithubAPILoginServiceTest.kt | 2 +- .../kotlin/packit/unit/service/PacketServiceTest.kt | 2 ++ 17 files changed, 36 insertions(+), 17 deletions(-) rename api/app/src/main/kotlin/packit/model/{ => dto}/LoginWithPassword.kt (83%) rename api/app/src/main/kotlin/packit/model/{ => dto}/LoginWithToken.kt (79%) rename api/app/src/main/kotlin/packit/model/{ => dto}/OutpackMetadata.kt (70%) create mode 100644 api/app/src/main/kotlin/packit/model/dto/PacketGroupSummary.kt diff --git a/api/app/src/main/kotlin/packit/controllers/LoginController.kt b/api/app/src/main/kotlin/packit/controllers/LoginController.kt index 1c6e01a2..783f9a92 100644 --- a/api/app/src/main/kotlin/packit/controllers/LoginController.kt +++ b/api/app/src/main/kotlin/packit/controllers/LoginController.kt @@ -6,8 +6,8 @@ import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.* import packit.AppConfig import packit.exceptions.PackitException -import packit.model.LoginWithPassword -import packit.model.LoginWithToken +import packit.model.dto.LoginWithPassword +import packit.model.dto.LoginWithToken import packit.service.BasicLoginService import packit.service.GithubAPILoginService diff --git a/api/app/src/main/kotlin/packit/controllers/PacketController.kt b/api/app/src/main/kotlin/packit/controllers/PacketController.kt index 46f7e630..198f2e10 100644 --- a/api/app/src/main/kotlin/packit/controllers/PacketController.kt +++ b/api/app/src/main/kotlin/packit/controllers/PacketController.kt @@ -4,10 +4,10 @@ import org.springframework.core.io.ByteArrayResource import org.springframework.data.domain.Page import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* -import packit.model.PacketGroupSummary import packit.model.PacketMetadata import packit.model.PageablePayload import packit.model.dto.PacketDto +import packit.model.dto.PacketGroupSummary import packit.model.toDto import packit.service.PacketService diff --git a/api/app/src/main/kotlin/packit/model/LoginWithPassword.kt b/api/app/src/main/kotlin/packit/model/dto/LoginWithPassword.kt similarity index 83% rename from api/app/src/main/kotlin/packit/model/LoginWithPassword.kt rename to api/app/src/main/kotlin/packit/model/dto/LoginWithPassword.kt index ed493c43..324dfb94 100644 --- a/api/app/src/main/kotlin/packit/model/LoginWithPassword.kt +++ b/api/app/src/main/kotlin/packit/model/dto/LoginWithPassword.kt @@ -1,4 +1,4 @@ -package packit.model +package packit.model.dto import org.jetbrains.annotations.NotNull diff --git a/api/app/src/main/kotlin/packit/model/LoginWithToken.kt b/api/app/src/main/kotlin/packit/model/dto/LoginWithToken.kt similarity index 79% rename from api/app/src/main/kotlin/packit/model/LoginWithToken.kt rename to api/app/src/main/kotlin/packit/model/dto/LoginWithToken.kt index 951a1cd1..ce96bc5f 100644 --- a/api/app/src/main/kotlin/packit/model/LoginWithToken.kt +++ b/api/app/src/main/kotlin/packit/model/dto/LoginWithToken.kt @@ -1,4 +1,4 @@ -package packit.model +package packit.model.dto import org.jetbrains.annotations.NotNull diff --git a/api/app/src/main/kotlin/packit/model/OutpackMetadata.kt b/api/app/src/main/kotlin/packit/model/dto/OutpackMetadata.kt similarity index 70% rename from api/app/src/main/kotlin/packit/model/OutpackMetadata.kt rename to api/app/src/main/kotlin/packit/model/dto/OutpackMetadata.kt index 4ca565f9..92afc19c 100644 --- a/api/app/src/main/kotlin/packit/model/OutpackMetadata.kt +++ b/api/app/src/main/kotlin/packit/model/dto/OutpackMetadata.kt @@ -1,4 +1,6 @@ -package packit.model +package packit.model.dto + +import packit.model.TimeMetadata data class OutpackMetadata( val id: String, diff --git a/api/app/src/main/kotlin/packit/model/dto/PacketGroupSummary.kt b/api/app/src/main/kotlin/packit/model/dto/PacketGroupSummary.kt new file mode 100644 index 00000000..413ba793 --- /dev/null +++ b/api/app/src/main/kotlin/packit/model/dto/PacketGroupSummary.kt @@ -0,0 +1,10 @@ +package packit.model.dto + +// Projection class for PacketRepository.findPacketGroupSummaryByName +interface PacketGroupSummary +{ + fun getName(): String + fun getPacketCount(): Int + fun getLatestId(): String + fun getLatestTime(): Double +} diff --git a/api/app/src/main/kotlin/packit/repository/PacketRepository.kt b/api/app/src/main/kotlin/packit/repository/PacketRepository.kt index 24859e47..06b22233 100644 --- a/api/app/src/main/kotlin/packit/repository/PacketRepository.kt +++ b/api/app/src/main/kotlin/packit/repository/PacketRepository.kt @@ -6,7 +6,7 @@ import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query import org.springframework.stereotype.Repository import packit.model.Packet -import packit.model.PacketGroupSummary +import packit.model.dto.PacketGroupSummary @Repository interface PacketRepository : JpaRepository diff --git a/api/app/src/main/kotlin/packit/service/BasePacketService.kt b/api/app/src/main/kotlin/packit/service/BasePacketService.kt index c49aa911..f327b542 100644 --- a/api/app/src/main/kotlin/packit/service/BasePacketService.kt +++ b/api/app/src/main/kotlin/packit/service/BasePacketService.kt @@ -11,7 +11,11 @@ import org.springframework.http.MediaType import org.springframework.stereotype.Service import packit.contentTypes import packit.exceptions.PackitException -import packit.model.* +import packit.model.Packet +import packit.model.PacketGroup +import packit.model.PacketMetadata +import packit.model.PageablePayload +import packit.model.dto.PacketGroupSummary import packit.repository.PacketGroupRepository import packit.repository.PacketRepository import java.security.MessageDigest diff --git a/api/app/src/main/kotlin/packit/service/BasicLoginService.kt b/api/app/src/main/kotlin/packit/service/BasicLoginService.kt index e993e392..d87cc77b 100644 --- a/api/app/src/main/kotlin/packit/service/BasicLoginService.kt +++ b/api/app/src/main/kotlin/packit/service/BasicLoginService.kt @@ -5,7 +5,7 @@ import org.springframework.security.authentication.AuthenticationManager import org.springframework.security.authentication.UsernamePasswordAuthenticationToken import org.springframework.stereotype.Component import packit.exceptions.PackitException -import packit.model.LoginWithPassword +import packit.model.dto.LoginWithPassword import packit.security.profile.BasicUserDetails import packit.security.provider.JwtIssuer diff --git a/api/app/src/main/kotlin/packit/service/GithubAPILoginService.kt b/api/app/src/main/kotlin/packit/service/GithubAPILoginService.kt index 1dd740b7..8acf6ebc 100644 --- a/api/app/src/main/kotlin/packit/service/GithubAPILoginService.kt +++ b/api/app/src/main/kotlin/packit/service/GithubAPILoginService.kt @@ -5,7 +5,7 @@ import org.springframework.stereotype.Component import packit.AppConfig import packit.clients.GithubUserClient import packit.exceptions.PackitException -import packit.model.LoginWithToken +import packit.model.dto.LoginWithToken import packit.security.profile.UserPrincipal import packit.security.provider.JwtIssuer diff --git a/api/app/src/main/kotlin/packit/service/OutpackServerClient.kt b/api/app/src/main/kotlin/packit/service/OutpackServerClient.kt index c3debcbb..c4c8629f 100644 --- a/api/app/src/main/kotlin/packit/service/OutpackServerClient.kt +++ b/api/app/src/main/kotlin/packit/service/OutpackServerClient.kt @@ -12,9 +12,9 @@ import org.springframework.web.client.HttpStatusCodeException import org.springframework.web.client.RestTemplate import packit.AppConfig import packit.exceptions.PackitException -import packit.model.OutpackMetadata import packit.model.OutpackResponse import packit.model.PacketMetadata +import packit.model.dto.OutpackMetadata import java.net.URI interface OutpackServer diff --git a/api/app/src/test/kotlin/packit/integration/controllers/LoginControllerTest.kt b/api/app/src/test/kotlin/packit/integration/controllers/LoginControllerTest.kt index ee4edf4c..c4d57ed2 100644 --- a/api/app/src/test/kotlin/packit/integration/controllers/LoginControllerTest.kt +++ b/api/app/src/test/kotlin/packit/integration/controllers/LoginControllerTest.kt @@ -12,9 +12,9 @@ import org.springframework.http.* import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.test.context.TestPropertySource import packit.integration.IntegrationTest -import packit.model.LoginWithPassword -import packit.model.LoginWithToken import packit.model.User +import packit.model.dto.LoginWithPassword +import packit.model.dto.LoginWithToken import packit.repository.UserRepository import kotlin.test.assertEquals diff --git a/api/app/src/test/kotlin/packit/unit/controllers/LoginControllerTest.kt b/api/app/src/test/kotlin/packit/unit/controllers/LoginControllerTest.kt index fde59b9e..0ece44e0 100644 --- a/api/app/src/test/kotlin/packit/unit/controllers/LoginControllerTest.kt +++ b/api/app/src/test/kotlin/packit/unit/controllers/LoginControllerTest.kt @@ -7,8 +7,8 @@ import org.springframework.http.HttpStatus import packit.AppConfig import packit.controllers.LoginController import packit.exceptions.PackitException -import packit.model.LoginWithPassword -import packit.model.LoginWithToken +import packit.model.dto.LoginWithPassword +import packit.model.dto.LoginWithToken import packit.service.BasicLoginService import packit.service.GithubAPILoginService import kotlin.test.Test diff --git a/api/app/src/test/kotlin/packit/unit/controllers/PacketControllerTest.kt b/api/app/src/test/kotlin/packit/unit/controllers/PacketControllerTest.kt index 7fe5465b..0408e675 100644 --- a/api/app/src/test/kotlin/packit/unit/controllers/PacketControllerTest.kt +++ b/api/app/src/test/kotlin/packit/unit/controllers/PacketControllerTest.kt @@ -13,6 +13,7 @@ import org.springframework.http.HttpHeaders import org.springframework.http.HttpStatus import packit.controllers.PacketController import packit.model.* +import packit.model.dto.PacketGroupSummary import packit.service.PacketService import java.time.Instant import kotlin.test.assertEquals diff --git a/api/app/src/test/kotlin/packit/unit/service/BasicLoginServiceTest.kt b/api/app/src/test/kotlin/packit/unit/service/BasicLoginServiceTest.kt index 5b94a802..20747011 100644 --- a/api/app/src/test/kotlin/packit/unit/service/BasicLoginServiceTest.kt +++ b/api/app/src/test/kotlin/packit/unit/service/BasicLoginServiceTest.kt @@ -7,7 +7,7 @@ import org.springframework.security.authentication.AuthenticationManager import org.springframework.security.authentication.UsernamePasswordAuthenticationToken import org.springframework.security.core.Authentication import packit.exceptions.PackitException -import packit.model.LoginWithPassword +import packit.model.dto.LoginWithPassword import packit.security.profile.BasicUserDetails import packit.security.profile.UserPrincipal import packit.security.provider.JwtIssuer diff --git a/api/app/src/test/kotlin/packit/unit/service/GithubAPILoginServiceTest.kt b/api/app/src/test/kotlin/packit/unit/service/GithubAPILoginServiceTest.kt index 2c0bffbf..7cad74b6 100644 --- a/api/app/src/test/kotlin/packit/unit/service/GithubAPILoginServiceTest.kt +++ b/api/app/src/test/kotlin/packit/unit/service/GithubAPILoginServiceTest.kt @@ -12,9 +12,9 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority import packit.AppConfig import packit.clients.GithubUserClient import packit.exceptions.PackitException -import packit.model.LoginWithToken import packit.model.Role import packit.model.User +import packit.model.dto.LoginWithToken import packit.security.profile.UserPrincipal import packit.security.provider.JwtIssuer import packit.service.GithubAPILoginService diff --git a/api/app/src/test/kotlin/packit/unit/service/PacketServiceTest.kt b/api/app/src/test/kotlin/packit/unit/service/PacketServiceTest.kt index 1bc18d85..545462a9 100644 --- a/api/app/src/test/kotlin/packit/unit/service/PacketServiceTest.kt +++ b/api/app/src/test/kotlin/packit/unit/service/PacketServiceTest.kt @@ -11,6 +11,8 @@ import org.springframework.data.domain.Sort import org.springframework.http.HttpHeaders import packit.exceptions.PackitException import packit.model.* +import packit.model.dto.OutpackMetadata +import packit.model.dto.PacketGroupSummary import packit.repository.PacketGroupRepository import packit.repository.PacketRepository import packit.service.BasePacketService From b0c73484778671a96d2f7b552ac45b5fc211c54a Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Wed, 1 May 2024 14:25:01 +0100 Subject: [PATCH 6/9] Refactor RoleController and RoleControllerTest*** --- .../src/main/kotlin/packit/controllers/RoleController.kt | 2 +- .../packit/integration/controllers/RoleControllerTest.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/app/src/main/kotlin/packit/controllers/RoleController.kt b/api/app/src/main/kotlin/packit/controllers/RoleController.kt index 4cf1d145..765fe01e 100644 --- a/api/app/src/main/kotlin/packit/controllers/RoleController.kt +++ b/api/app/src/main/kotlin/packit/controllers/RoleController.kt @@ -15,7 +15,7 @@ import packit.service.RoleService @RequestMapping("/role") class RoleController(private val roleService: RoleService) { - @PostMapping("/create") + @PostMapping() fun createRole(@RequestBody @Validated createRole: CreateRole): ResponseEntity> { roleService.createRole(createRole) diff --git a/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt b/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt index 2e2b5f20..b98216ce 100644 --- a/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt +++ b/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt @@ -29,7 +29,7 @@ class RoleControllerTest : IntegrationTest() fun `users with manage authority can create roles`() { val result = restTemplate.postForEntity( - "/role/create", + "/role", getTokenizedHttpEntity(data = createTestRoleBody), String::class.java ) @@ -43,7 +43,7 @@ class RoleControllerTest : IntegrationTest() fun `user without user manage permission cannot create roles`() { val result = restTemplate.postForEntity( - "/role/create", + "/role", getTokenizedHttpEntity(data = createTestRoleBody), String::class.java ) @@ -56,7 +56,7 @@ class RoleControllerTest : IntegrationTest() fun `reject request if createRole body is invalid`() { val result = restTemplate.postForEntity( - "/role/create", + "/role", getTokenizedHttpEntity(data = "{}"), String::class.java ) From c0cda7ff58f242bf9cd468f029b5dad303421a01 Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Fri, 3 May 2024 08:53:45 +0100 Subject: [PATCH 7/9] Refactor Role class to add rolePermissions property --- api/app/src/main/kotlin/packit/model/Role.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/app/src/main/kotlin/packit/model/Role.kt b/api/app/src/main/kotlin/packit/model/Role.kt index dc3b4c38..7b76ef77 100644 --- a/api/app/src/main/kotlin/packit/model/Role.kt +++ b/api/app/src/main/kotlin/packit/model/Role.kt @@ -6,8 +6,8 @@ import jakarta.persistence.* @Table(name = "`role`") class Role( var name: String, - @OneToMany(mappedBy = "role", fetch = FetchType.EAGER, cascade = [CascadeType.ALL]) var isUsername: Boolean = false, + @OneToMany(mappedBy = "role", fetch = FetchType.EAGER, cascade = [CascadeType.ALL]) var rolePermissions: MutableList = mutableListOf(), @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY) var users: MutableList = mutableListOf(), From 74afb92ba98275e85224653b8a2f22b6ea891e63 Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Tue, 7 May 2024 09:13:10 +0100 Subject: [PATCH 8/9] Refactor role permissions variable names --- api/app/build.gradle.kts | 1 - api/app/src/main/kotlin/packit/model/dto/CreateRole.kt | 2 +- api/app/src/main/kotlin/packit/service/RoleService.kt | 2 +- .../packit/integration/controllers/RoleControllerTest.kt | 2 +- .../src/test/kotlin/packit/unit/service/RoleServiceTest.kt | 4 ++-- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/api/app/build.gradle.kts b/api/app/build.gradle.kts index d4c5774b..e5b69171 100644 --- a/api/app/build.gradle.kts +++ b/api/app/build.gradle.kts @@ -54,7 +54,6 @@ dependencies { implementation("com.auth0:java-jwt:4.4.0") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.flywaydb:flyway-core") - testImplementation("org.testng:testng:7.1.0") developmentOnly("org.springframework.boot:spring-boot-devtools") runtimeOnly("org.postgresql:postgresql") diff --git a/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt b/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt index 86e0e177..ab10ff85 100644 --- a/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt +++ b/api/app/src/main/kotlin/packit/model/dto/CreateRole.kt @@ -5,5 +5,5 @@ import org.jetbrains.annotations.NotNull data class CreateRole( @field:NotNull val name: String, - val permissions: List = listOf() + val permissionNames: List = listOf() ) diff --git a/api/app/src/main/kotlin/packit/service/RoleService.kt b/api/app/src/main/kotlin/packit/service/RoleService.kt index 2bf74faa..c6fd0c96 100644 --- a/api/app/src/main/kotlin/packit/service/RoleService.kt +++ b/api/app/src/main/kotlin/packit/service/RoleService.kt @@ -45,7 +45,7 @@ class BaseRoleService( override fun createRole(createRole: CreateRole) { - val permissions = permissionService.checkMatchingPermissions(createRole.permissions) + val permissions = permissionService.checkMatchingPermissions(createRole.permissionNames) saveRole(createRole.name, permissions) } diff --git a/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt b/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt index b98216ce..c942f240 100644 --- a/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt +++ b/api/app/src/test/kotlin/packit/integration/controllers/RoleControllerTest.kt @@ -20,7 +20,7 @@ class RoleControllerTest : IntegrationTest() private val createTestRoleBody = ObjectMapper().writeValueAsString( CreateRole( name = "testRole", - permissions = listOf("packet.run", "packet.read") + permissionNames = listOf("packet.run", "packet.read") ) ) diff --git a/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt b/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt index 06f3a2dd..5e3127f9 100644 --- a/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt +++ b/api/app/src/test/kotlin/packit/unit/service/RoleServiceTest.kt @@ -84,10 +84,10 @@ class RoleServiceTest @Test fun `createRole creates role with matching permissions`() { - val createRole = CreateRole(name = "newRole", permissions = listOf("p1", "p2")) + val createRole = CreateRole(name = "newRole", permissionNames = listOf("p1", "p2")) val permissions = listOf(Permission(name = "p1", description = "d1"), Permission(name = "p2", description = "d2")) - whenever(permissionService.checkMatchingPermissions(createRole.permissions)).thenReturn(permissions) + whenever(permissionService.checkMatchingPermissions(createRole.permissionNames)).thenReturn(permissions) whenever(roleRepository.existsByName(createRole.name)).thenReturn(false) roleService.createRole(createRole) From 82800ef49295fa63a02c7cb9657371997e40b0ae Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Tue, 7 May 2024 09:28:45 +0100 Subject: [PATCH 9/9] Add PacketService interface and BasePacketService implementation --- .../packit/service/{BasePacketService.kt => PacketService.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename api/app/src/main/kotlin/packit/service/{BasePacketService.kt => PacketService.kt} (100%) diff --git a/api/app/src/main/kotlin/packit/service/BasePacketService.kt b/api/app/src/main/kotlin/packit/service/PacketService.kt similarity index 100% rename from api/app/src/main/kotlin/packit/service/BasePacketService.kt rename to api/app/src/main/kotlin/packit/service/PacketService.kt