diff --git a/.github/workflows/sonarqube.yml b/.github/workflows/sonarqube.yml.disabled similarity index 86% rename from .github/workflows/sonarqube.yml rename to .github/workflows/sonarqube.yml.disabled index d1c691708..1d35d8d15 100644 --- a/.github/workflows/sonarqube.yml +++ b/.github/workflows/sonarqube.yml.disabled @@ -1,3 +1,7 @@ +# This action is disabled because it does +# the same thing as CI with Maven (run all tests and build). +# The SonarQube Cloud Analysis already happens without this, so no worries. + name: SonarQube on: push: diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml index a7265e4c8..200eae3fa 100644 --- a/.idea/dictionaries/project.xml +++ b/.idea/dictionaries/project.xml @@ -2,6 +2,7 @@ picoc + scas \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 44efd8de8..a2ce51cff 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -8,6 +8,7 @@ + diff --git a/account/pom.xml b/account/pom.xml index 5ae3d627f..f89bc2c3f 100644 --- a/account/pom.xml +++ b/account/pom.xml @@ -59,5 +59,11 @@ postgresql 42.7.2 + + br.all + shared + 1.0-SNAPSHOT + compile + \ No newline at end of file diff --git a/account/src/main/kotlin/br/all/application/user/create/RegisterUserAccountPresenter.kt b/account/src/main/kotlin/br/all/application/user/create/RegisterUserAccountPresenter.kt index a0c78b747..f1710ddd8 100644 --- a/account/src/main/kotlin/br/all/application/user/create/RegisterUserAccountPresenter.kt +++ b/account/src/main/kotlin/br/all/application/user/create/RegisterUserAccountPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.user.create -import br.all.application.shared.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.user.create.RegisterUserAccountService.ResponseModel interface RegisterUserAccountPresenter : GenericPresenter diff --git a/account/src/main/kotlin/br/all/application/user/create/RegisterUserAccountServiceImpl.kt b/account/src/main/kotlin/br/all/application/user/create/RegisterUserAccountServiceImpl.kt index 9d2195cb0..5fafd6c42 100644 --- a/account/src/main/kotlin/br/all/application/user/create/RegisterUserAccountServiceImpl.kt +++ b/account/src/main/kotlin/br/all/application/user/create/RegisterUserAccountServiceImpl.kt @@ -1,10 +1,11 @@ package br.all.application.user.create -import br.all.application.shared.UniquenessViolationException import br.all.application.user.create.RegisterUserAccountService.RequestModel import br.all.application.user.create.RegisterUserAccountService.ResponseModel import br.all.application.user.repository.UserAccountRepository import br.all.application.user.repository.toDto +import br.all.domain.shared.exception.UniquenessViolationException +import br.all.domain.shared.user.Email import br.all.domain.user.* class RegisterUserAccountServiceImpl(private val repository: UserAccountRepository) : RegisterUserAccountService { diff --git a/account/src/main/kotlin/br/all/application/user/find/RetrieveUserProfilePresenter.kt b/account/src/main/kotlin/br/all/application/user/find/RetrieveUserProfilePresenter.kt new file mode 100644 index 000000000..e70cf8c96 --- /dev/null +++ b/account/src/main/kotlin/br/all/application/user/find/RetrieveUserProfilePresenter.kt @@ -0,0 +1,6 @@ +package br.all.application.user.find + +import br.all.application.user.find.RetrieveUserProfileService.ResponseModel +import br.all.domain.shared.presenter.GenericPresenter + +interface RetrieveUserProfilePresenter : GenericPresenter \ No newline at end of file diff --git a/account/src/main/kotlin/br/all/application/user/find/RetrieveUserProfileService.kt b/account/src/main/kotlin/br/all/application/user/find/RetrieveUserProfileService.kt new file mode 100644 index 000000000..2016e2c86 --- /dev/null +++ b/account/src/main/kotlin/br/all/application/user/find/RetrieveUserProfileService.kt @@ -0,0 +1,19 @@ +package br.all.application.user.find +import java.util.UUID + +interface RetrieveUserProfileService { + fun retrieveData(presenter: RetrieveUserProfilePresenter, request: RequestModel) + + data class RequestModel( + val userId: UUID + ) + + data class ResponseModel( + val userId: UUID, + val username: String, + val email: String, + val affiliation: String, + val country: String, + val authorities: Set, + ) +} \ No newline at end of file diff --git a/account/src/main/kotlin/br/all/application/user/find/RetrieveUserProfileServiceImpl.kt b/account/src/main/kotlin/br/all/application/user/find/RetrieveUserProfileServiceImpl.kt new file mode 100644 index 000000000..f382bc86a --- /dev/null +++ b/account/src/main/kotlin/br/all/application/user/find/RetrieveUserProfileServiceImpl.kt @@ -0,0 +1,38 @@ +package br.all.application.user.find + +import br.all.application.user.find.RetrieveUserProfileService.RequestModel +import br.all.application.user.find.RetrieveUserProfileService.ResponseModel +import br.all.application.user.repository.UserAccountRepository + +class RetrieveUserProfileServiceImpl( + private val userAccountRepository: UserAccountRepository +) : RetrieveUserProfileService { + override fun retrieveData( + presenter: RetrieveUserProfilePresenter, + request: RequestModel + ) { + val userProfile = userAccountRepository.loadUserProfileById(request.userId) + if (userProfile == null) { + presenter.prepareFailView(NoSuchElementException("User with id ${request.userId} doesn't exist!")) + return + } + + val userCredentials = userAccountRepository.loadCredentialsById(request.userId) + if (userCredentials == null) { + presenter.prepareFailView(NoSuchElementException("Account credentials with id ${request.userId} doesn't exist!")) + return + } + + + val profile = ResponseModel( + userId = userProfile.id, + username = userCredentials.username, + email = userProfile.email, + affiliation = userProfile.affiliation, + country = userProfile.country, + authorities = userCredentials.authorities + ) + + presenter.prepareSuccessView(profile) + } +} \ No newline at end of file diff --git a/account/src/main/kotlin/br/all/application/user/repository/UserAccountMapper.kt b/account/src/main/kotlin/br/all/application/user/repository/UserAccountMapper.kt index 716c1ba41..dcc0754db 100644 --- a/account/src/main/kotlin/br/all/application/user/repository/UserAccountMapper.kt +++ b/account/src/main/kotlin/br/all/application/user/repository/UserAccountMapper.kt @@ -6,7 +6,7 @@ fun UserAccount.toDto() = UserAccountDto( id.value(), accountCredentials.username.value, accountCredentials.password, - email.value, + email.email, country.value, affiliation, createdAt, diff --git a/account/src/main/kotlin/br/all/application/user/repository/UserAccountRepository.kt b/account/src/main/kotlin/br/all/application/user/repository/UserAccountRepository.kt index 52531acd7..d14aa597a 100644 --- a/account/src/main/kotlin/br/all/application/user/repository/UserAccountRepository.kt +++ b/account/src/main/kotlin/br/all/application/user/repository/UserAccountRepository.kt @@ -11,4 +11,5 @@ interface UserAccountRepository { fun existsByEmail(email: String): Boolean fun existsByUsername(username: String): Boolean fun deleteById(id: UUID) + fun loadUserProfileById(id: UUID): UserProfileDto? } \ No newline at end of file diff --git a/account/src/main/kotlin/br/all/application/user/repository/UserProfileDto.kt b/account/src/main/kotlin/br/all/application/user/repository/UserProfileDto.kt new file mode 100644 index 000000000..1060041c4 --- /dev/null +++ b/account/src/main/kotlin/br/all/application/user/repository/UserProfileDto.kt @@ -0,0 +1,10 @@ +package br.all.application.user.repository + +import java.util.UUID + +data class UserProfileDto( + val id: UUID, + val email: String, + val country: String, + val affiliation: String, +) diff --git a/account/src/main/kotlin/br/all/domain/shared/ddd/Entity.kt b/account/src/main/kotlin/br/all/domain/shared/ddd/Entity.kt deleted file mode 100644 index 417d8d3f4..000000000 --- a/account/src/main/kotlin/br/all/domain/shared/ddd/Entity.kt +++ /dev/null @@ -1,13 +0,0 @@ -package br.all.domain.shared.ddd - -abstract class Entity (val id: Identifier) { - - final override fun equals(other: Any?) = when { - this === other -> true - other !is Entity<*> -> false - this::class != other::class -> false - else -> id == other.id - } - - final override fun hashCode() = id.hashCode() -} \ No newline at end of file diff --git a/account/src/main/kotlin/br/all/domain/user/Email.kt b/account/src/main/kotlin/br/all/domain/user/Email.kt deleted file mode 100644 index 965415718..000000000 --- a/account/src/main/kotlin/br/all/domain/user/Email.kt +++ /dev/null @@ -1,66 +0,0 @@ -package br.all.domain.user - -import br.all.domain.shared.ddd.Notification -import br.all.domain.shared.ddd.ValueObject - -data class Email(val value: String) : ValueObject() { - - init { - val notification = validate() - require(notification.hasNoErrors()) { notification.message() } - } - - override fun validate(): Notification { - val notification = Notification() - - if (value.isEmpty()) { - notification.addError("Email must not be empty.") - return notification - } - - if (value.isBlank()) { - notification.addError("Email must not be blank.") - return notification - } - - if (!isValidEmailFormat(value)) notification.addError("Wrong Email format.") - - return notification - } - - private fun isValidEmailFormat(email: String): Boolean { - if (email.contains("..") || email.contains(".@") || email.contains("@.")) return false - if (email.startsWith(".") || email.endsWith(".")) return false - if (email.startsWith("@") || email.endsWith("@")) return false - - val parts = email.split("@") - if (parts.size != 2) return false - - val localPart = parts[0] - val domainPart = parts[1] - - if (!hasValidLength(localPart, domainPart)) return false - if (!isValidStructure(localPart, domainPart)) return false - - return true - } - - private fun isValidStructure(localPart: String, domainPart: String): Boolean { - val localRegex = Regex("^[A-Za-z0-9_!#$%&'*+/=?`{|}~^.-]+$") - val domainRegex = Regex("^[A-Za-z0-9.-]+$") - - val domainLabels = domainPart.split(".") - if (domainLabels.last().length < 2 || domainLabels.any { it.startsWith("-") || it.endsWith("-") }) { - return false - } - - return localRegex.matches(localPart) && domainRegex.matches(domainPart) - } - - private fun hasValidLength(localPart: String, domainPart: String): Boolean { - if (localPart.length > 64) return false - if (domainPart.length > 255) return false - if ((localPart.length + 1 + domainPart.length) > 254) return false - return true - } -} \ No newline at end of file diff --git a/account/src/main/kotlin/br/all/domain/user/UserAccount.kt b/account/src/main/kotlin/br/all/domain/user/UserAccount.kt index 673641552..61ca66dc2 100644 --- a/account/src/main/kotlin/br/all/domain/user/UserAccount.kt +++ b/account/src/main/kotlin/br/all/domain/user/UserAccount.kt @@ -1,6 +1,7 @@ package br.all.domain.user import br.all.domain.shared.ddd.Entity +import br.all.domain.shared.user.Email import java.time.LocalDateTime import java.util.UUID diff --git a/account/src/main/kotlin/br/all/domain/user/Username.kt b/account/src/main/kotlin/br/all/domain/user/Username.kt index 6c5f1704f..95c604a79 100644 --- a/account/src/main/kotlin/br/all/domain/user/Username.kt +++ b/account/src/main/kotlin/br/all/domain/user/Username.kt @@ -3,7 +3,7 @@ package br.all.domain.user import br.all.domain.shared.ddd.Notification import br.all.domain.shared.ddd.ValueObject -data class Username(val value: String) : ValueObject (){ +data class Username(val value: String) : ValueObject(){ init { val notification = validate() @@ -16,6 +16,6 @@ data class Username(val value: String) : ValueObject (){ notification.addError("Username must not be blank!") else if (!value.matches( Regex("[a-zA-Z0-9-_]*"))) notification.addError("Username must contain only letters and numbers, dashes and underscores!") - return notification; + return notification } } diff --git a/account/src/main/kotlin/br/all/infrastructure/user/UserAccountMapper.kt b/account/src/main/kotlin/br/all/infrastructure/user/UserAccountMapper.kt index f48e3b375..29982ff06 100644 --- a/account/src/main/kotlin/br/all/infrastructure/user/UserAccountMapper.kt +++ b/account/src/main/kotlin/br/all/infrastructure/user/UserAccountMapper.kt @@ -2,6 +2,7 @@ package br.all.infrastructure.user import br.all.application.user.repository.AccountCredentialsDto import br.all.application.user.repository.UserAccountDto +import br.all.application.user.repository.UserProfileDto fun UserAccountDto.toUserAccountEntity(): UserAccountEntity { val credentials = AccountCredentialsEntity( @@ -18,4 +19,11 @@ fun UserAccountDto.toUserAccountEntity(): UserAccountEntity { return UserAccountEntity(id, credentials, email, country, affiliation, createdAt) } -fun AccountCredentialsEntity.toAccountCredentialsDto() = AccountCredentialsDto(id, username, password, authorities, refreshToken) \ No newline at end of file +fun AccountCredentialsEntity.toAccountCredentialsDto() = AccountCredentialsDto(id, username, password, authorities, refreshToken) + +fun UserAccountEntity.toUserProfileDto() = UserProfileDto( + id = this.id, + email = this.email, + country = this.country, + affiliation = this.affiliation +) \ No newline at end of file diff --git a/account/src/main/kotlin/br/all/infrastructure/user/UserAccountRepositoryImpl.kt b/account/src/main/kotlin/br/all/infrastructure/user/UserAccountRepositoryImpl.kt index a3b5fd2b9..8c3d02b06 100644 --- a/account/src/main/kotlin/br/all/infrastructure/user/UserAccountRepositoryImpl.kt +++ b/account/src/main/kotlin/br/all/infrastructure/user/UserAccountRepositoryImpl.kt @@ -3,6 +3,7 @@ package br.all.infrastructure.user import br.all.application.user.repository.AccountCredentialsDto import br.all.application.user.repository.UserAccountDto import br.all.application.user.repository.UserAccountRepository +import br.all.application.user.repository.UserProfileDto import org.springframework.stereotype.Repository import java.util.* @@ -22,6 +23,9 @@ class UserAccountRepositoryImpl( credentialsRepository.deleteById(id) } + override fun loadUserProfileById(id: UUID): UserProfileDto? = + userAccountRepository.findById(id).orElse(null)?.toUserProfileDto() + override fun loadCredentialsByUsername(username: String) = credentialsRepository.findByUsername(username)?.toAccountCredentialsDto() diff --git a/account/src/test/kotlin/br/all/application/user/create/RegisterUserAccountServiceImplTest.kt b/account/src/test/kotlin/br/all/application/user/create/RegisterUserAccountServiceImplTest.kt index 10f7cca27..294fe01e7 100644 --- a/account/src/test/kotlin/br/all/application/user/create/RegisterUserAccountServiceImplTest.kt +++ b/account/src/test/kotlin/br/all/application/user/create/RegisterUserAccountServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.user.create -import br.all.application.shared.UniquenessViolationException import br.all.application.user.repository.UserAccountRepository import br.all.application.user.utils.TestDataFactory import io.mockk.every @@ -9,6 +8,7 @@ import io.mockk.junit5.MockKExtension import io.mockk.verifyOrder import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith +import br.all.domain.shared.exception.UniquenessViolationException @Tag("UnitTest") @Tag("ServiceTest") diff --git a/account/src/test/kotlin/br/all/application/user/find/RetrieveUserProfileServiceImplTest.kt b/account/src/test/kotlin/br/all/application/user/find/RetrieveUserProfileServiceImplTest.kt new file mode 100644 index 000000000..3b3ebc4ba --- /dev/null +++ b/account/src/test/kotlin/br/all/application/user/find/RetrieveUserProfileServiceImplTest.kt @@ -0,0 +1,105 @@ +package br.all.application.user.find + +import br.all.application.user.repository.UserAccountRepository +import br.all.application.user.utils.TestDataFactory +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.junit5.MockKExtension +import io.mockk.slot +import io.mockk.verify +import org.junit.jupiter.api.* +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.extension.ExtendWith +import java.util.* +import kotlin.NoSuchElementException + +@Tag("UnitTest") +@Tag("ServiceTest") +@ExtendWith(MockKExtension::class) +class RetrieveUserProfileServiceImplTest { + + @MockK(relaxUnitFun = true) + private lateinit var userAccountRepository: UserAccountRepository + + @MockK(relaxUnitFun = true) + private lateinit var presenter: RetrieveUserProfilePresenter + + private lateinit var sut: RetrieveUserProfileServiceImpl + private lateinit var factory: TestDataFactory + + @BeforeEach + fun setUp() { + sut = RetrieveUserProfileServiceImpl(userAccountRepository) + factory = TestDataFactory() + } + + @Nested + @DisplayName("When retrieving a user profile") + inner class WhenRetrievingUserProfile { + + @Test + fun `should retrieve user profile and prepare success view`() { + val userProfile = factory.userProfile() + val userCredentials = factory.accountCredentials().copy(id = userProfile.id) + val request = RetrieveUserProfileService.RequestModel(userId = userProfile.id) + + every { userAccountRepository.loadUserProfileById(request.userId) } returns userProfile + every { userAccountRepository.loadCredentialsById(request.userId) } returns userCredentials + + val responseSlot = slot() + every { presenter.prepareSuccessView(capture(responseSlot)) } returns Unit + + sut.retrieveData(presenter, request) + + verify(exactly = 1) { presenter.prepareSuccessView(any()) } + verify(exactly = 0) { presenter.prepareFailView(any()) } + + val capturedResponse = responseSlot.captured + assertEquals(userProfile.id, capturedResponse.userId) + assertEquals(userCredentials.username, capturedResponse.username) + assertEquals(userProfile.email, capturedResponse.email) + assertEquals(userProfile.affiliation, capturedResponse.affiliation) + assertEquals(userProfile.country, capturedResponse.country) + assertEquals(userCredentials.authorities, capturedResponse.authorities) + } + + @Test + fun `should prepare fail view when user profile is not found`() { + val userId = UUID.randomUUID() + val request = RetrieveUserProfileService.RequestModel(userId = userId) + + every { userAccountRepository.loadUserProfileById(userId) } returns null + + val exceptionSlot = slot() + every { presenter.prepareFailView(capture(exceptionSlot)) } returns Unit + + sut.retrieveData(presenter, request) + + verify(exactly = 0) { presenter.prepareSuccessView(any()) } + verify(exactly = 1) { presenter.prepareFailView(any()) } + + val capturedException = exceptionSlot.captured + assertEquals("User with id $userId doesn't exist!", capturedException.message) + } + + @Test + fun `should prepare fail view when user credentials are not found`() { + val userProfile = factory.userProfile() + val request = RetrieveUserProfileService.RequestModel(userId = userProfile.id) + + every { userAccountRepository.loadUserProfileById(request.userId) } returns userProfile + every { userAccountRepository.loadCredentialsById(request.userId) } returns null + + val exceptionSlot = slot() + every { presenter.prepareFailView(capture(exceptionSlot)) } returns Unit + + sut.retrieveData(presenter, request) + + verify(exactly = 0) { presenter.prepareSuccessView(any()) } + verify(exactly = 1) { presenter.prepareFailView(any()) } + + val capturedException = exceptionSlot.captured + assertEquals("Account credentials with id ${request.userId} doesn't exist!", capturedException.message) + } + } +} diff --git a/account/src/test/kotlin/br/all/application/user/utils/TestDataFactory.kt b/account/src/test/kotlin/br/all/application/user/utils/TestDataFactory.kt index 0b2e69e64..4bf2c37c3 100644 --- a/account/src/test/kotlin/br/all/application/user/utils/TestDataFactory.kt +++ b/account/src/test/kotlin/br/all/application/user/utils/TestDataFactory.kt @@ -2,6 +2,7 @@ package br.all.application.user.utils import br.all.application.user.create.RegisterUserAccountService import br.all.application.user.repository.AccountCredentialsDto +import br.all.application.user.repository.UserProfileDto import io.github.serpro69.kfaker.Faker import java.util.* @@ -25,4 +26,10 @@ class TestDataFactory { refreshToken = faker.lorem.words() ) + fun userProfile() = UserProfileDto( + id = UUID.randomUUID(), + email = faker.internet.email(), + country = faker.address.countryCode(), + affiliation = faker.leagueOfLegends.rank(), + ) } \ No newline at end of file diff --git a/account/src/test/kotlin/br/all/domain/user/UserAccountTest.kt b/account/src/test/kotlin/br/all/domain/user/UserAccountTest.kt index 25a1e4b8e..1483e8d4f 100644 --- a/account/src/test/kotlin/br/all/domain/user/UserAccountTest.kt +++ b/account/src/test/kotlin/br/all/domain/user/UserAccountTest.kt @@ -1,7 +1,8 @@ package br.all.domain.user +import br.all.domain.shared.user.Email import io.github.serpro69.kfaker.Faker -import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Tag import java.time.LocalDateTime import java.util.UUID @@ -45,11 +46,11 @@ class UserAccountTest{ @Test fun `should create account credentials with default values`(){ val user = createUser() - assertEquals(user.accountCredentials.refreshToken, null) - assertTrue(user.accountCredentials.isCredentialsNonExpired) - assertTrue(user.accountCredentials.isAccountNonExpired) - assertTrue(user.accountCredentials.isAccountNonLocked) - assertTrue(user.accountCredentials.isEnabled) + Assertions.assertEquals(user.accountCredentials.refreshToken, null) + Assertions.assertTrue(user.accountCredentials.isCredentialsNonExpired) + Assertions.assertTrue(user.accountCredentials.isAccountNonExpired) + Assertions.assertTrue(user.accountCredentials.isAccountNonLocked) + Assertions.assertTrue(user.accountCredentials.isEnabled) } @Test @@ -57,7 +58,7 @@ class UserAccountTest{ val user = createUser() val username = Username("new_name") user.changeUsername(username) - assertEquals(user.accountCredentials.username, username) + Assertions.assertEquals(user.accountCredentials.username, username) } @Test @@ -65,7 +66,7 @@ class UserAccountTest{ val user = createUser() val password = "new_password" user.changePassword(password) - assertEquals(user.accountCredentials.password, password) + Assertions.assertEquals(user.accountCredentials.password, password) } private fun createUser( @@ -79,6 +80,7 @@ class UserAccountTest{ authorities: Set = setOf(Authority.USER) ) = UserAccount( UserAccountId(id), - createdAt, email, country, affiliation, username, password, authorities) + createdAt, email, country, affiliation, username, password, authorities + ) } \ No newline at end of file diff --git a/pom.xml b/pom.xml index da1865238..56653c651 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ web account scas + shared diff --git a/review/pom.xml b/review/pom.xml index 920d13193..9de66f259 100644 --- a/review/pom.xml +++ b/review/pom.xml @@ -32,6 +32,12 @@ 1.0-SNAPSHOT compile + + br.all + shared + 1.0-SNAPSHOT + compile + io.swagger.core.v3 diff --git a/review/src/main/kotlin/br/all/application/collaboration/create/AcceptInvitePresenter.kt b/review/src/main/kotlin/br/all/application/collaboration/create/AcceptInvitePresenter.kt deleted file mode 100644 index 96a88cf71..000000000 --- a/review/src/main/kotlin/br/all/application/collaboration/create/AcceptInvitePresenter.kt +++ /dev/null @@ -1,6 +0,0 @@ -package br.all.application.collaboration.create - -import br.all.application.collaboration.create.AcceptInviteService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter - -interface AcceptInvitePresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/collaboration/create/AcceptInviteService.kt b/review/src/main/kotlin/br/all/application/collaboration/create/AcceptInviteService.kt deleted file mode 100644 index d4d780f0d..000000000 --- a/review/src/main/kotlin/br/all/application/collaboration/create/AcceptInviteService.kt +++ /dev/null @@ -1,17 +0,0 @@ -package br.all.application.collaboration.create - -import java.util.* - -interface AcceptInviteService { - fun acceptInvite(presenter: AcceptInvitePresenter, request: RequestModel) - - data class RequestModel( - val systematicStudyId: UUID, - val userId: UUID, - val inviteId: UUID, - ) - - data class ResponseModel( - val collaborationId: UUID - ) -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/collaboration/create/AcceptInviteServiceImpl.kt b/review/src/main/kotlin/br/all/application/collaboration/create/AcceptInviteServiceImpl.kt deleted file mode 100644 index 4f33ec805..000000000 --- a/review/src/main/kotlin/br/all/application/collaboration/create/AcceptInviteServiceImpl.kt +++ /dev/null @@ -1,58 +0,0 @@ -package br.all.application.collaboration.create - -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDto -import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.review.repository.fromDto -import br.all.application.shared.presenter.prepareIfUnauthorized -import br.all.application.user.CredentialsService -import br.all.domain.model.collaboration.Collaboration -import br.all.domain.model.collaboration.CollaborationPermission -import br.all.domain.model.collaboration.toCollaborationId -import br.all.domain.model.review.SystematicStudy -import br.all.domain.model.review.toSystematicStudyId -import br.all.domain.model.user.toResearcherId -import java.util.UUID - -class AcceptInviteServiceImpl( - private val systematicStudyRepository: SystematicStudyRepository, - private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository -) : AcceptInviteService { - override fun acceptInvite(presenter: AcceptInvitePresenter, request: AcceptInviteService.RequestModel) { - val user = credentialsService.loadCredentials(request.userId)?.toUser() - - val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) - val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - - presenter.prepareIfUnauthorized(user) - - if(presenter.isDone()) return - - if(systematicStudy!!.collaborators.any { it.value() == request.userId }) { - presenter.prepareFailView( - IllegalArgumentException("User is already a collaborator") - ) - return - } - - val allInvites = collaborationRepository.listAllInvitesBySystematicStudyId(request.systematicStudyId) - val userInvite = allInvites.firstOrNull { it.userId == request.userId } - - if(userInvite == null) { - presenter.prepareFailView(IllegalArgumentException("User has not been invited")) - return - } - - val collaborationId = UUID.randomUUID() - val collaboration = Collaboration( - collaborationId.toCollaborationId(), - request.systematicStudyId.toSystematicStudyId(), - request.userId.toResearcherId(), - permissions = userInvite.permissions.map { CollaborationPermission.valueOf(it) }.toSet() - ) - - collaborationRepository.saveOrUpdateCollaboration(collaboration.toDto()) - presenter.prepareSuccessView(AcceptInviteService.ResponseModel(collaborationId)) - } -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/collaboration/create/CreateInvitePresenter.kt b/review/src/main/kotlin/br/all/application/collaboration/create/CreateInvitePresenter.kt deleted file mode 100644 index 6863ee42d..000000000 --- a/review/src/main/kotlin/br/all/application/collaboration/create/CreateInvitePresenter.kt +++ /dev/null @@ -1,6 +0,0 @@ -package br.all.application.collaboration.create - -import br.all.application.collaboration.create.CreateInviteService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter - -interface CreateInvitePresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/collaboration/create/CreateInviteService.kt b/review/src/main/kotlin/br/all/application/collaboration/create/CreateInviteService.kt deleted file mode 100644 index 425e83802..000000000 --- a/review/src/main/kotlin/br/all/application/collaboration/create/CreateInviteService.kt +++ /dev/null @@ -1,18 +0,0 @@ -package br.all.application.collaboration.create - -import java.util.* - -interface CreateInviteService { - fun createInvite(presenter: CreateInvitePresenter, request: RequestModel) - - data class RequestModel( - val systematicStudyId: UUID, - val userId: UUID, - val inviteeId: UUID, - val permissions: Set - ) - - data class ResponseModel( - val inviteId: UUID - ) -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/collaboration/create/CreateInviteServiceImpl.kt b/review/src/main/kotlin/br/all/application/collaboration/create/CreateInviteServiceImpl.kt deleted file mode 100644 index dc9b605e3..000000000 --- a/review/src/main/kotlin/br/all/application/collaboration/create/CreateInviteServiceImpl.kt +++ /dev/null @@ -1,64 +0,0 @@ -package br.all.application.collaboration.create - -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain -import br.all.application.collaboration.repository.toDto -import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.review.repository.fromDto -import br.all.application.shared.presenter.prepareIfFailsPreconditions -import br.all.application.user.CredentialsService -import br.all.domain.model.collaboration.CollaborationPermission -import br.all.domain.model.collaboration.Invite -import br.all.domain.model.collaboration.toInviteId -import br.all.domain.model.review.SystematicStudy -import br.all.domain.model.review.toSystematicStudyId -import br.all.domain.model.user.toResearcherId -import java.time.LocalDateTime -import java.util.* - -class CreateInviteServiceImpl( - private val systematicStudyRepository: SystematicStudyRepository, - private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository -) : CreateInviteService -{ - override fun createInvite(presenter: CreateInvitePresenter, request: CreateInviteService.RequestModel) { - val user = credentialsService.loadCredentials(request.userId)?.toUser() - - val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) - val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) - - if(presenter.isDone()) return - - if(systematicStudy!!.collaborators.any { it.value() == request.inviteeId }) { - presenter.prepareFailView( - IllegalArgumentException("User who is already a collaborator may not be invited") - ) - } - - val allInvites = collaborationRepository.listAllInvitesBySystematicStudyId(request.systematicStudyId) - if(allInvites.any { it.userId == request.inviteeId }) { - presenter.prepareFailView( - IllegalArgumentException("User who is already invited may not be invited again") - ) - } - - val inviteId = UUID.randomUUID() - val invite = Invite( - inviteId.toInviteId(), - request.systematicStudyId.toSystematicStudyId(), - request.userId.toResearcherId(), - request.permissions.map { CollaborationPermission.valueOf(it) }.toSet(), - inviteDate = LocalDateTime.now(), - ) - - collaborationRepository.saveOrUpdateInvite(invite.toDto()) - - presenter.prepareSuccessView(CreateInviteService.ResponseModel(inviteId)) - } -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/collaboration/repository/CollaborationDto.kt b/review/src/main/kotlin/br/all/application/collaboration/repository/CollaborationDto.kt deleted file mode 100644 index 34a74c3f9..000000000 --- a/review/src/main/kotlin/br/all/application/collaboration/repository/CollaborationDto.kt +++ /dev/null @@ -1,11 +0,0 @@ -package br.all.application.collaboration.repository - -import java.util.* - -class CollaborationDto ( - val id: UUID, - val systematicStudyId: UUID, - val userId: UUID, - val status: String, - val permissions: Set -) \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/collaboration/repository/CollaborationMapper.kt b/review/src/main/kotlin/br/all/application/collaboration/repository/CollaborationMapper.kt deleted file mode 100644 index b7e2fc168..000000000 --- a/review/src/main/kotlin/br/all/application/collaboration/repository/CollaborationMapper.kt +++ /dev/null @@ -1,39 +0,0 @@ -package br.all.application.collaboration.repository - -import br.all.domain.model.collaboration.* -import br.all.domain.model.review.toSystematicStudyId -import br.all.domain.model.user.toResearcherId - -fun Invite.toDto(): InviteDto = InviteDto( - id = this.id.value(), - systematicStudyId = this.systematicStudyId.value(), - userId = this.userId.value, - inviteDate = this.inviteDate, - expirationDate = this.expirationDate, - permissions = this.permissions.map { it.name }.toSet() -) - -fun InviteDto.toDomain(): Invite = Invite( - id = this.id.toInviteId(), - systematicStudyId = this.systematicStudyId.toSystematicStudyId(), - userId = this.userId.toResearcherId(), - permissions = this.permissions.map { CollaborationPermission.valueOf(it) }.toSet(), - inviteDate = this.inviteDate, - expirationDate = this.expirationDate -) - -fun Collaboration.toDto(): CollaborationDto = CollaborationDto( - id = this.id.value(), - systematicStudyId = this.systematicStudyId.value(), - userId = this.userId.value, - status = this.status.name, - permissions = this.permissions.map { it.name }.toSet() -) - -fun CollaborationDto.toDomain(): Collaboration = Collaboration( - id = this.id.toCollaborationId(), - systematicStudyId = this.systematicStudyId.toSystematicStudyId(), - userId = this.userId.toResearcherId(), - status = CollaborationStatus.valueOf(this.status), - permissions = this.permissions.map { CollaborationPermission.valueOf(it) }.toSet() -) \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/collaboration/repository/CollaborationRepository.kt b/review/src/main/kotlin/br/all/application/collaboration/repository/CollaborationRepository.kt deleted file mode 100644 index 70b1dd4ed..000000000 --- a/review/src/main/kotlin/br/all/application/collaboration/repository/CollaborationRepository.kt +++ /dev/null @@ -1,13 +0,0 @@ -package br.all.application.collaboration.repository - -import java.util.* - -interface CollaborationRepository { - fun saveOrUpdateCollaboration(dto: CollaborationDto) - fun saveOrUpdateInvite(dto: InviteDto) - - fun listAllCollaborationsBySystematicStudyId(id: UUID): List - fun listAllInvitesBySystematicStudyId(id: UUID): List - - fun deleteInvite(id: UUID) -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/collaboration/repository/InviteDto.kt b/review/src/main/kotlin/br/all/application/collaboration/repository/InviteDto.kt deleted file mode 100644 index 2ebf7cc41..000000000 --- a/review/src/main/kotlin/br/all/application/collaboration/repository/InviteDto.kt +++ /dev/null @@ -1,13 +0,0 @@ -package br.all.application.collaboration.repository - -import java.time.LocalDateTime -import java.util.* - -class InviteDto ( - val id: UUID, - val systematicStudyId: UUID, - val userId: UUID, - val inviteDate: LocalDateTime, - val expirationDate: LocalDateTime, - val permissions: Set -) \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolPresenter.kt b/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolPresenter.kt index e98af4639..c73c0307e 100644 --- a/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolPresenter.kt +++ b/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.protocol.find import br.all.application.protocol.find.FindProtocolService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindProtocolPresenter : GenericPresenter diff --git a/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolServiceImpl.kt b/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolServiceImpl.kt index d097c0bec..537a81a79 100644 --- a/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolServiceImpl.kt @@ -1,13 +1,11 @@ package br.all.application.protocol.find -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.protocol.find.FindProtocolService.RequestModel import br.all.application.protocol.find.FindProtocolService.ResponseModel import br.all.application.protocol.repository.ProtocolRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.user.CredentialsService import br.all.domain.model.review.SystematicStudy @@ -16,20 +14,16 @@ class FindProtocolServiceImpl( private val protocolRepository: ProtocolRepository, private val systematicStudyRepository: SystematicStudyRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository ) : FindProtocolService { override fun findById(presenter: FindProtocolPresenter, request: RequestModel) { val userId = request.userId - val user = credentialsService.loadCredentials(request.userId)?.toUser() + val user = credentialsService.loadCredentials(userId)?.toUser() val systematicStudyId = request.systematicStudyId - val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) + val systematicStudyDto = systematicStudyRepository.findById(systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolStagePresenter.kt b/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolStagePresenter.kt new file mode 100644 index 000000000..351e47db5 --- /dev/null +++ b/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolStagePresenter.kt @@ -0,0 +1,6 @@ +package br.all.application.protocol.find + +import br.all.domain.shared.presenter.GenericPresenter +import br.all.application.protocol.find.FindProtocolStageService.ResponseModel + +interface FindProtocolStagePresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/protocol/find/GetProtocolStageService.kt b/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolStageService.kt similarity index 70% rename from review/src/main/kotlin/br/all/application/protocol/find/GetProtocolStageService.kt rename to review/src/main/kotlin/br/all/application/protocol/find/FindProtocolStageService.kt index 31ba40773..09966a5e0 100644 --- a/review/src/main/kotlin/br/all/application/protocol/find/GetProtocolStageService.kt +++ b/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolStageService.kt @@ -3,15 +3,15 @@ package br.all.application.protocol.find import io.swagger.v3.oas.annotations.media.Schema import java.util.UUID -interface GetProtocolStageService { - fun getStage(presenter: GetProtocolStagePresenter, request: RequestModel) +interface FindProtocolStageService { + fun getStage(presenter: FindProtocolStagePresenter, request: RequestModel) data class RequestModel( val userId: UUID, val systematicStudyId: UUID ) - @Schema(name = "GetProtocolStageServiceResponseModel", description = "Response model for Get Protocol Stage Service") + @Schema(name = "FindProtocolStageServiceResponseModel", description = "Response model for Find Protocol Stage Service") data class ResponseModel( val userId: UUID, val systematicStudyId: UUID, diff --git a/review/src/main/kotlin/br/all/application/protocol/find/GetProtocolStageServiceImpl.kt b/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolStageServiceImpl.kt similarity index 85% rename from review/src/main/kotlin/br/all/application/protocol/find/GetProtocolStageServiceImpl.kt rename to review/src/main/kotlin/br/all/application/protocol/find/FindProtocolStageServiceImpl.kt index 4468c77df..c900bf90f 100644 --- a/review/src/main/kotlin/br/all/application/protocol/find/GetProtocolStageServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/protocol/find/FindProtocolStageServiceImpl.kt @@ -1,17 +1,15 @@ package br.all.application.protocol.find -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.protocol.repository.ProtocolRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.user.CredentialsService -import br.all.application.protocol.find.GetProtocolStageService.RequestModel -import br.all.application.protocol.find.GetProtocolStageService.ResponseModel -import br.all.application.protocol.find.GetProtocolStageService.ProtocolStage +import br.all.application.protocol.find.FindProtocolStageService.RequestModel +import br.all.application.protocol.find.FindProtocolStageService.ResponseModel +import br.all.application.protocol.find.FindProtocolStageService.ProtocolStage import br.all.application.protocol.repository.ProtocolDto import br.all.application.question.repository.QuestionRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.domain.model.question.QuestionContextEnum @@ -19,24 +17,19 @@ import br.all.domain.model.review.SystematicStudy import org.springframework.stereotype.Service @Service -class GetProtocolStageServiceImpl( +class FindProtocolStageServiceImpl( private val protocolRepository: ProtocolRepository, private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val questionRepository: QuestionRepository, - private val collaborationRepository: CollaborationRepository, -) : GetProtocolStageService { - override fun getStage(presenter: GetProtocolStagePresenter, request: RequestModel) { + private val questionRepository: QuestionRepository +) : FindProtocolStageService { + override fun getStage(presenter: FindProtocolStagePresenter, request: RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() - val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return val protocolDto = protocolRepository.findById(request.systematicStudyId) diff --git a/review/src/main/kotlin/br/all/application/protocol/find/GetProtocolStagePresenter.kt b/review/src/main/kotlin/br/all/application/protocol/find/GetProtocolStagePresenter.kt deleted file mode 100644 index 8ba8c5d9b..000000000 --- a/review/src/main/kotlin/br/all/application/protocol/find/GetProtocolStagePresenter.kt +++ /dev/null @@ -1,6 +0,0 @@ -package br.all.application.protocol.find - -import br.all.application.shared.presenter.GenericPresenter -import br.all.application.protocol.find.GetProtocolStageService.ResponseModel - -interface GetProtocolStagePresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/protocol/update/UpdateProtocolPresenter.kt b/review/src/main/kotlin/br/all/application/protocol/update/UpdateProtocolPresenter.kt index e3be1de88..91b8dbfa0 100644 --- a/review/src/main/kotlin/br/all/application/protocol/update/UpdateProtocolPresenter.kt +++ b/review/src/main/kotlin/br/all/application/protocol/update/UpdateProtocolPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.protocol.update import br.all.application.protocol.update.UpdateProtocolService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface UpdateProtocolPresenter : GenericPresenter diff --git a/review/src/main/kotlin/br/all/application/protocol/update/UpdateProtocolServiceImpl.kt b/review/src/main/kotlin/br/all/application/protocol/update/UpdateProtocolServiceImpl.kt index 3d18549a7..68f9bbf3d 100644 --- a/review/src/main/kotlin/br/all/application/protocol/update/UpdateProtocolServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/protocol/update/UpdateProtocolServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.protocol.update -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.protocol.repository.ProtocolRepository import br.all.application.protocol.repository.copyUpdates import br.all.application.protocol.repository.fromDto @@ -26,22 +24,17 @@ class UpdateProtocolServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val credentialsService: CredentialsService, private val studyReviewRepository: StudyReviewRepository, - private val scoreCalculatorService: ScoreCalculatorService, - private val collaborationRepository: CollaborationRepository + private val scoreCalculatorService: ScoreCalculatorService ) : UpdateProtocolService { override fun update(presenter: UpdateProtocolPresenter, request: RequestModel) { val userId = request.userId + val user = credentialsService.loadCredentials(userId)?.toUser() val systematicStudyId = request.systematicStudyId - val user = credentialsService.loadCredentials(request.userId)?.toUser() - - val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) + val systematicStudyDto = systematicStudyRepository.findById(systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return val dto = protocolRepository.findById(systematicStudyId) diff --git a/review/src/main/kotlin/br/all/application/question/create/CreateQuestionPresenter.kt b/review/src/main/kotlin/br/all/application/question/create/CreateQuestionPresenter.kt index d274e4977..9d1ed45b8 100644 --- a/review/src/main/kotlin/br/all/application/question/create/CreateQuestionPresenter.kt +++ b/review/src/main/kotlin/br/all/application/question/create/CreateQuestionPresenter.kt @@ -1,7 +1,7 @@ package br.all.application.question.create import br.all.application.question.create.CreateQuestionService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface CreateQuestionPresenter : GenericPresenter diff --git a/review/src/main/kotlin/br/all/application/question/create/CreateQuestionServiceImpl.kt b/review/src/main/kotlin/br/all/application/question/create/CreateQuestionServiceImpl.kt index 913f58fbd..657309808 100644 --- a/review/src/main/kotlin/br/all/application/question/create/CreateQuestionServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/question/create/CreateQuestionServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.question.create -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.question.create.CreateQuestionService.QuestionType.* import br.all.application.question.create.CreateQuestionService.RequestModel import br.all.application.question.create.CreateQuestionService.ResponseModel @@ -22,7 +20,6 @@ class CreateQuestionServiceImpl( private val questionRepository: QuestionRepository, private val uuidGeneratorService: UuidGeneratorService, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : CreateQuestionService { override fun create( @@ -30,15 +27,11 @@ class CreateQuestionServiceImpl( request: RequestModel ) { val systematicStudyId = request.systematicStudyId - val user = credentialsService.loadCredentials(request.userId)?.toUser() - - val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) + val userId = request.userId + val user = credentialsService.loadCredentials(userId)?.toUser() + val systematicStudyDto = systematicStudyRepository.findById(systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/question/find/FindQuestionPresenter.kt b/review/src/main/kotlin/br/all/application/question/find/FindQuestionPresenter.kt index 36aca4c69..0396e329b 100644 --- a/review/src/main/kotlin/br/all/application/question/find/FindQuestionPresenter.kt +++ b/review/src/main/kotlin/br/all/application/question/find/FindQuestionPresenter.kt @@ -1,7 +1,7 @@ package br.all.application.question.find import br.all.application.question.find.FindQuestionService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindQuestionPresenter: GenericPresenter { } \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/question/find/FindQuestionServiceImpl.kt b/review/src/main/kotlin/br/all/application/question/find/FindQuestionServiceImpl.kt index ef9f2d191..6a7ce26a4 100644 --- a/review/src/main/kotlin/br/all/application/question/find/FindQuestionServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/question/find/FindQuestionServiceImpl.kt @@ -1,38 +1,32 @@ package br.all.application.question.find -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.question.find.FindQuestionService.* import br.all.application.question.repository.QuestionRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.user.CredentialsService +import br.all.domain.model.question.QuestionId import br.all.domain.model.review.SystematicStudy class FindQuestionServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val questionRepository: QuestionRepository, - private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, + private val credentialsService: CredentialsService ) : FindQuestionService { override fun findOne(presenter: FindQuestionPresenter, request: RequestModel) { - val user = credentialsService.loadCredentials(request.userId)?.toUser() - - val questionId = request.questionId + val userId = request.userId + val user = credentialsService.loadCredentials(userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + val questionId = QuestionId(request.questionId) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return - val question = questionRepository.findById(request.systematicStudyId, questionId) + val question = questionRepository.findById(request.systematicStudyId, questionId.value) if (question === null) { val message = "There is no review of id ${request.systematicStudyId} or question of id ${request.questionId}." diff --git a/review/src/main/kotlin/br/all/application/question/findAll/FindAllBySystematicStudyIdPresenter.kt b/review/src/main/kotlin/br/all/application/question/findAll/FindAllBySystematicStudyIdPresenter.kt index a955b2d32..738c01eef 100644 --- a/review/src/main/kotlin/br/all/application/question/findAll/FindAllBySystematicStudyIdPresenter.kt +++ b/review/src/main/kotlin/br/all/application/question/findAll/FindAllBySystematicStudyIdPresenter.kt @@ -1,7 +1,7 @@ package br.all.application.question.findAll import br.all.application.question.findAll.FindAllBySystematicStudyIdService.* -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindAllBySystematicStudyIdPresenter: GenericPresenter { } \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/question/findAll/FindAllBySystematicStudyIdServiceImpl.kt b/review/src/main/kotlin/br/all/application/question/findAll/FindAllBySystematicStudyIdServiceImpl.kt index d16c1efd9..61c7b650a 100644 --- a/review/src/main/kotlin/br/all/application/question/findAll/FindAllBySystematicStudyIdServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/question/findAll/FindAllBySystematicStudyIdServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.question.findAll -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.question.findAll.FindAllBySystematicStudyIdService.* import br.all.application.question.repository.QuestionRepository import br.all.application.review.repository.SystematicStudyRepository @@ -14,20 +12,16 @@ import br.all.domain.model.review.SystematicStudy class FindAllBySystematicStudyIdServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val questionRepository: QuestionRepository, - private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository + private val credentialsService: CredentialsService ) : FindAllBySystematicStudyIdService { override fun findAllBySystematicStudyId(presenter: FindAllBySystematicStudyIdPresenter, request: RequestModel) { - val user = credentialsService.loadCredentials(request.userId)?.toUser() - + val userId = request.userId + val user = credentialsService.loadCredentials(userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return val questions = questionRepository.findAllBySystematicStudyId( diff --git a/review/src/main/kotlin/br/all/application/question/update/presenter/UpdateQuestionPresenter.kt b/review/src/main/kotlin/br/all/application/question/update/presenter/UpdateQuestionPresenter.kt index 8f98bdece..a977ec487 100644 --- a/review/src/main/kotlin/br/all/application/question/update/presenter/UpdateQuestionPresenter.kt +++ b/review/src/main/kotlin/br/all/application/question/update/presenter/UpdateQuestionPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.question.update.presenter import br.all.application.question.update.services.UpdateQuestionService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface UpdateQuestionPresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/question/update/services/UpdateQuestionServiceImpl.kt b/review/src/main/kotlin/br/all/application/question/update/services/UpdateQuestionServiceImpl.kt index dea918dad..4b3bcd8bf 100644 --- a/review/src/main/kotlin/br/all/application/question/update/services/UpdateQuestionServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/question/update/services/UpdateQuestionServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.question.update.services -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.question.create.CreateQuestionService.QuestionType import br.all.application.question.repository.QuestionRepository import br.all.application.question.repository.toDto @@ -20,19 +18,15 @@ class UpdateQuestionServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val questionRepository: QuestionRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository ) : UpdateQuestionService { override fun update(presenter: UpdateQuestionPresenter, request: RequestModel) { val systematicStudyId = request.systematicStudyId val userId = request.userId - val user = credentialsService.loadCredentials(request.userId)?.toUser() + val user = credentialsService.loadCredentials(userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } + presenter.prepareIfFailsPreconditions(user, systematicStudy) - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) if (presenter.isDone()) return val type = request.questionType diff --git a/review/src/main/kotlin/br/all/application/report/find/presenter/AuthorNetworkPresenter.kt b/review/src/main/kotlin/br/all/application/report/find/presenter/AuthorNetworkPresenter.kt index 225fd2fb7..47df04efb 100644 --- a/review/src/main/kotlin/br/all/application/report/find/presenter/AuthorNetworkPresenter.kt +++ b/review/src/main/kotlin/br/all/application/report/find/presenter/AuthorNetworkPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.report.find.presenter import br.all.application.report.find.service.AuthorNetworkService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface AuthorNetworkPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/report/find/presenter/ExportProtocolPresenter.kt b/review/src/main/kotlin/br/all/application/report/find/presenter/ExportProtocolPresenter.kt index a2d2e43cc..d1a48e585 100644 --- a/review/src/main/kotlin/br/all/application/report/find/presenter/ExportProtocolPresenter.kt +++ b/review/src/main/kotlin/br/all/application/report/find/presenter/ExportProtocolPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.report.find.presenter import br.all.application.report.find.service.ExportProtocolService -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface ExportProtocolPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/report/find/presenter/FindAnswerPresenter.kt b/review/src/main/kotlin/br/all/application/report/find/presenter/FindAnswerPresenter.kt index 522e5a459..300a4e368 100644 --- a/review/src/main/kotlin/br/all/application/report/find/presenter/FindAnswerPresenter.kt +++ b/review/src/main/kotlin/br/all/application/report/find/presenter/FindAnswerPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.report.find.presenter import br.all.application.report.find.service.FindAnswerService -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindAnswerPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/report/find/presenter/FindCriteriaPresenter.kt b/review/src/main/kotlin/br/all/application/report/find/presenter/FindCriteriaPresenter.kt index 7099eaaf8..92b556845 100644 --- a/review/src/main/kotlin/br/all/application/report/find/presenter/FindCriteriaPresenter.kt +++ b/review/src/main/kotlin/br/all/application/report/find/presenter/FindCriteriaPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.report.find.presenter import br.all.application.report.find.service.FindCriteriaService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindCriteriaPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/report/find/presenter/FindKeywordsPresenter.kt b/review/src/main/kotlin/br/all/application/report/find/presenter/FindKeywordsPresenter.kt index 618f50f30..f2153f822 100644 --- a/review/src/main/kotlin/br/all/application/report/find/presenter/FindKeywordsPresenter.kt +++ b/review/src/main/kotlin/br/all/application/report/find/presenter/FindKeywordsPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.report.find.presenter -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.report.find.service.FindKeywordsService.ResponseModel interface FindKeywordsPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/report/find/presenter/FindSourcePresenter.kt b/review/src/main/kotlin/br/all/application/report/find/presenter/FindSourcePresenter.kt index fbacba315..751845bb3 100644 --- a/review/src/main/kotlin/br/all/application/report/find/presenter/FindSourcePresenter.kt +++ b/review/src/main/kotlin/br/all/application/report/find/presenter/FindSourcePresenter.kt @@ -1,6 +1,6 @@ package br.all.application.report.find.presenter import br.all.application.report.find.service.FindSourceService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindSourcePresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/report/find/presenter/FindStudiesByStagePresenter.kt b/review/src/main/kotlin/br/all/application/report/find/presenter/FindStudiesByStagePresenter.kt index 115f7aaa1..f6d2a5638 100644 --- a/review/src/main/kotlin/br/all/application/report/find/presenter/FindStudiesByStagePresenter.kt +++ b/review/src/main/kotlin/br/all/application/report/find/presenter/FindStudiesByStagePresenter.kt @@ -1,6 +1,6 @@ package br.all.application.report.find.presenter import br.all.application.report.find.service.FindStudiesByStageService -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindStudiesByStagePresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/report/find/presenter/FindStudyReviewCriteriaPresenter.kt b/review/src/main/kotlin/br/all/application/report/find/presenter/FindStudyReviewCriteriaPresenter.kt index 90e2ad4cf..f18a7b841 100644 --- a/review/src/main/kotlin/br/all/application/report/find/presenter/FindStudyReviewCriteriaPresenter.kt +++ b/review/src/main/kotlin/br/all/application/report/find/presenter/FindStudyReviewCriteriaPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.report.find.presenter -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.report.find.service.FindStudyReviewCriteriaService interface FindStudyReviewCriteriaPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/report/find/presenter/IncludedStudiesAnswersPresenter.kt b/review/src/main/kotlin/br/all/application/report/find/presenter/IncludedStudiesAnswersPresenter.kt index 768693702..f16086401 100644 --- a/review/src/main/kotlin/br/all/application/report/find/presenter/IncludedStudiesAnswersPresenter.kt +++ b/review/src/main/kotlin/br/all/application/report/find/presenter/IncludedStudiesAnswersPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.report.find.presenter -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.report.find.service.IncludedStudiesAnswersService.ResponseModel interface IncludedStudiesAnswersPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/report/find/presenter/StudiesFunnelPresenter.kt b/review/src/main/kotlin/br/all/application/report/find/presenter/StudiesFunnelPresenter.kt index 2f24f35e7..b4e48a4f1 100644 --- a/review/src/main/kotlin/br/all/application/report/find/presenter/StudiesFunnelPresenter.kt +++ b/review/src/main/kotlin/br/all/application/report/find/presenter/StudiesFunnelPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.report.find.presenter import br.all.application.report.find.service.StudiesFunnelService -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface StudiesFunnelPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/report/find/service/AuthorNetworkServiceImpl.kt b/review/src/main/kotlin/br/all/application/report/find/service/AuthorNetworkServiceImpl.kt index 54fc254d6..1723231ca 100644 --- a/review/src/main/kotlin/br/all/application/report/find/service/AuthorNetworkServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/report/find/service/AuthorNetworkServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.report.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.report.find.presenter.AuthorNetworkPresenter import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto @@ -16,18 +14,14 @@ class AuthorNetworkServiceImpl( private val credentialsService: CredentialsService, private val studyReviewRepository: StudyReviewRepository, private val systematicStudyRepository: SystematicStudyRepository, - private val collaborationRepository: CollaborationRepository, ): AuthorNetworkService { override fun findAuthors(presenter: AuthorNetworkPresenter, request: AuthorNetworkService.RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/report/find/service/ExportProtocolServiceImpl.kt b/review/src/main/kotlin/br/all/application/report/find/service/ExportProtocolServiceImpl.kt index e13148214..837ce0b76 100644 --- a/review/src/main/kotlin/br/all/application/report/find/service/ExportProtocolServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/report/find/service/ExportProtocolServiceImpl.kt @@ -1,13 +1,11 @@ package br.all.application.report.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.protocol.repository.ProtocolDto import br.all.application.protocol.repository.ProtocolRepository import br.all.application.report.find.presenter.ExportProtocolPresenter import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.user.CredentialsService import br.all.domain.model.review.SystematicStudy @@ -19,18 +17,14 @@ class ExportProtocolServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val formatterFactoryService: FormatterFactoryService, private val protocolRepository: ProtocolRepository, - private val collaborationRepository: CollaborationRepository ): ExportProtocolService { override fun exportProtocol(presenter: ExportProtocolPresenter, request: ExportProtocolService.RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/report/find/service/FindAnswerServiceImpl.kt b/review/src/main/kotlin/br/all/application/report/find/service/FindAnswerServiceImpl.kt index a0b5b54b7..c06ddc4a1 100644 --- a/review/src/main/kotlin/br/all/application/report/find/service/FindAnswerServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/report/find/service/FindAnswerServiceImpl.kt @@ -1,12 +1,10 @@ package br.all.application.report.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.question.repository.QuestionRepository import br.all.application.report.find.presenter.FindAnswerPresenter import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.application.user.CredentialsService @@ -17,18 +15,14 @@ class FindAnswerServiceImpl( private val studyReviewRepository: StudyReviewRepository, private val systematicStudyRepository: SystematicStudyRepository, private val questionRepository: QuestionRepository, - private val collaborationRepository: CollaborationRepository ): FindAnswerService { override fun find(presenter: FindAnswerPresenter, request: FindAnswerService.RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) val question = questionRepository.findById(request.systematicStudyId, request.questionId) diff --git a/review/src/main/kotlin/br/all/application/report/find/service/FindCriteriaServiceImpl.kt b/review/src/main/kotlin/br/all/application/report/find/service/FindCriteriaServiceImpl.kt index cd683e378..30bdbc79a 100644 --- a/review/src/main/kotlin/br/all/application/report/find/service/FindCriteriaServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/report/find/service/FindCriteriaServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.report.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.protocol.repository.CriterionDto import br.all.application.protocol.repository.ProtocolRepository import br.all.application.report.find.presenter.FindCriteriaPresenter @@ -17,18 +15,14 @@ class FindCriteriaServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val credentialsService: CredentialsService, private val studyReviewRepository: StudyReviewRepository, - private val collaborationRepository: CollaborationRepository ): FindCriteriaService { override fun findCriteria(presenter: FindCriteriaPresenter, request: FindCriteriaService.RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/report/find/service/FindKeywordsServiceImpl.kt b/review/src/main/kotlin/br/all/application/report/find/service/FindKeywordsServiceImpl.kt index 7ba35a8b8..6a7f5f8fc 100644 --- a/review/src/main/kotlin/br/all/application/report/find/service/FindKeywordsServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/report/find/service/FindKeywordsServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.report.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.report.find.presenter.FindKeywordsPresenter import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto @@ -16,18 +14,14 @@ class FindKeywordsServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository ): FindKeywordsService { override fun findKeywords(presenter: FindKeywordsPresenter, request: FindKeywordsService.RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/report/find/service/FindSourceServiceImpl.kt b/review/src/main/kotlin/br/all/application/report/find/service/FindSourceServiceImpl.kt index bafc408d8..f8ff54837 100644 --- a/review/src/main/kotlin/br/all/application/report/find/service/FindSourceServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/report/find/service/FindSourceServiceImpl.kt @@ -1,12 +1,10 @@ package br.all.application.report.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.protocol.repository.ProtocolRepository import br.all.application.report.find.presenter.FindSourcePresenter import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewDto import br.all.application.study.repository.StudyReviewRepository @@ -19,18 +17,14 @@ class FindSourceServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ): FindSourceService { override fun findSource(presenter: FindSourcePresenter, request: FindSourceService.RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/report/find/service/FindStudiesByStageServiceImpl.kt b/review/src/main/kotlin/br/all/application/report/find/service/FindStudiesByStageServiceImpl.kt index 1c2cef16f..1f9d26b35 100644 --- a/review/src/main/kotlin/br/all/application/report/find/service/FindStudiesByStageServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/report/find/service/FindStudiesByStageServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.report.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.report.find.presenter.FindStudiesByStagePresenter import br.all.application.report.find.service.FindStudiesByStageService.StudyCollection import br.all.application.review.repository.SystematicStudyRepository @@ -18,18 +16,14 @@ class FindStudiesByStageServiceImpl( private val credentialsService: CredentialsService, private val studyReviewRepository: StudyReviewRepository, private val systematicStudyRepository: SystematicStudyRepository, - private val collaborationRepository: CollaborationRepository, ): FindStudiesByStageService { override fun findStudiesByStage(presenter: FindStudiesByStagePresenter, request: FindStudiesByStageService.RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return if (request.stage != "selection" && request.stage != "extraction") { diff --git a/review/src/main/kotlin/br/all/application/report/find/service/FindStudyReviewCriteriaServiceImpl.kt b/review/src/main/kotlin/br/all/application/report/find/service/FindStudyReviewCriteriaServiceImpl.kt index 1e106fab8..f1b8bc5ac 100644 --- a/review/src/main/kotlin/br/all/application/report/find/service/FindStudyReviewCriteriaServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/report/find/service/FindStudyReviewCriteriaServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.report.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.protocol.repository.CriterionDto import br.all.application.protocol.repository.ProtocolRepository import br.all.application.review.repository.SystematicStudyRepository @@ -18,7 +16,6 @@ class FindStudyReviewCriteriaServiceImpl( private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, private val protocolRepository: ProtocolRepository, - private val collaborationRepository: CollaborationRepository ): FindStudyReviewCriteriaService { override fun findCriteria( presenter: FindStudyReviewCriteriaPresenter, @@ -28,11 +25,8 @@ class FindStudyReviewCriteriaServiceImpl( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/report/find/service/IncludedStudiesAnswersServiceImpl.kt b/review/src/main/kotlin/br/all/application/report/find/service/IncludedStudiesAnswersServiceImpl.kt index da98fd269..6ff08417b 100644 --- a/review/src/main/kotlin/br/all/application/report/find/service/IncludedStudiesAnswersServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/report/find/service/IncludedStudiesAnswersServiceImpl.kt @@ -1,13 +1,11 @@ package br.all.application.report.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.question.repository.QuestionDto import br.all.application.question.repository.QuestionRepository import br.all.application.report.find.presenter.IncludedStudiesAnswersPresenter import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.application.user.CredentialsService @@ -20,7 +18,6 @@ class IncludedStudiesAnswersServiceImpl( private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, private val systematicStudyRepository: SystematicStudyRepository, - private val collaborationRepository: CollaborationRepository, ) : IncludedStudiesAnswersService { override fun findAnswers(presenter: IncludedStudiesAnswersPresenter, request: IncludedStudiesAnswersService.RequestModel) { @@ -28,11 +25,8 @@ class IncludedStudiesAnswersServiceImpl( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/report/find/service/StudiesFunnelServiceImpl.kt b/review/src/main/kotlin/br/all/application/report/find/service/StudiesFunnelServiceImpl.kt index 9719f1aaf..eae33c249 100644 --- a/review/src/main/kotlin/br/all/application/report/find/service/StudiesFunnelServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/report/find/service/StudiesFunnelServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.report.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.report.find.presenter.StudiesFunnelPresenter import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto @@ -17,18 +15,14 @@ class StudiesFunnelServiceImpl( private val credentialsService: CredentialsService, private val studyReviewRepository: StudyReviewRepository, private val systematicStudyRepository: SystematicStudyRepository, - private val collaborationRepository: CollaborationRepository ): StudiesFunnelService { override fun studiesFunnel(presenter: StudiesFunnelPresenter, request: StudiesFunnelService.RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return val allStudies = studyReviewRepository.findAllFromReview(request.systematicStudyId) diff --git a/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyPresenter.kt b/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyPresenter.kt index 035f8806a..fe1fd3fe6 100644 --- a/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyPresenter.kt +++ b/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.review.create import br.all.application.review.create.CreateSystematicStudyService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface CreateSystematicStudyPresenter : GenericPresenter diff --git a/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyService.kt b/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyService.kt index 44388d8e3..1b3ec80e4 100644 --- a/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyService.kt +++ b/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyService.kt @@ -9,6 +9,7 @@ interface CreateSystematicStudyService { val userId: UUID, val title : String, val description : String, + val collaborators : Set, ) data class ResponseModel( diff --git a/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyServiceImpl.kt b/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyServiceImpl.kt index 9a11a4742..2a6144f24 100644 --- a/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/review/create/CreateSystematicStudyServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.review.create -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDto import br.all.application.protocol.repository.ProtocolRepository import br.all.application.protocol.repository.toDto import br.all.application.user.CredentialsService @@ -11,24 +9,22 @@ import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromRequestModel import br.all.application.review.repository.toDto import br.all.application.shared.presenter.prepareIfUnauthorized -import br.all.domain.model.collaboration.Collaboration -import br.all.domain.model.collaboration.CollaborationId -import br.all.domain.model.collaboration.CollaborationPermission -import br.all.domain.model.collaboration.toCollaborationId import br.all.domain.model.protocol.Protocol import br.all.domain.model.review.SystematicStudy import br.all.domain.model.review.toSystematicStudyId -import br.all.domain.model.user.ResearcherId import br.all.domain.services.UuidGeneratorService +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +@Service class CreateSystematicStudyServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val protocolRepository: ProtocolRepository, private val uuidGeneratorService: UuidGeneratorService, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : CreateSystematicStudyService { - + + @Transactional override fun create(presenter: CreateSystematicStudyPresenter, request: RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() presenter.prepareIfUnauthorized(user) @@ -36,22 +32,12 @@ class CreateSystematicStudyServiceImpl( if (presenter.isDone()) return val generatedId = uuidGeneratorService.next() - val collabId = uuidGeneratorService.next() - - val ownerCollaboration = Collaboration( - collabId.toCollaborationId(), - generatedId.toSystematicStudyId(), - user!!.id as ResearcherId, - permissions = setOf(CollaborationPermission.VIEW, CollaborationPermission.EDIT, CollaborationPermission.REVIEW_STUDIES) - ) - collaborationRepository.saveOrUpdateCollaboration(ownerCollaboration.toDto()) - - val systematicStudy = SystematicStudy.fromRequestModel(generatedId, request, ownerCollaboration.id as CollaborationId) + val systematicStudy = SystematicStudy.fromRequestModel(generatedId, request) systematicStudyRepository.saveOrUpdate(systematicStudy.toDto()) val protocol = Protocol.write(generatedId.toSystematicStudyId(), emptySet()).build() protocolRepository.saveOrUpdate(protocol.toDto()) - presenter.prepareSuccessView(ResponseModel(user.id.value(), generatedId)) + presenter.prepareSuccessView(ResponseModel(user!!.id.value(), generatedId)) } } diff --git a/review/src/main/kotlin/br/all/application/review/find/presenter/FindAllSystematicStudyPresenter.kt b/review/src/main/kotlin/br/all/application/review/find/presenter/FindAllSystematicStudyPresenter.kt index d606ce3eb..bc8c5650c 100644 --- a/review/src/main/kotlin/br/all/application/review/find/presenter/FindAllSystematicStudyPresenter.kt +++ b/review/src/main/kotlin/br/all/application/review/find/presenter/FindAllSystematicStudyPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.review.find.presenter import br.all.application.review.find.services.FindAllSystematicStudiesService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindAllSystematicStudyPresenter : GenericPresenter diff --git a/review/src/main/kotlin/br/all/application/review/find/presenter/FindSystematicStudyPresenter.kt b/review/src/main/kotlin/br/all/application/review/find/presenter/FindSystematicStudyPresenter.kt index 4952240d5..b75b8bcc6 100644 --- a/review/src/main/kotlin/br/all/application/review/find/presenter/FindSystematicStudyPresenter.kt +++ b/review/src/main/kotlin/br/all/application/review/find/presenter/FindSystematicStudyPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.review.find.presenter import br.all.application.review.find.services.FindSystematicStudyService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindSystematicStudyPresenter : GenericPresenter diff --git a/review/src/main/kotlin/br/all/application/review/find/services/FindSystematicStudyServiceImpl.kt b/review/src/main/kotlin/br/all/application/review/find/services/FindSystematicStudyServiceImpl.kt index d9c6afbfa..a7edfd260 100644 --- a/review/src/main/kotlin/br/all/application/review/find/services/FindSystematicStudyServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/review/find/services/FindSystematicStudyServiceImpl.kt @@ -4,7 +4,7 @@ import br.all.application.review.find.presenter.FindSystematicStudyPresenter import br.all.application.review.find.services.FindSystematicStudyService.RequestModel import br.all.application.review.find.services.FindSystematicStudyService.ResponseModel import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfUnauthorized import br.all.application.user.CredentialsService diff --git a/review/src/main/kotlin/br/all/application/review/repository/SystematicStudyMapper.kt b/review/src/main/kotlin/br/all/application/review/repository/SystematicStudyMapper.kt index c5156a551..025cda28a 100644 --- a/review/src/main/kotlin/br/all/application/review/repository/SystematicStudyMapper.kt +++ b/review/src/main/kotlin/br/all/application/review/repository/SystematicStudyMapper.kt @@ -1,8 +1,7 @@ package br.all.application.review.repository import br.all.application.review.create.CreateSystematicStudyService.RequestModel -import br.all.domain.model.collaboration.CollaborationId -import br.all.domain.model.user.ResearcherId +import br.all.domain.shared.user.ResearcherId import br.all.domain.model.review.SystematicStudy import br.all.domain.model.review.SystematicStudyId import java.util.* @@ -15,12 +14,11 @@ fun SystematicStudy.toDto() = SystematicStudyDto( collaborators.map { it.value }.toSet(), ) -fun SystematicStudy.Companion.fromRequestModel(id: UUID, requestModel: RequestModel, ownerCollaborationId: CollaborationId) = SystematicStudy( +fun SystematicStudy.Companion.fromRequestModel(id: UUID, requestModel: RequestModel) = SystematicStudy( SystematicStudyId(id), requestModel.title, requestModel.description, ResearcherId(requestModel.userId), - setOf(ownerCollaborationId) ) fun SystematicStudy.Companion.fromDto(dto: SystematicStudyDto) = SystematicStudy( @@ -29,6 +27,6 @@ fun SystematicStudy.Companion.fromDto(dto: SystematicStudyDto) = SystematicStudy dto.description, ResearcherId(dto.owner), dto.collaborators - .map { CollaborationId(it) } + .map { ResearcherId(it) } .toMutableSet(), ) diff --git a/review/src/main/kotlin/br/all/application/review/update/presenter/UpdateSystematicStudyPresenter.kt b/review/src/main/kotlin/br/all/application/review/update/presenter/UpdateSystematicStudyPresenter.kt index d96136a3f..7dbd59897 100644 --- a/review/src/main/kotlin/br/all/application/review/update/presenter/UpdateSystematicStudyPresenter.kt +++ b/review/src/main/kotlin/br/all/application/review/update/presenter/UpdateSystematicStudyPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.review.update.presenter import br.all.application.review.update.services.UpdateSystematicStudyService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface UpdateSystematicStudyPresenter : GenericPresenter diff --git a/review/src/main/kotlin/br/all/application/review/update/services/UpdateSystematicStudyServiceImpl.kt b/review/src/main/kotlin/br/all/application/review/update/services/UpdateSystematicStudyServiceImpl.kt index 635722c2a..76de2a921 100644 --- a/review/src/main/kotlin/br/all/application/review/update/services/UpdateSystematicStudyServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/review/update/services/UpdateSystematicStudyServiceImpl.kt @@ -6,7 +6,7 @@ import br.all.application.review.repository.toDto import br.all.application.review.update.presenter.UpdateSystematicStudyPresenter import br.all.application.review.update.services.UpdateSystematicStudyService.RequestModel import br.all.application.review.update.services.UpdateSystematicStudyService.ResponseModel -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfUnauthorized import br.all.application.user.CredentialsService import br.all.domain.model.review.SystematicStudy diff --git a/review/src/main/kotlin/br/all/application/search/create/CreateSearchSessionPresenter.kt b/review/src/main/kotlin/br/all/application/search/create/CreateSearchSessionPresenter.kt index 6e5daaca2..c45259e45 100644 --- a/review/src/main/kotlin/br/all/application/search/create/CreateSearchSessionPresenter.kt +++ b/review/src/main/kotlin/br/all/application/search/create/CreateSearchSessionPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.search.create -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.search.create.CreateSearchSessionService.ResponseModel interface CreateSearchSessionPresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/search/create/CreateSearchSessionServiceImpl.kt b/review/src/main/kotlin/br/all/application/search/create/CreateSearchSessionServiceImpl.kt index 88e741d69..2fe2d3e2a 100644 --- a/review/src/main/kotlin/br/all/application/search/create/CreateSearchSessionServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/search/create/CreateSearchSessionServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.search.create -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.protocol.repository.ProtocolRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto @@ -32,24 +30,19 @@ class CreateSearchSessionServiceImpl( private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, private val scoreCalculatorService: ScoreCalculatorService, - private val reviewSimilarityService: ReviewSimilarityService, - private val collaborationRepository: CollaborationRepository + private val reviewSimilarityService: ReviewSimilarityService ) : CreateSearchSessionService { + override fun createSession( presenter: CreateSearchSessionPresenter, request: RequestModel, file: String ) { val user = credentialsService.loadCredentials(request.userId)?.toUser() - val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionPresenter.kt b/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionPresenter.kt index e9ef45ad2..51a210f10 100644 --- a/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionPresenter.kt +++ b/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.search.delete +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.search.delete.DeleteSearchSessionService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter -interface DeleteSearchSessionPresenter : GenericPresenter +interface DeleteSearchSessionPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionService.kt b/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionService.kt index 2067d589a..686fb3abe 100644 --- a/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionService.kt +++ b/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionService.kt @@ -1,15 +1,11 @@ -@file:Suppress("ktlint:standard:no-wildcard-imports") - package br.all.application.search.delete +import br.all.application.search.update.PatchSearchSessionPresenter import io.swagger.v3.oas.annotations.media.Schema import java.util.* interface DeleteSearchSessionService { - fun delete( - presenter: DeleteSearchSessionPresenter, - request: RequestModel, - ) + fun delete(presenter: DeleteSearchSessionPresenter, request: RequestModel) data class RequestModel( val userId: UUID, @@ -23,4 +19,4 @@ interface DeleteSearchSessionService { val systematicStudyId: UUID, val sessionId: UUID, ) -} +} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionServiceImpl.kt b/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionServiceImpl.kt index 82aa9878a..c94a6596d 100644 --- a/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/search/delete/DeleteSearchSessionServiceImpl.kt @@ -1,51 +1,45 @@ package br.all.application.search.delete -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.search.repository.SearchSessionRepository -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.user.CredentialsService import br.all.domain.model.review.SystematicStudy -class DeleteSearchSessionServiceImpl( +class DeleteSearchSessionServiceImpl ( private val systematicStudyRepository: SystematicStudyRepository, private val searchSessionRepository: SearchSessionRepository, - private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository + private val credentialsService: CredentialsService ) : DeleteSearchSessionService { override fun delete( presenter: DeleteSearchSessionPresenter, - request: DeleteSearchSessionService.RequestModel, + request: DeleteSearchSessionService.RequestModel ) { val user = credentialsService.loadCredentials(request.userId)?.toUser() + val searchSessionDto = searchSessionRepository.findById(request.sessionId) val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return - val searchSessionDto = searchSessionRepository.findById(request.sessionId) - - if(searchSessionDto == null){ - presenter.prepareFailView(EntityNotFoundException("There is no search session with ID ${request.sessionId}")) - return + if (searchSessionDto != null) { + searchSessionRepository.deleteById(searchSessionDto.id) + + presenter.prepareSuccessView( + DeleteSearchSessionService.ResponseModel( + userId = request.userId, + systematicStudyId = request.systematicStudyId, + sessionId = request.sessionId + ) + ) + } else { + val message = "There is no search session with ID ${request.sessionId}" + presenter.prepareFailView(EntityNotFoundException(message)) } - - searchSessionRepository.deleteById(searchSessionDto.id) - presenter.prepareSuccessView( - DeleteSearchSessionService.ResponseModel( - userId = request.userId, - systematicStudyId = request.systematicStudyId, - sessionId = request.sessionId, - ), - ) } -} +} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/search/find/presenter/FindAllSearchSessionsBySourcePresenter.kt b/review/src/main/kotlin/br/all/application/search/find/presenter/FindAllSearchSessionsBySourcePresenter.kt index 41cddd6ba..64b23b796 100644 --- a/review/src/main/kotlin/br/all/application/search/find/presenter/FindAllSearchSessionsBySourcePresenter.kt +++ b/review/src/main/kotlin/br/all/application/search/find/presenter/FindAllSearchSessionsBySourcePresenter.kt @@ -1,6 +1,6 @@ package br.all.application.search.find.presenter import br.all.application.search.find.service.FindAllSearchSessionsBySourceService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindAllSearchSessionsBySourcePresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/search/find/presenter/FindAllSearchSessionsPresenter.kt b/review/src/main/kotlin/br/all/application/search/find/presenter/FindAllSearchSessionsPresenter.kt index 05d6c568c..7fd4d02ed 100644 --- a/review/src/main/kotlin/br/all/application/search/find/presenter/FindAllSearchSessionsPresenter.kt +++ b/review/src/main/kotlin/br/all/application/search/find/presenter/FindAllSearchSessionsPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.search.find.presenter import br.all.application.search.find.service.FindAllSearchSessionsService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindAllSearchSessionsPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/search/find/presenter/FindSearchSessionPresenter.kt b/review/src/main/kotlin/br/all/application/search/find/presenter/FindSearchSessionPresenter.kt index 376578652..fe96eea25 100644 --- a/review/src/main/kotlin/br/all/application/search/find/presenter/FindSearchSessionPresenter.kt +++ b/review/src/main/kotlin/br/all/application/search/find/presenter/FindSearchSessionPresenter.kt @@ -2,6 +2,6 @@ package br.all.application.search.find.presenter import br.all.application.search.find.service.FindSearchSessionService import br.all.application.search.find.service.FindSearchSessionService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface FindSearchSessionPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/search/find/service/FindAllSearchSessionsBySourceServiceImpl.kt b/review/src/main/kotlin/br/all/application/search/find/service/FindAllSearchSessionsBySourceServiceImpl.kt index 726bd7340..9ab05349a 100644 --- a/review/src/main/kotlin/br/all/application/search/find/service/FindAllSearchSessionsBySourceServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/search/find/service/FindAllSearchSessionsBySourceServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.search.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.search.find.presenter.FindAllSearchSessionsBySourcePresenter @@ -16,7 +14,6 @@ class FindAllSearchSessionsBySourceServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val searchSessionRepository: SearchSessionRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ): FindAllSearchSessionsBySourceService{ override fun findAllSessionsBySource ( presenter: FindAllSearchSessionsBySourcePresenter, request: RequestModel @@ -25,11 +22,8 @@ class FindAllSearchSessionsBySourceServiceImpl( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/search/find/service/FindAllSearchSessionsServiceImpl.kt b/review/src/main/kotlin/br/all/application/search/find/service/FindAllSearchSessionsServiceImpl.kt index ae92d546d..d93f414dd 100644 --- a/review/src/main/kotlin/br/all/application/search/find/service/FindAllSearchSessionsServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/search/find/service/FindAllSearchSessionsServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.search.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.search.find.presenter.FindAllSearchSessionsPresenter @@ -15,18 +13,14 @@ class FindAllSearchSessionsServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val searchSessionRepository: SearchSessionRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ): FindAllSearchSessionsService { override fun findAllSearchSessions (presenter: FindAllSearchSessionsPresenter, request: RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/search/find/service/FindSearchSessionServiceImpl.kt b/review/src/main/kotlin/br/all/application/search/find/service/FindSearchSessionServiceImpl.kt index bdd495b64..26242f3a8 100644 --- a/review/src/main/kotlin/br/all/application/search/find/service/FindSearchSessionServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/search/find/service/FindSearchSessionServiceImpl.kt @@ -1,14 +1,12 @@ package br.all.application.search.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.search.find.presenter.FindSearchSessionPresenter import br.all.application.search.find.service.FindSearchSessionService.RequestModel import br.all.application.search.find.service.FindSearchSessionService.ResponseModel import br.all.application.search.repository.SearchSessionRepository -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.user.CredentialsService import br.all.domain.model.review.SystematicStudy @@ -17,7 +15,6 @@ class FindSearchSessionServiceImpl ( private val systematicStudyRepository: SystematicStudyRepository, private val searchSessionRepository: SearchSessionRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : FindSearchSessionService { override fun findOneSession(presenter: FindSearchSessionPresenter, request: RequestModel) { @@ -25,11 +22,8 @@ class FindSearchSessionServiceImpl ( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/search/repository/SearchSessionMapper.kt b/review/src/main/kotlin/br/all/application/search/repository/SearchSessionMapper.kt index 2bdc8944b..10d7ed2c1 100644 --- a/review/src/main/kotlin/br/all/application/search/repository/SearchSessionMapper.kt +++ b/review/src/main/kotlin/br/all/application/search/repository/SearchSessionMapper.kt @@ -1,7 +1,7 @@ package br.all.application.search.repository import br.all.application.search.create.CreateSearchSessionService.RequestModel import br.all.domain.model.protocol.SearchSource -import br.all.domain.model.user.ResearcherId +import br.all.domain.shared.user.ResearcherId import br.all.domain.model.review.SystematicStudyId import br.all.domain.model.search.SearchSession import br.all.domain.model.search.SearchSessionID diff --git a/review/src/main/kotlin/br/all/application/search/update/PatchSearchSessionPresenter.kt b/review/src/main/kotlin/br/all/application/search/update/PatchSearchSessionPresenter.kt index 2853831f9..4a4f69fad 100644 --- a/review/src/main/kotlin/br/all/application/search/update/PatchSearchSessionPresenter.kt +++ b/review/src/main/kotlin/br/all/application/search/update/PatchSearchSessionPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.search.update -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.search.update.PatchSearchSessionService.ResponseModel interface PatchSearchSessionPresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/search/update/PatchSearchSessionServiceImpl.kt b/review/src/main/kotlin/br/all/application/search/update/PatchSearchSessionServiceImpl.kt index 4ef63dc3a..f25e67c85 100644 --- a/review/src/main/kotlin/br/all/application/search/update/PatchSearchSessionServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/search/update/PatchSearchSessionServiceImpl.kt @@ -1,13 +1,11 @@ package br.all.application.search.update -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.protocol.repository.ProtocolRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.search.repository.SearchSessionRepository import br.all.application.search.update.PatchSearchSessionService.ResponseModel -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.repository.toDto @@ -31,24 +29,20 @@ class PatchSearchSessionServiceImpl ( private val converterFactoryService: ConverterFactoryService, private val protocolRepository: ProtocolRepository, private val scoreCalculatorService: ScoreCalculatorService, - private val reviewSimilarityService: ReviewSimilarityService, - private val collaborationRepository: CollaborationRepository + private val reviewSimilarityService: ReviewSimilarityService ) : PatchSearchSessionService { override fun patchSession( presenter: PatchSearchSessionPresenter, request: PatchSearchSessionService.RequestModel, file: String ) { - val searchSessionDto = searchSessionRepository.findById(request.sessionId) val user = credentialsService.loadCredentials(request.userId)?.toUser() + val searchSessionDto = searchSessionRepository.findById(request.sessionId) val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/search/update/UpdateSearchSessionPresenter.kt b/review/src/main/kotlin/br/all/application/search/update/UpdateSearchSessionPresenter.kt index fefa55caa..b658840e5 100644 --- a/review/src/main/kotlin/br/all/application/search/update/UpdateSearchSessionPresenter.kt +++ b/review/src/main/kotlin/br/all/application/search/update/UpdateSearchSessionPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.search.update import br.all.application.search.update.UpdateSearchSessionService.ResponseModel -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface UpdateSearchSessionPresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/search/update/UpdateSearchSessionServiceImpl.kt b/review/src/main/kotlin/br/all/application/search/update/UpdateSearchSessionServiceImpl.kt index b5d25504b..98356cbbf 100644 --- a/review/src/main/kotlin/br/all/application/search/update/UpdateSearchSessionServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/search/update/UpdateSearchSessionServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.search.update -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.search.repository.SearchSessionRepository @@ -9,7 +7,7 @@ import br.all.application.search.repository.fromDto import br.all.application.search.repository.toDto import br.all.application.search.update.UpdateSearchSessionService.RequestModel import br.all.application.search.update.UpdateSearchSessionService.ResponseModel -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.user.CredentialsService import br.all.domain.model.protocol.toSearchSource @@ -20,7 +18,6 @@ class UpdateSearchSessionServiceImpl ( private val systematicStudyRepository: SystematicStudyRepository, private val searchSessionRepository: SearchSessionRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : UpdateSearchSessionService { override fun updateSession(presenter: UpdateSearchSessionPresenter, request: RequestModel ) { @@ -28,11 +25,8 @@ class UpdateSearchSessionServiceImpl ( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/shared/exceptions/UniquenessViolationException.kt b/review/src/main/kotlin/br/all/application/shared/exceptions/UniquenessViolationException.kt deleted file mode 100644 index 6cd2e1658..000000000 --- a/review/src/main/kotlin/br/all/application/shared/exceptions/UniquenessViolationException.kt +++ /dev/null @@ -1,3 +0,0 @@ -package br.all.application.shared.exceptions - -class UniquenessViolationException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/shared/presenter/GenericPresenter.kt b/review/src/main/kotlin/br/all/application/shared/presenter/GenericPresenter.kt deleted file mode 100644 index 1262ed4e9..000000000 --- a/review/src/main/kotlin/br/all/application/shared/presenter/GenericPresenter.kt +++ /dev/null @@ -1,7 +0,0 @@ -package br.all.application.shared.presenter - -interface GenericPresenter { - fun prepareSuccessView(response: T) - fun prepareFailView(throwable: Throwable) - fun isDone(): Boolean -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/shared/presenter/PreconditionChecker.kt b/review/src/main/kotlin/br/all/application/shared/presenter/PreconditionChecker.kt index b5c7826b9..5de37e18a 100644 --- a/review/src/main/kotlin/br/all/application/shared/presenter/PreconditionChecker.kt +++ b/review/src/main/kotlin/br/all/application/shared/presenter/PreconditionChecker.kt @@ -2,11 +2,12 @@ package br.all.application.shared.presenter import br.all.application.user.credentials.ResearcherCredentialsService import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException -import br.all.domain.model.user.ResearcherId +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException +import br.all.domain.shared.user.ResearcherId import br.all.domain.model.review.SystematicStudyId +import br.all.domain.shared.presenter.GenericPresenter class PreconditionChecker( private val reviewRepository: SystematicStudyRepository, diff --git a/review/src/main/kotlin/br/all/application/shared/presenter/PreconditionCheckerNEW.kt b/review/src/main/kotlin/br/all/application/shared/presenter/PreconditionCheckerNEW.kt index c59cdf8a8..6d5f87d17 100644 --- a/review/src/main/kotlin/br/all/application/shared/presenter/PreconditionCheckerNEW.kt +++ b/review/src/main/kotlin/br/all/application/shared/presenter/PreconditionCheckerNEW.kt @@ -1,20 +1,20 @@ package br.all.application.shared.presenter -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException -import br.all.domain.model.collaboration.Collaboration -import br.all.domain.model.user.Researcher -import br.all.domain.model.user.Role -import br.all.domain.model.user.Role.ADMIN -import br.all.domain.model.user.Role.COLLABORATOR +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException +import br.all.domain.shared.user.Researcher +import br.all.domain.shared.user.Role +import br.all.domain.shared.user.Role.ADMIN +import br.all.domain.shared.user.Role.COLLABORATOR +import br.all.domain.model.review.SystematicStudy +import br.all.domain.shared.presenter.GenericPresenter fun GenericPresenter<*>.prepareIfFailsPreconditions( user: Researcher?, - systematicStudy: br.all.domain.model.review.SystematicStudy?, - allowedRoles: Set = setOf(COLLABORATOR), - collaborations: List? + systematicStudy: SystematicStudy?, + allowedRoles: Set = setOf(COLLABORATOR) ) { this.prepareIfUnauthorized(user, allowedRoles) if (this.isDone()) return @@ -28,7 +28,7 @@ fun GenericPresenter<*>.prepareIfFailsPreconditions( if (allowedRoles.contains(ADMIN) && existingUser.roles.contains(ADMIN)) return - if(collaborations == null || collaborations.none{ it.userId == user.id }) + if (!systematicStudy.collaborators.contains(existingUser.id)) this.prepareFailView(UnauthorizedUserException("User of id $existingUser can not perform this action.")) } diff --git a/review/src/main/kotlin/br/all/application/study/create/CreateStudyReviewPresenter.kt b/review/src/main/kotlin/br/all/application/study/create/CreateStudyReviewPresenter.kt index db69c1ddf..1c3c4837c 100644 --- a/review/src/main/kotlin/br/all/application/study/create/CreateStudyReviewPresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/create/CreateStudyReviewPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.study.create -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.study.create.CreateStudyReviewService.ResponseModel interface CreateStudyReviewPresenter : GenericPresenter diff --git a/review/src/main/kotlin/br/all/application/study/create/CreateStudyReviewServiceImpl.kt b/review/src/main/kotlin/br/all/application/study/create/CreateStudyReviewServiceImpl.kt index e769c6f2d..60efb59c5 100644 --- a/review/src/main/kotlin/br/all/application/study/create/CreateStudyReviewServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/study/create/CreateStudyReviewServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.study.create -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.shared.presenter.prepareIfFailsPreconditions @@ -19,8 +17,7 @@ class CreateStudyReviewServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val idGenerator: IdGeneratorService, - private val collaborationRepository: CollaborationRepository + private val idGenerator: IdGeneratorService ) : CreateStudyReviewService { override fun createFromStudy(presenter: CreateStudyReviewPresenter, request: RequestModel) { @@ -28,11 +25,8 @@ class CreateStudyReviewServiceImpl( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsByAuthorPresenter.kt b/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsByAuthorPresenter.kt index f0af9a242..1aaf4841e 100644 --- a/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsByAuthorPresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsByAuthorPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.study.find.presenter -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.study.find.service.FindAllStudyReviewsByAuthorService.ResponseModel interface FindAllStudyReviewsByAuthorPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsBySessionPresenter.kt b/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsBySessionPresenter.kt index 6cac12635..65ac4dd6d 100644 --- a/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsBySessionPresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsBySessionPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.study.find.presenter -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.study.find.service.FindAllStudyReviewsBySessionService.ResponseModel interface FindAllStudyReviewsBySessionPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsBySourcePresenter.kt b/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsBySourcePresenter.kt index 2b4e835d9..972699c04 100644 --- a/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsBySourcePresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsBySourcePresenter.kt @@ -1,6 +1,6 @@ package br.all.application.study.find.presenter -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.study.find.service.FindAllStudyReviewsBySourceService.ResponseModel interface FindAllStudyReviewsBySourcePresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsPresenter.kt b/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsPresenter.kt index f936735e1..61b51f88b 100644 --- a/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsPresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/find/presenter/FindAllStudyReviewsPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.study.find.presenter -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.study.find.service.FindAllStudyReviewsService.ResponseModel interface FindAllStudyReviewsPresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/find/presenter/FindStudyReviewPresenter.kt b/review/src/main/kotlin/br/all/application/study/find/presenter/FindStudyReviewPresenter.kt index c40c14129..93e7908c0 100644 --- a/review/src/main/kotlin/br/all/application/study/find/presenter/FindStudyReviewPresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/find/presenter/FindStudyReviewPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.study.find.presenter -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.study.find.service.FindStudyReviewService.ResponseModel interface FindStudyReviewPresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsByAuthorServiceImpl.kt b/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsByAuthorServiceImpl.kt index 7a87d5536..5c46a7556 100644 --- a/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsByAuthorServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsByAuthorServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.study.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.shared.presenter.prepareIfFailsPreconditions @@ -14,8 +12,7 @@ import br.all.domain.model.review.SystematicStudy class FindAllStudyReviewsByAuthorServiceImpl ( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, - private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, + private val credentialsService: CredentialsService ) : FindAllStudyReviewsByAuthorService { override fun findAllByAuthor( presenter: FindAllStudyReviewsByAuthorPresenter, @@ -25,11 +22,8 @@ class FindAllStudyReviewsByAuthorServiceImpl ( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return val allStudyReviews = studyReviewRepository.findAllFromReview(request.systematicStudyId) diff --git a/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsBySessionServiceImpl.kt b/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsBySessionServiceImpl.kt index 76abd10e7..afcc58670 100644 --- a/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsBySessionServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsBySessionServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.study.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.shared.presenter.prepareIfFailsPreconditions @@ -14,7 +12,6 @@ class FindAllStudyReviewsBySessionServiceImpl ( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : FindAllStudyReviewsBySessionService { override fun findAllBySearchSession( @@ -25,11 +22,8 @@ class FindAllStudyReviewsBySessionServiceImpl ( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsBySourceServiceImpl.kt b/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsBySourceServiceImpl.kt index 1a86956c9..3c96a6eb3 100644 --- a/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsBySourceServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsBySourceServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.study.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.shared.presenter.prepareIfFailsPreconditions @@ -18,7 +16,6 @@ class FindAllStudyReviewsBySourceServiceImpl( private val studyReviewRepository: StudyReviewRepository, // private val protocolRepository: ProtocolRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : FindAllStudyReviewsBySourceService { override fun findAllFromSearchSession(presenter: FindAllStudyReviewsBySourcePresenter, request: RequestModel) { @@ -26,11 +23,8 @@ class FindAllStudyReviewsBySourceServiceImpl( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsService.kt b/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsService.kt index 6f95d23b5..5404d0539 100644 --- a/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsService.kt +++ b/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsService.kt @@ -10,12 +10,20 @@ interface FindAllStudyReviewsService { data class RequestModel( val userId: UUID, - val systematicStudyId: UUID + val systematicStudyId: UUID, + val page: Int = 0, + val pageSize: Int = 20, + val sort: String = "id,asc" ) + @Schema(name = "FindAllStudyReviewsServiceResponseModel") data class ResponseModel( val userId: UUID, val systematicStudyId: UUID, - val studyReviews: List + val studyReviews: List, + val page: Int, + val size: Int, + val totalElements: Long, + val totalPages: Int ) } \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsServiceImpl.kt b/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsServiceImpl.kt index c4e90bb2d..c39318a1b 100644 --- a/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/study/find/service/FindAllStudyReviewsServiceImpl.kt @@ -1,7 +1,5 @@ package br.all.application.study.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto import br.all.application.shared.presenter.prepareIfFailsPreconditions @@ -11,28 +9,52 @@ import br.all.application.study.find.service.FindAllStudyReviewsService.Response import br.all.application.study.repository.StudyReviewRepository import br.all.application.user.CredentialsService import br.all.domain.model.review.SystematicStudy +import org.springframework.data.domain.PageRequest +import org.springframework.data.domain.Sort class FindAllStudyReviewsServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : FindAllStudyReviewsService { + private fun parseSortParameter(sortParam: String): Sort { + val parts = sortParam.split(",") + val property = parts[0] + val direction = if (parts.size > 1 && parts[1].equals("desc", ignoreCase = true)) { + Sort.Direction.DESC + } else { + Sort.Direction.ASC + } + return Sort.by(direction, property) + } + override fun findAllFromReview(presenter: FindAllStudyReviewsPresenter, request: RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return - val studyReviews = studyReviewRepository.findAllFromReview(request.systematicStudyId) - presenter.prepareSuccessView(ResponseModel(request.userId, request.systematicStudyId, studyReviews)) + val sort = parseSortParameter(request.sort) + val pageable = PageRequest.of( + request.page, + request.pageSize, + sort + ) + + val studyReviewsPage = studyReviewRepository.findAllFromReviewPaged(request.systematicStudyId, pageable) + presenter.prepareSuccessView(ResponseModel( + userId = request.userId, + systematicStudyId = request.systematicStudyId, + studyReviews = studyReviewsPage.content, + page = pageable.pageNumber, + size = pageable.pageSize, + totalElements = studyReviewsPage.totalElements, + totalPages = studyReviewsPage.totalPages + )) } } \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/find/service/FindStudyReviewServiceImpl.kt b/review/src/main/kotlin/br/all/application/study/find/service/FindStudyReviewServiceImpl.kt index c84a26cd8..d0d8b3e10 100644 --- a/review/src/main/kotlin/br/all/application/study/find/service/FindStudyReviewServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/study/find/service/FindStudyReviewServiceImpl.kt @@ -1,10 +1,8 @@ package br.all.application.study.find.service -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.find.presenter.FindStudyReviewPresenter import br.all.application.study.find.service.FindStudyReviewService.RequestModel @@ -17,7 +15,6 @@ class FindStudyReviewServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : FindStudyReviewService { override fun findOne(presenter: FindStudyReviewPresenter, request: RequestModel) { @@ -25,11 +22,8 @@ class FindStudyReviewServiceImpl( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/study/repository/StudyReviewRepository.kt b/review/src/main/kotlin/br/all/application/study/repository/StudyReviewRepository.kt index e74ac03f4..6978afce0 100644 --- a/review/src/main/kotlin/br/all/application/study/repository/StudyReviewRepository.kt +++ b/review/src/main/kotlin/br/all/application/study/repository/StudyReviewRepository.kt @@ -1,11 +1,14 @@ package br.all.application.study.repository +import org.springframework.data.domain.Page +import org.springframework.data.domain.Pageable import java.util.UUID interface StudyReviewRepository { fun saveOrUpdate(dto: StudyReviewDto): Any - fun findAllFromReview(reviewId: UUID): List + fun findAllFromReview(reviewId: UUID, pageable: Pageable = Pageable.unpaged()): List + fun findAllFromReviewPaged(reviewId: UUID, pageable: Pageable = Pageable.unpaged()): Page fun findAllBySource(reviewId: UUID, source: String): List fun findAllBySession(reviewId: UUID, searchSessionId: UUID): List fun findById(reviewId: UUID, studyId: Long) : StudyReviewDto? diff --git a/review/src/main/kotlin/br/all/application/study/update/implementation/AnswerQuestionImpl.kt b/review/src/main/kotlin/br/all/application/study/update/implementation/AnswerQuestionImpl.kt deleted file mode 100644 index f1ce6ce42..000000000 --- a/review/src/main/kotlin/br/all/application/study/update/implementation/AnswerQuestionImpl.kt +++ /dev/null @@ -1,131 +0,0 @@ -package br.all.application.study.update.implementation - -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain -import br.all.application.question.repository.QuestionRepository -import br.all.application.question.repository.fromDto -import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.presenter.prepareIfFailsPreconditions -import br.all.application.study.repository.StudyReviewRepository -import br.all.application.study.repository.fromDto -import br.all.application.study.repository.toDto -import br.all.application.study.update.interfaces.* -import br.all.application.user.CredentialsService -import br.all.domain.model.question.* -import br.all.domain.model.review.SystematicStudy -import br.all.domain.model.study.Answer -import br.all.domain.model.study.StudyReview - -class AnswerQuestionImpl ( - private val studyReviewRepository: StudyReviewRepository, - private val questionRepository: QuestionRepository, - private val systematicStudyRepository: SystematicStudyRepository, - private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, -): AnswerQuestionService { - override fun answerQuestion( - presenter: AnswerQuestionPresenter, - request: AnswerQuestionService.RequestModel<*>, - context: String? - ) { - val user = credentialsService.loadCredentials(request.userId)?.toUser() - - val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) - val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) - - if (presenter.isDone()) return - - val (userId, systematicStudyId, studyReviewId, questionId) = request - - val reviewDto = studyReviewRepository.findById(systematicStudyId, studyReviewId) - if (reviewDto == null) { - val message = "Review with id $studyReviewId in systematic study $systematicStudyId does not exist!" - presenter.prepareFailView(EntityNotFoundException(message)) - return - } - - val review = StudyReview.fromDto(reviewDto) - - val questionDto = questionRepository.findById(systematicStudyId, questionId) - if (questionDto == null) { - val message = "There is no question with id $questionId defined in protocol $systematicStudyId" - presenter.prepareFailView(EntityNotFoundException(message)) - return - } - - val question = Question.fromDto(questionDto) - - if (context == null) { - val message = "No context defined" - presenter.prepareFailView(IllegalArgumentException(message)) - return - } - - if (QuestionContextEnum.valueOf(context) != questionDto.context) { - val message = "Should answer question with the context: $context, found: ${questionDto.context}" - presenter.prepareFailView(IllegalArgumentException(message)) - return - } - - val answer = answer(questionDto.questionType, request, question) - if (questionDto.context == QuestionContextEnum.ROB) { - review.answerQualityQuestionOf(answer) - } else { - review.answerFormQuestionOf(answer) - } - - studyReviewRepository.saveOrUpdate(review.toDto()) - - presenter.prepareSuccessView( - AnswerQuestionService.ResponseModel( - userId, - systematicStudyId, - studyReviewId - ) - ) - } - - private fun answer( - type: String, - request: AnswerQuestionService.RequestModel<*>, - question: Question<*>, - ): Answer<*> { - if (type != request.type) { - val message = "Answer for ${request.type} has been sent, but question ${question.id} is actually $type" - throw IllegalArgumentException(message) - } - return when { - type == "TEXTUAL" && request.answer is String -> (question as Textual).answer(request.answer) - type == "PICK_LIST" && request.answer is String -> (question as PickList).answer(request.answer) - type == "NUMBERED_SCALE" && request.answer is Int -> (question as NumberScale).answer(request.answer) - type == "LABELED_SCALE" -> { - when (val answer = request.answer) { - is LinkedHashMap<*, *> -> { - (answer["name"] as? String)?.let { name -> - (answer["value"] as? Int)?.let { value -> - (question as LabeledScale).answer(Label(name, value)) - } - } ?: throw IllegalArgumentException("Invalid labeled scale answer: missing 'name' or 'value'") - } - is AnswerQuestionService.LabelDto -> { - (question as LabeledScale).answer(Label(answer.name, answer.value)) - } - else -> { - throw IllegalArgumentException("Unsupported answer type for LABELED_SCALE") - } - } - } - else -> { - val message = "Answer type of ${request.answer?.javaClass} is not compatible with question type $type" - throw IllegalArgumentException(message) - } - } - } -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/update/implementation/BatchAnswerQuestionServiceImpl.kt b/review/src/main/kotlin/br/all/application/study/update/implementation/BatchAnswerQuestionServiceImpl.kt index 6a8f753eb..640a8a209 100644 --- a/review/src/main/kotlin/br/all/application/study/update/implementation/BatchAnswerQuestionServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/study/update/implementation/BatchAnswerQuestionServiceImpl.kt @@ -1,12 +1,10 @@ package br.all.application.study.update.implementation -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.question.repository.QuestionRepository import br.all.application.question.repository.fromDto import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.repository.fromDto @@ -39,24 +37,19 @@ class BatchAnswerQuestionServiceImpl( private val questionRepository: QuestionRepository, private val systematicStudyRepository: SystematicStudyRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository ): BatchAnswerQuestionService { @Transactional override fun batchAnswerQuestion( presenter: BatchAnswerQuestionPresenter, - request: RequestModel, - context: String + request: RequestModel ) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return val reviewDto = studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) @@ -67,7 +60,6 @@ class BatchAnswerQuestionServiceImpl( } val review = StudyReview.fromDto(reviewDto) - val questionContext = QuestionContextEnum.valueOf(context.uppercase()) val successfulQuestionIds = mutableListOf() val failedAnswers = mutableListOf() @@ -76,7 +68,6 @@ class BatchAnswerQuestionServiceImpl( val questionDto = questionRepository.findById(request.systematicStudyId, answerDetail.questionId) if (questionDto == null) throw EntityNotFoundException("Question with id ${answerDetail.questionId} in systematic study ${request.systematicStudyId} was not found!") - if (questionDto.context != questionContext) throw IllegalArgumentException("Should answer question with the context: $context, found: ${questionDto.context}") val question = Question.fromDto(questionDto) val answer = convertAnswer(question, answerDetail, questionDto.questionType) diff --git a/review/src/main/kotlin/br/all/application/study/update/implementation/MarkAsDuplicatedServiceImpl.kt b/review/src/main/kotlin/br/all/application/study/update/implementation/MarkAsDuplicatedServiceImpl.kt index bd30d294b..a9caa7417 100644 --- a/review/src/main/kotlin/br/all/application/study/update/implementation/MarkAsDuplicatedServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/study/update/implementation/MarkAsDuplicatedServiceImpl.kt @@ -1,10 +1,8 @@ package br.all.application.study.update.implementation -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.repository.fromDto @@ -19,7 +17,6 @@ class MarkAsDuplicatedServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : MarkAsDuplicatedService { override fun markAsDuplicated( @@ -30,11 +27,8 @@ class MarkAsDuplicatedServiceImpl( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return val referenceStudyDto = studyReviewRepository.findById(request.systematicStudyId, request.referenceStudyId) diff --git a/review/src/main/kotlin/br/all/application/study/update/implementation/RemoveCriteriaServiceImpl.kt b/review/src/main/kotlin/br/all/application/study/update/implementation/RemoveCriteriaServiceImpl.kt index a31e31ac5..e83475901 100644 --- a/review/src/main/kotlin/br/all/application/study/update/implementation/RemoveCriteriaServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/study/update/implementation/RemoveCriteriaServiceImpl.kt @@ -1,10 +1,8 @@ package br.all.application.study.update.implementation -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.repository.fromDto @@ -20,18 +18,14 @@ class RemoveCriteriaServiceImpl( private val studyReviewRepository: StudyReviewRepository, private val systematicStudyRepository: SystematicStudyRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository ): RemoveCriteriaService { override fun removeCriteria(presenter: RemoveCriteriaPresenter, request: RemoveCriteriaService.RequestModel) { val user = credentialsService.loadCredentials(request.userId)?.toUser() val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return val studyReviewDto = studyReviewRepository.findById(request.systematicStudyId, request.studyId) diff --git a/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewExtractionService.kt b/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewExtractionService.kt index 6a97fe409..8f8baf6c2 100644 --- a/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewExtractionService.kt +++ b/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewExtractionService.kt @@ -1,10 +1,8 @@ package br.all.application.study.update.implementation -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.repository.fromDto @@ -22,7 +20,6 @@ class UpdateStudyReviewExtractionService( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : UpdateStudyReviewStatusService { override fun changeStatus(presenter: UpdateStudyReviewStatusPresenter, request: RequestModel) { @@ -30,11 +27,8 @@ class UpdateStudyReviewExtractionService( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if (presenter.isDone()) return for (studyId in request.studyReviewId) { diff --git a/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewPriorityService.kt b/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewPriorityService.kt index fb898cdfc..4c7bda606 100644 --- a/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewPriorityService.kt +++ b/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewPriorityService.kt @@ -1,10 +1,8 @@ package br.all.application.study.update.implementation -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.repository.fromDto @@ -22,7 +20,6 @@ class UpdateStudyReviewPriorityService( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : UpdateStudyReviewStatusService { override fun changeStatus(presenter: UpdateStudyReviewStatusPresenter, request: RequestModel) { @@ -30,11 +27,8 @@ class UpdateStudyReviewPriorityService( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewSelectionService.kt b/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewSelectionService.kt index 3de6b6eb9..eb9719239 100644 --- a/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewSelectionService.kt +++ b/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewSelectionService.kt @@ -1,10 +1,8 @@ package br.all.application.study.update.implementation -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.repository.fromDto @@ -22,7 +20,6 @@ class UpdateStudyReviewSelectionService( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository ) : UpdateStudyReviewStatusService { override fun changeStatus(presenter: UpdateStudyReviewStatusPresenter, request: RequestModel){ @@ -30,11 +27,8 @@ class UpdateStudyReviewSelectionService( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewServiceImpl.kt b/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewServiceImpl.kt index d04507e11..bf7730c5a 100644 --- a/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewServiceImpl.kt +++ b/review/src/main/kotlin/br/all/application/study/update/implementation/UpdateStudyReviewServiceImpl.kt @@ -1,10 +1,8 @@ package br.all.application.study.update.implementation -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.toDomain import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.repository.fromDto -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.repository.fromStudyUpdateRequestModel @@ -19,7 +17,6 @@ class UpdateStudyReviewServiceImpl( private val systematicStudyRepository: SystematicStudyRepository, private val studyReviewRepository: StudyReviewRepository, private val credentialsService: CredentialsService, - private val collaborationRepository: CollaborationRepository, ) : UpdateStudyReviewService { override fun updateFromStudy(presenter: UpdateStudyReviewPresenter, request: UpdateStudyReviewService.RequestModel) { @@ -27,11 +24,8 @@ class UpdateStudyReviewServiceImpl( val systematicStudyDto = systematicStudyRepository.findById(request.systematicStudyId) val systematicStudy = systematicStudyDto?.let { SystematicStudy.fromDto(it) } - val collaborations = collaborationRepository - .listAllCollaborationsBySystematicStudyId(request.systematicStudyId) - .map { it.toDomain() } - presenter.prepareIfFailsPreconditions(user, systematicStudy, collaborations = collaborations) + presenter.prepareIfFailsPreconditions(user, systematicStudy) if(presenter.isDone()) return diff --git a/review/src/main/kotlin/br/all/application/study/update/interfaces/AnswerQuestionPresenter.kt b/review/src/main/kotlin/br/all/application/study/update/interfaces/AnswerQuestionPresenter.kt deleted file mode 100644 index a81118761..000000000 --- a/review/src/main/kotlin/br/all/application/study/update/interfaces/AnswerQuestionPresenter.kt +++ /dev/null @@ -1,6 +0,0 @@ -package br.all.application.study.update.interfaces - -import br.all.application.shared.presenter.GenericPresenter -import br.all.application.study.update.interfaces.AnswerQuestionService.ResponseModel - -interface AnswerQuestionPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/update/interfaces/AnswerQuestionService.kt b/review/src/main/kotlin/br/all/application/study/update/interfaces/AnswerQuestionService.kt deleted file mode 100644 index 66320599f..000000000 --- a/review/src/main/kotlin/br/all/application/study/update/interfaces/AnswerQuestionService.kt +++ /dev/null @@ -1,29 +0,0 @@ -package br.all.application.study.update.interfaces - -import io.swagger.v3.oas.annotations.media.Schema -import java.util.* - -interface AnswerQuestionService { - fun answerQuestion(presenter: AnswerQuestionPresenter, request: RequestModel<*>, context: String?) - - data class RequestModel( - val userId: UUID, - val systematicStudyId: UUID, - val studyReviewId: Long, - val questionId: UUID, - val type: String, - val answer: T, - ) - - data class LabelDto( - val name: String, - val value: Int - ) - - @Schema(name = "AnswerQuestionServiceResponseModel") - data class ResponseModel( - val userId: UUID, - val systematicStudyId: UUID, - val studyReviewId: Long, - ) -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/update/interfaces/BatchAnswerQuestionPresenter.kt b/review/src/main/kotlin/br/all/application/study/update/interfaces/BatchAnswerQuestionPresenter.kt index 627d35bb8..ee19e87bf 100644 --- a/review/src/main/kotlin/br/all/application/study/update/interfaces/BatchAnswerQuestionPresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/update/interfaces/BatchAnswerQuestionPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.study.update.interfaces -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.study.update.interfaces.BatchAnswerQuestionService.ResponseModel interface BatchAnswerQuestionPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/update/interfaces/BatchAnswerQuestionService.kt b/review/src/main/kotlin/br/all/application/study/update/interfaces/BatchAnswerQuestionService.kt index 36c6299d1..1b1e91ecf 100644 --- a/review/src/main/kotlin/br/all/application/study/update/interfaces/BatchAnswerQuestionService.kt +++ b/review/src/main/kotlin/br/all/application/study/update/interfaces/BatchAnswerQuestionService.kt @@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema import java.util.UUID interface BatchAnswerQuestionService { - fun batchAnswerQuestion(presenter: BatchAnswerQuestionPresenter, request: RequestModel, context: String) + fun batchAnswerQuestion(presenter: BatchAnswerQuestionPresenter, request: RequestModel) data class RequestModel( val userId: UUID, diff --git a/review/src/main/kotlin/br/all/application/study/update/interfaces/MarkAsDuplicatedPresenter.kt b/review/src/main/kotlin/br/all/application/study/update/interfaces/MarkAsDuplicatedPresenter.kt index 341d91e88..233772a2e 100644 --- a/review/src/main/kotlin/br/all/application/study/update/interfaces/MarkAsDuplicatedPresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/update/interfaces/MarkAsDuplicatedPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.study.update.interfaces -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.study.update.interfaces.MarkAsDuplicatedService.ResponseModel interface MarkAsDuplicatedPresenter : GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/update/interfaces/RemoveCriteriaPresenter.kt b/review/src/main/kotlin/br/all/application/study/update/interfaces/RemoveCriteriaPresenter.kt index ab24adad1..5c289a47a 100644 --- a/review/src/main/kotlin/br/all/application/study/update/interfaces/RemoveCriteriaPresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/update/interfaces/RemoveCriteriaPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.study.update.interfaces -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface RemoveCriteriaPresenter: GenericPresenter \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/study/update/interfaces/UpdateStudyReviewPresenter.kt b/review/src/main/kotlin/br/all/application/study/update/interfaces/UpdateStudyReviewPresenter.kt index f4156d3dc..096aa4936 100644 --- a/review/src/main/kotlin/br/all/application/study/update/interfaces/UpdateStudyReviewPresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/update/interfaces/UpdateStudyReviewPresenter.kt @@ -1,5 +1,5 @@ package br.all.application.study.update.interfaces -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter interface UpdateStudyReviewPresenter : GenericPresenter diff --git a/review/src/main/kotlin/br/all/application/study/update/interfaces/UpdateStudyReviewStatusPresenter.kt b/review/src/main/kotlin/br/all/application/study/update/interfaces/UpdateStudyReviewStatusPresenter.kt index 87d11490a..88c318024 100644 --- a/review/src/main/kotlin/br/all/application/study/update/interfaces/UpdateStudyReviewStatusPresenter.kt +++ b/review/src/main/kotlin/br/all/application/study/update/interfaces/UpdateStudyReviewStatusPresenter.kt @@ -1,6 +1,6 @@ package br.all.application.study.update.interfaces -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.study.update.interfaces.UpdateStudyReviewStatusService.ResponseModel interface UpdateStudyReviewStatusPresenter : GenericPresenter diff --git a/review/src/main/kotlin/br/all/application/user/CredentialsService.kt b/review/src/main/kotlin/br/all/application/user/CredentialsService.kt index c7bd692d3..36004de22 100644 --- a/review/src/main/kotlin/br/all/application/user/CredentialsService.kt +++ b/review/src/main/kotlin/br/all/application/user/CredentialsService.kt @@ -1,8 +1,8 @@ package br.all.application.user -import br.all.domain.model.user.Researcher -import br.all.domain.model.user.ResearcherId -import br.all.domain.model.user.Role +import br.all.domain.shared.user.Researcher +import br.all.domain.shared.user.ResearcherId +import br.all.domain.shared.user.Role import io.swagger.v3.oas.annotations.media.Schema import java.util.UUID diff --git a/review/src/main/kotlin/br/all/application/user/credentials/FakeResearcherCredentialsService.kt b/review/src/main/kotlin/br/all/application/user/credentials/FakeResearcherCredentialsService.kt index 22e8718da..b10846e5a 100644 --- a/review/src/main/kotlin/br/all/application/user/credentials/FakeResearcherCredentialsService.kt +++ b/review/src/main/kotlin/br/all/application/user/credentials/FakeResearcherCredentialsService.kt @@ -1,6 +1,6 @@ package br.all.application.user.credentials -import br.all.domain.model.user.ResearcherId +import br.all.domain.shared.user.ResearcherId import org.springframework.stereotype.Service @Service diff --git a/review/src/main/kotlin/br/all/application/user/credentials/ResearcherCredentialsService.kt b/review/src/main/kotlin/br/all/application/user/credentials/ResearcherCredentialsService.kt index f7cbd4356..2f2615c5d 100644 --- a/review/src/main/kotlin/br/all/application/user/credentials/ResearcherCredentialsService.kt +++ b/review/src/main/kotlin/br/all/application/user/credentials/ResearcherCredentialsService.kt @@ -1,6 +1,6 @@ package br.all.application.user.credentials -import br.all.domain.model.user.ResearcherId +import br.all.domain.shared.user.ResearcherId interface ResearcherCredentialsService { fun isAuthenticated(researcherId: ResearcherId): Boolean diff --git a/review/src/main/kotlin/br/all/domain/model/collaboration/Collaboration.kt b/review/src/main/kotlin/br/all/domain/model/collaboration/Collaboration.kt deleted file mode 100644 index 2f9df8507..000000000 --- a/review/src/main/kotlin/br/all/domain/model/collaboration/Collaboration.kt +++ /dev/null @@ -1,45 +0,0 @@ -package br.all.domain.model.collaboration - -import br.all.domain.model.review.SystematicStudyId -import br.all.domain.model.user.ResearcherId -import br.all.domain.shared.ddd.Entity -import br.all.domain.shared.ddd.Notification -import java.util.* - -class Collaboration( - id: CollaborationId, - val systematicStudyId: SystematicStudyId, - val userId: ResearcherId, - status: CollaborationStatus = CollaborationStatus.ACTIVE, - permissions: Set = emptySet() -) : Entity(id) { - - private val _permissions = permissions.toMutableSet() - val permissions: Set - get() = _permissions.toSet() - - var status = status - private set - - init { - val notification = validate() - require(notification.hasNoErrors()) { notification.message() } - } - - fun addPermission(permission: CollaborationPermission) { - _permissions.add(permission) - } - - fun removePermission(permission: CollaborationPermission) { - _permissions.remove(permission) - } - - fun removeCollaboration() { - status = CollaborationStatus.REMOVED - } - - private fun validate() = Notification().also { - if (_permissions.isEmpty()) - it.addError("Collaboration must have at least one permission") - } -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/domain/model/collaboration/CollaborationId.kt b/review/src/main/kotlin/br/all/domain/model/collaboration/CollaborationId.kt deleted file mode 100644 index da15c73e1..000000000 --- a/review/src/main/kotlin/br/all/domain/model/collaboration/CollaborationId.kt +++ /dev/null @@ -1,21 +0,0 @@ -package br.all.domain.model.collaboration - -import br.all.domain.shared.ddd.Identifier -import br.all.domain.shared.ddd.Notification -import java.util.* - -@JvmInline -value class CollaborationId(val value: UUID) : Identifier { - init { - val notification = validate() - require(notification.hasNoErrors()) { notification.message() } - } - - override fun validate() = Notification() - - override fun value() = value - - override fun toString() = value.toString() -} - -fun UUID.toCollaborationId() = CollaborationId(this) \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/domain/model/collaboration/CollaborationPermission.kt b/review/src/main/kotlin/br/all/domain/model/collaboration/CollaborationPermission.kt deleted file mode 100644 index 9f87ac2f9..000000000 --- a/review/src/main/kotlin/br/all/domain/model/collaboration/CollaborationPermission.kt +++ /dev/null @@ -1,7 +0,0 @@ -package br.all.domain.model.collaboration - -enum class CollaborationPermission { - EDIT, - REVIEW_STUDIES, - VIEW -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/domain/model/collaboration/CollaborationStatus.kt b/review/src/main/kotlin/br/all/domain/model/collaboration/CollaborationStatus.kt deleted file mode 100644 index d48c3431c..000000000 --- a/review/src/main/kotlin/br/all/domain/model/collaboration/CollaborationStatus.kt +++ /dev/null @@ -1,6 +0,0 @@ -package br.all.domain.model.collaboration - -enum class CollaborationStatus { - REMOVED, - ACTIVE -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/domain/model/collaboration/Invite.kt b/review/src/main/kotlin/br/all/domain/model/collaboration/Invite.kt deleted file mode 100644 index b2bb0983d..000000000 --- a/review/src/main/kotlin/br/all/domain/model/collaboration/Invite.kt +++ /dev/null @@ -1,31 +0,0 @@ -package br.all.domain.model.collaboration - -import br.all.domain.model.review.SystematicStudyId -import br.all.domain.model.user.ResearcherId -import br.all.domain.shared.ddd.Entity -import br.all.domain.shared.ddd.Notification -import java.time.LocalDateTime -import java.util.* - -class Invite( - id: InviteId, - val systematicStudyId: SystematicStudyId, - val userId: ResearcherId, - permissions: Set = emptySet(), - val inviteDate: LocalDateTime, - val expirationDate: LocalDateTime = inviteDate.plusDays(30) -) : Entity(id) { - - private val _permissions = permissions.toMutableSet() - val permissions get() = _permissions - - init { - val notification = validate() - require(notification.hasNoErrors()) { notification.message() } - } - - fun validate() = Notification().also { - if (inviteDate.isAfter(expirationDate)) - it.addError("Invite date cannot be after expiration date") - } -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/domain/model/collaboration/InviteId.kt b/review/src/main/kotlin/br/all/domain/model/collaboration/InviteId.kt deleted file mode 100644 index cc045b88d..000000000 --- a/review/src/main/kotlin/br/all/domain/model/collaboration/InviteId.kt +++ /dev/null @@ -1,21 +0,0 @@ -package br.all.domain.model.collaboration - -import br.all.domain.shared.ddd.Identifier -import br.all.domain.shared.ddd.Notification -import java.util.* - -@JvmInline -value class InviteId(private val value: UUID) : Identifier { - init { - val notification = validate() - require(notification.hasNoErrors()) { notification.message() } - } - - override fun validate() = Notification() - - override fun value() = value - - override fun toString() = value.toString() -} - -fun UUID.toInviteId() = InviteId(this) \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/domain/model/protocol/Criterion.kt b/review/src/main/kotlin/br/all/domain/model/protocol/Criterion.kt index f88f64879..f5aaae05d 100644 --- a/review/src/main/kotlin/br/all/domain/model/protocol/Criterion.kt +++ b/review/src/main/kotlin/br/all/domain/model/protocol/Criterion.kt @@ -2,9 +2,8 @@ package br.all.domain.model.protocol import br.all.domain.shared.ddd.Notification import br.all.domain.shared.ddd.ValueObject -import jakarta.persistence.Embeddable -data class Criterion internal constructor( +data class Criterion( val description: String, val type: CriterionType, ) : ValueObject() { diff --git a/review/src/main/kotlin/br/all/domain/model/protocol/Protocol.kt b/review/src/main/kotlin/br/all/domain/model/protocol/Protocol.kt index 430a97d9d..34f7afc52 100644 --- a/review/src/main/kotlin/br/all/domain/model/protocol/Protocol.kt +++ b/review/src/main/kotlin/br/all/domain/model/protocol/Protocol.kt @@ -1,8 +1,8 @@ package br.all.domain.model.protocol +import br.all.domain.shared.ddd.Entity import br.all.domain.model.question.QuestionId import br.all.domain.model.review.SystematicStudyId -import br.all.domain.shared.ddd.Entity import br.all.domain.shared.utils.exists import br.all.domain.shared.valueobject.Language import java.util.* diff --git a/review/src/main/kotlin/br/all/domain/model/question/PickList.kt b/review/src/main/kotlin/br/all/domain/model/question/PickList.kt index 73fc705a7..8a04e5e3e 100644 --- a/review/src/main/kotlin/br/all/domain/model/question/PickList.kt +++ b/review/src/main/kotlin/br/all/domain/model/question/PickList.kt @@ -1,6 +1,5 @@ package br.all.domain.model.question -import br.all.domain.model.protocol.ProtocolId import br.all.domain.model.review.SystematicStudyId import br.all.domain.model.study.Answer import br.all.domain.shared.ddd.Notification diff --git a/review/src/main/kotlin/br/all/domain/model/question/Question.kt b/review/src/main/kotlin/br/all/domain/model/question/Question.kt index f5484018b..dcd216b10 100644 --- a/review/src/main/kotlin/br/all/domain/model/question/Question.kt +++ b/review/src/main/kotlin/br/all/domain/model/question/Question.kt @@ -1,9 +1,8 @@ package br.all.domain.model.question -import br.all.domain.model.protocol.ProtocolId +import br.all.domain.shared.ddd.Entity import br.all.domain.model.review.SystematicStudyId import br.all.domain.model.study.Answer -import br.all.domain.shared.ddd.Entity import br.all.domain.shared.ddd.Notification import java.util.* diff --git a/review/src/main/kotlin/br/all/domain/model/question/QuestionId.kt b/review/src/main/kotlin/br/all/domain/model/question/QuestionId.kt index 339c6122a..5d232b4c0 100644 --- a/review/src/main/kotlin/br/all/domain/model/question/QuestionId.kt +++ b/review/src/main/kotlin/br/all/domain/model/question/QuestionId.kt @@ -2,11 +2,10 @@ package br.all.domain.model.question import br.all.domain.shared.ddd.Identifier import br.all.domain.shared.ddd.Notification -import java.rmi.server.UID import java.util.UUID @JvmInline -value class QuestionId(val value : UUID) : Identifier { +value class QuestionId(val value : UUID) : Identifier { override fun validate() = Notification() override fun value(): UUID = value override fun toString() = value.toString() diff --git a/review/src/main/kotlin/br/all/domain/model/review/SystematicStudy.kt b/review/src/main/kotlin/br/all/domain/model/review/SystematicStudy.kt index d6041339c..69ce0e5c7 100644 --- a/review/src/main/kotlin/br/all/domain/model/review/SystematicStudy.kt +++ b/review/src/main/kotlin/br/all/domain/model/review/SystematicStudy.kt @@ -1,11 +1,7 @@ package br.all.domain.model.review -import br.all.domain.model.collaboration.Collaboration -import br.all.domain.model.collaboration.CollaborationId -import br.all.domain.model.collaboration.toCollaborationId -import br.all.domain.model.user.ResearcherId -import br.all.domain.model.user.toResearcherId import br.all.domain.shared.ddd.Entity +import br.all.domain.shared.user.ResearcherId import br.all.domain.shared.ddd.Notification import br.all.domain.shared.utils.exists import java.util.* @@ -15,7 +11,7 @@ class SystematicStudy( title: String, description: String, owner: ResearcherId, - collaborators: Set + collaborators: Set = emptySet(), ) : Entity(id) { private val _collaborators = collaborators.toMutableSet() @@ -36,6 +32,7 @@ class SystematicStudy( init { val notification = validate() require(notification.hasNoErrors()) { notification.message() } + _collaborators.add(owner) } private fun validate() = Notification().also { @@ -45,20 +42,19 @@ class SystematicStudy( it.addError("Systematic Study description must not be blank!") } - fun addCollaborator(collaborationId: CollaborationId) = _collaborators.add(collaborationId) + fun addCollaborator(researcherId: ResearcherId) = _collaborators.add(researcherId) - fun changeOwner(previousOwnerCollaborationId: CollaborationId, newCollaboration: Collaboration) { - _collaborators.remove(previousOwnerCollaborationId) - owner = newCollaboration.userId - _collaborators.add(newCollaboration.id as CollaborationId) - } + fun changeOwner(researcherId: ResearcherId) { + _collaborators.add(researcherId) + owner = researcherId + } - fun removeCollaborator(collaboration: Collaboration) { - check(collaboration.id.value().toResearcherId() != owner) { "Cannot remove the Systematic Study owner: $owner" } - exists(collaboration.id.value().toCollaborationId() in _collaborators) { - "Cannot remove member that is not part of the collaboration: ${collaboration.id}" + fun removeCollaborator(researcherId: ResearcherId) { + check(researcherId != owner) { "Cannot remove the Systematic Study owner: $owner" } + exists(researcherId in _collaborators) { + "Cannot remove member that is not part of the collaboration: $researcherId" } - _collaborators.remove(collaboration.id) + _collaborators.remove(researcherId) } override fun toString() = "SystematicStudy(reviewId=$id, title='$title', description='$description', owner=$owner," + diff --git a/review/src/main/kotlin/br/all/domain/model/search/SearchSession.kt b/review/src/main/kotlin/br/all/domain/model/search/SearchSession.kt index 42eca6571..b8ce58d8f 100644 --- a/review/src/main/kotlin/br/all/domain/model/search/SearchSession.kt +++ b/review/src/main/kotlin/br/all/domain/model/search/SearchSession.kt @@ -1,9 +1,9 @@ package br.all.domain.model.search +import br.all.domain.shared.ddd.Entity import br.all.domain.model.protocol.SearchSource -import br.all.domain.model.user.ResearcherId +import br.all.domain.shared.user.ResearcherId import br.all.domain.model.review.SystematicStudyId -import br.all.domain.shared.ddd.Entity import br.all.domain.shared.ddd.Notification import java.time.LocalDateTime import java.util.* diff --git a/review/src/main/kotlin/br/all/domain/model/search/SearchSessionID.kt b/review/src/main/kotlin/br/all/domain/model/search/SearchSessionID.kt index 5a1c27d69..bdf029c24 100644 --- a/review/src/main/kotlin/br/all/domain/model/search/SearchSessionID.kt +++ b/review/src/main/kotlin/br/all/domain/model/search/SearchSessionID.kt @@ -5,7 +5,7 @@ import br.all.domain.shared.ddd.Notification import java.util.* @JvmInline -value class SearchSessionID(val value: UUID) : Identifier { +value class SearchSessionID(val value: UUID) : Identifier { init { val notification = validate() diff --git a/review/src/main/kotlin/br/all/domain/model/study/StudyReview.kt b/review/src/main/kotlin/br/all/domain/model/study/StudyReview.kt index 75e86a626..fec26fef2 100644 --- a/review/src/main/kotlin/br/all/domain/model/study/StudyReview.kt +++ b/review/src/main/kotlin/br/all/domain/model/study/StudyReview.kt @@ -1,7 +1,7 @@ package br.all.domain.model.study -import br.all.domain.model.protocol.Criterion import br.all.domain.shared.ddd.Entity +import br.all.domain.model.protocol.Criterion import br.all.domain.model.review.SystematicStudyId import br.all.domain.model.search.SearchSessionID diff --git a/review/src/main/kotlin/br/all/domain/model/study/StudyReviewId.kt b/review/src/main/kotlin/br/all/domain/model/study/StudyReviewId.kt index e2e900969..4754210c2 100644 --- a/review/src/main/kotlin/br/all/domain/model/study/StudyReviewId.kt +++ b/review/src/main/kotlin/br/all/domain/model/study/StudyReviewId.kt @@ -2,11 +2,9 @@ package br.all.domain.model.study import br.all.domain.shared.ddd.Identifier import br.all.domain.shared.ddd.Notification -import java.util.UUID -import javax.swing.LookAndFeel @JvmInline -value class StudyReviewId(val value: Long) : Identifier { +value class StudyReviewId(val value: Long) : Identifier { init { val notification = validate() diff --git a/review/src/main/kotlin/br/all/domain/shared/ddd/Identifier.kt b/review/src/main/kotlin/br/all/domain/shared/ddd/Identifier.kt deleted file mode 100644 index 6e5b54bbf..000000000 --- a/review/src/main/kotlin/br/all/domain/shared/ddd/Identifier.kt +++ /dev/null @@ -1,6 +0,0 @@ -package br.all.domain.shared.ddd - -interface Identifier { - fun validate() : Notification - fun value() : T -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/domain/shared/ddd/Notification.kt b/review/src/main/kotlin/br/all/domain/shared/ddd/Notification.kt deleted file mode 100644 index 298fb9ac3..000000000 --- a/review/src/main/kotlin/br/all/domain/shared/ddd/Notification.kt +++ /dev/null @@ -1,13 +0,0 @@ -package br.all.domain.shared.ddd - -class Notification { - - private val errors: MutableList = mutableListOf() - fun addError(message: String, cause: Exception? = null) = errors.add(Error(message, cause)) - fun hasNoErrors() = errors.isEmpty() - fun message() = errors.joinToString(" | ") { it.message } - data class Error(val message: String, val cause: Exception?) -} - - - diff --git a/review/src/main/kotlin/br/all/domain/shared/ddd/ValueObject.kt b/review/src/main/kotlin/br/all/domain/shared/ddd/ValueObject.kt deleted file mode 100644 index c22062ab7..000000000 --- a/review/src/main/kotlin/br/all/domain/shared/ddd/ValueObject.kt +++ /dev/null @@ -1,5 +0,0 @@ -package br.all.domain.shared.ddd - -abstract class ValueObject { - protected abstract fun validate() : Notification -} diff --git a/review/src/main/kotlin/br/all/domain/shared/utils/Phrase.kt b/review/src/main/kotlin/br/all/domain/shared/utils/Phrase.kt index 4588df4b8..dea9f462f 100644 --- a/review/src/main/kotlin/br/all/domain/shared/utils/Phrase.kt +++ b/review/src/main/kotlin/br/all/domain/shared/utils/Phrase.kt @@ -2,6 +2,7 @@ package br.all.domain.shared.utils import br.all.domain.shared.ddd.Notification import br.all.domain.shared.ddd.ValueObject +import kotlin.text.iterator data class Phrase(private val text: String) : ValueObject() { init { diff --git a/review/src/main/kotlin/br/all/infrastructure/collaboration/CollaborationDocument.kt b/review/src/main/kotlin/br/all/infrastructure/collaboration/CollaborationDocument.kt deleted file mode 100644 index 99f6ff6b7..000000000 --- a/review/src/main/kotlin/br/all/infrastructure/collaboration/CollaborationDocument.kt +++ /dev/null @@ -1,14 +0,0 @@ -package br.all.infrastructure.collaboration - -import org.springframework.data.annotation.Id -import org.springframework.data.mongodb.core.mapping.Document -import java.util.* - -@Document("collaboration") -data class CollaborationDocument( - @Id val id: UUID, - val systematicStudyId: UUID, - val userId: UUID, - val status: String, - val permissions: Set = emptySet() -) diff --git a/review/src/main/kotlin/br/all/infrastructure/collaboration/CollaborationRepositoryImpl.kt b/review/src/main/kotlin/br/all/infrastructure/collaboration/CollaborationRepositoryImpl.kt deleted file mode 100644 index 4f6152b38..000000000 --- a/review/src/main/kotlin/br/all/infrastructure/collaboration/CollaborationRepositoryImpl.kt +++ /dev/null @@ -1,54 +0,0 @@ -package br.all.infrastructure.collaboration - -import br.all.application.collaboration.repository.CollaborationDto -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.collaboration.repository.InviteDto -import org.springframework.stereotype.Repository -import java.time.LocalDateTime -import java.util.* - -@Repository -class CollaborationRepositoryImpl( - private val innerCollaborationRepository: MongoCollaborationRepository, - private val innerInviteRepository: MongoInviteRepository -) - : CollaborationRepository -{ - override fun saveOrUpdateCollaboration(dto: CollaborationDto) { - innerCollaborationRepository.save(CollaborationDocument( - dto.id, - dto.systematicStudyId, - dto.userId, - dto.status, - dto.permissions - )) - } - - override fun saveOrUpdateInvite(dto: InviteDto) { - innerInviteRepository.save(InviteDocument( - dto.id, - dto.systematicStudyId, - dto.userId, - dto.inviteDate, - dto.expirationDate - )) - } - - override fun listAllCollaborationsBySystematicStudyId(id: UUID): List { - return innerCollaborationRepository.findAll().filter { it.systematicStudyId == id }.map { - CollaborationDto(it.id, it.systematicStudyId, it.userId, it.status, it.permissions) - } - } - - override fun listAllInvitesBySystematicStudyId(id: UUID): List { - return innerInviteRepository.findAll() - .filter { it.systematicStudyId == id && it.expirationDate.isBefore(LocalDateTime.now()) } - .map { - InviteDto(it.id, it.systematicStudyId, it.userId, it.inviteDate, it.expirationDate, it.permissions) - } - } - - override fun deleteInvite(id: UUID) { - innerInviteRepository.deleteById(id) - } -} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/infrastructure/collaboration/InviteDocument.kt b/review/src/main/kotlin/br/all/infrastructure/collaboration/InviteDocument.kt deleted file mode 100644 index 3f5b2626e..000000000 --- a/review/src/main/kotlin/br/all/infrastructure/collaboration/InviteDocument.kt +++ /dev/null @@ -1,16 +0,0 @@ -package br.all.infrastructure.collaboration - -import org.springframework.data.annotation.Id -import org.springframework.data.mongodb.core.mapping.Document -import java.time.LocalDateTime -import java.util.* - -@Document("invite") -data class InviteDocument( - @Id val id: UUID, - val systematicStudyId: UUID, - val userId: UUID, - val inviteDate: LocalDateTime, - val expirationDate: LocalDateTime, - val permissions: Set = emptySet() -) diff --git a/review/src/main/kotlin/br/all/infrastructure/collaboration/MongoCollaborationRepository.kt b/review/src/main/kotlin/br/all/infrastructure/collaboration/MongoCollaborationRepository.kt deleted file mode 100644 index 043e6c494..000000000 --- a/review/src/main/kotlin/br/all/infrastructure/collaboration/MongoCollaborationRepository.kt +++ /dev/null @@ -1,6 +0,0 @@ -package br.all.infrastructure.collaboration - -import org.springframework.data.mongodb.repository.MongoRepository -import java.util.* - -interface MongoCollaborationRepository: MongoRepository \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/infrastructure/collaboration/MongoInviteRepository.kt b/review/src/main/kotlin/br/all/infrastructure/collaboration/MongoInviteRepository.kt deleted file mode 100644 index 05358d9fe..000000000 --- a/review/src/main/kotlin/br/all/infrastructure/collaboration/MongoInviteRepository.kt +++ /dev/null @@ -1,6 +0,0 @@ -package br.all.infrastructure.collaboration - -import org.springframework.data.mongodb.repository.MongoRepository -import java.util.* - -interface MongoInviteRepository: MongoRepository \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/infrastructure/study/MongoStudyReviewRepository.kt b/review/src/main/kotlin/br/all/infrastructure/study/MongoStudyReviewRepository.kt index 984f11917..c6d8893b0 100644 --- a/review/src/main/kotlin/br/all/infrastructure/study/MongoStudyReviewRepository.kt +++ b/review/src/main/kotlin/br/all/infrastructure/study/MongoStudyReviewRepository.kt @@ -1,6 +1,8 @@ package br.all.infrastructure.study import br.all.application.study.repository.AnswerDto +import org.springframework.data.domain.Page +import org.springframework.data.domain.Pageable import org.springframework.data.mongodb.repository.Aggregation import org.springframework.data.mongodb.repository.MongoRepository import org.springframework.data.mongodb.repository.Update @@ -9,7 +11,11 @@ import java.util.* interface MongoStudyReviewRepository : MongoRepository { + fun findAllById_SystematicStudyId(reviewID: UUID, pageable: Pageable): Page + fun findAllById_SystematicStudyId(reviewID: UUID): List + + fun countById_SystematicStudyId(reviewID: UUID): Long fun findAllById_SystematicStudyIdAndSearchSourcesContaining(reviewID: UUID, source: String): List diff --git a/review/src/main/kotlin/br/all/infrastructure/study/StudyReviewRepositoryImpl.kt b/review/src/main/kotlin/br/all/infrastructure/study/StudyReviewRepositoryImpl.kt index 01339ba89..838f133cf 100644 --- a/review/src/main/kotlin/br/all/infrastructure/study/StudyReviewRepositoryImpl.kt +++ b/review/src/main/kotlin/br/all/infrastructure/study/StudyReviewRepositoryImpl.kt @@ -4,6 +4,9 @@ import br.all.application.study.repository.AnswerDto import br.all.application.study.repository.StudyReviewDto import br.all.application.study.repository.StudyReviewRepository import br.all.infrastructure.shared.toNullable +import org.springframework.data.domain.Page +import org.springframework.data.domain.PageImpl +import org.springframework.data.domain.Pageable import org.springframework.stereotype.Repository import java.util.* @@ -14,8 +17,13 @@ open class StudyReviewRepositoryImpl(private val repository: MongoStudyReviewRe override fun findById(reviewId: UUID, studyId: Long) = repository.findById(StudyReviewId(reviewId, studyId)).toNullable()?.toDto() - override fun findAllFromReview(reviewId: UUID): List = - repository.findAllById_SystematicStudyId(reviewId).map { it.toDto() } + override fun findAllFromReview(reviewId: UUID, pageable: Pageable): List = + repository.findAllById_SystematicStudyId(reviewId, pageable).content.map { it.toDto() } + + override fun findAllFromReviewPaged(reviewId: UUID, pageable: Pageable): Page { + val documentsPage = repository.findAllById_SystematicStudyId(reviewId, pageable) + return documentsPage.map { it.toDto() } + } override fun findAllBySource(reviewId: UUID, source: String): List = // repository.findAllById_SystematicStudyId(reviewId).map { it.toDto() } diff --git a/review/src/test/kotlin/br/all/application/protocol/find/FindProtocolServiceImplTest.kt b/review/src/test/kotlin/br/all/application/protocol/find/FindProtocolServiceImplTest.kt index 378f78244..fcf1ddc42 100644 --- a/review/src/test/kotlin/br/all/application/protocol/find/FindProtocolServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/protocol/find/FindProtocolServiceImplTest.kt @@ -1,12 +1,11 @@ package br.all.application.protocol.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.ProtocolRepository import br.all.application.protocol.util.TestDataFactory import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import io.mockk.every @@ -30,8 +29,6 @@ class FindProtocolServiceImplTest { private lateinit var credentialsService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: FindProtocolPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository @InjectMockKs private lateinit var sut: FindProtocolServiceImpl @@ -45,10 +42,8 @@ class FindProtocolServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, factory.researcher, factory.systematicStudy, - factory.collaboration ) } diff --git a/review/src/test/kotlin/br/all/application/protocol/find/GetProtocolStageServiceImplTest.kt b/review/src/test/kotlin/br/all/application/protocol/find/FindProtocolStageServiceImplTest.kt similarity index 95% rename from review/src/test/kotlin/br/all/application/protocol/find/GetProtocolStageServiceImplTest.kt rename to review/src/test/kotlin/br/all/application/protocol/find/FindProtocolStageServiceImplTest.kt index 4235266af..d803ac572 100644 --- a/review/src/test/kotlin/br/all/application/protocol/find/GetProtocolStageServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/protocol/find/FindProtocolStageServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.protocol.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.ProtocolRepository import br.all.application.protocol.util.TestDataFactory as ProtocolFactory import br.all.application.study.util.TestDataFactory as StudyReviewFactory @@ -20,9 +19,9 @@ import org.junit.jupiter.api.Tag import org.junit.jupiter.api.extension.ExtendWith import java.util.UUID import kotlin.test.Test -import br.all.application.protocol.find.GetProtocolStageService.RequestModel -import br.all.application.protocol.find.GetProtocolStageService.ResponseModel -import br.all.application.protocol.find.GetProtocolStageService.ProtocolStage +import br.all.application.protocol.find.FindProtocolStageService.RequestModel +import br.all.application.protocol.find.FindProtocolStageService.ResponseModel +import br.all.application.protocol.find.FindProtocolStageService.ProtocolStage import br.all.application.protocol.repository.CriterionDto import br.all.application.protocol.repository.PicocDto import br.all.application.question.repository.QuestionRepository @@ -32,7 +31,7 @@ import io.mockk.verify @Tag("UnitTest") @Tag("ServiceTest") @ExtendWith(MockKExtension::class) -class GetProtocolStageServiceImplTest { +class FindProtocolStageServiceImplTest { @MockK(relaxUnitFun = true) private lateinit var protocolRepository: ProtocolRepository @@ -50,13 +49,10 @@ class GetProtocolStageServiceImplTest { private lateinit var credentialsService: CredentialsService @MockK(relaxUnitFun = true) - private lateinit var presenter: GetProtocolStagePresenter - - @MockK - private lateinit var collaborationRepository: CollaborationRepository + private lateinit var presenter: FindProtocolStagePresenter @InjectMockKs - private lateinit var sut: GetProtocolStageServiceImpl + private lateinit var sut: FindProtocolStageServiceImpl private lateinit var precondition: PreconditionCheckerMockingNew private lateinit var protocolFactory: ProtocolFactory @@ -65,7 +61,6 @@ class GetProtocolStageServiceImplTest { private lateinit var researcherId: UUID private lateinit var systematicStudyId: UUID - private lateinit var collaboration: UUID @BeforeEach fun setup() { @@ -75,16 +70,13 @@ class GetProtocolStageServiceImplTest { researcherId = protocolFactory.researcher systematicStudyId = protocolFactory.systematicStudy - collaboration = protocolFactory.collaboration precondition = PreconditionCheckerMockingNew( presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcherId, - systematicStudyId, - collaboration + systematicStudyId ) precondition.makeEverythingWork() diff --git a/review/src/test/kotlin/br/all/application/protocol/update/UpdateProtocolServiceImplTest.kt b/review/src/test/kotlin/br/all/application/protocol/update/UpdateProtocolServiceImplTest.kt index 7371ff32c..dda08ed09 100644 --- a/review/src/test/kotlin/br/all/application/protocol/update/UpdateProtocolServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/protocol/update/UpdateProtocolServiceImplTest.kt @@ -1,12 +1,11 @@ package br.all.application.protocol.update -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.ProtocolRepository import br.all.application.protocol.util.TestDataFactory import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.study.repository.StudyReviewRepository import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew @@ -36,8 +35,6 @@ class UpdateProtocolServiceImplTest { private lateinit var scoreCalculatorService: ScoreCalculatorService @MockK(relaxed = true) private lateinit var presenter: UpdateProtocolPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository @InjectMockKs private lateinit var sut: UpdateProtocolServiceImpl @@ -47,15 +44,13 @@ class UpdateProtocolServiceImplTest { @BeforeEach fun setUp() { factory = TestDataFactory() - val (researcher, systematicStudy, collaboration) = factory + val (researcher, systematicStudy) = factory preconditionCheckerMocking = PreconditionCheckerMockingNew( presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcher, systematicStudy, - collaboration ) } diff --git a/review/src/test/kotlin/br/all/application/protocol/util/TestDataFactory.kt b/review/src/test/kotlin/br/all/application/protocol/util/TestDataFactory.kt index 560d4c038..4e4ad0392 100644 --- a/review/src/test/kotlin/br/all/application/protocol/util/TestDataFactory.kt +++ b/review/src/test/kotlin/br/all/application/protocol/util/TestDataFactory.kt @@ -14,7 +14,6 @@ import br.all.application.protocol.update.UpdateProtocolService.ResponseModel as class TestDataFactory { val researcher: UUID = UUID.randomUUID() val systematicStudy: UUID = UUID.randomUUID() - val collaboration: UUID = UUID.randomUUID() private val faker = Faker() @@ -164,6 +163,4 @@ class TestDataFactory { operator fun component1() = researcher operator fun component2() = systematicStudy - - operator fun component3() = collaboration } diff --git a/review/src/test/kotlin/br/all/application/question/create/CreateQuestionServiceImplTest.kt b/review/src/test/kotlin/br/all/application/question/create/CreateQuestionServiceImplTest.kt index 93d1283e5..c4b539262 100644 --- a/review/src/test/kotlin/br/all/application/question/create/CreateQuestionServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/question/create/CreateQuestionServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.question.create -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.question.create.CreateQuestionService.QuestionType import br.all.application.question.create.CreateQuestionService.QuestionType.* import br.all.application.question.create.CreateQuestionService.ResponseModel @@ -40,9 +39,6 @@ class CreateQuestionServiceImplTest { @MockK(relaxed = true) private lateinit var presenter: CreateQuestionPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @InjectMockKs private lateinit var sut: CreateQuestionServiceImpl @@ -53,13 +49,7 @@ class CreateQuestionServiceImplTest { fun setUp() { factory = TestDataFactory() preconditionCheckerMocking = PreconditionCheckerMockingNew( - presenter, - credentialsService, - systematicRepository, - collaborationRepository, - factory.researcher, - factory.systematicStudy, - factory.collaboration + presenter, credentialsService, systematicRepository, factory.researcher, factory.systematicStudy ) } diff --git a/review/src/test/kotlin/br/all/application/question/find/FindQuestionServiceImplTest.kt b/review/src/test/kotlin/br/all/application/question/find/FindQuestionServiceImplTest.kt index e86dfcbdc..1f09a1877 100644 --- a/review/src/test/kotlin/br/all/application/question/find/FindQuestionServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/question/find/FindQuestionServiceImplTest.kt @@ -1,12 +1,11 @@ package br.all.application.question.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.question.create.CreateQuestionService.* import br.all.application.question.repository.QuestionRepository import br.all.application.question.util.TestDataFactory import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import io.mockk.every @@ -36,9 +35,6 @@ class FindQuestionServiceImplTest { @MockK(relaxed = true) private lateinit var presenter: FindQuestionPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @InjectMockKs private lateinit var sut: FindQuestionServiceImpl @@ -49,13 +45,7 @@ class FindQuestionServiceImplTest { fun setUp() { factory = TestDataFactory() preconditionCheckerMocking = PreconditionCheckerMockingNew( - presenter, - credentialsService, - systematicRepository, - collaborationRepository, - factory.researcher, - factory.systematicStudy, - factory.collaboration + presenter, credentialsService, systematicRepository, factory.researcher, factory.systematicStudy ) } diff --git a/review/src/test/kotlin/br/all/application/question/update/services/UpdateQuestionServiceImplTest.kt b/review/src/test/kotlin/br/all/application/question/update/services/UpdateQuestionServiceImplTest.kt index 67df74bec..17dd479eb 100644 --- a/review/src/test/kotlin/br/all/application/question/update/services/UpdateQuestionServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/question/update/services/UpdateQuestionServiceImplTest.kt @@ -1,13 +1,15 @@ package br.all.application.question.update.services -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.question.create.CreateQuestionService.* import br.all.application.question.create.CreateQuestionService.QuestionType.* import br.all.application.question.repository.QuestionRepository import br.all.application.question.update.presenter.UpdateQuestionPresenter import br.all.application.question.util.TestDataFactory +import br.all.application.user.credentials.ResearcherCredentialsService import br.all.application.review.repository.SystematicStudyRepository +import br.all.application.search.repository.SearchSessionRepository import br.all.application.user.CredentialsService +import br.all.application.util.PreconditionCheckerMocking import br.all.application.util.PreconditionCheckerMockingNew import br.all.domain.services.UuidGeneratorService import io.mockk.every @@ -33,12 +35,12 @@ class UpdateQuestionServiceImplTest { @MockK private lateinit var credentialsService: CredentialsService + @MockK + private lateinit var uuidGeneratorService: UuidGeneratorService + @MockK(relaxed = true) private lateinit var presenter: UpdateQuestionPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @InjectMockKs private lateinit var sut: UpdateQuestionServiceImpl @@ -52,10 +54,8 @@ class UpdateQuestionServiceImplTest { presenter, credentialsService, systematicRepository, - collaborationRepository, factory.researcher, - factory.systematicStudy, - factory.collaboration + factory.systematicStudy ) } diff --git a/review/src/test/kotlin/br/all/application/question/util/TestDataFactory.kt b/review/src/test/kotlin/br/all/application/question/util/TestDataFactory.kt index 204585c92..f1bdb5c59 100644 --- a/review/src/test/kotlin/br/all/application/question/util/TestDataFactory.kt +++ b/review/src/test/kotlin/br/all/application/question/util/TestDataFactory.kt @@ -15,7 +15,6 @@ class TestDataFactory { val question: UUID = UUID.randomUUID() val code: String = faker.lorem.words() val description: String = faker.lorem.words() - val collaboration: UUID = UUID.randomUUID() fun generateTextualDto( questionId: UUID = question, @@ -234,5 +233,4 @@ class TestDataFactory { operator fun component1() = researcher operator fun component2() = systematicStudy operator fun component3() = question - operator fun component4() = collaboration } diff --git a/review/src/test/kotlin/br/all/application/report/find/AuthorNetworkServiceImplTest.kt b/review/src/test/kotlin/br/all/application/report/find/AuthorNetworkServiceImplTest.kt index 95617ff0a..196b9cf6a 100644 --- a/review/src/test/kotlin/br/all/application/report/find/AuthorNetworkServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/report/find/AuthorNetworkServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.report.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.report.find.presenter.AuthorNetworkPresenter import br.all.application.report.find.service.AuthorNetworkService import br.all.application.report.find.service.AuthorNetworkService.Edge @@ -40,9 +39,6 @@ class AuthorNetworkServiceImplTest { @MockK lateinit var credentialsService: CredentialsService - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @InjectMockKs lateinit var sut: AuthorNetworkServiceImpl @@ -58,10 +54,8 @@ class AuthorNetworkServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcherId, - systematicStudyId, - UUID.randomUUID() + systematicStudyId ) precondition.makeEverythingWork() } @@ -169,7 +163,7 @@ class AuthorNetworkServiceImplTest { sut.findAuthors(presenter, request) verify(exactly = 1) { - presenter.prepareIfFailsPreconditions(any(), any(), any(), any()) + presenter.prepareIfFailsPreconditions(any(), any()) } assertTrue { presenter.isDone() } } @@ -189,7 +183,7 @@ class AuthorNetworkServiceImplTest { sut.findAuthors(presenter, request) verify(exactly = 1) { - presenter.prepareIfFailsPreconditions(any(), any(), any(), any()) + presenter.prepareIfFailsPreconditions(any(), any()) } assertTrue { presenter.isDone() } } diff --git a/review/src/test/kotlin/br/all/application/report/find/ExportProtocolServiceImplTest.kt b/review/src/test/kotlin/br/all/application/report/find/ExportProtocolServiceImplTest.kt index 54d83f0ec..23ea0a94a 100644 --- a/review/src/test/kotlin/br/all/application/report/find/ExportProtocolServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/report/find/ExportProtocolServiceImplTest.kt @@ -1,12 +1,11 @@ package br.all.application.report.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.ProtocolRepository import br.all.application.report.find.presenter.ExportProtocolPresenter import br.all.application.report.find.service.ExportProtocolService import br.all.application.report.find.service.ExportProtocolServiceImpl import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.protocol.util.TestDataFactory as ProtocolDtoFactory import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew @@ -38,9 +37,6 @@ class ExportProtocolServiceImplTest { @MockK private lateinit var formatterFactoryService: FormatterFactoryService - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @MockK(relaxUnitFun = true) private lateinit var presenter: ExportProtocolPresenter @@ -64,10 +60,8 @@ class ExportProtocolServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcherId, - systematicStudyId, - factory.collaboration + systematicStudyId ) precondition.makeEverythingWork() } diff --git a/review/src/test/kotlin/br/all/application/report/find/FindAnswerServiceImplTest.kt b/review/src/test/kotlin/br/all/application/report/find/FindAnswerServiceImplTest.kt index 257d5412c..51aacd7fa 100644 --- a/review/src/test/kotlin/br/all/application/report/find/FindAnswerServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/report/find/FindAnswerServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.report.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.question.repository.QuestionRepository import br.all.application.report.find.presenter.FindAnswerPresenter import br.all.application.report.find.service.FindAnswerService @@ -44,9 +43,6 @@ class FindAnswerServiceImplTest { @MockK(relaxUnitFun = true) private lateinit var presenter: FindAnswerPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @InjectMockKs private lateinit var sut: FindAnswerServiceImpl @@ -71,10 +67,8 @@ class FindAnswerServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcherId, - systematicStudyId, - UUID.randomUUID() + systematicStudyId ) precondition.makeEverythingWork() } diff --git a/review/src/test/kotlin/br/all/application/report/find/FindCriteriaServiceImplTest.kt b/review/src/test/kotlin/br/all/application/report/find/FindCriteriaServiceImplTest.kt index 4ca1a8de0..1e80d12f2 100644 --- a/review/src/test/kotlin/br/all/application/report/find/FindCriteriaServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/report/find/FindCriteriaServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.report.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.CriterionDto import br.all.application.protocol.repository.ProtocolRepository import br.all.application.report.find.presenter.FindCriteriaPresenter @@ -43,9 +42,6 @@ class FindCriteriaServiceImplTest { @MockK(relaxUnitFun = true) private lateinit var studyReviewRepository: StudyReviewRepository - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @MockK(relaxUnitFun = true) private lateinit var presenter: FindCriteriaPresenter @@ -73,10 +69,8 @@ class FindCriteriaServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcherId, - systematicStudyId, - UUID.randomUUID() + systematicStudyId ) precondition.makeEverythingWork() } diff --git a/review/src/test/kotlin/br/all/application/report/find/FindKeywordsServiceImplTest.kt b/review/src/test/kotlin/br/all/application/report/find/FindKeywordsServiceImplTest.kt index b065bf70c..9486dccad 100644 --- a/review/src/test/kotlin/br/all/application/report/find/FindKeywordsServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/report/find/FindKeywordsServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.report.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.report.find.presenter.FindKeywordsPresenter import br.all.application.report.find.service.FindKeywordsService import br.all.application.report.find.service.FindKeywordsServiceImpl @@ -39,9 +38,6 @@ class FindKeywordsServiceImplTest { @MockK(relaxUnitFun = true) private lateinit var presenter: FindKeywordsPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @InjectMockKs private lateinit var sut: FindKeywordsServiceImpl @@ -62,10 +58,8 @@ class FindKeywordsServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcherId, - systematicStudyId, - UUID.randomUUID() + systematicStudyId ) precondition.makeEverythingWork() } diff --git a/review/src/test/kotlin/br/all/application/report/find/FindSourceServiceImplTest.kt b/review/src/test/kotlin/br/all/application/report/find/FindSourceServiceImplTest.kt index e573f0d47..fba84f71a 100644 --- a/review/src/test/kotlin/br/all/application/report/find/FindSourceServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/report/find/FindSourceServiceImplTest.kt @@ -1,12 +1,11 @@ package br.all.application.report.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.ProtocolRepository import br.all.application.report.find.presenter.FindSourcePresenter import br.all.application.report.find.service.FindSourceService import br.all.application.report.find.service.FindSourceServiceImpl import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.study.repository.StudyReviewRepository import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew @@ -42,9 +41,6 @@ class FindSourceServiceImplTest { @MockK private lateinit var credentialsService: CredentialsService - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @MockK(relaxUnitFun = true) private lateinit var presenter: FindSourcePresenter @@ -70,10 +66,8 @@ class FindSourceServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcherId, - systematicStudyId, - UUID.randomUUID() + systematicStudyId ) precondition.makeEverythingWork() diff --git a/review/src/test/kotlin/br/all/application/report/find/FindStudiesByStageServiceImplTest.kt b/review/src/test/kotlin/br/all/application/report/find/FindStudiesByStageServiceImplTest.kt index 5fcece208..3399013b5 100644 --- a/review/src/test/kotlin/br/all/application/report/find/FindStudiesByStageServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/report/find/FindStudiesByStageServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.report.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.report.find.presenter.FindStudiesByStagePresenter import br.all.application.report.find.service.FindStudiesByStageService.RequestModel import br.all.application.report.find.service.FindStudiesByStageService.ResponseModel @@ -39,9 +38,6 @@ class FindStudiesByStageServiceImplTest { @MockK(relaxUnitFun = true) lateinit var studyReviewRepository: StudyReviewRepository - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @MockK lateinit var credentialsService: CredentialsService @@ -60,10 +56,8 @@ class FindStudiesByStageServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcherId, - systematicStudyId, - UUID.randomUUID() + systematicStudyId ) precondition.makeEverythingWork() } @@ -198,7 +192,7 @@ class FindStudiesByStageServiceImplTest { sut.findStudiesByStage(presenter, request) verify(exactly = 1) { - presenter.prepareIfFailsPreconditions(any(), any(), any(), any()) + presenter.prepareIfFailsPreconditions(any(), any()) } assertTrue { presenter.isDone() } } @@ -216,7 +210,7 @@ class FindStudiesByStageServiceImplTest { sut.findStudiesByStage(presenter, request) verify(exactly = 1) { - presenter.prepareIfFailsPreconditions(any(), any(), any(), any()) + presenter.prepareIfFailsPreconditions(any(), any()) } assertTrue { presenter.isDone() } } diff --git a/review/src/test/kotlin/br/all/application/report/find/IncludedStudiesAnswersServiceImplTest.kt b/review/src/test/kotlin/br/all/application/report/find/IncludedStudiesAnswersServiceImplTest.kt index e15093165..5b0c265cc 100644 --- a/review/src/test/kotlin/br/all/application/report/find/IncludedStudiesAnswersServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/report/find/IncludedStudiesAnswersServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.report.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.question.repository.QuestionDto import br.all.application.question.repository.QuestionRepository import br.all.application.report.find.presenter.IncludedStudiesAnswersPresenter @@ -12,7 +11,7 @@ import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import br.all.application.report.find.service.IncludedStudiesAnswersService.RequestModel import br.all.application.report.util.TestDataFactory -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.domain.model.question.QuestionContextEnum import io.mockk.every @@ -47,9 +46,6 @@ class IncludedStudiesAnswersServiceImplTest { @MockK lateinit var credentialsService: CredentialsService - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @InjectMockKs lateinit var sut: IncludedStudiesAnswersServiceImpl @@ -75,10 +71,8 @@ class IncludedStudiesAnswersServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcherId, - systematicStudyId, - UUID.randomUUID() + systematicStudyId ) precondition.makeEverythingWork() @@ -107,6 +101,7 @@ class IncludedStudiesAnswersServiceImplTest { when (secondArg()) { QuestionContextEnum.ROB -> listOf(question1) QuestionContextEnum.EXTRACTION -> listOf(question2) + else -> emptyList() } } @@ -151,6 +146,7 @@ class IncludedStudiesAnswersServiceImplTest { when (secondArg()) { QuestionContextEnum.ROB -> robQuestions QuestionContextEnum.EXTRACTION -> extractionQuestions + else -> emptyList() } } @@ -194,6 +190,7 @@ class IncludedStudiesAnswersServiceImplTest { when (secondArg()) { QuestionContextEnum.ROB -> robQuestions QuestionContextEnum.EXTRACTION -> extractionQuestions + else -> emptyList() } } @@ -227,6 +224,7 @@ class IncludedStudiesAnswersServiceImplTest { when (secondArg()) { QuestionContextEnum.ROB -> robQuestions QuestionContextEnum.EXTRACTION -> extractionQuestions + else -> emptyList() } } @@ -269,6 +267,7 @@ class IncludedStudiesAnswersServiceImplTest { when (secondArg()) { QuestionContextEnum.ROB -> robQuestions QuestionContextEnum.EXTRACTION -> extractionQuestions + else -> emptyList() } } @@ -281,7 +280,7 @@ class IncludedStudiesAnswersServiceImplTest { sut.findAnswers(presenter, request) verify(exactly = 1) { - presenter.prepareIfFailsPreconditions(any(), any(), any(), any()) + presenter.prepareIfFailsPreconditions(any(), any()) } assertEquals(true, presenter.isDone()) @@ -309,6 +308,7 @@ class IncludedStudiesAnswersServiceImplTest { when (secondArg()) { QuestionContextEnum.ROB -> listOf(question1) QuestionContextEnum.EXTRACTION -> listOf(question2) + else -> emptyList() } } @@ -317,7 +317,7 @@ class IncludedStudiesAnswersServiceImplTest { sut.findAnswers(presenter, request) verify(exactly = 1) { - presenter.prepareIfFailsPreconditions(any(), any(), any(), any()) + presenter.prepareIfFailsPreconditions(any(), any()) } assertEquals(true, presenter.isDone()) diff --git a/review/src/test/kotlin/br/all/application/report/find/StudiesFunnelServiceImplTest.kt b/review/src/test/kotlin/br/all/application/report/find/StudiesFunnelServiceImplTest.kt index 310899e8d..4bdc31f3a 100644 --- a/review/src/test/kotlin/br/all/application/report/find/StudiesFunnelServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/report/find/StudiesFunnelServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.report.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.report.find.presenter.StudiesFunnelPresenter import br.all.application.report.find.service.StudiesFunnelService import br.all.application.report.find.service.StudiesFunnelServiceImpl @@ -40,9 +39,6 @@ class StudiesFunnelServiceImplTest { @MockK lateinit var credentialsService: CredentialsService - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @InjectMockKs lateinit var sut: StudiesFunnelServiceImpl @@ -58,10 +54,8 @@ class StudiesFunnelServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, researcherId, - systematicStudyId, - UUID.randomUUID() + systematicStudyId ) precondition.makeEverythingWork() } @@ -197,7 +191,7 @@ class StudiesFunnelServiceImplTest { sut.studiesFunnel(presenter, request) verify(exactly = 1) { - presenter.prepareIfFailsPreconditions(any(), any(), any(), any()) + presenter.prepareIfFailsPreconditions(any(), any()) } assertTrue { presenter.isDone() } } @@ -217,7 +211,7 @@ class StudiesFunnelServiceImplTest { sut.studiesFunnel(presenter, request) verify(exactly = 1) { - presenter.prepareIfFailsPreconditions(any(), any(), any(), any()) + presenter.prepareIfFailsPreconditions(any(), any()) } assertTrue { presenter.isDone() } } diff --git a/review/src/test/kotlin/br/all/application/review/create/CreateSystematicStudyServiceImplTest.kt b/review/src/test/kotlin/br/all/application/review/create/CreateSystematicStudyServiceImplTest.kt index d37450856..7e4b6ac44 100644 --- a/review/src/test/kotlin/br/all/application/review/create/CreateSystematicStudyServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/review/create/CreateSystematicStudyServiceImplTest.kt @@ -1,11 +1,10 @@ package br.all.application.review.create -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.ProtocolRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.util.TestDataFactory -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import br.all.domain.services.UuidGeneratorService @@ -17,7 +16,6 @@ import io.mockk.verify import io.mockk.verifyOrder import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID @Tag("UnitTest") @Tag("ServiceTest") @@ -31,8 +29,6 @@ class CreateSystematicStudyServiceImplTest { private lateinit var uuidGeneratorService: UuidGeneratorService @MockK private lateinit var credentialsService: CredentialsService - @MockK - private lateinit var collaborationRepository: CollaborationRepository @MockK(relaxed = true) private lateinit var presenter: CreateSystematicStudyPresenter @InjectMockKs @@ -48,13 +44,9 @@ class CreateSystematicStudyServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, factory.researcher, - factory.systematicStudy, - UUID.randomUUID(), + factory.systematicStudy ) - - every { collaborationRepository.saveOrUpdateCollaboration(any()) } returns Unit } @Nested @@ -66,6 +58,7 @@ class CreateSystematicStudyServiceImplTest { val (_, systematicStudy) = factory val request = factory.createRequestModel() val response = factory.createResponseModel() + val dto = factory.dtoFromCreateRequest(request) val protocolDto = factory.protocolDto() preconditionCheckerMocking.makeEverythingWork() @@ -74,7 +67,8 @@ class CreateSystematicStudyServiceImplTest { sut.create(presenter, request) verify(exactly = 1) { - systematicStudyRepository.saveOrUpdate(any()) + uuidGeneratorService.next() + systematicStudyRepository.saveOrUpdate(dto) protocolRepository.saveOrUpdate(protocolDto) presenter.prepareSuccessView(response) } diff --git a/review/src/test/kotlin/br/all/application/review/find/services/FindAllSystematicStudiesServiceImplTest.kt b/review/src/test/kotlin/br/all/application/review/find/services/FindAllSystematicStudiesServiceImplTest.kt index d274582ef..ab2d61ff9 100644 --- a/review/src/test/kotlin/br/all/application/review/find/services/FindAllSystematicStudiesServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/review/find/services/FindAllSystematicStudiesServiceImplTest.kt @@ -1,11 +1,10 @@ package br.all.application.review.find.services -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.find.presenter.FindAllSystematicStudyPresenter import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.util.TestDataFactory -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import io.mockk.every @@ -16,7 +15,6 @@ import io.mockk.verify import io.mockk.verifyOrder import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID @Tag("UnitTest") @Tag("ServiceTest") @@ -28,8 +26,6 @@ class FindAllSystematicStudiesServiceImplTest { private lateinit var credentialsService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: FindAllSystematicStudyPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository @InjectMockKs private lateinit var sut: FindAllSystematicStudiesServiceImpl @@ -43,10 +39,8 @@ class FindAllSystematicStudiesServiceImplTest { presenter, credentialsService, repository, - collaborationRepository, factory.researcher, factory.systematicStudy, - UUID.randomUUID(), ) } diff --git a/review/src/test/kotlin/br/all/application/review/find/services/FindSystematicStudyServiceImplTest.kt b/review/src/test/kotlin/br/all/application/review/find/services/FindSystematicStudyServiceImplTest.kt index 9ec3ed37f..edf0046aa 100644 --- a/review/src/test/kotlin/br/all/application/review/find/services/FindSystematicStudyServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/review/find/services/FindSystematicStudyServiceImplTest.kt @@ -1,12 +1,11 @@ package br.all.application.review.find.services -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.find.presenter.FindSystematicStudyPresenter import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.util.TestDataFactory -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import io.mockk.every @@ -17,7 +16,6 @@ import io.mockk.verify import io.mockk.verifyOrder import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID @Tag("UnitTest") @Tag("ServiceTest") @@ -29,8 +27,6 @@ class FindSystematicStudyServiceImplTest { private lateinit var credentialsService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: FindSystematicStudyPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository @InjectMockKs private lateinit var sut: FindSystematicStudyServiceImpl @@ -44,10 +40,8 @@ class FindSystematicStudyServiceImplTest { presenter, credentialsService, repository, - collaborationRepository, factory.researcher, factory.systematicStudy, - UUID.randomUUID(), ) } diff --git a/review/src/test/kotlin/br/all/application/review/update/services/UpdateSystematicStudyServiceImplTest.kt b/review/src/test/kotlin/br/all/application/review/update/services/UpdateSystematicStudyServiceImplTest.kt index 2f77f6ab0..e7dbf1944 100644 --- a/review/src/test/kotlin/br/all/application/review/update/services/UpdateSystematicStudyServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/review/update/services/UpdateSystematicStudyServiceImplTest.kt @@ -1,13 +1,12 @@ package br.all.application.review.update.services -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyDto import br.all.application.review.repository.SystematicStudyRepository import br.all.application.review.update.presenter.UpdateSystematicStudyPresenter import br.all.application.review.util.TestDataFactory -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import io.mockk.every @@ -18,7 +17,6 @@ import io.mockk.verify import io.mockk.verifyOrder import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID @Tag("UnitTest") @Tag("ServiceTest") @@ -30,8 +28,6 @@ class UpdateSystematicStudyServiceImplTest { private lateinit var credentialsService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: UpdateSystematicStudyPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository @InjectMockKs private lateinit var sut: UpdateSystematicStudyServiceImpl @@ -45,10 +41,8 @@ class UpdateSystematicStudyServiceImplTest { presenter, credentialsService, repository, - collaborationRepository, factory.researcher, factory.systematicStudy, - UUID.randomUUID(), ) } diff --git a/review/src/test/kotlin/br/all/application/review/util/TestDataFactory.kt b/review/src/test/kotlin/br/all/application/review/util/TestDataFactory.kt index 61039c7cf..fd03b3921 100644 --- a/review/src/test/kotlin/br/all/application/review/util/TestDataFactory.kt +++ b/review/src/test/kotlin/br/all/application/review/util/TestDataFactory.kt @@ -6,7 +6,6 @@ import br.all.application.review.repository.SystematicStudyDto import br.all.application.review.repository.fromRequestModel import br.all.application.review.repository.toDto import br.all.application.review.update.services.UpdateSystematicStudyService.ResponseModel -import br.all.domain.model.collaboration.CollaborationId import br.all.domain.model.protocol.Protocol import br.all.domain.model.review.SystematicStudy import br.all.domain.model.review.toSystematicStudyId @@ -47,14 +46,20 @@ class TestDataFactory { fun createRequestModel( researcherId: UUID = researcher, title: String = faker.book.title(), - description: String = faker.lorem.words() - ) = CreateRequestModel(researcherId, title, description) + description: String = faker.lorem.words(), + collaborators: Set = emptySet() + ) = CreateRequestModel(researcherId, title, description, collaborators) fun createResponseModel( researcherId: UUID = researcher, systematicStudyId: UUID = systematicStudy, ) = CreateResponseModel(researcherId, systematicStudyId) + fun dtoFromCreateRequest( + request: CreateRequestModel, + systematicStudyId: UUID = systematicStudy, + ) = SystematicStudy.fromRequestModel(systematicStudyId, request).toDto() + fun findOneRequestModel( researcherId: UUID = researcher, systematicStudyId: UUID = systematicStudy, diff --git a/review/src/test/kotlin/br/all/application/search/create/CreateSearchSessionServiceImplTest.kt b/review/src/test/kotlin/br/all/application/search/create/CreateSearchSessionServiceImplTest.kt index e6b18ed3c..4b3511aab 100644 --- a/review/src/test/kotlin/br/all/application/search/create/CreateSearchSessionServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/search/create/CreateSearchSessionServiceImplTest.kt @@ -1,13 +1,12 @@ package br.all.application.search.create -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.ProtocolRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.search.util.TestDataFactory import br.all.application.search.repository.SearchSessionRepository -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.study.repository.StudyReviewRepository import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew @@ -25,7 +24,6 @@ import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Tag import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID import kotlin.test.Test @Tag("UnitTest") @@ -60,9 +58,6 @@ class CreateSearchSessionServiceImplTest { @MockK private lateinit var reviewSimilarityService: ReviewSimilarityService - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @MockK(relaxed = true) private lateinit var presenter: CreateSearchSessionPresenter @@ -82,18 +77,15 @@ class CreateSearchSessionServiceImplTest { studyReviewRepository, credentialsService, scoreCalculatorService, - reviewSimilarityService, - collaborationRepository, + reviewSimilarityService ) testDataFactory = TestDataFactory() preconditionCheckerMocking = PreconditionCheckerMockingNew( presenter, credentialsService, systematicStudyRepository, - collaborationRepository, testDataFactory.userId, testDataFactory.systematicStudyId, - UUID.randomUUID() ) } diff --git a/review/src/test/kotlin/br/all/application/search/delete/DeleteSearchSessionServiceImplTest.kt b/review/src/test/kotlin/br/all/application/search/delete/DeleteSearchSessionServiceImplTest.kt deleted file mode 100644 index 4a839031c..000000000 --- a/review/src/test/kotlin/br/all/application/search/delete/DeleteSearchSessionServiceImplTest.kt +++ /dev/null @@ -1,145 +0,0 @@ -@file:Suppress("ktlint:standard:no-wildcard-imports") - -package br.all.application.search.delete - -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.search.repository.SearchSessionRepository -import br.all.application.search.util.TestDataFactory -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException -import br.all.application.user.CredentialsService -import br.all.application.util.PreconditionCheckerMockingNew -import io.mockk.* -import io.mockk.impl.annotations.InjectMockKs -import io.mockk.impl.annotations.MockK -import io.mockk.junit5.MockKExtension -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID - -@ExtendWith(MockKExtension::class) -class DeleteSearchSessionServiceImplTest { - @MockK(relaxUnitFun = true) - private lateinit var systematicStudyRepository: SystematicStudyRepository - - @MockK(relaxUnitFun = true) - private lateinit var searchSessionRepository: SearchSessionRepository - - @MockK(relaxed = true) - private lateinit var presenter: DeleteSearchSessionPresenter - - @MockK - private lateinit var credentialService: CredentialsService - - @MockK - private lateinit var collaborationRepository: CollaborationRepository - - @InjectMockKs - private lateinit var sut: DeleteSearchSessionServiceImpl - - private lateinit var factory: TestDataFactory - private lateinit var preconditionCheckerMocking: PreconditionCheckerMockingNew - - @BeforeEach - fun setUp() { - factory = TestDataFactory() - preconditionCheckerMocking = - PreconditionCheckerMockingNew( - presenter, - credentialService, - systematicStudyRepository, - collaborationRepository, - factory.userId, - factory.systematicStudyId, - UUID.randomUUID() - ) - } - - @Nested - @DisplayName("When successfully deleting search session") - inner class WhenSuccessfullyDeletingSearchSession { - @BeforeEach - fun setUp() { - preconditionCheckerMocking.makeEverythingWork() - } - - @Test - fun `should successfully delete search session`() { - val request = factory.deleteRequestModel() - val response = factory.deleteResponseModel() - - every { searchSessionRepository.findById(factory.searchSessionId) } returns factory.generateDto() - every { searchSessionRepository.deleteById(factory.searchSessionId) } just Runs - - sut.delete(presenter, request) - - verify { - searchSessionRepository.deleteById(factory.searchSessionId) - presenter.prepareSuccessView(response) - } - } - } - - @Nested - @DisplayName("When unable to delete search session") - inner class WhenUnableToDeleteSearchSession { - @Test - fun `should fail with EntityNotFoundException when session does not exist`() { - val request = factory.deleteRequestModel() - - preconditionCheckerMocking.makeEverythingWork() - every { searchSessionRepository.findById(factory.searchSessionId) } returns null - - sut.delete(presenter, request) - - verify { - presenter.prepareFailView(any()) - presenter.isDone() - } - } - - @Test - fun `should the researcher be unauthorized if they are not a collaborator`() { - val request = factory.deleteRequestModel() - - preconditionCheckerMocking.makeUserUnauthorized() - sut.delete(presenter, request) - - verifyOrder { - presenter.prepareFailView(any()) - presenter.isDone() - } - } - - @Test - fun `should prepare fail view if the researcher is unauthenticated`() { - val request = factory.deleteRequestModel() - - preconditionCheckerMocking.makeUserUnauthenticated() - sut.delete(presenter, request) - - verifyOrder { - presenter.prepareFailView(any()) - presenter.isDone() - } - } - - @Test - fun `should prepare fail view if the researcher is unauthorized`() { - val request = factory.deleteRequestModel() - - preconditionCheckerMocking.makeUserUnauthorized() - sut.delete(presenter, request) - - verifyOrder { - presenter.prepareFailView(any()) - presenter.isDone() - } - } - } -} diff --git a/review/src/test/kotlin/br/all/application/search/find/FindAllSearchSessionsBySourceServiceImplTest.kt b/review/src/test/kotlin/br/all/application/search/find/FindAllSearchSessionsBySourceServiceImplTest.kt index 380fd7b27..ca198e87a 100644 --- a/review/src/test/kotlin/br/all/application/search/find/FindAllSearchSessionsBySourceServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/search/find/FindAllSearchSessionsBySourceServiceImplTest.kt @@ -1,14 +1,13 @@ package br.all.application.search.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.search.find.presenter.FindAllSearchSessionsBySourcePresenter import br.all.application.search.find.service.FindAllSearchSessionsBySourceService import br.all.application.search.find.service.FindAllSearchSessionsBySourceServiceImpl import br.all.application.search.repository.SearchSessionRepository import br.all.application.search.util.TestDataFactory -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import io.mockk.every @@ -21,7 +20,6 @@ import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID @Tag("UnitTest") @Tag("ServiceTest") @@ -37,9 +35,6 @@ class FindAllSearchSessionsBySourceServiceImplTest { @MockK private lateinit var credentialsService: CredentialsService - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @MockK(relaxed = true) private lateinit var presenter: FindAllSearchSessionsBySourcePresenter @@ -54,10 +49,8 @@ class FindAllSearchSessionsBySourceServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, factory.userId, factory.systematicStudyId, - UUID.randomUUID() ) } @@ -69,8 +62,7 @@ class FindAllSearchSessionsBySourceServiceImplTest { sut = FindAllSearchSessionsBySourceServiceImpl( systematicStudyRepository, searchSessionRepository, - credentialsService, - collaborationRepository, + credentialsService ) run { preconditionCheckerMocking.makeEverythingWork() } } @@ -105,8 +97,7 @@ class FindAllSearchSessionsBySourceServiceImplTest { sut = FindAllSearchSessionsBySourceServiceImpl( systematicStudyRepository, searchSessionRepository, - credentialsService, - collaborationRepository, + credentialsService ) } @Test diff --git a/review/src/test/kotlin/br/all/application/search/find/FindAllSearchSessionsServiceImplTest.kt b/review/src/test/kotlin/br/all/application/search/find/FindAllSearchSessionsServiceImplTest.kt index fb67a5bfe..be7c474b1 100644 --- a/review/src/test/kotlin/br/all/application/search/find/FindAllSearchSessionsServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/search/find/FindAllSearchSessionsServiceImplTest.kt @@ -1,13 +1,12 @@ package br.all.application.search.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.search.find.presenter.FindAllSearchSessionsPresenter import br.all.application.search.find.service.FindAllSearchSessionsServiceImpl import br.all.application.search.repository.SearchSessionRepository import br.all.application.search.util.TestDataFactory -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import io.mockk.every @@ -20,7 +19,6 @@ import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID @Tag("UnitTest") @Tag("ServiceTest") @@ -36,9 +34,6 @@ class FindAllSearchSessionsServiceImplTest { @MockK private lateinit var credentialService: CredentialsService - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @MockK(relaxed = true) private lateinit var presenter: FindAllSearchSessionsPresenter @@ -53,10 +48,8 @@ class FindAllSearchSessionsServiceImplTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.userId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) } @@ -68,8 +61,7 @@ class FindAllSearchSessionsServiceImplTest { sut = FindAllSearchSessionsServiceImpl( systematicStudyRepository, searchSessionRepository, - credentialService, - collaborationRepository, + credentialService ) run { preconditionCheckerMocking.makeEverythingWork() } } @@ -100,8 +92,7 @@ class FindAllSearchSessionsServiceImplTest { sut = FindAllSearchSessionsServiceImpl( systematicStudyRepository, searchSessionRepository, - credentialService, - collaborationRepository, + credentialService ) } @Test diff --git a/review/src/test/kotlin/br/all/application/search/find/FindSearchSessionServiceImplTest.kt b/review/src/test/kotlin/br/all/application/search/find/FindSearchSessionServiceImplTest.kt index 5ebadabb0..491dd62a6 100644 --- a/review/src/test/kotlin/br/all/application/search/find/FindSearchSessionServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/search/find/FindSearchSessionServiceImplTest.kt @@ -1,14 +1,13 @@ package br.all.application.search.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.search.find.presenter.FindSearchSessionPresenter import br.all.application.search.find.service.FindSearchSessionServiceImpl import br.all.application.search.repository.SearchSessionRepository import br.all.application.search.util.TestDataFactory -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import io.mockk.every @@ -21,7 +20,6 @@ import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID @Tag("UnitTest") @Tag("ServiceTest") @@ -36,9 +34,6 @@ class FindSearchSessionServiceImplTest { @MockK private lateinit var credentialsService: CredentialsService - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @MockK(relaxed = true) private lateinit var presenter: FindSearchSessionPresenter @@ -53,10 +48,8 @@ class FindSearchSessionServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, factory.userId, factory.systematicStudyId, - UUID.randomUUID() ) } @@ -68,8 +61,7 @@ class FindSearchSessionServiceImplTest { sut = FindSearchSessionServiceImpl( systematicStudyRepository, searchSessionRepository, - credentialsService, - collaborationRepository, + credentialsService ) run { preconditionCheckerMocking.makeEverythingWork() } } @@ -94,8 +86,7 @@ class FindSearchSessionServiceImplTest { sut = FindSearchSessionServiceImpl( systematicStudyRepository, searchSessionRepository, - credentialsService, - collaborationRepository, + credentialsService ) } diff --git a/review/src/test/kotlin/br/all/application/search/update/UpdateSearchSessionServiceImplTest.kt b/review/src/test/kotlin/br/all/application/search/update/UpdateSearchSessionServiceImplTest.kt index 81d3043cd..7b0d6ea83 100644 --- a/review/src/test/kotlin/br/all/application/search/update/UpdateSearchSessionServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/search/update/UpdateSearchSessionServiceImplTest.kt @@ -1,13 +1,12 @@ package br.all.application.search.update -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.search.repository.SearchSessionDto import br.all.application.search.repository.SearchSessionRepository import br.all.application.search.util.TestDataFactory -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew import io.mockk.* @@ -20,7 +19,6 @@ import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID @Tag("UnitTest") @Tag("ServiceTest") @@ -38,10 +36,6 @@ class UpdateSearchSessionServiceImplTest { @MockK(relaxed = true) private lateinit var presenter: UpdateSearchSessionPresenter - - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @InjectMockKs private lateinit var sut: UpdateSearchSessionServiceImpl @@ -55,10 +49,8 @@ class UpdateSearchSessionServiceImplTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.userId, factory.systematicStudyId, - UUID.randomUUID() ) } diff --git a/review/src/test/kotlin/br/all/application/search/util/TestDataFactory.kt b/review/src/test/kotlin/br/all/application/search/util/TestDataFactory.kt index 3053801d0..1bb4debdb 100644 --- a/review/src/test/kotlin/br/all/application/search/util/TestDataFactory.kt +++ b/review/src/test/kotlin/br/all/application/search/util/TestDataFactory.kt @@ -3,7 +3,6 @@ package br.all.application.search.util import br.all.application.protocol.repository.CriterionDto import br.all.application.protocol.repository.PicocDto import br.all.application.protocol.repository.ProtocolDto -import br.all.application.search.delete.DeleteSearchSessionService import br.all.application.search.find.service.FindAllSearchSessionsBySourceService import br.all.application.search.find.service.FindAllSearchSessionsService import br.all.application.search.find.service.FindSearchSessionService @@ -11,7 +10,7 @@ import br.all.application.search.repository.SearchSessionDto import br.all.application.search.update.UpdateSearchSessionService import br.all.application.search.update.UpdateSearchSessionService.RequestModel import br.all.domain.model.protocol.SearchSource -import br.all.domain.model.user.ResearcherId +import br.all.domain.shared.user.ResearcherId import br.all.domain.model.review.SystematicStudyId import br.all.domain.model.search.SearchSession import br.all.domain.model.search.SearchSessionID @@ -65,26 +64,6 @@ class TestDataFactory { invalidEntries: List = emptyList() ) = CreateResponseModel(userId, systematicStudyId, sessionId, invalidEntries) - fun deleteRequestModel( - userId: UUID = this.userId, - systematicStudyId: UUID = this.systematicStudyId, - sessionId: UUID = this.searchSessionId, - ) = DeleteSearchSessionService.RequestModel( - userId, - systematicStudyId, - sessionId, - ) - - fun deleteResponseModel( - userId: UUID = this.userId, - systematicStudyId: UUID = this.systematicStudyId, - sessionId: UUID = this.searchSessionId, - ) = DeleteSearchSessionService.ResponseModel( - userId, - systematicStudyId, - sessionId, - ) - fun findOneRequestModel( userId: UUID = this.userId, systematicStudyId: UUID = this.systematicStudyId, diff --git a/review/src/test/kotlin/br/all/application/shared/presenter/PreconditionCheckerTest.kt b/review/src/test/kotlin/br/all/application/shared/presenter/PreconditionCheckerTest.kt index c69609d0a..3ec130153 100644 --- a/review/src/test/kotlin/br/all/application/shared/presenter/PreconditionCheckerTest.kt +++ b/review/src/test/kotlin/br/all/application/shared/presenter/PreconditionCheckerTest.kt @@ -2,11 +2,12 @@ package br.all.application.shared.presenter import br.all.application.user.credentials.ResearcherCredentialsService import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException -import br.all.domain.model.user.ResearcherId +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException +import br.all.domain.shared.user.ResearcherId import br.all.domain.model.review.SystematicStudyId +import br.all.domain.shared.presenter.GenericPresenter import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/review/src/test/kotlin/br/all/application/study/create/CreateStudyReviewServiceImplTest.kt b/review/src/test/kotlin/br/all/application/study/create/CreateStudyReviewServiceImplTest.kt index 8690f0787..c4d2934f3 100644 --- a/review/src/test/kotlin/br/all/application/study/create/CreateStudyReviewServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/study/create/CreateStudyReviewServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.study.create -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.util.TestDataFactory @@ -12,8 +11,6 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID - @Tag("UnitTest") @Tag("ServiceTest") @ExtendWith(MockKExtension::class) @@ -27,8 +24,6 @@ class CreateStudyReviewServiceImplTest { private lateinit var idGenerator: IdGeneratorService @MockK private lateinit var credentialService: CredentialsService - @MockK - private lateinit var collaborationRepository: CollaborationRepository @MockK(relaxUnitFun = true) private lateinit var presenter: CreateStudyReviewPresenter @@ -44,17 +39,14 @@ class CreateStudyReviewServiceImplTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) sut = CreateStudyReviewServiceImpl( systematicStudyRepository, studyReviewRepository, credentialService, - idGenerator, - collaborationRepository, + idGenerator ) } diff --git a/review/src/test/kotlin/br/all/application/study/find/FindAllStudyReviewsBySourceServiceImplTest.kt b/review/src/test/kotlin/br/all/application/study/find/FindAllStudyReviewsBySourceServiceImplTest.kt index 11a78a184..5bb7dda53 100644 --- a/review/src/test/kotlin/br/all/application/study/find/FindAllStudyReviewsBySourceServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/study/find/FindAllStudyReviewsBySourceServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.study.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.study.find.presenter.FindAllStudyReviewsBySourcePresenter import br.all.application.study.find.service.FindAllStudyReviewsBySourceServiceImpl @@ -13,7 +12,6 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID @Tag("UnitTest") @Tag("ServiceTest") @@ -28,8 +26,6 @@ class FindAllStudyReviewsBySourceServiceImplTest { private lateinit var credentialService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: FindAllStudyReviewsBySourcePresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository private lateinit var sut: FindAllStudyReviewsBySourceServiceImpl @@ -43,16 +39,13 @@ class FindAllStudyReviewsBySourceServiceImplTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) sut = FindAllStudyReviewsBySourceServiceImpl( systematicStudyRepository, studyReviewRepository, credentialService, - collaborationRepository, ) } diff --git a/review/src/test/kotlin/br/all/application/study/find/FindAllStudyReviewsServiceImplTest.kt b/review/src/test/kotlin/br/all/application/study/find/FindAllStudyReviewsServiceImplTest.kt index 97d8eda9c..45124d901 100644 --- a/review/src/test/kotlin/br/all/application/study/find/FindAllStudyReviewsServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/study/find/FindAllStudyReviewsServiceImplTest.kt @@ -1,9 +1,9 @@ package br.all.application.study.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.study.find.presenter.FindAllStudyReviewsPresenter import br.all.application.study.find.service.FindAllStudyReviewsServiceImpl +import br.all.application.study.repository.StudyReviewDto import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.util.TestDataFactory import br.all.application.user.CredentialsService @@ -13,7 +13,9 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID +import org.springframework.data.domain.Page +import org.springframework.data.domain.PageImpl +import org.springframework.data.domain.Pageable @Tag("UnitTest") @Tag("ServiceTest") @@ -28,8 +30,6 @@ class FindAllStudyReviewsServiceImplTest { private lateinit var credentialService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: FindAllStudyReviewsPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository private lateinit var sut: FindAllStudyReviewsServiceImpl @@ -43,16 +43,13 @@ class FindAllStudyReviewsServiceImplTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) sut = FindAllStudyReviewsServiceImpl( systematicStudyRepository, studyReviewRepository, credentialService, - collaborationRepository, ) } @@ -69,7 +66,7 @@ class FindAllStudyReviewsServiceImplTest { preconditionCheckerMocking.makeEverythingWork() - every { studyReviewRepository.findAllFromReview(request.systematicStudyId) } returns response.studyReviews + every { studyReviewRepository.findAllFromReviewPaged(request.systematicStudyId, any()) } returns PageImpl(response.studyReviews) sut.findAllFromReview(presenter, request) @@ -85,7 +82,7 @@ class FindAllStudyReviewsServiceImplTest { preconditionCheckerMocking.makeEverythingWork() - every { studyReviewRepository.findAllFromReview(request.systematicStudyId) } returns response.studyReviews + every { studyReviewRepository.findAllFromReviewPaged(request.systematicStudyId, any()) } returns PageImpl(response.studyReviews) sut.findAllFromReview(presenter, request) @@ -102,7 +99,7 @@ class FindAllStudyReviewsServiceImplTest { val request = factory.findAllRequestModel() preconditionCheckerMocking.makeEverythingWork() - every {studyReviewRepository.findAllFromReview(factory.systematicStudyId)} returns emptyList() + every {studyReviewRepository.findAllFromReviewPaged(factory.systematicStudyId, any())} returns PageImpl(emptyList()) sut.findAllFromReview(presenter, request) diff --git a/review/src/test/kotlin/br/all/application/study/find/FindStudyReviewServiceImplTest.kt b/review/src/test/kotlin/br/all/application/study/find/FindStudyReviewServiceImplTest.kt index 25fa3b44d..092eeaf82 100644 --- a/review/src/test/kotlin/br/all/application/study/find/FindStudyReviewServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/study/find/FindStudyReviewServiceImplTest.kt @@ -1,6 +1,5 @@ package br.all.application.study.find -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.study.find.presenter.FindStudyReviewPresenter import br.all.application.study.find.service.FindStudyReviewServiceImpl @@ -13,8 +12,6 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID - @Tag("UnitTest") @Tag("ServiceTest") @ExtendWith(MockKExtension::class) @@ -24,8 +21,6 @@ class FindStudyReviewServiceImplTest { @MockK private lateinit var systematicStudyRepository: SystematicStudyRepository @MockK private lateinit var credentialService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: FindStudyReviewPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository private lateinit var sut: FindStudyReviewServiceImpl @@ -39,16 +34,13 @@ class FindStudyReviewServiceImplTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) sut = FindStudyReviewServiceImpl( systematicStudyRepository, studyReviewRepository, credentialService, - collaborationRepository, ) } diff --git a/review/src/test/kotlin/br/all/application/study/update/AnswerQuestionImplTest.kt b/review/src/test/kotlin/br/all/application/study/update/AnswerQuestionImplTest.kt deleted file mode 100644 index cda44c8df..000000000 --- a/review/src/test/kotlin/br/all/application/study/update/AnswerQuestionImplTest.kt +++ /dev/null @@ -1,340 +0,0 @@ -package br.all.application.study.update - -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.question.repository.QuestionRepository -import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.study.repository.StudyReviewRepository -import br.all.application.study.update.implementation.AnswerQuestionImpl -import br.all.application.study.update.interfaces.AnswerQuestionPresenter -import br.all.application.study.update.interfaces.AnswerQuestionService -import br.all.application.study.util.TestDataFactory -import br.all.application.user.CredentialsService -import br.all.application.util.PreconditionCheckerMockingNew -import io.mockk.* -import io.mockk.impl.annotations.MockK -import io.mockk.junit5.MockKExtension -import org.junit.jupiter.api.* -import org.junit.jupiter.api.extension.ExtendWith -import java.util.* - -@Tag("UnitTest") -@Tag("ServiceTest") -@ExtendWith(MockKExtension::class) -class AnswerQuestionImplTest { - - @MockK(relaxed = true) private lateinit var studyReviewRepository: StudyReviewRepository - @MockK private lateinit var systematicStudyRepository: SystematicStudyRepository - @MockK private lateinit var questionRepository: QuestionRepository - @MockK private lateinit var credentialService: CredentialsService - @MockK(relaxed = true) private lateinit var presenter: AnswerQuestionPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository - - private lateinit var sut: AnswerQuestionService - - private lateinit var factory: TestDataFactory - private lateinit var preconditionCheckerMocking: PreconditionCheckerMockingNew - - private lateinit var questionId: UUID - - @BeforeEach - fun setUp() { - factory = TestDataFactory() - preconditionCheckerMocking = PreconditionCheckerMockingNew( - presenter, - credentialService, - systematicStudyRepository, - collaborationRepository, - factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() - ) - sut = AnswerQuestionImpl( - studyReviewRepository, - questionRepository, - systematicStudyRepository, - credentialService, - collaborationRepository, - ) - questionId = UUID.randomUUID() - } - - @Nested - @Tag("ValidClasses") - @DisplayName("When successfully answering a question") - inner class WhenSuccessfullyAnsweringAQuestion { - @Test - fun `should successfully answer a textual question`() { - val dto = factory.generateDto() - val questionDto = factory.generateQuestionTextualDto(questionId, factory.systematicStudyId, questionContext = "ROB") - val request = factory.answerQuestionModel(questionId, "TEXTUAL", "Answer Test") - val context = "ROB" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns questionDto - - sut.answerQuestion(presenter, request, context) - - verify(exactly = 1) { - studyReviewRepository.saveOrUpdate(any()) - presenter.prepareSuccessView(any()) - } - } - - @Test - fun `should successfully answer a labeled scale question`() { - val dto = factory.generateDto() - val answer = factory.questionLabelDto("Test Name", 1) - val questionDto = factory.generateQuestionLabeledScaleDto(questionId, labelDto = answer, questionContext = "ROB") - val request = factory.answerQuestionModel(questionId, "LABELED_SCALE", answer) - val context = "ROB" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns questionDto - - sut.answerQuestion(presenter, request, context) - - verify(exactly = 1) { - studyReviewRepository.saveOrUpdate(any()) - presenter.prepareSuccessView(any()) - } - } - - @Test - fun `should successfully answer a numbered scale question`() { - val dto = factory.generateDto() - val answer = 9 - val questionDto = factory.generateQuestionNumberedScaleDto( - questionId, factory.systematicStudyId, higher = 10, lower = 1, questionContext = "EXTRACTION" - ) - val request = factory.answerQuestionModel(questionId, "NUMBERED_SCALE", answer) - val context = "EXTRACTION" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns questionDto - - sut.answerQuestion(presenter, request, context) - - verify(exactly = 1) { - studyReviewRepository.saveOrUpdate(any()) - presenter.prepareSuccessView(any()) - } - } - - @Test - fun `should successfully answer a pick one question`() { - val dto = factory.generateDto() - val questionDto = factory.generateQuestionPickListDto(questionId, factory.systematicStudyId, options = listOf("op1", "op2", "op3"), questionContext = "EXTRACTION") - val answer = "op1" - val request = factory.answerQuestionModel(questionId, "PICK_LIST", answer) - val context = "EXTRACTION" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns questionDto - - sut.answerQuestion(presenter, request, context) - - verify(exactly = 1) { - studyReviewRepository.saveOrUpdate(any()) - } - } - - @Test - fun `should handle labeled scale answer as LinkedHashMap`() { - val dto = factory.generateDto() - val labelDto = factory.questionLabelDto("Test Name", 1) - val questionDto = factory.generateQuestionLabeledScaleDto( - questionId, - factory.systematicStudyId, - questionContext = "ROB", - labelDto = labelDto, - ) - val request = factory.answerQuestionModel( - questionId, - "LABELED_SCALE", - mapOf("name" to "Test Name", "value" to 1) - ) - val context = "ROB" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns questionDto - - sut.answerQuestion(presenter, request, context) - - verify(exactly = 1) { - studyReviewRepository.saveOrUpdate(any()) - presenter.prepareSuccessView(any()) - } - } - } - - @Nested - @Tag("InvalidClasses") - @DisplayName("When failing to answer a question") - inner class WhenFailingToAnswerAQuestion { - @Test - fun `should not work if study doesn't exist`() { - val request = factory.answerQuestionModel(questionId, "TEXTUAL", "Answer") - val context = "ROB" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns null - sut.answerQuestion(presenter, request, context) - - verify { - presenter.prepareFailView(any()) - } - } - - @Test - fun `should not work if question doesn't exist`() { - val dto = factory.generateDto() - val request = factory.answerQuestionModel(questionId, "TEXTUAL", "Testing") - val context = "ROB" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns null - - sut.answerQuestion(presenter, request, context) - - verify { - presenter.prepareFailView(any()) - } - } - - @Test - fun `should not answer when unauthorized`() { - val request = factory.answerQuestionModel(questionId, "TEXTUAL", "failure test") - val context = "ROB" - - preconditionCheckerMocking.testForUnauthenticatedUser(presenter, request) { _, _ -> - sut.answerQuestion(presenter, request, context) - } - } - - @Test - fun `should not answer when unauthenticated`() { - val request = factory.answerQuestionModel(questionId, "TEXTUAL", "nono") - val context = "ROB" - - preconditionCheckerMocking.testForUnauthenticatedUser(presenter, request) { _, _ -> - sut.answerQuestion(presenter, request, context) - } - } - - @Test - fun `should not answer when systematic study does not exist`() { - val request = factory.answerQuestionModel(questionId, "TEXTUAL", "not real") - val context = "ROB" - - preconditionCheckerMocking.testForNonexistentSystematicStudy(presenter, request) { _, _ -> - sut.answerQuestion(presenter, request, context) - } - } - - @Test - fun `should not answer question of diferent context`() { - val dto = factory.generateDto() - val questionDto = factory.generateQuestionTextualDto(questionId, factory.systematicStudyId, questionContext = "ROB") - val request = factory.answerQuestionModel(questionId, "TEXTUAL", "Answer Test") - val context = "EXTRACTION" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns questionDto - - sut.answerQuestion(presenter, request, context) - - verify { - presenter.prepareFailView(any()) - } - } - - @Test - fun `should not answer question with null context`() { - val dto = factory.generateDto() - val questionDto = factory.generateQuestionTextualDto(questionId, factory.systematicStudyId, questionContext = "ROB") - val request = factory.answerQuestionModel(questionId, "TEXTUAL", "Answer Test") - val context = null - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns questionDto - - sut.answerQuestion(presenter, request, context) - - verify { - presenter.prepareFailView(any()) - } - } - - @Test - fun `should not answer question with conflicting types`() { - val dto = factory.generateDto() - val questionDto = factory.generateQuestionTextualDto(questionId, factory.systematicStudyId, questionContext = "ROB") - val request = factory.answerQuestionModel(questionId, "PICK_LIST", "Answer Test") - val context = "ROB" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns questionDto - - assertThrows { - sut.answerQuestion(presenter, request, context) - } - } - - @Test - fun `should not answer labeled scale if answer is of unsupported type`() { - val dto = factory.generateDto() - val labelDto = factory.questionLabelDto("Test Name", 1) - val questionDto = factory.generateQuestionLabeledScaleDto(questionId, labelDto = labelDto, questionContext = "ROB") - val answer = "wrong answer" - val request = factory.answerQuestionModel(questionId, "LABELED_SCALE", answer) - val context = "ROB" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns questionDto - - assertThrows { - sut.answerQuestion(presenter, request, context) - } - } - - @Test - fun `should not answer question if answer if of unsupported type`() { - val dto = factory.generateDto() - val questionDto = - factory.generateQuestionTextualDto(questionId, factory.systematicStudyId, questionContext = "ROB") - val request = factory.answerQuestionModel(questionId, "TEXTUAL", 1) - val context = "ROB" - - preconditionCheckerMocking.makeEverythingWork() - - every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns dto - every { questionRepository.findById(request.systematicStudyId, questionId) } returns questionDto - assertThrows { - sut.answerQuestion(presenter, request, context) - } - } - } -} diff --git a/review/src/test/kotlin/br/all/application/study/update/BatchAnswerQuestionServiceImplTest.kt b/review/src/test/kotlin/br/all/application/study/update/BatchAnswerQuestionServiceImplTest.kt index 724c42018..c32915128 100644 --- a/review/src/test/kotlin/br/all/application/study/update/BatchAnswerQuestionServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/study/update/BatchAnswerQuestionServiceImplTest.kt @@ -1,12 +1,11 @@ package br.all.application.study.update -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.question.repository.QuestionRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.update.implementation.BatchAnswerQuestionServiceImpl -import br.all.application.study.update.interfaces.AnswerQuestionService import br.all.application.study.update.interfaces.BatchAnswerQuestionPresenter +import br.all.application.study.update.interfaces.BatchAnswerQuestionService import br.all.application.study.util.TestDataFactory import br.all.application.user.CredentialsService import br.all.application.util.PreconditionCheckerMockingNew @@ -18,9 +17,9 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Tag +import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import java.util.UUID -import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -41,16 +40,12 @@ class BatchAnswerQuestionServiceImplTest { @MockK private lateinit var credentialsService: CredentialsService - @MockK - private lateinit var collaborationRepository: CollaborationRepository - @MockK(relaxed = true) private lateinit var presenter: BatchAnswerQuestionPresenter private lateinit var sut: BatchAnswerQuestionServiceImpl private lateinit var factory: TestDataFactory private lateinit var preconditionCheckerMocking: PreconditionCheckerMockingNew - private lateinit var questionId: UUID @BeforeEach fun setUp() { @@ -59,19 +54,15 @@ class BatchAnswerQuestionServiceImplTest { presenter, credentialsService, systematicStudyRepository, - collaborationRepository, factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) sut = BatchAnswerQuestionServiceImpl( studyReviewRepository, questionRepository, systematicStudyRepository, - credentialsService, - collaborationRepository, + credentialsService ) - questionId = UUID.randomUUID() } @Nested @@ -81,18 +72,17 @@ class BatchAnswerQuestionServiceImplTest { @Test fun `should successfully answer multiple questions of different types`() { val reviewDto = factory.generateDto() - val context = "EXTRACTION" val textualQId = UUID.randomUUID() - val textualQDto = factory.generateQuestionTextualDto(textualQId, factory.systematicStudyId, questionContext = context) + val textualQDto = factory.generateQuestionTextualDto(textualQId, factory.systematicStudyId, questionContext = "EXTRACTION") val textualAnswer = factory.answerDetail(questionId = textualQId, type = "TEXTUAL", answer = "Valid textual answer") val numberedQId = UUID.randomUUID() - val numberedQDto = factory.generateQuestionNumberedScaleDto(numberedQId, factory.systematicStudyId, questionContext = context, higher = 5, lower = 1) + val numberedQDto = factory.generateQuestionNumberedScaleDto(numberedQId, factory.systematicStudyId, higher = 5, lower = 1, questionContext = "EXTRACTION") val numberedAnswer = factory.answerDetail(questionId = numberedQId, type = "NUMBERED_SCALE", answer = 5) val pickListQId = UUID.randomUUID() - val pickListQDto = factory.generateQuestionPickListDto(pickListQId, factory.systematicStudyId, options = listOf("A", "B"), questionContext = context) + val pickListQDto = factory.generateQuestionPickListDto(pickListQId, factory.systematicStudyId, options = listOf("A", "B"), questionContext = "EXTRACTION") val pickListAnswer = factory.answerDetail(questionId = pickListQId, type = "PICK_LIST", answer = "A") val request = factory.batchAnswerRequest(listOf(textualAnswer, numberedAnswer, pickListAnswer)) @@ -104,7 +94,7 @@ class BatchAnswerQuestionServiceImplTest { every { questionRepository.findById(request.systematicStudyId, numberedQId) } returns numberedQDto every { questionRepository.findById(request.systematicStudyId, pickListQId) } returns pickListQDto - sut.batchAnswerQuestion(presenter, request, context) + sut.batchAnswerQuestion(presenter, request) verify(exactly = 1) { studyReviewRepository.saveOrUpdate(any()) } verify(exactly = 1) { @@ -120,39 +110,67 @@ class BatchAnswerQuestionServiceImplTest { @Test fun `should handle a mix of successful and failed answers`() { val reviewDto = factory.generateDto() - val context = "ROB" val successQId = UUID.randomUUID() - val successQDto = factory.generateQuestionTextualDto(successQId, factory.systematicStudyId, questionContext = context) + val successQDto = factory.generateQuestionTextualDto(successQId, factory.systematicStudyId, questionContext = "ROB") val successAnswer = factory.answerDetail(questionId = successQId, type = "TEXTUAL", answer = "This will work") val notFoundQId = UUID.randomUUID() val notFoundAnswer = factory.answerDetail(questionId = notFoundQId, type = "TEXTUAL", answer = "This will fail") - val wrongContextQId = UUID.randomUUID() - val wrongContextQDto = factory.generateQuestionTextualDto(wrongContextQId, factory.systematicStudyId, questionContext = "EXTRACTION") - val wrongContextAnswer = factory.answerDetail(questionId = wrongContextQId, type = "TEXTUAL", answer = "Wrong context") - - val request = factory.batchAnswerRequest(listOf(successAnswer, notFoundAnswer, wrongContextAnswer)) + val request = factory.batchAnswerRequest(listOf(successAnswer, notFoundAnswer)) preconditionCheckerMocking.makeEverythingWork() every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns reviewDto every { questionRepository.findById(request.systematicStudyId, successQId) } returns successQDto every { questionRepository.findById(request.systematicStudyId, notFoundQId) } returns null - every { questionRepository.findById(request.systematicStudyId, wrongContextQId) } returns wrongContextQDto - sut.batchAnswerQuestion(presenter, request, context) + sut.batchAnswerQuestion(presenter, request) verify(exactly = 1) { studyReviewRepository.saveOrUpdate(any()) } verify(exactly = 1) { presenter.prepareSuccessView(withArg { response -> assertEquals(1, response.succeededAnswers.size) - assertEquals(2, response.failedAnswers.size) + assertEquals(1, response.failedAnswers.size) assertEquals(1, response.totalAnswered) assertTrue(response.succeededAnswers.contains(successQId)) assertTrue(response.failedAnswers.any { it.questionId == notFoundQId }) - assertTrue(response.failedAnswers.any { it.questionId == wrongContextQId }) + }) + } + } + + @Test + fun `should successfully answer a mix of ROB and EXTRACTION questions`() { + val reviewDto = factory.generateDto() + + val robQId = UUID.randomUUID() + val robQDto = factory.generateQuestionTextualDto(robQId, factory.systematicStudyId, questionContext = "ROB") + val robAnswer = factory.answerDetail(questionId = robQId, type = "TEXTUAL", answer = "Valid ROB answer") + + val extractionQId = UUID.randomUUID() + val extractionQDto = factory.generateQuestionPickListDto(extractionQId, factory.systematicStudyId, options = listOf("X", "Y"), questionContext = "EXTRACTION") + val extractionAnswer = factory.answerDetail(questionId = extractionQId, type = "PICK_LIST", answer = "X") + + val request = factory.batchAnswerRequest(listOf(robAnswer, extractionAnswer)) + + preconditionCheckerMocking.makeEverythingWork() + every { studyReviewRepository.findById(request.systematicStudyId, request.studyReviewId) } returns reviewDto + every { questionRepository.findById(request.systematicStudyId, robQId) } returns robQDto + every { questionRepository.findById(request.systematicStudyId, extractionQId) } returns extractionQDto + + sut.batchAnswerQuestion(presenter, request) + + verify(exactly = 1) { studyReviewRepository.saveOrUpdate(any()) } + verify(exactly = 1) { + presenter.prepareSuccessView(withArg { response -> + assertEquals(2, response.succeededAnswers.size, "Should have 2 successful answers") + assertTrue(response.failedAnswers.isEmpty(), "Should have no failed answers") + assertEquals(2, response.totalAnswered, "Total answered should be 2") + assertTrue( + response.succeededAnswers.containsAll(listOf(robQId, extractionQId)), + "Response should contain both ROB and EXTRACTION question IDs" + ) }) } } @@ -164,10 +182,8 @@ class BatchAnswerQuestionServiceImplTest { @Test fun `should create a failed answer entry for a question with conflicting types`() { val reviewDto = factory.generateDto() - val context = "ROB" val questionId = UUID.randomUUID() - val questionDto = factory.generateQuestionTextualDto(questionId, factory.systematicStudyId, questionContext = context) - + val questionDto = factory.generateQuestionTextualDto(questionId, factory.systematicStudyId, questionContext = "ROB") val answerDetail = factory.answerDetail(questionId, "PICK_LIST", "Some answer") val request = factory.batchAnswerRequest(listOf(answerDetail)) @@ -175,7 +191,7 @@ class BatchAnswerQuestionServiceImplTest { every { studyReviewRepository.findById(any(), any()) } returns reviewDto every { questionRepository.findById(any(), questionId) } returns questionDto - sut.batchAnswerQuestion(presenter, request, context) + sut.batchAnswerQuestion(presenter, request) verify(exactly = 1) { presenter.prepareSuccessView(withArg { response -> @@ -190,19 +206,17 @@ class BatchAnswerQuestionServiceImplTest { @Test fun `should create a failed answer entry when answer value type is incompatible`() { val reviewDto = factory.generateDto() - val context = "EXTRACTION" val questionId = UUID.randomUUID() - val questionDto = factory.generateQuestionTextualDto(questionId, factory.systematicStudyId, questionContext = context) + val questionDto = factory.generateQuestionTextualDto(questionId, factory.systematicStudyId, questionContext = "ROB") val answerDetail = factory.answerDetail(questionId, "TEXTUAL", 12345) val request = factory.batchAnswerRequest(listOf(answerDetail)) preconditionCheckerMocking.makeEverythingWork() - every { studyReviewRepository.findById(any(), any()) } returns reviewDto every { questionRepository.findById(any(), questionId) } returns questionDto - sut.batchAnswerQuestion(presenter, request, context) + sut.batchAnswerQuestion(presenter, request) // Updated call verify(exactly = 1) { presenter.prepareSuccessView(withArg { response -> @@ -217,13 +231,9 @@ class BatchAnswerQuestionServiceImplTest { @Test fun `should create a failed answer entry for unsupported labeled scale answer type`() { val reviewDto = factory.generateDto() - val context = "ROB" val questionId = UUID.randomUUID() - val labelDto = AnswerQuestionService.LabelDto( - "LabelTest", - 1 - ) - val questionDto = factory.generateQuestionLabeledScaleDto(questionId, factory.systematicStudyId, questionContext = context, labelDto = labelDto) + val labelDto = BatchAnswerQuestionService.LabelDto("LabelTest", 1) + val questionDto = factory.generateQuestionLabeledScaleDto(questionId, factory.systematicStudyId, labelDto = labelDto, questionContext = "ROB") val answerDetail = factory.answerDetail(questionId, "LABELED_SCALE", "invalid answer format") val request = factory.batchAnswerRequest(listOf(answerDetail)) @@ -232,7 +242,7 @@ class BatchAnswerQuestionServiceImplTest { every { studyReviewRepository.findById(any(), any()) } returns reviewDto every { questionRepository.findById(any(), questionId) } returns questionDto - sut.batchAnswerQuestion(presenter, request, context) + sut.batchAnswerQuestion(presenter, request) // Updated call verify(exactly = 1) { presenter.prepareSuccessView(withArg { response -> diff --git a/review/src/test/kotlin/br/all/application/study/update/MarkAsDuplicatedServiceImplTest.kt b/review/src/test/kotlin/br/all/application/study/update/MarkAsDuplicatedServiceImplTest.kt index 76a21c603..9b29c5a69 100644 --- a/review/src/test/kotlin/br/all/application/study/update/MarkAsDuplicatedServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/study/update/MarkAsDuplicatedServiceImplTest.kt @@ -1,8 +1,7 @@ package br.all.application.study.update -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.update.implementation.MarkAsDuplicatedServiceImpl import br.all.application.study.update.interfaces.MarkAsDuplicatedPresenter @@ -14,7 +13,6 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.* @Tag("UnitTest") @Tag("ServiceTest") @@ -25,8 +23,6 @@ class MarkAsDuplicatedServiceImplTest { @MockK(relaxUnitFun = true) private lateinit var systematicStudyRepository: SystematicStudyRepository @MockK private lateinit var credentialService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: MarkAsDuplicatedPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository private lateinit var sut: MarkAsDuplicatedServiceImpl @@ -40,16 +36,13 @@ class MarkAsDuplicatedServiceImplTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) sut = MarkAsDuplicatedServiceImpl( systematicStudyRepository, studyReviewRepository, credentialService, - collaborationRepository ) } diff --git a/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewExtractionServiceTest.kt b/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewExtractionServiceTest.kt index 2585cfd5a..87ccc5c04 100644 --- a/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewExtractionServiceTest.kt +++ b/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewExtractionServiceTest.kt @@ -1,8 +1,7 @@ package br.all.application.study.update -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.update.implementation.UpdateStudyReviewExtractionService import br.all.application.study.update.interfaces.UpdateStudyReviewStatusPresenter @@ -14,7 +13,6 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID import kotlin.test.assertFailsWith @Tag("UnitTest") @@ -26,8 +24,6 @@ class UpdateStudyReviewExtractionServiceTest { @MockK(relaxUnitFun = true) private lateinit var systematicStudyRepository: SystematicStudyRepository @MockK private lateinit var credentialService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: UpdateStudyReviewStatusPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository private lateinit var sut: UpdateStudyReviewExtractionService @@ -41,16 +37,13 @@ class UpdateStudyReviewExtractionServiceTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) sut = UpdateStudyReviewExtractionService( systematicStudyRepository, studyReviewRepository, credentialService, - collaborationRepository ) } diff --git a/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewPriorityServiceTest.kt b/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewPriorityServiceTest.kt index b8e76cb77..d9c3a467d 100644 --- a/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewPriorityServiceTest.kt +++ b/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewPriorityServiceTest.kt @@ -1,8 +1,7 @@ package br.all.application.study.update -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.update.implementation.UpdateStudyReviewPriorityService import br.all.application.study.update.interfaces.UpdateStudyReviewStatusPresenter @@ -14,8 +13,6 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID - @Tag("UnitTest") @Tag("ServiceTest") @ExtendWith(MockKExtension::class) @@ -25,8 +22,6 @@ class UpdateStudyReviewPriorityServiceTest { @MockK(relaxUnitFun = true) private lateinit var systematicStudyRepository: SystematicStudyRepository @MockK private lateinit var credentialService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: UpdateStudyReviewStatusPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository private lateinit var sut: UpdateStudyReviewPriorityService @@ -40,16 +35,13 @@ class UpdateStudyReviewPriorityServiceTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) sut = UpdateStudyReviewPriorityService( systematicStudyRepository, studyReviewRepository, credentialService, - collaborationRepository ) } diff --git a/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewSelectionStatusServiceTest.kt b/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewSelectionStatusServiceTest.kt index b075c2fcf..092d4b3df 100644 --- a/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewSelectionStatusServiceTest.kt +++ b/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewSelectionStatusServiceTest.kt @@ -1,8 +1,7 @@ package br.all.application.study.update -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.update.implementation.UpdateStudyReviewSelectionService import br.all.application.study.update.interfaces.UpdateStudyReviewStatusPresenter @@ -14,7 +13,6 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID import kotlin.test.assertFailsWith @Tag("UnitTest") @@ -26,8 +24,6 @@ class UpdateStudyReviewSelectionStatusServiceTest { @MockK(relaxUnitFun = true) private lateinit var systematicStudyRepository: SystematicStudyRepository @MockK private lateinit var credentialService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: UpdateStudyReviewStatusPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository private lateinit var sut: UpdateStudyReviewSelectionService @@ -41,16 +37,13 @@ class UpdateStudyReviewSelectionStatusServiceTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) sut = UpdateStudyReviewSelectionService( systematicStudyRepository, studyReviewRepository, credentialService, - collaborationRepository ) } diff --git a/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewServiceImplTest.kt b/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewServiceImplTest.kt index cfb5b1588..90658b4c4 100644 --- a/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewServiceImplTest.kt +++ b/review/src/test/kotlin/br/all/application/study/update/UpdateStudyReviewServiceImplTest.kt @@ -1,8 +1,7 @@ package br.all.application.study.update -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException +import br.all.domain.shared.exception.EntityNotFoundException import br.all.application.study.repository.StudyReviewRepository import br.all.application.study.update.implementation.UpdateStudyReviewServiceImpl import br.all.application.study.update.interfaces.UpdateStudyReviewPresenter @@ -14,8 +13,6 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith -import java.util.UUID - @Tag("UnitTest") @Tag("ServiceTest") @ExtendWith(MockKExtension::class) @@ -25,8 +22,6 @@ class UpdateStudyReviewServiceImplTest { @MockK(relaxUnitFun = true) private lateinit var systematicStudyRepository: SystematicStudyRepository @MockK private lateinit var credentialService: CredentialsService @MockK(relaxed = true) private lateinit var presenter: UpdateStudyReviewPresenter - @MockK - private lateinit var collaborationRepository: CollaborationRepository private lateinit var sut: UpdateStudyReviewServiceImpl @@ -40,16 +35,13 @@ class UpdateStudyReviewServiceImplTest { presenter, credentialService, systematicStudyRepository, - collaborationRepository, factory.researcherId, - factory.systematicStudyId, - UUID.randomUUID() + factory.systematicStudyId ) sut = UpdateStudyReviewServiceImpl( systematicStudyRepository, studyReviewRepository, credentialService, - collaborationRepository ) } diff --git a/review/src/test/kotlin/br/all/application/study/util/TestDataFactory.kt b/review/src/test/kotlin/br/all/application/study/util/TestDataFactory.kt index 63640d153..7cc0bbc18 100644 --- a/review/src/test/kotlin/br/all/application/study/util/TestDataFactory.kt +++ b/review/src/test/kotlin/br/all/application/study/util/TestDataFactory.kt @@ -80,10 +80,18 @@ class TestDataFactory { fun findAllResponseModel( amountOfStudies: Int, + page: Int = 0, + size: Int = 20, + totalElements: Long = amountOfStudies.toLong(), + totalPages: Int = if (amountOfStudies == 0) 0 else (amountOfStudies + size - 1) / size ) = FindAllStudyReviewsService.ResponseModel( researcherId, systematicStudyId, - List(amountOfStudies) { generateDto(studyReviewId = Random(1).nextLong()) } + List(amountOfStudies) { generateDto(studyReviewId = Random(1).nextLong()) }, + page, + size, + totalElements, + totalPages ) fun findAllBySourceRequestModel( @@ -125,17 +133,6 @@ class TestDataFactory { duplicateIds: List ) = MarkAsDuplicatedService.RequestModel(researcherId, systematicStudyId, keptStudyReviewId, duplicateIds) - fun answerQuestionModel( - questionId: UUID, - type: String, - answer: T, - ) = AnswerQuestionService.RequestModel(researcherId, systematicStudyId, studyReviewId, questionId, type, answer) - - fun questionLabelDto( - name: String, - value: Int, - ) = AnswerQuestionService.LabelDto(name, value) - fun generateQuestionTextualDto( questionId: UUID, systematicStudyId: UUID = this.systematicStudyId, @@ -161,7 +158,7 @@ class TestDataFactory { systematicStudyId: UUID = this.systematicStudyId, code: String = faker.lorem.words(), description: String = faker.lorem.words(), - labelDto: AnswerQuestionService.LabelDto, + labelDto: BatchAnswerQuestionService.LabelDto, questionContext: String ) = QuestionDto( diff --git a/review/src/test/kotlin/br/all/application/util/PreconditionCheckerMocking.kt b/review/src/test/kotlin/br/all/application/util/PreconditionCheckerMocking.kt index e41dab172..80b63fa7f 100644 --- a/review/src/test/kotlin/br/all/application/util/PreconditionCheckerMocking.kt +++ b/review/src/test/kotlin/br/all/application/util/PreconditionCheckerMocking.kt @@ -3,8 +3,8 @@ package br.all.application.util import br.all.application.question.repository.QuestionRepository import br.all.application.user.credentials.ResearcherCredentialsService import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.presenter.GenericPresenter -import br.all.domain.model.user.toResearcherId +import br.all.domain.shared.presenter.GenericPresenter +import br.all.domain.shared.user.toResearcherId import br.all.domain.model.review.toSystematicStudyId import io.mockk.every import java.util.* diff --git a/review/src/test/kotlin/br/all/application/util/PreconditionCheckerMockingNew.kt b/review/src/test/kotlin/br/all/application/util/PreconditionCheckerMockingNew.kt index 1ca3c0967..350e3865d 100644 --- a/review/src/test/kotlin/br/all/application/util/PreconditionCheckerMockingNew.kt +++ b/review/src/test/kotlin/br/all/application/util/PreconditionCheckerMockingNew.kt @@ -1,14 +1,12 @@ package br.all.application.util -import br.all.application.collaboration.repository.CollaborationDto -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.question.repository.QuestionRepository import br.all.application.review.repository.SystematicStudyDto import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException -import br.all.application.shared.presenter.GenericPresenter +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException +import br.all.domain.shared.presenter.GenericPresenter import br.all.application.shared.presenter.prepareIfFailsPreconditions import br.all.application.user.CredentialsService import io.github.serpro69.kfaker.Faker @@ -21,38 +19,24 @@ class PreconditionCheckerMockingNew( private val presenter: GenericPresenter<*>, private val credentialsService: CredentialsService, private val systematicStudyRepository: SystematicStudyRepository, - private val collaborationRepository: CollaborationRepository, private val userId: UUID, private val systematicStudyId: UUID, - private val collaborationId: UUID, ) { private val faker = Faker() private val systematicStudy = generateSystematicStudy() - private val collaboration = generateCollaborationDto() fun makeEverythingWork() { val user = generateUserDto() mockkStatic(GenericPresenter<*>::prepareIfFailsPreconditions) every { credentialsService.loadCredentials(userId) } returns user every { systematicStudyRepository.findById(systematicStudyId) } returns systematicStudy - every { presenter.prepareIfFailsPreconditions( - any(), - any(), - allowedRoles = any(), - collaborations = any() - ) } returns Unit - every { collaborationRepository. - listAllCollaborationsBySystematicStudyId(systematicStudyId) - } returns listOf(collaboration) + every { presenter.prepareIfFailsPreconditions(any(), any()) } returns Unit every { presenter.isDone() } returns false } fun makeUserUnauthenticated() { every { credentialsService.loadCredentials(userId) } returns null every { systematicStudyRepository.findById(systematicStudyId) } returns systematicStudy - every { collaborationRepository. - listAllCollaborationsBySystematicStudyId(systematicStudyId) - } returns listOf(collaboration) every { presenter.isDone() } returns true } @@ -60,9 +44,6 @@ class PreconditionCheckerMockingNew( val user = generateUnauthorizedUserDto() every { credentialsService.loadCredentials(userId) } returns user every { systematicStudyRepository.findById(systematicStudyId) } returns systematicStudy - every { collaborationRepository. - listAllCollaborationsBySystematicStudyId(systematicStudyId) - } returns listOf(collaboration) every { presenter.isDone() } returns true } @@ -70,9 +51,6 @@ class PreconditionCheckerMockingNew( val user = generateUserDto() every { credentialsService.loadCredentials(userId) } returns user every { systematicStudyRepository.findById(systematicStudyId) } returns null - every { collaborationRepository. - listAllCollaborationsBySystematicStudyId(systematicStudyId) - } returns emptyList() every { presenter.isDone() } returns false andThen true } @@ -80,9 +58,6 @@ class PreconditionCheckerMockingNew( val user = generateUserDto() every { credentialsService.loadCredentials(userId) } returns user every { systematicStudyRepository.findById(systematicStudyId) } returns systematicStudy - every { collaborationRepository. - listAllCollaborationsBySystematicStudyId(systematicStudyId) - } returns listOf(collaboration) every { repository.findById(systematicStudyId, questionId) } returns null every { presenter.isDone() } returns false andThen false andThen true } @@ -155,18 +130,6 @@ class PreconditionCheckerMockingNew( mutableSetOf(ownerId).also { it.addAll(collaborators) }, ) - private fun generateCollaborationDto( - id: UUID = collaborationId, - status: String = "ACTIVE", - permissions: Set = setOf("EDIT") - ) = CollaborationDto( - id = id, - systematicStudyId = systematicStudyId, - userId = userId, - status = status, - permissions = permissions - ) - private fun generateUserDto( userId: UUID = this.userId, userName: String = faker.name.firstName(), diff --git a/review/src/test/kotlin/br/all/domain/model/review/SystematicStudyTest.kt b/review/src/test/kotlin/br/all/domain/model/review/SystematicStudyTest.kt index d37a5f2b6..664865e91 100644 --- a/review/src/test/kotlin/br/all/domain/model/review/SystematicStudyTest.kt +++ b/review/src/test/kotlin/br/all/domain/model/review/SystematicStudyTest.kt @@ -1,9 +1,6 @@ package br.all.domain.model.review -import br.all.domain.model.collaboration.Collaboration -import br.all.domain.model.collaboration.CollaborationId -import br.all.domain.model.collaboration.CollaborationPermission -import br.all.domain.model.user.ResearcherId +import br.all.domain.shared.user.ResearcherId import org.junit.jupiter.api.* import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.assertDoesNotThrow @@ -20,7 +17,7 @@ class SystematicStudyTest { fun setUp() { val systematicStudyId = SystematicStudyId(UUID.randomUUID()) val owner = ResearcherId(UUID.randomUUID()) - sut = SystematicStudy(systematicStudyId, "Some title", "Some description", owner, setOf()) + sut = SystematicStudy(systematicStudyId, "Some title", "Some description", owner) } @Nested @@ -34,10 +31,19 @@ class SystematicStudyTest { fun `should successfully create an systematic study`() { val id = SystematicStudyId(UUID.randomUUID()) val owner = ResearcherId(UUID.randomUUID()) - val collaborators = mutableSetOf(CollaborationId(UUID.randomUUID())) + val collaborators = mutableSetOf(ResearcherId(UUID.randomUUID())) assertDoesNotThrow { SystematicStudy(id, "Title", "Description", owner, collaborators) } } + + @Test + fun `should owner be a collaborator`() { + val id = SystematicStudyId(UUID.randomUUID()) + val ownerId = ResearcherId(UUID.randomUUID()) + val sut = SystematicStudy(id, "Title", "Description", ownerId, mutableSetOf()) + + assertTrue(ownerId in sut.collaborators) + } } @Nested @@ -50,7 +56,7 @@ class SystematicStudyTest { val id = SystematicStudyId(UUID.randomUUID()) val owner = ResearcherId(UUID.randomUUID()) - assertThrows { SystematicStudy(id, title, description, owner, setOf()) } + assertThrows { SystematicStudy(id, title, description, owner) } } } } @@ -58,10 +64,17 @@ class SystematicStudyTest { @Nested @DisplayName("When adding new collaborators") inner class WhenAddingNewCollaborators { + @Test + @Tag("ValidClasses") + fun `should add new collaborator`() { + sut.addCollaborator(ResearcherId(UUID.randomUUID())) + assertEquals(2, sut.collaborators.size) + } + @Test @Tag("InvalidClasses") fun `should not add duplicated researchers`() { - val duplicatedResearcher = CollaborationId(UUID.randomUUID()) + val duplicatedResearcher = ResearcherId(UUID.randomUUID()) sut.addCollaborator(duplicatedResearcher) sut.addCollaborator(duplicatedResearcher) @@ -80,14 +93,12 @@ class SystematicStudyTest { @Test fun `should remove valid collaborator`() { val researcherId = ResearcherId(UUID.randomUUID()) - val collabId = CollaborationId(UUID.randomUUID()) - val collaboration = Collaboration(collabId, sut.id as SystematicStudyId, researcherId, permissions = setOf(CollaborationPermission.VIEW)) - sut.addCollaborator(collabId) - assertTrue(collabId in sut.collaborators, "researcher was not even added" ) + sut.addCollaborator(researcherId) + assertTrue(researcherId in sut.collaborators, "researcher was not even added" ) - sut.removeCollaborator(collaboration) - assertFalse(collabId in sut.collaborators, "researcher was not removed") + sut.removeCollaborator(researcherId) + assertFalse(researcherId in sut.collaborators, "researcher was not removed") } } @@ -98,19 +109,33 @@ class SystematicStudyTest { @Test fun `should not allow removing owner from collaborators`(){ val ownerId = sut.owner - val collaboration = Collaboration(CollaborationId(UUID.randomUUID()), sut.id as SystematicStudyId, ownerId, permissions = setOf(CollaborationPermission.VIEW)) - assertThrows { sut.removeCollaborator(collaboration) } + assertThrows { sut.removeCollaborator(ownerId) } } @Test fun `should throw if try to remove absent collaborator`(){ val absentResearcher = ResearcherId(UUID.randomUUID()) - val collaboration = Collaboration(CollaborationId(UUID.randomUUID()), sut.id as SystematicStudyId, absentResearcher, permissions = setOf(CollaborationPermission.VIEW)) - assertThrows { sut.removeCollaborator(collaboration) } + assertThrows { sut.removeCollaborator(absentResearcher) } } } } + @Nested + @DisplayName("When changing the owner") + inner class WhenChangingTheOwner { + @Test + @Tag("ValidClasses") + fun `should add new owner to collaborators if not present yet`(){ + val newOwner = ResearcherId(UUID.randomUUID()) + sut.changeOwner(newOwner) + + Assertions.assertAll("change owner", + { assertTrue(newOwner in sut.collaborators) }, + { assertEquals(sut.owner, newOwner) } + ) + } + } + @Nested @DisplayName("When changing the title") inner class WhenChangingTheTitle { diff --git a/review/src/test/kotlin/br/all/domain/model/search/SearchSessionTest.kt b/review/src/test/kotlin/br/all/domain/model/search/SearchSessionTest.kt index dcb7de383..f7fa3540b 100644 --- a/review/src/test/kotlin/br/all/domain/model/search/SearchSessionTest.kt +++ b/review/src/test/kotlin/br/all/domain/model/search/SearchSessionTest.kt @@ -1,7 +1,7 @@ package br.all.domain.model.search import br.all.domain.model.protocol.SearchSource -import br.all.domain.model.user.ResearcherId +import br.all.domain.shared.user.ResearcherId import br.all.domain.model.review.SystematicStudyId import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test diff --git a/scas/pom.xml b/scas/pom.xml index b8ddb39a2..c05350760 100644 --- a/scas/pom.xml +++ b/scas/pom.xml @@ -26,7 +26,7 @@ src/main/kotlin - src/test/kotlin + org.jetbrains.kotlin @@ -78,11 +78,6 @@ 5.10.0 test - - org.jetbrains.kotlin - kotlin-stdlib - 1.9.0 - br.all review diff --git a/shared/pom.xml b/shared/pom.xml new file mode 100644 index 000000000..c94b5f019 --- /dev/null +++ b/shared/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + br.all + systematic + 1.0-SNAPSHOT + + + shared + + + UTF-8 + official + 1.8 + + + + + mavenCentral + https://repo1.maven.org/maven2/ + + + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework + spring-web + + + + \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/domain/shared/ddd/Entity.kt b/shared/src/main/kotlin/br/all/domain/shared/ddd/Entity.kt similarity index 99% rename from review/src/main/kotlin/br/all/domain/shared/ddd/Entity.kt rename to shared/src/main/kotlin/br/all/domain/shared/ddd/Entity.kt index 417d8d3f4..f67a9a28e 100644 --- a/review/src/main/kotlin/br/all/domain/shared/ddd/Entity.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/ddd/Entity.kt @@ -1,7 +1,6 @@ package br.all.domain.shared.ddd abstract class Entity (val id: Identifier) { - final override fun equals(other: Any?) = when { this === other -> true other !is Entity<*> -> false diff --git a/account/src/main/kotlin/br/all/domain/shared/ddd/Identifier.kt b/shared/src/main/kotlin/br/all/domain/shared/ddd/Identifier.kt similarity index 100% rename from account/src/main/kotlin/br/all/domain/shared/ddd/Identifier.kt rename to shared/src/main/kotlin/br/all/domain/shared/ddd/Identifier.kt diff --git a/account/src/main/kotlin/br/all/domain/shared/ddd/Notification.kt b/shared/src/main/kotlin/br/all/domain/shared/ddd/Notification.kt similarity index 98% rename from account/src/main/kotlin/br/all/domain/shared/ddd/Notification.kt rename to shared/src/main/kotlin/br/all/domain/shared/ddd/Notification.kt index 298fb9ac3..33c434bcd 100644 --- a/account/src/main/kotlin/br/all/domain/shared/ddd/Notification.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/ddd/Notification.kt @@ -1,13 +1,9 @@ package br.all.domain.shared.ddd class Notification { - private val errors: MutableList = mutableListOf() fun addError(message: String, cause: Exception? = null) = errors.add(Error(message, cause)) fun hasNoErrors() = errors.isEmpty() fun message() = errors.joinToString(" | ") { it.message } data class Error(val message: String, val cause: Exception?) } - - - diff --git a/account/src/main/kotlin/br/all/domain/shared/ddd/ValueObject.kt b/shared/src/main/kotlin/br/all/domain/shared/ddd/ValueObject.kt similarity index 98% rename from account/src/main/kotlin/br/all/domain/shared/ddd/ValueObject.kt rename to shared/src/main/kotlin/br/all/domain/shared/ddd/ValueObject.kt index c22062ab7..0b820a04b 100644 --- a/account/src/main/kotlin/br/all/domain/shared/ddd/ValueObject.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/ddd/ValueObject.kt @@ -2,4 +2,4 @@ package br.all.domain.shared.ddd abstract class ValueObject { protected abstract fun validate() : Notification -} +} \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/shared/exceptions/EntityNotFoundException.kt b/shared/src/main/kotlin/br/all/domain/shared/exception/EntityNotFoundException.kt similarity index 70% rename from review/src/main/kotlin/br/all/application/shared/exceptions/EntityNotFoundException.kt rename to shared/src/main/kotlin/br/all/domain/shared/exception/EntityNotFoundException.kt index 2c09a0a70..56f438bac 100644 --- a/review/src/main/kotlin/br/all/application/shared/exceptions/EntityNotFoundException.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/exception/EntityNotFoundException.kt @@ -1,3 +1,3 @@ -package br.all.application.shared.exceptions +package br.all.domain.shared.exception class EntityNotFoundException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/shared/exceptions/UnauthenticatedUserException.kt b/shared/src/main/kotlin/br/all/domain/shared/exception/UnauthenticatedUserException.kt similarity index 71% rename from review/src/main/kotlin/br/all/application/shared/exceptions/UnauthenticatedUserException.kt rename to shared/src/main/kotlin/br/all/domain/shared/exception/UnauthenticatedUserException.kt index 4ae3f28b7..c7a095474 100644 --- a/review/src/main/kotlin/br/all/application/shared/exceptions/UnauthenticatedUserException.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/exception/UnauthenticatedUserException.kt @@ -1,3 +1,3 @@ -package br.all.application.shared.exceptions +package br.all.domain.shared.exception class UnauthenticatedUserException (message: String? = null, cause: Throwable? = null) : Exception(message, cause) \ No newline at end of file diff --git a/review/src/main/kotlin/br/all/application/shared/exceptions/UnauthorizedUserException.kt b/shared/src/main/kotlin/br/all/domain/shared/exception/UnauthorizedUserException.kt similarity index 71% rename from review/src/main/kotlin/br/all/application/shared/exceptions/UnauthorizedUserException.kt rename to shared/src/main/kotlin/br/all/domain/shared/exception/UnauthorizedUserException.kt index b3b50ada4..08293f6bd 100644 --- a/review/src/main/kotlin/br/all/application/shared/exceptions/UnauthorizedUserException.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/exception/UnauthorizedUserException.kt @@ -1,3 +1,3 @@ -package br.all.application.shared.exceptions +package br.all.domain.shared.exception class UnauthorizedUserException (message: String? = null, cause: Throwable? = null) : Exception(message, cause) \ No newline at end of file diff --git a/account/src/main/kotlin/br/all/application/shared/UniquenessViolationException.kt b/shared/src/main/kotlin/br/all/domain/shared/exception/UniquenessViolationException.kt similarity index 74% rename from account/src/main/kotlin/br/all/application/shared/UniquenessViolationException.kt rename to shared/src/main/kotlin/br/all/domain/shared/exception/UniquenessViolationException.kt index 95e38b127..6b3f10373 100644 --- a/account/src/main/kotlin/br/all/application/shared/UniquenessViolationException.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/exception/UniquenessViolationException.kt @@ -1,3 +1,3 @@ -package br.all.application.shared +package br.all.domain.shared.exception class UniquenessViolationException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) \ No newline at end of file diff --git a/account/src/main/kotlin/br/all/application/shared/GenericPresenter.kt b/shared/src/main/kotlin/br/all/domain/shared/presenter/GenericPresenter.kt similarity index 79% rename from account/src/main/kotlin/br/all/application/shared/GenericPresenter.kt rename to shared/src/main/kotlin/br/all/domain/shared/presenter/GenericPresenter.kt index b340d32da..bdc877976 100644 --- a/account/src/main/kotlin/br/all/application/shared/GenericPresenter.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/presenter/GenericPresenter.kt @@ -1,4 +1,4 @@ -package br.all.application.shared +package br.all.domain.shared.presenter interface GenericPresenter { fun prepareSuccessView(response: T) diff --git a/review/src/main/kotlin/br/all/domain/shared/valueobject/Email.kt b/shared/src/main/kotlin/br/all/domain/shared/user/Email.kt similarity index 98% rename from review/src/main/kotlin/br/all/domain/shared/valueobject/Email.kt rename to shared/src/main/kotlin/br/all/domain/shared/user/Email.kt index aa332b362..903c10af5 100644 --- a/review/src/main/kotlin/br/all/domain/shared/valueobject/Email.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/user/Email.kt @@ -1,4 +1,4 @@ -package br.all.domain.shared.valueobject +package br.all.domain.shared.user import br.all.domain.shared.ddd.Notification import br.all.domain.shared.ddd.ValueObject diff --git a/review/src/main/kotlin/br/all/domain/model/user/Researcher.kt b/shared/src/main/kotlin/br/all/domain/shared/user/Researcher.kt similarity index 83% rename from review/src/main/kotlin/br/all/domain/model/user/Researcher.kt rename to shared/src/main/kotlin/br/all/domain/shared/user/Researcher.kt index 32bbfce0b..992cc2484 100644 --- a/review/src/main/kotlin/br/all/domain/model/user/Researcher.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/user/Researcher.kt @@ -1,4 +1,4 @@ -package br.all.domain.model.user +package br.all.domain.shared.user import br.all.domain.shared.ddd.Entity import java.util.UUID diff --git a/review/src/main/kotlin/br/all/domain/model/user/ResearcherId.kt b/shared/src/main/kotlin/br/all/domain/shared/user/ResearcherId.kt similarity index 75% rename from review/src/main/kotlin/br/all/domain/model/user/ResearcherId.kt rename to shared/src/main/kotlin/br/all/domain/shared/user/ResearcherId.kt index e9391c101..67e6b4b5e 100644 --- a/review/src/main/kotlin/br/all/domain/model/user/ResearcherId.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/user/ResearcherId.kt @@ -1,11 +1,11 @@ -package br.all.domain.model.user +package br.all.domain.shared.user import br.all.domain.shared.ddd.Identifier import br.all.domain.shared.ddd.Notification import java.util.* @JvmInline -value class ResearcherId(val value : UUID ) : Identifier { +value class ResearcherId(val value : UUID ) : Identifier { override fun validate() = Notification() diff --git a/review/src/main/kotlin/br/all/domain/model/user/Role.kt b/shared/src/main/kotlin/br/all/domain/shared/user/Role.kt similarity index 58% rename from review/src/main/kotlin/br/all/domain/model/user/Role.kt rename to shared/src/main/kotlin/br/all/domain/shared/user/Role.kt index 8e6ed2dde..2546921df 100644 --- a/review/src/main/kotlin/br/all/domain/model/user/Role.kt +++ b/shared/src/main/kotlin/br/all/domain/shared/user/Role.kt @@ -1,4 +1,4 @@ -package br.all.domain.model.user +package br.all.domain.shared.user enum class Role { COLLABORATOR, diff --git a/review/src/test/kotlin/br/all/domain/shared/ddd/EntityTest.kt b/shared/src/test/kotlin/br/all/domain/shared/ddd/EntityTest.kt similarity index 58% rename from review/src/test/kotlin/br/all/domain/shared/ddd/EntityTest.kt rename to shared/src/test/kotlin/br/all/domain/shared/ddd/EntityTest.kt index bbf2ae3b7..9f1aff62a 100644 --- a/review/src/test/kotlin/br/all/domain/shared/ddd/EntityTest.kt +++ b/shared/src/test/kotlin/br/all/domain/shared/ddd/EntityTest.kt @@ -1,59 +1,61 @@ package br.all.domain.shared.ddd -import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertNotEquals import org.junit.jupiter.api.Tag -import org.junit.jupiter.api.Tags import org.junit.jupiter.api.Test @Tag("UnitTest") -class EntityTest{ +class EntityTest { @JvmInline - private value class EntityId(val value: Long) : Identifier { - override fun validate() = Notification () + private value class EntityId(val value: Long) : Identifier { + override fun validate() = Notification() override fun value() = value } - private class EntityA(id: EntityId) : Entity (id) - private class EntityB(id: EntityId) : Entity (id) + private class EntityA(id: EntityId) : Entity(id) + private class EntityB(id: EntityId) : Entity(id) @Test - fun `Should two entities of same class and id be equal`(){ + fun `Should two entities of same class and id be equal`() { val entityA1 = EntityA(EntityId(10L)) val entityA2 = EntityA(EntityId(10L)) assertEquals(entityA1, entityA2) } @Test - fun `Should two entities of same class and different ids be different`(){ + fun `Should two entities of same class and different ids be different`() { val entityA1 = EntityA(EntityId(10L)) val entityA2 = EntityA(EntityId(11L)) assertNotEquals(entityA1, entityA2) } @Test - fun `Should an entity be different from a not entity`(){ + fun `Should an entity be different from a not entity`() { data class OtherClass(val id: Long) - val otherObject = OtherClass(10L); + + val otherObject = OtherClass(10L) val entityA = EntityA(EntityId(10L)) assertNotEquals(otherObject, entityA) } @Test - fun `Should two entities of different classes and same index be different`(){ + fun `Should two entities of different classes and same index be different`() { val entityA = EntityA(EntityId(10L)) val entityB = EntityB(EntityId(10L)) assertNotEquals(entityA, entityB) } @Test - fun `Should entity be different from null`(){ + fun `Should entity be different from null`() { val entityA = EntityA(EntityId(10L)) - assertFalse(entityA.equals(null)); + assertFalse(entityA.equals(null)) } @Test - fun `Should two variables of same object be equal`(){ + fun `Should two variables of same object be equal`() { val entityA = EntityA(EntityId(10L)) val entityB = entityA assertEquals(entityA, entityB) diff --git a/review/src/test/kotlin/br/all/domain/shared/ddd/NotificationTest.kt b/shared/src/test/kotlin/br/all/domain/shared/ddd/NotificationTest.kt similarity index 100% rename from review/src/test/kotlin/br/all/domain/shared/ddd/NotificationTest.kt rename to shared/src/test/kotlin/br/all/domain/shared/ddd/NotificationTest.kt diff --git a/review/src/test/kotlin/br/all/domain/shared/ddd/EmailTest.kt b/shared/src/test/kotlin/br/all/domain/shared/user/EmailTest.kt similarity index 98% rename from review/src/test/kotlin/br/all/domain/shared/ddd/EmailTest.kt rename to shared/src/test/kotlin/br/all/domain/shared/user/EmailTest.kt index 55959a529..b94e23685 100644 --- a/review/src/test/kotlin/br/all/domain/shared/ddd/EmailTest.kt +++ b/shared/src/test/kotlin/br/all/domain/shared/user/EmailTest.kt @@ -1,10 +1,9 @@ -package br.all.domain.shared.ddd +package br.all.domain.shared.user -import br.all.domain.shared.valueobject.Email import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertDoesNotThrow import org.junit.jupiter.api.assertThrows +import org.junit.jupiter.api.assertDoesNotThrow import kotlin.test.assertEquals import kotlin.test.assertNotEquals import kotlin.test.assertTrue @@ -146,4 +145,4 @@ class EmailTest { val exception = assertThrows { Email("user@domain@com") } exception.message?.contains("Wrong Email format")?.let { assertTrue(it) } } -} +} \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/collaboration/controller/CollaborationController.kt b/web/src/main/kotlin/br/all/collaboration/controller/CollaborationController.kt deleted file mode 100644 index f171f0955..000000000 --- a/web/src/main/kotlin/br/all/collaboration/controller/CollaborationController.kt +++ /dev/null @@ -1,57 +0,0 @@ -package br.all.collaboration.controller - -import br.all.application.collaboration.create.AcceptInviteService -import br.all.application.collaboration.create.CreateInviteService -import br.all.collaboration.presenter.RestfulAcceptInvitePresenter -import br.all.collaboration.presenter.RestfulCreateInvitePresenter -import br.all.collaboration.requests.PostInviteRequest -import br.all.security.service.AuthenticationInfoService -import io.swagger.v3.oas.annotations.Operation -import org.springframework.http.HttpStatus -import org.springframework.http.ResponseEntity -import org.springframework.web.bind.annotation.* -import java.util.* - -@RestController -@RequestMapping("/api/v1/systematic-study/{systematicStudy}") -class CollaborationController( - private val createInviteService: CreateInviteService, - private val acceptInviteService: AcceptInviteService, - private val authenticationInfoService: AuthenticationInfoService, - ) { - - @PostMapping("/invite") - @Operation(summary = "Invite an user in a systematic study") - fun createInvite( - @PathVariable systematicStudy: UUID, - @RequestBody postRequest: PostInviteRequest - ): ResponseEntity<*> { - val presenter = RestfulCreateInvitePresenter() - val userId = authenticationInfoService.getAuthenticatedUserId() - val request = CreateInviteService.RequestModel( - systematicStudy, - userId, - postRequest.inviteeId, - postRequest.permissions.toSet() - ) - createInviteService.createInvite(presenter, request) - return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) - } - - @PostMapping("/invite/{inviteId}/accept") - @Operation(summary = "Invite an user in a systematic study") - fun acceptInvite( - @PathVariable systematicStudy: UUID, - @PathVariable inviteId: UUID - ): ResponseEntity<*> { - val presenter = RestfulAcceptInvitePresenter() - val userId = authenticationInfoService.getAuthenticatedUserId() - val request = AcceptInviteService.RequestModel( - systematicStudy, - userId, - inviteId - ) - acceptInviteService.acceptInvite(presenter, request) - return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) - } -} \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/collaboration/controller/CollaborationServicesConfiguration.kt b/web/src/main/kotlin/br/all/collaboration/controller/CollaborationServicesConfiguration.kt deleted file mode 100644 index 6f1536a57..000000000 --- a/web/src/main/kotlin/br/all/collaboration/controller/CollaborationServicesConfiguration.kt +++ /dev/null @@ -1,31 +0,0 @@ -package br.all.collaboration.controller - -import br.all.application.collaboration.create.AcceptInviteServiceImpl -import br.all.application.collaboration.create.CreateInviteServiceImpl -import br.all.application.collaboration.repository.CollaborationRepository -import br.all.application.review.repository.SystematicStudyRepository -import br.all.application.user.CredentialsService -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration - -@Configuration -class CollaborationServicesConfiguration { - - @Bean - fun createInviteService( - systematicStudyRepository: SystematicStudyRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository - ) = CreateInviteServiceImpl( - systematicStudyRepository, credentialsService, collaborationRepository - ) - - @Bean - fun acceptInviteService( - systematicStudyRepository: SystematicStudyRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository - ) = AcceptInviteServiceImpl( - systematicStudyRepository, credentialsService, collaborationRepository - ) -} \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/collaboration/presenter/RestfulAcceptInvitePresenter.kt b/web/src/main/kotlin/br/all/collaboration/presenter/RestfulAcceptInvitePresenter.kt deleted file mode 100644 index a86487f50..000000000 --- a/web/src/main/kotlin/br/all/collaboration/presenter/RestfulAcceptInvitePresenter.kt +++ /dev/null @@ -1,30 +0,0 @@ -package br.all.collaboration.presenter - -import br.all.application.collaboration.create.AcceptInvitePresenter -import br.all.application.collaboration.create.AcceptInviteService -import br.all.application.collaboration.create.CreateInvitePresenter -import br.all.application.collaboration.create.CreateInviteService -import br.all.shared.error.createErrorResponseFrom -import org.springframework.hateoas.RepresentationModel -import org.springframework.http.HttpStatus -import org.springframework.http.ResponseEntity -import java.util.* - -class RestfulAcceptInvitePresenter : AcceptInvitePresenter { - var responseEntity: ResponseEntity<*>? = null - - override fun prepareSuccessView(response: AcceptInviteService.ResponseModel) { - responseEntity = ResponseEntity.status(HttpStatus.CREATED).body(ViewModel(response.collaborationId)) - } - - override fun prepareFailView(throwable: Throwable) { - responseEntity = createErrorResponseFrom(throwable) - } - - override fun isDone() = responseEntity != null - - private data class ViewModel( - val collaborationId: UUID, - ) : RepresentationModel() - -} \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/collaboration/presenter/RestfulCreateInvitePresenter.kt b/web/src/main/kotlin/br/all/collaboration/presenter/RestfulCreateInvitePresenter.kt deleted file mode 100644 index aac75f54b..000000000 --- a/web/src/main/kotlin/br/all/collaboration/presenter/RestfulCreateInvitePresenter.kt +++ /dev/null @@ -1,28 +0,0 @@ -package br.all.collaboration.presenter - -import br.all.application.collaboration.create.CreateInvitePresenter -import br.all.application.collaboration.create.CreateInviteService -import br.all.shared.error.createErrorResponseFrom -import org.springframework.hateoas.RepresentationModel -import org.springframework.http.HttpStatus -import org.springframework.http.ResponseEntity -import java.util.* - -class RestfulCreateInvitePresenter : CreateInvitePresenter { - var responseEntity: ResponseEntity<*>? = null - - override fun prepareSuccessView(response: CreateInviteService.ResponseModel) { - responseEntity = ResponseEntity.status(HttpStatus.CREATED).body(ViewModel(response.inviteId)) - } - - override fun prepareFailView(throwable: Throwable) { - responseEntity = createErrorResponseFrom(throwable) - } - - override fun isDone() = responseEntity != null - - private data class ViewModel( - val inviteId: UUID, - ) : RepresentationModel() - -} \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/collaboration/requests/PostInviteRequest.kt b/web/src/main/kotlin/br/all/collaboration/requests/PostInviteRequest.kt deleted file mode 100644 index ad12991af..000000000 --- a/web/src/main/kotlin/br/all/collaboration/requests/PostInviteRequest.kt +++ /dev/null @@ -1,8 +0,0 @@ -package br.all.collaboration.requests - -import java.util.UUID - -data class PostInviteRequest( - val inviteeId: UUID, - val permissions: List -) diff --git a/web/src/main/kotlin/br/all/protocol/controller/ProtocolController.kt b/web/src/main/kotlin/br/all/protocol/controller/ProtocolController.kt index 8ef4aef3a..2a23e29f2 100644 --- a/web/src/main/kotlin/br/all/protocol/controller/ProtocolController.kt +++ b/web/src/main/kotlin/br/all/protocol/controller/ProtocolController.kt @@ -1,10 +1,10 @@ package br.all.protocol.controller import br.all.application.protocol.find.FindProtocolService -import br.all.application.protocol.find.GetProtocolStageService +import br.all.application.protocol.find.FindProtocolStageService import br.all.application.protocol.update.UpdateProtocolService import br.all.protocol.presenter.RestfulFindProtocolPresenter -import br.all.protocol.presenter.RestfulGetProtocolStagePresenter +import br.all.protocol.presenter.RestfulFindProtocolStagePresenter import br.all.protocol.presenter.RestfulUpdateProtocolPresenter import br.all.protocol.requests.PutRequest import br.all.security.service.AuthenticationInfoService @@ -19,14 +19,14 @@ import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* import java.util.* import br.all.application.protocol.find.FindProtocolService.RequestModel as FindOneRequestModel -import br.all.application.protocol.find.GetProtocolStageService.RequestModel as FindStageRequestModel +import br.all.application.protocol.find.FindProtocolStageService.RequestModel as FindStageRequestModel @RestController @RequestMapping("/systematic-study/{systematicStudyId}/protocol") class ProtocolController( private val findProtocolService: FindProtocolService, private val updateProtocolService: UpdateProtocolService, - private val getProtocolStageService: GetProtocolStageService, + private val findProtocolStageService: FindProtocolStageService, private val authenticationInfoService: AuthenticationInfoService, private val linksFactory: LinksFactory ) { @@ -96,7 +96,7 @@ class ProtocolController( ApiResponse(responseCode = "200", description = "Success getting the protocol stage", content = [Content( mediaType = "application/json", - schema = Schema(implementation = GetProtocolStageService.ResponseModel::class) + schema = Schema(implementation = FindProtocolStageService.ResponseModel::class) )]), ApiResponse( responseCode = "401", @@ -114,14 +114,14 @@ class ProtocolController( content = [Content(schema = Schema(hidden = true))] ), ]) - fun getStage( + fun findStage( @PathVariable systematicStudyId: UUID ) : ResponseEntity<*> { - val presenter = RestfulGetProtocolStagePresenter(linksFactory) + val presenter = RestfulFindProtocolStagePresenter(linksFactory) val userId = authenticationInfoService.getAuthenticatedUserId() val request = FindStageRequestModel(userId, systematicStudyId) - getProtocolStageService.getStage(presenter, request) + findProtocolStageService.getStage(presenter, request) return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) } } diff --git a/web/src/main/kotlin/br/all/protocol/controller/ProtocolServicesConfiguration.kt b/web/src/main/kotlin/br/all/protocol/controller/ProtocolServicesConfiguration.kt index de05097c6..8603480d2 100644 --- a/web/src/main/kotlin/br/all/protocol/controller/ProtocolServicesConfiguration.kt +++ b/web/src/main/kotlin/br/all/protocol/controller/ProtocolServicesConfiguration.kt @@ -1,8 +1,7 @@ package br.all.protocol.controller -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.find.FindProtocolServiceImpl -import br.all.application.protocol.find.GetProtocolStageServiceImpl +import br.all.application.protocol.find.FindProtocolStageServiceImpl import br.all.application.protocol.repository.ProtocolRepository import br.all.application.protocol.update.UpdateProtocolServiceImpl import br.all.application.question.repository.QuestionRepository @@ -20,8 +19,7 @@ class ProtocolServicesConfiguration { protocolRepository: ProtocolRepository, systematicStudyRepository: SystematicStudyRepository, credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository - ) = FindProtocolServiceImpl(protocolRepository, systematicStudyRepository, credentialsService, collaborationRepository) + ) = FindProtocolServiceImpl(protocolRepository, systematicStudyRepository, credentialsService) @Bean fun updateProtocolService( @@ -29,31 +27,15 @@ class ProtocolServicesConfiguration { systematicStudyRepository: SystematicStudyRepository, credentialsService: CredentialsService, studyReviewRepository: StudyReviewRepository, - scoreCalculatorService: ScoreCalculatorService, - collaborationRepository: CollaborationRepository - ) = UpdateProtocolServiceImpl( - protocolRepository, - systematicStudyRepository, - credentialsService, - studyReviewRepository, - scoreCalculatorService, - collaborationRepository - ) + scoreCalculatorService: ScoreCalculatorService + ) = UpdateProtocolServiceImpl(protocolRepository, systematicStudyRepository, credentialsService, studyReviewRepository, scoreCalculatorService) @Bean - fun getProtocolStageService( + fun findProtocolStageService( protocolRepository: ProtocolRepository, systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, credentialsService: CredentialsService, - questionRepository: QuestionRepository, - collaborationRepository: CollaborationRepository - ) = GetProtocolStageServiceImpl( - protocolRepository, - systematicStudyRepository, - studyReviewRepository, - credentialsService, - questionRepository, - collaborationRepository - ) + questionRepository: QuestionRepository + ) = FindProtocolStageServiceImpl(protocolRepository, systematicStudyRepository, studyReviewRepository, credentialsService, questionRepository) } diff --git a/web/src/main/kotlin/br/all/protocol/presenter/RestfulGetProtocolStagePresenter.kt b/web/src/main/kotlin/br/all/protocol/presenter/RestfulFindProtocolStagePresenter.kt similarity index 76% rename from web/src/main/kotlin/br/all/protocol/presenter/RestfulGetProtocolStagePresenter.kt rename to web/src/main/kotlin/br/all/protocol/presenter/RestfulFindProtocolStagePresenter.kt index 760cb5f3f..34132c31b 100644 --- a/web/src/main/kotlin/br/all/protocol/presenter/RestfulGetProtocolStagePresenter.kt +++ b/web/src/main/kotlin/br/all/protocol/presenter/RestfulFindProtocolStagePresenter.kt @@ -1,8 +1,8 @@ package br.all.protocol.presenter -import br.all.application.protocol.find.GetProtocolStagePresenter -import br.all.application.protocol.find.GetProtocolStageService.ResponseModel -import br.all.application.protocol.find.GetProtocolStageService.ProtocolStage +import br.all.application.protocol.find.FindProtocolStagePresenter +import br.all.application.protocol.find.FindProtocolStageService.ResponseModel +import br.all.application.protocol.find.FindProtocolStageService.ProtocolStage import br.all.shared.error.createErrorResponseFrom import br.all.utils.LinksFactory import org.springframework.hateoas.RepresentationModel @@ -10,9 +10,9 @@ import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import java.util.UUID -class RestfulGetProtocolStagePresenter( +class RestfulFindProtocolStagePresenter( private val linksFactory: LinksFactory -) : GetProtocolStagePresenter { +) : FindProtocolStagePresenter { var responseEntity: ResponseEntity<*>? = null override fun prepareSuccessView(response: ResponseModel) { diff --git a/web/src/main/kotlin/br/all/question/controller/QuestionServicesConfiguration.kt b/web/src/main/kotlin/br/all/question/controller/QuestionServicesConfiguration.kt index 067374cc6..11e3dacd6 100644 --- a/web/src/main/kotlin/br/all/question/controller/QuestionServicesConfiguration.kt +++ b/web/src/main/kotlin/br/all/question/controller/QuestionServicesConfiguration.kt @@ -1,11 +1,12 @@ package br.all.question.controller -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.question.create.CreateQuestionServiceImpl import br.all.application.question.find.FindQuestionServiceImpl import br.all.application.question.findAll.FindAllBySystematicStudyIdServiceImpl import br.all.application.question.repository.QuestionRepository +import br.all.application.question.update.presenter.UpdateQuestionPresenter import br.all.application.question.update.services.UpdateQuestionServiceImpl +import br.all.application.user.credentials.ResearcherCredentialsService import br.all.application.review.repository.SystematicStudyRepository import br.all.application.user.CredentialsService import br.all.domain.services.UuidGeneratorService @@ -20,42 +21,37 @@ class QuestionServicesConfiguration { questionRepository: QuestionRepository, credentialsService: CredentialsService, idGenerator: UuidGeneratorService, - collaborationRepository: CollaborationRepository ) = CreateQuestionServiceImpl( systematicStudyRepository, questionRepository, idGenerator, - credentialsService, - collaborationRepository + credentialsService ) @Bean fun findQuestionService( systematicStudyRepository: SystematicStudyRepository, questionRepository: QuestionRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = FindQuestionServiceImpl( - systematicStudyRepository, questionRepository, credentialsService, collaborationRepository + systematicStudyRepository, questionRepository, credentialsService ) @Bean fun findAllBySystematicStudyIdService( systematicStudyRepository: SystematicStudyRepository, questionRepository: QuestionRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = FindAllBySystematicStudyIdServiceImpl( - systematicStudyRepository, questionRepository, credentialsService, collaborationRepository + systematicStudyRepository, questionRepository, credentialsService ) @Bean fun updateQuestionService( systematicStudyRepository: SystematicStudyRepository, questionRepository: QuestionRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = UpdateQuestionServiceImpl( - systematicStudyRepository, questionRepository, credentialsService, collaborationRepository + systematicStudyRepository, questionRepository, credentialsService ) } \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/report/controller/ReportControllerConfiguration.kt b/web/src/main/kotlin/br/all/report/controller/ReportControllerConfiguration.kt index ff9bd1961..2edc0fc1c 100644 --- a/web/src/main/kotlin/br/all/report/controller/ReportControllerConfiguration.kt +++ b/web/src/main/kotlin/br/all/report/controller/ReportControllerConfiguration.kt @@ -1,6 +1,5 @@ package br.all.report.controller -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.ProtocolRepository import br.all.application.question.repository.QuestionRepository import br.all.application.report.find.service.* @@ -36,13 +35,11 @@ class ReportControllerConfiguration { studyReviewRepository: StudyReviewRepository, credentialsService: CredentialsService, systematicStudyRepository: SystematicStudyRepository, - collaborationRepository: CollaborationRepository ) = IncludedStudiesAnswersServiceImpl( questionRepository, studyReviewRepository, credentialsService, systematicStudyRepository, - collaborationRepository ) @Bean @@ -50,14 +47,12 @@ class ReportControllerConfiguration { protocolRepository: ProtocolRepository, studyReviewRepository: StudyReviewRepository, credentialsService: CredentialsService, - systematicStudyRepository: SystematicStudyRepository, - collaborationRepository: CollaborationRepository + systematicStudyRepository: SystematicStudyRepository ) = FindCriteriaServiceImpl( protocolRepository, systematicStudyRepository, credentialsService, studyReviewRepository, - collaborationRepository ) @Bean @@ -66,13 +61,11 @@ class ReportControllerConfiguration { systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository ) = FindSourceServiceImpl( protocolRepository, systematicStudyRepository, studyReviewRepository, credentialsService, - collaborationRepository ) @Bean @@ -80,12 +73,10 @@ class ReportControllerConfiguration { credentialsService: CredentialsService, studyReviewRepository: StudyReviewRepository, systematicStudyRepository: SystematicStudyRepository, - collaborationRepository: CollaborationRepository ) = AuthorNetworkServiceImpl( credentialsService, studyReviewRepository, systematicStudyRepository, - collaborationRepository ) @Bean @@ -93,12 +84,10 @@ class ReportControllerConfiguration { credentialsService: CredentialsService, systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, - collaborationRepository: CollaborationRepository ) = FindKeywordsServiceImpl( systematicStudyRepository, studyReviewRepository, - credentialsService, - collaborationRepository + credentialsService ) @Bean @@ -107,13 +96,11 @@ class ReportControllerConfiguration { systematicStudyRepository: SystematicStudyRepository, formatterFactoryService: FormatterFactoryService, protocolRepository: ProtocolRepository, - collaborationRepository: CollaborationRepository ) = ExportProtocolServiceImpl( credentialsService, systematicStudyRepository, formatterFactoryService, - protocolRepository, - collaborationRepository + protocolRepository ) @Bean @@ -121,12 +108,10 @@ class ReportControllerConfiguration { credentialsService: CredentialsService, studyReviewRepository: StudyReviewRepository, systematicStudyRepository: SystematicStudyRepository, - collaborationRepository: CollaborationRepository ) = FindStudiesByStageServiceImpl( credentialsService, studyReviewRepository, systematicStudyRepository, - collaborationRepository ) @Bean @@ -134,12 +119,10 @@ class ReportControllerConfiguration { credentialsService: CredentialsService, studyReviewRepository: StudyReviewRepository, systematicStudyRepository: SystematicStudyRepository, - collaborationRepository: CollaborationRepository ) = StudiesFunnelServiceImpl( credentialsService, studyReviewRepository, systematicStudyRepository, - collaborationRepository ) @Bean @@ -147,14 +130,12 @@ class ReportControllerConfiguration { credentialsService: CredentialsService, studyReviewRepository: StudyReviewRepository, systematicStudyRepository: SystematicStudyRepository, - questionRepository: QuestionRepository, - collaborationRepository: CollaborationRepository + questionRepository: QuestionRepository ) = FindAnswerServiceImpl( credentialsService, studyReviewRepository, systematicStudyRepository, - questionRepository, - collaborationRepository + questionRepository ) @Bean @@ -163,12 +144,10 @@ class ReportControllerConfiguration { studyReviewRepository: StudyReviewRepository, credentialsService: CredentialsService, protocolRepository: ProtocolRepository, - collaborationRepository: CollaborationRepository ) = FindStudyReviewCriteriaServiceImpl( systematicStudyRepository, studyReviewRepository, credentialsService, - protocolRepository, - collaborationRepository + protocolRepository ) } \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/review/controller/SystematicStudyServicesConfiguration.kt b/web/src/main/kotlin/br/all/review/controller/SystematicStudyServicesConfiguration.kt index cfa3c20d8..61335937e 100644 --- a/web/src/main/kotlin/br/all/review/controller/SystematicStudyServicesConfiguration.kt +++ b/web/src/main/kotlin/br/all/review/controller/SystematicStudyServicesConfiguration.kt @@ -1,6 +1,5 @@ package br.all.review.controller -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.ProtocolRepository import br.all.application.user.CredentialsService import br.all.application.review.create.CreateSystematicStudyServiceImpl @@ -20,13 +19,11 @@ class SystematicStudyServicesConfiguration { protocolRepository: ProtocolRepository, uuidGeneratorService: UuidGeneratorService, credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository ) = CreateSystematicStudyServiceImpl( systematicStudyRepository, protocolRepository, uuidGeneratorService, credentialsService, - collaborationRepository, ) @Bean diff --git a/web/src/main/kotlin/br/all/review/requests/PostRequest.kt b/web/src/main/kotlin/br/all/review/requests/PostRequest.kt index 9f66aca77..b617549f6 100644 --- a/web/src/main/kotlin/br/all/review/requests/PostRequest.kt +++ b/web/src/main/kotlin/br/all/review/requests/PostRequest.kt @@ -9,5 +9,5 @@ data class PostRequest( val collaborators: Set, ) { fun toCreateRequestModel(userId: UUID) = - RequestModel(userId, title, description) + RequestModel(userId, title, description, collaborators) } \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/search/controller/SearchSessionServicesConfiguration.kt b/web/src/main/kotlin/br/all/search/controller/SearchSessionServicesConfiguration.kt index 9c482d214..14412925a 100644 --- a/web/src/main/kotlin/br/all/search/controller/SearchSessionServicesConfiguration.kt +++ b/web/src/main/kotlin/br/all/search/controller/SearchSessionServicesConfiguration.kt @@ -1,6 +1,5 @@ package br.all.search.controller -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.protocol.repository.ProtocolRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.search.create.CreateSearchSessionServiceImpl @@ -49,7 +48,6 @@ class SearchSessionServicesConfiguration { protocolRepository: ProtocolRepository, scoreCalculatorService: ScoreCalculatorService, reviewSimilarityService: ReviewSimilarityService, - collaborationRepository: CollaborationRepository ) = PatchSearchSessionServiceImpl( systematicStudyRepository, searchSessionRepository, @@ -58,8 +56,7 @@ class SearchSessionServicesConfiguration { converterFactoryService, protocolRepository, scoreCalculatorService, - reviewSimilarityService, - collaborationRepository + reviewSimilarityService ) @Bean @@ -72,8 +69,7 @@ class SearchSessionServicesConfiguration { studyReviewRepository: StudyReviewRepository, credentialsService: CredentialsService, scoreCalculatorService: ScoreCalculatorService, - reviewSimilarityService: ReviewSimilarityService, - collaborationRepository: CollaborationRepository + reviewSimilarityService: ReviewSimilarityService ) = CreateSearchSessionServiceImpl( searchSessionRepository, systematicStudyRepository, @@ -83,64 +79,56 @@ class SearchSessionServicesConfiguration { studyReviewRepository, credentialsService, scoreCalculatorService, - reviewSimilarityService, - collaborationRepository + reviewSimilarityService ) @Bean fun findSearchSession( searchSessionRepository: SearchSessionRepository, systematicStudyRepository: SystematicStudyRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = FindSearchSessionServiceImpl ( systematicStudyRepository, searchSessionRepository, - credentialsService, - collaborationRepository + credentialsService ) @Bean fun findAllSessionService( searchSessionRepository: SearchSessionRepository, systematicStudyRepository: SystematicStudyRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = FindAllSearchSessionsServiceImpl ( - systematicStudyRepository, searchSessionRepository, credentialsService, collaborationRepository + systematicStudyRepository, searchSessionRepository, credentialsService ) @Bean fun findAllSearchSessionsBySourceService( searchSessionRepository: SearchSessionRepository, systematicStudyRepository: SystematicStudyRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = FindAllSearchSessionsBySourceServiceImpl ( - systematicStudyRepository, searchSessionRepository, credentialsService, collaborationRepository + systematicStudyRepository, searchSessionRepository, credentialsService ) @Bean fun updateSessionService( searchSessionRepository: SearchSessionRepository, systematicStudyRepository: SystematicStudyRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = UpdateSearchSessionServiceImpl ( - systematicStudyRepository, searchSessionRepository, credentialsService, collaborationRepository + systematicStudyRepository, searchSessionRepository, credentialsService ) @Bean fun deleteSearchSessionService( credentialsService: CredentialsService, searchSessionRepository: SearchSessionRepository, - systematicStudyRepository: SystematicStudyRepository, - collaborationRepository: CollaborationRepository + systematicStudyRepository: SystematicStudyRepository ) = DeleteSearchSessionServiceImpl( systematicStudyRepository, searchSessionRepository, - credentialsService, - collaborationRepository + credentialsService ) } \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/security/config/JwtAuthenticationFilter.kt b/web/src/main/kotlin/br/all/security/config/JwtAuthenticationFilter.kt index e8988bf86..a1b181363 100644 --- a/web/src/main/kotlin/br/all/security/config/JwtAuthenticationFilter.kt +++ b/web/src/main/kotlin/br/all/security/config/JwtAuthenticationFilter.kt @@ -21,7 +21,7 @@ class JwtAuthenticationFilter( ) : OncePerRequestFilter() { private val matchersToSkip: List = listOf( - AntPathRequestMatcher("/api/v1/user"), + AntPathRequestMatcher("/api/v1/user", "POST"), AntPathRequestMatcher("/api/v1/auth/"), AntPathRequestMatcher("/api/v1/auth/logout/"), AntPathRequestMatcher("/webjars/**"), diff --git a/web/src/main/kotlin/br/all/security/config/SecurityConfiguration.kt b/web/src/main/kotlin/br/all/security/config/SecurityConfiguration.kt index 9f373a709..06d34bc97 100644 --- a/web/src/main/kotlin/br/all/security/config/SecurityConfiguration.kt +++ b/web/src/main/kotlin/br/all/security/config/SecurityConfiguration.kt @@ -44,6 +44,7 @@ class SecurityConfiguration( "/webjars/**" ).permitAll() .requestMatchers(HttpMethod.POST, "/api/v1/user").permitAll() + .requestMatchers(HttpMethod.GET, "/api/v1/user").authenticated() .anyRequest().fullyAuthenticated() } diff --git a/web/src/main/kotlin/br/all/security/service/AuthenticationInfoService.kt b/web/src/main/kotlin/br/all/security/service/AuthenticationInfoService.kt index d0e17a1f6..98c10eece 100644 --- a/web/src/main/kotlin/br/all/security/service/AuthenticationInfoService.kt +++ b/web/src/main/kotlin/br/all/security/service/AuthenticationInfoService.kt @@ -1,10 +1,8 @@ package br.all.security.service -import br.all.application.shared.exceptions.UnauthorizedUserException -import org.springframework.http.HttpStatus +import br.all.domain.shared.exception.UnauthorizedUserException import org.springframework.security.core.context.SecurityContextHolder import org.springframework.stereotype.Service -import org.springframework.web.server.ResponseStatusException import java.util.* @Service diff --git a/web/src/main/kotlin/br/all/security/service/AuthenticationService.kt b/web/src/main/kotlin/br/all/security/service/AuthenticationService.kt index 9af5d9942..e52ffc323 100644 --- a/web/src/main/kotlin/br/all/security/service/AuthenticationService.kt +++ b/web/src/main/kotlin/br/all/security/service/AuthenticationService.kt @@ -1,6 +1,6 @@ package br.all.security.service -import br.all.application.shared.exceptions.UnauthorizedUserException +import br.all.domain.shared.exception.UnauthorizedUserException import br.all.application.user.find.LoadAccountCredentialsService import br.all.application.user.update.UpdateRefreshTokenService import br.all.application.user.update.UpdateRefreshTokenService.RequestModel diff --git a/web/src/main/kotlin/br/all/shared/error/ErrorResponseEntityFactory.kt b/web/src/main/kotlin/br/all/shared/error/ErrorResponseEntityFactory.kt index 6d283101b..9ec454572 100644 --- a/web/src/main/kotlin/br/all/shared/error/ErrorResponseEntityFactory.kt +++ b/web/src/main/kotlin/br/all/shared/error/ErrorResponseEntityFactory.kt @@ -1,9 +1,9 @@ package br.all.shared.error -import br.all.application.shared.exceptions.EntityNotFoundException -import br.all.application.shared.exceptions.UnauthenticatedUserException -import br.all.application.shared.exceptions.UnauthorizedUserException -import br.all.application.shared.exceptions.UniquenessViolationException +import br.all.domain.shared.exception.EntityNotFoundException +import br.all.domain.shared.exception.UnauthenticatedUserException +import br.all.domain.shared.exception.UnauthorizedUserException +import br.all.domain.shared.exception.UniquenessViolationException import org.springframework.http.HttpStatus.* import org.springframework.http.ResponseEntity diff --git a/web/src/main/kotlin/br/all/study/controller/StudyReviewController.kt b/web/src/main/kotlin/br/all/study/controller/StudyReviewController.kt index f2005b0aa..3ccce027c 100644 --- a/web/src/main/kotlin/br/all/study/controller/StudyReviewController.kt +++ b/web/src/main/kotlin/br/all/study/controller/StudyReviewController.kt @@ -40,7 +40,6 @@ class StudyReviewController( private val updateReadingPriorityService: UpdateStudyReviewPriorityService, private val removeCriteriaService: RemoveCriteriaService, private val markAsDuplicatedService: MarkAsDuplicatedService, - private val answerQuestionService: AnswerQuestionService, private val batchAnswerQuestionService: BatchAnswerQuestionService, private val authenticationInfoService: AuthenticationInfoService, private val linksFactory: LinksFactory @@ -95,10 +94,13 @@ class StudyReviewController( ) fun findAllStudyReviews( @PathVariable systematicStudy: UUID, + @RequestParam("page", required = false, defaultValue = "0") page: Int, + @RequestParam("size", required = false, defaultValue = "20") size: Int, + @RequestParam("sort", required = false, defaultValue = "id,asc") sort: String, ): ResponseEntity<*> { val presenter = RestfulFindAllStudyReviewsPresenter(linksFactory) val userId = authenticationInfoService.getAuthenticatedUserId() - val request = FindAllStudyReviewsService.RequestModel(userId, systematicStudy) + val request = FindAllStudyReviewsService.RequestModel(userId, systematicStudy, page, size, sort) findAllService.findAllFromReview(presenter, request) return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) } @@ -368,129 +370,11 @@ class StudyReviewController( return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) } - @PatchMapping("/study-review/{studyReview}/riskOfBias-answer") - @Operation(summary = "Update the answer of a risk of bias question") + @PatchMapping("/study-review/{studyReview}/batch-answer-question") + @Operation(summary = "Update a batch of answers for both rob and/or extraction questions") @ApiResponses( value = [ - ApiResponse(responseCode = "200", description = "Success updating answer to risk of bias question", - content = [Content( - mediaType = "application/json", - schema = Schema(implementation = AnswerQuestionService.ResponseModel::class) - )] - ), - ApiResponse( - responseCode = "400", - description = "Fail updating answer to risk of bias question", - content = [Content(schema = Schema(hidden = true))] - ), - ApiResponse( - responseCode = "401", - description = "Fail updating answer to risk of bias question - unauthenticated user", - content = [Content(schema = Schema(hidden = true))] - ), - ApiResponse( - responseCode = "403", - description = "Fail updating answer to risk of bias question - unauthorized user", - content = [Content(schema = Schema(hidden = true))] - ), - ] - ) - fun riskOfBiasAnswer( - @PathVariable systematicStudy: UUID, - @PathVariable studyReview: Long, - @RequestBody patchRequest: PatchAnswerQuestionStudyReviewRequest<*>, - ) : ResponseEntity<*> { - val presenter = RestfulAnswerQuestionPresenter(linksFactory) - val userId = authenticationInfoService.getAuthenticatedUserId() - val request = patchRequest.toRequestModel(userId, systematicStudy, studyReview) - answerQuestionService.answerQuestion(presenter, request, context = "ROB") - return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) - } - - @PatchMapping("/study-review/{studyReview}/extraction-answer") - @Operation(summary = "Update the answer of a extraction question") - @ApiResponses( - value = [ - ApiResponse(responseCode = "200", description = "Success updating answer to extraction question", - content = [Content( - mediaType = "application/json", - schema = Schema(implementation = AnswerQuestionService.ResponseModel::class) - )] - ), - ApiResponse( - responseCode = "400", - description = "Fail updating answer to extraction question", - content = [Content(schema = Schema(hidden = true))] - ), - ApiResponse( - responseCode = "401", - description = "Fail updating answer to extraction question - unauthenticated user", - content = [Content(schema = Schema(hidden = true))] - ), - ApiResponse( - responseCode = "403", - description = "Fail updating answer to extraction question - unauthorized user", - content = [Content(schema = Schema(hidden = true))] - ), - ] - ) - fun extractionAnswer( - @PathVariable systematicStudy: UUID, - @PathVariable studyReview: Long, - @RequestBody patchRequest: PatchAnswerQuestionStudyReviewRequest<*>, - ) : ResponseEntity<*> { - val presenter = RestfulAnswerQuestionPresenter(linksFactory) - val userId = authenticationInfoService.getAuthenticatedUserId() - val request = patchRequest.toRequestModel(userId, systematicStudy, studyReview) - answerQuestionService.answerQuestion(presenter, request, context = "EXTRACTION") - return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) - } - - @PatchMapping("/study-review/{studyReview}/batch-riskOfBias-answers") - @Operation(summary = "Update a batch of answers for risk of bias questions") - @ApiResponses( - value = [ - ApiResponse(responseCode = "200", description = "Success updating a batch of answers to risk of bias questions", - content = [Content( - mediaType = "application/json", - schema = Schema(implementation = BatchAnswerQuestionService.ResponseModel::class) - )] - ), - ApiResponse( - responseCode = "400", - description = "Fail updating answers - invalid payload", - content = [Content(schema = Schema(hidden = true))] - ), - ApiResponse( - responseCode = "401", - description = "Fail updating answers - unauthenticated user", - content = [Content(schema = Schema(hidden = true))] - ), - ApiResponse( - responseCode = "403", - description = "Fail updating answers - unauthorized user", - content = [Content(schema = Schema(hidden = true))] - ), - ] - ) - fun batchRiskOfBiasAnswers( - @PathVariable systematicStudy: UUID, - @PathVariable studyReview: Long, - @RequestBody requestBody: PatchBatchAnswerQuestionStudyReviewRequest - ): ResponseEntity<*> { - val presenter = RestfulBatchAnswerQuestionPresenter(linksFactory) - val userId = authenticationInfoService.getAuthenticatedUserId() - val request = requestBody.toRequestModel(userId, systematicStudy, studyReview) - - batchAnswerQuestionService.batchAnswerQuestion(presenter, request, "ROB") - return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) - } - - @PatchMapping("/study-review/{studyReview}/batch-extraction-answers") - @Operation(summary = "Update a batch of answers for extraction questions") - @ApiResponses( - value = [ - ApiResponse(responseCode = "200", description = "Success updating a batch of answers to extraction questions", + ApiResponse(responseCode = "200", description = "Success updating a batch of answers", content = [Content( mediaType = "application/json", schema = Schema(implementation = BatchAnswerQuestionService.ResponseModel::class) @@ -513,7 +397,7 @@ class StudyReviewController( ), ] ) - fun batchExtractionAnswers( + fun batchAnswerQuestions( @PathVariable systematicStudy: UUID, @PathVariable studyReview: Long, @RequestBody requestBody: PatchBatchAnswerQuestionStudyReviewRequest @@ -522,7 +406,7 @@ class StudyReviewController( val userId = authenticationInfoService.getAuthenticatedUserId() val request = requestBody.toRequestModel(userId, systematicStudy, studyReview) - batchAnswerQuestionService.batchAnswerQuestion(presenter, request, "EXTRACTION") + batchAnswerQuestionService.batchAnswerQuestion(presenter, request) return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) } diff --git a/web/src/main/kotlin/br/all/study/controller/StudyReviewServicesConfiguration.kt b/web/src/main/kotlin/br/all/study/controller/StudyReviewServicesConfiguration.kt index 42b5c6f66..54d9e3f2d 100644 --- a/web/src/main/kotlin/br/all/study/controller/StudyReviewServicesConfiguration.kt +++ b/web/src/main/kotlin/br/all/study/controller/StudyReviewServicesConfiguration.kt @@ -1,6 +1,5 @@ package br.all.study.controller -import br.all.application.collaboration.repository.CollaborationRepository import br.all.application.question.repository.QuestionRepository import br.all.application.review.repository.SystematicStudyRepository import br.all.application.study.create.CreateStudyReviewServiceImpl @@ -24,10 +23,9 @@ class StudyReviewServicesConfiguration { systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, credentialsService: CredentialsService, - idGenerator: IdGeneratorService, - collaborationRepository: CollaborationRepository + idGenerator: IdGeneratorService ) = CreateStudyReviewServiceImpl( - systematicStudyRepository, studyReviewRepository, credentialsService, idGenerator, collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService, idGenerator ) @Bean @@ -35,9 +33,8 @@ class StudyReviewServicesConfiguration { systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository ) = UpdateStudyReviewServiceImpl( - systematicStudyRepository, studyReviewRepository, credentialsService, collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService, ) @Bean @@ -45,10 +42,9 @@ class StudyReviewServicesConfiguration { systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, findAllStudyReviewsPresenter: FindAllStudyReviewsPresenter, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = FindAllStudyReviewsServiceImpl( - systematicStudyRepository, studyReviewRepository, credentialsService, collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService ) @Bean @@ -57,40 +53,36 @@ class StudyReviewServicesConfiguration { studyReviewRepository: StudyReviewRepository, //protocolRepository: ProtocolRepository, findAllStudyReviewsBySourcePresenter: FindAllStudyReviewsBySourcePresenter, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = FindAllStudyReviewsBySourceServiceImpl( - systematicStudyRepository, studyReviewRepository, credentialsService, collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService ) @Bean fun findAllReviewBySessionService( systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = FindAllStudyReviewsBySessionServiceImpl( - systematicStudyRepository, studyReviewRepository, credentialsService, collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService ) @Bean fun findReviewService( systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, findStudyReviewPresenter: FindStudyReviewPresenter, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = FindStudyReviewServiceImpl( - systematicStudyRepository, studyReviewRepository, credentialsService, collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService ) @Bean fun findAllByAuthorService( systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = FindAllStudyReviewsByAuthorServiceImpl( - systematicStudyRepository, studyReviewRepository, credentialsService, collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService ) @@ -99,10 +91,9 @@ class StudyReviewServicesConfiguration { systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, updateStudyReviewStatusPresenter: UpdateStudyReviewStatusPresenter, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = UpdateStudyReviewSelectionService( - systematicStudyRepository, studyReviewRepository, credentialsService, collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService ) @Bean @@ -110,10 +101,9 @@ class StudyReviewServicesConfiguration { systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, updateStudyReviewStatusPresenter: UpdateStudyReviewStatusPresenter, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = UpdateStudyReviewExtractionService( - systematicStudyRepository, studyReviewRepository, credentialsService, collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService ) @Bean @@ -121,10 +111,9 @@ class StudyReviewServicesConfiguration { systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, updateStudyReviewStatusPresenter: UpdateStudyReviewStatusPresenter, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = UpdateStudyReviewPriorityService( - systematicStudyRepository, studyReviewRepository, credentialsService, collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService ) @Bean @@ -132,25 +121,9 @@ class StudyReviewServicesConfiguration { systematicStudyRepository: SystematicStudyRepository, studyReviewRepository: StudyReviewRepository, updateStudyReviewStatusPresenter: UpdateStudyReviewStatusPresenter, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = MarkAsDuplicatedServiceImpl( - systematicStudyRepository, studyReviewRepository, credentialsService, collaborationRepository - ) - - @Bean - fun answerQuestionService( - studyReviewRepository: StudyReviewRepository, - questionRepository: QuestionRepository, - systematicStudyRepository: SystematicStudyRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository - ) = AnswerQuestionImpl( - studyReviewRepository, - questionRepository, - systematicStudyRepository, - credentialsService, - collaborationRepository + systematicStudyRepository, studyReviewRepository, credentialsService ) @Bean @@ -158,14 +131,12 @@ class StudyReviewServicesConfiguration { studyReviewRepository: StudyReviewRepository, questionRepository: QuestionRepository, systematicStudyRepository: SystematicStudyRepository, - credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository + credentialsService: CredentialsService ) = BatchAnswerQuestionServiceImpl( studyReviewRepository, questionRepository, systematicStudyRepository, - credentialsService, - collaborationRepository + credentialsService ) @Bean @@ -173,11 +144,9 @@ class StudyReviewServicesConfiguration { studyReviewRepository: StudyReviewRepository, systematicStudyRepository: SystematicStudyRepository, credentialsService: CredentialsService, - collaborationRepository: CollaborationRepository ) = RemoveCriteriaServiceImpl( studyReviewRepository, systematicStudyRepository, - credentialsService, - collaborationRepository + credentialsService ) } \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/study/presenter/RestfulAnswerQuestionPresenter.kt b/web/src/main/kotlin/br/all/study/presenter/RestfulAnswerQuestionPresenter.kt deleted file mode 100644 index 413c7810c..000000000 --- a/web/src/main/kotlin/br/all/study/presenter/RestfulAnswerQuestionPresenter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package br.all.study.presenter - -import br.all.application.study.update.interfaces.AnswerQuestionPresenter -import br.all.application.study.update.interfaces.AnswerQuestionService -import br.all.shared.error.createErrorResponseFrom -import br.all.utils.LinksFactory -import org.springframework.hateoas.RepresentationModel -import org.springframework.http.HttpStatus -import org.springframework.http.ResponseEntity -import java.util.* - -class RestfulAnswerQuestionPresenter( - private val linksFactory: LinksFactory, -): AnswerQuestionPresenter { - var responseEntity: ResponseEntity<*>?= null - - override fun prepareSuccessView(response: AnswerQuestionService.ResponseModel) { - val viewModel = ViewModel(response.userId, response.systematicStudyId, response.studyReviewId) - - val link = linksFactory.findStudy(response.systematicStudyId, response.studyReviewId) - viewModel.add(link) - - responseEntity = ResponseEntity.status(HttpStatus.OK).body(viewModel) - } - - override fun prepareFailView(throwable: Throwable) = run { responseEntity = createErrorResponseFrom(throwable) } - - override fun isDone() = responseEntity != null - - data class ViewModel( - val researcherId: UUID, - val systematicStudyId: UUID, - val studyReviewId: Long, - ): RepresentationModel() -} \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/study/presenter/RestfulFindAllStudyReviewsPresenter.kt b/web/src/main/kotlin/br/all/study/presenter/RestfulFindAllStudyReviewsPresenter.kt index 6aab812d7..859660342 100644 --- a/web/src/main/kotlin/br/all/study/presenter/RestfulFindAllStudyReviewsPresenter.kt +++ b/web/src/main/kotlin/br/all/study/presenter/RestfulFindAllStudyReviewsPresenter.kt @@ -19,9 +19,31 @@ class RestfulFindAllStudyReviewsPresenter( var responseEntity: ResponseEntity<*>? = null override fun prepareSuccessView(response: ResponseModel) { - val restfulResponse = ViewModel(response.systematicStudyId, response.studyReviews.size, response.studyReviews) + val restfulResponse = ViewModel( + systematicStudyId = response.systematicStudyId, + size = response.studyReviews.size, + studyReviews = response.studyReviews, + page = response.page, + totalElements = response.totalElements, + totalPages = response.totalPages + ) - val selfRef = linksFactory.findAllStudies(response.systematicStudyId) + val selfRef = linksFactory.findAllStudies(response.systematicStudyId, response.page, response.size) + + // Add pagination links + if (response.totalPages > 0) { + restfulResponse.add(linksFactory.findAllStudiesFirstPage(response.systematicStudyId, response.size)) + restfulResponse.add(linksFactory.findAllStudiesLastPage(response.systematicStudyId, response.totalPages, response.size)) + + if (response.page < response.totalPages - 1) { + restfulResponse.add(linksFactory.findAllStudiesNextPage(response.systematicStudyId, response.page, response.size)) + } + + if (response.page > 0) { + restfulResponse.add(linksFactory.findAllStudiesPrevPage(response.systematicStudyId, response.page, response.size)) + } + } + val sources = getSources(response.studyReviews) for (source in sources) { restfulResponse.add(linksFactory.findAllStudiesBySource(response.systematicStudyId, source)) @@ -42,5 +64,8 @@ class RestfulFindAllStudyReviewsPresenter( val systematicStudyId : UUID, val size: Int, val studyReviews: List, + val page: Int, + val totalElements: Long, + val totalPages: Int ) : RepresentationModel() } \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/study/requests/PatchAnswerQuestionStudyReviewRequest.kt b/web/src/main/kotlin/br/all/study/requests/PatchAnswerQuestionStudyReviewRequest.kt deleted file mode 100644 index 4d39a56a1..000000000 --- a/web/src/main/kotlin/br/all/study/requests/PatchAnswerQuestionStudyReviewRequest.kt +++ /dev/null @@ -1,20 +0,0 @@ -package br.all.study.requests - -import br.all.application.study.update.interfaces.AnswerQuestionService -import java.util.* - -class PatchAnswerQuestionStudyReviewRequest( - val questionId: UUID, - val type: String, - val answer: T -) { - fun toRequestModel(userId: UUID, systematicStudyId: UUID, studyReviewId: Long) - = AnswerQuestionService.RequestModel( - userId, - systematicStudyId, - studyReviewId, - questionId, - type, - answer - ) -} \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/user/controller/UserAccountConfiguration.kt b/web/src/main/kotlin/br/all/user/controller/UserAccountConfiguration.kt index b5113266f..44d088719 100644 --- a/web/src/main/kotlin/br/all/user/controller/UserAccountConfiguration.kt +++ b/web/src/main/kotlin/br/all/user/controller/UserAccountConfiguration.kt @@ -1,6 +1,7 @@ package br.all.user.controller import br.all.application.user.create.RegisterUserAccountServiceImpl +import br.all.application.user.find.RetrieveUserProfileServiceImpl import br.all.application.user.repository.UserAccountRepository import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -10,4 +11,7 @@ class UserAccountConfiguration { @Bean fun registerUser(repository: UserAccountRepository) = RegisterUserAccountServiceImpl(repository) + + @Bean + fun retrieveUserProfile(repository: UserAccountRepository) = RetrieveUserProfileServiceImpl(repository) } \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/user/controller/UserAccountController.kt b/web/src/main/kotlin/br/all/user/controller/UserAccountController.kt index e5973fa04..3919eaef8 100644 --- a/web/src/main/kotlin/br/all/user/controller/UserAccountController.kt +++ b/web/src/main/kotlin/br/all/user/controller/UserAccountController.kt @@ -3,7 +3,10 @@ package br.all.user.controller import br.all.application.user.CredentialsService import br.all.application.user.create.RegisterUserAccountService import br.all.application.user.create.RegisterUserAccountService.RequestModel -import br.all.user.presenter.RestfullRegisterUserAccountPresenter +import br.all.application.user.find.RetrieveUserProfileService +import br.all.security.service.AuthenticationInfoService +import br.all.user.presenter.RestfulRegisterUserAccountPresenter +import br.all.user.presenter.RestfulRetrieveUserProfilePresenter import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.media.Content import io.swagger.v3.oas.annotations.media.Schema @@ -12,6 +15,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping @@ -21,7 +25,9 @@ import org.springframework.web.bind.annotation.RestController @RequestMapping("api/v1/user") class UserAccountController( private val registerUserAccountService: RegisterUserAccountService, - private val encoder: PasswordEncoder + private val encoder: PasswordEncoder, + private val retrieveUserProfileService: RetrieveUserProfileService, + private val authenticationInfoService: AuthenticationInfoService ) { @PostMapping @@ -49,9 +55,46 @@ class UserAccountController( ] ) fun registerUser(@RequestBody request: RequestModel): ResponseEntity<*> { - val presenter = RestfullRegisterUserAccountPresenter() + val presenter = RestfulRegisterUserAccountPresenter() val encodedPasswordRequest = request.copy(password = encoder.encode(request.password)) registerUserAccountService.register(presenter, encodedPasswordRequest) return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) } + + @GetMapping("/profile") + @Operation(summary = "Retrieve public information of a user") + @ApiResponses( + value = [ + ApiResponse( + responseCode = "200", + description = "Success retrieving user profile", + content = [Content( + mediaType = "application/json", + schema = Schema(implementation = RetrieveUserProfileService.ResponseModel::class) + )] + ), + ApiResponse( + responseCode = "401", + description = "Fail retrieving user profile - unauthenticated collaborator", + content = [Content(schema = Schema(hidden = true))] + ), + ApiResponse( + responseCode = "403", + description = "Fail retrieving user profile - unauthorized collaborator", + content = [Content(schema = Schema(hidden = true))] + ), + ApiResponse( + responseCode = "404", + description = "Fail retrieving user profile - nonexistent user", + content = [Content(schema = Schema(hidden = true))] + ), + ]) + fun retrieveUserPublicData(): ResponseEntity<*> { + val presenter = RestfulRetrieveUserProfilePresenter() + val userId = authenticationInfoService.getAuthenticatedUserId() + val request = RetrieveUserProfileService.RequestModel(userId) + + retrieveUserProfileService.retrieveData(presenter, request) + return presenter.responseEntity ?: ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR) + } } \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/user/presenter/RestfullRegisterUserAccountPresenter.kt b/web/src/main/kotlin/br/all/user/presenter/RestfulRegisterUserAccountPresenter.kt similarity index 93% rename from web/src/main/kotlin/br/all/user/presenter/RestfullRegisterUserAccountPresenter.kt rename to web/src/main/kotlin/br/all/user/presenter/RestfulRegisterUserAccountPresenter.kt index b42879b01..03f83317a 100644 --- a/web/src/main/kotlin/br/all/user/presenter/RestfullRegisterUserAccountPresenter.kt +++ b/web/src/main/kotlin/br/all/user/presenter/RestfulRegisterUserAccountPresenter.kt @@ -9,7 +9,7 @@ import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity.status import java.util.* -class RestfullRegisterUserAccountPresenter : RegisterUserAccountPresenter { +class RestfulRegisterUserAccountPresenter : RegisterUserAccountPresenter { var responseEntity: ResponseEntity<*>? = null diff --git a/web/src/main/kotlin/br/all/user/presenter/RestfulRetrieveUserProfilePresenter.kt b/web/src/main/kotlin/br/all/user/presenter/RestfulRetrieveUserProfilePresenter.kt new file mode 100644 index 000000000..9e3fc3156 --- /dev/null +++ b/web/src/main/kotlin/br/all/user/presenter/RestfulRetrieveUserProfilePresenter.kt @@ -0,0 +1,39 @@ +package br.all.user.presenter + +import br.all.application.user.find.RetrieveUserProfileService.ResponseModel +import br.all.application.user.find.RetrieveUserProfilePresenter +import br.all.shared.error.createErrorResponseFrom +import org.springframework.hateoas.RepresentationModel +import org.springframework.http.ResponseEntity +import org.springframework.http.ResponseEntity.ok +import java.util.* + +class RestfulRetrieveUserProfilePresenter : RetrieveUserProfilePresenter { + + var responseEntity: ResponseEntity<*>? = null + + override fun prepareSuccessView(response: ResponseModel) { + val restfulResponse = ViewModel( + response.userId, + response.username, + response.email, + response.affiliation, + response.country, + response.authorities + ) + responseEntity = ok(restfulResponse) + } + + override fun prepareFailView(throwable: Throwable) = run { responseEntity = createErrorResponseFrom(throwable) } + + override fun isDone() = responseEntity != null + + private data class ViewModel( + val userId: UUID, + val username: String, + val email: String, + val affiliation: String, + val country: String, + val authorities: Set + ) : RepresentationModel() +} \ No newline at end of file diff --git a/web/src/main/kotlin/br/all/utils/LinksFactory.kt b/web/src/main/kotlin/br/all/utils/LinksFactory.kt index 205d590f6..e2ed2eb30 100644 --- a/web/src/main/kotlin/br/all/utils/LinksFactory.kt +++ b/web/src/main/kotlin/br/all/utils/LinksFactory.kt @@ -187,9 +187,21 @@ class LinksFactory { findStudyReview(systematicStudyId, studyId) }.withRel("find-study").withType("GET") - fun findAllStudies(systematicStudyId: UUID): Link = linkTo { - findAllStudyReviews(systematicStudyId) + fun findAllStudies(systematicStudyId: UUID, page: Int = 0, size: Int = 20, sort: String = "id,asc"): Link = linkTo { + findAllStudyReviews(systematicStudyId, page, size, sort) }.withRel("find-all-studies").withType("GET") + + fun findAllStudiesFirstPage(systematicStudyId: UUID, size: Int = 20, sort: String = "id,asc"): Link = + findAllStudies(systematicStudyId, 0, size, sort).withRel("first").withType("GET") + + fun findAllStudiesLastPage(systematicStudyId: UUID, totalPages: Int, size: Int = 20, sort: String = "id,asc"): Link = + findAllStudies(systematicStudyId, totalPages - 1, size, sort).withRel("last").withType("GET") + + fun findAllStudiesNextPage(systematicStudyId: UUID, currentPage: Int, size: Int = 20, sort: String = "id,asc"): Link = + findAllStudies(systematicStudyId, currentPage + 1, size, sort).withRel("next").withType("GET") + + fun findAllStudiesPrevPage(systematicStudyId: UUID, currentPage: Int, size: Int = 20, sort: String = "id,asc"): Link = + findAllStudies(systematicStudyId, currentPage - 1, size, sort).withRel("prev").withType("GET") fun findAllStudiesBySource(systematicStudyId: UUID, source: String): Link = linkTo { findAllStudyReviewsBySource(systematicStudyId, source) diff --git a/web/src/main/kotlin/br/all/utils/example/RegisterUserExampleService.kt b/web/src/main/kotlin/br/all/utils/example/RegisterUserExampleService.kt index 13cd68ab6..8c61d6b1c 100644 --- a/web/src/main/kotlin/br/all/utils/example/RegisterUserExampleService.kt +++ b/web/src/main/kotlin/br/all/utils/example/RegisterUserExampleService.kt @@ -2,6 +2,7 @@ package br.all.utils.example import br.all.application.user.repository.UserAccountRepository import br.all.application.user.repository.toDto +import br.all.domain.shared.user.Email import br.all.domain.user.* import org.springframework.stereotype.Service import java.util.* diff --git a/web/src/test/kotlin/br/all/protocol/controller/ProtocolControllerTest.kt b/web/src/test/kotlin/br/all/protocol/controller/ProtocolControllerTest.kt index 05770fe0e..315c98db0 100644 --- a/web/src/test/kotlin/br/all/protocol/controller/ProtocolControllerTest.kt +++ b/web/src/test/kotlin/br/all/protocol/controller/ProtocolControllerTest.kt @@ -1,7 +1,6 @@ package br.all.protocol.controller import br.all.application.protocol.repository.CriterionDto -import br.all.infrastructure.collaboration.MongoCollaborationRepository import br.all.infrastructure.protocol.MongoProtocolRepository import br.all.infrastructure.review.MongoSystematicStudyRepository import br.all.infrastructure.review.SystematicStudyDocument @@ -30,7 +29,6 @@ import br.all.review.shared.TestDataFactory as SystematicStudyTestDataFactory class ProtocolControllerTest( @Autowired private val protocolRepository: MongoProtocolRepository, @Autowired private val systematicStudyRepository: MongoSystematicStudyRepository, - @Autowired val collaborationRepository: MongoCollaborationRepository, @Autowired private val mockMvc: MockMvc, @Autowired private val testHelperService: TestHelperService ) { @@ -55,13 +53,6 @@ class ProtocolControllerTest( collaborators = mutableSetOf(user.id) ) systematicStudyRepository.save(systematicStudy) - collaborationRepository.deleteAll() - collaborationRepository.save( - br.all.review.shared.TestDataFactory().createCollaborationDocument( - systematicStudyId = systematicStudyId, - researcherId = user.id - ) - ) } @AfterEach @@ -77,7 +68,7 @@ class ProtocolControllerTest( private fun putUrl(systematicStudyId: UUID = factory.protocol) = "/systematic-study/$systematicStudyId/protocol" - private fun getStage(systematicStudy: UUID = factory.protocol) = + private fun findStage(systematicStudy: UUID = factory.protocol) = "/systematic-study/$systematicStudy/protocol/stage" @Nested @@ -276,7 +267,7 @@ class ProtocolControllerTest( val document = factory.createProtocolDocument() protocolRepository.save(document) - mockMvc.perform(get(getStage()) + mockMvc.perform(get(findStage()) .with(SecurityMockMvcRequestPostProcessors.user(user)) .contentType(MediaType.APPLICATION_JSON) ) @@ -287,7 +278,7 @@ class ProtocolControllerTest( @Test fun `should return 404 when protocol does not exist`() { - mockMvc.perform(get(getStage()) + mockMvc.perform(get(findStage()) .with(SecurityMockMvcRequestPostProcessors.user(user)) .contentType(MediaType.APPLICATION_JSON) ) @@ -298,12 +289,12 @@ class ProtocolControllerTest( @Test fun `should not authorize researchers that are not collaborators to get protocol stage`() { - testHelperService.testForUnauthorizedUser(mockMvc, get(getStage())) + testHelperService.testForUnauthorizedUser(mockMvc, get(findStage())) } @Test fun `should not allow unauthenticated users to get protocol stage`() { - testHelperService.testForUnauthenticatedUser(mockMvc, get(getStage())) + testHelperService.testForUnauthenticatedUser(mockMvc, get(findStage())) } } } \ No newline at end of file diff --git a/web/src/test/kotlin/br/all/question/controller/ExtractionQuestionControllerTest.kt b/web/src/test/kotlin/br/all/question/controller/ExtractionQuestionControllerTest.kt index 677dec47a..f9b441db8 100644 --- a/web/src/test/kotlin/br/all/question/controller/ExtractionQuestionControllerTest.kt +++ b/web/src/test/kotlin/br/all/question/controller/ExtractionQuestionControllerTest.kt @@ -1,7 +1,6 @@ package br.all.question.controller import br.all.domain.model.question.QuestionContextEnum -import br.all.infrastructure.collaboration.MongoCollaborationRepository import br.all.infrastructure.question.MongoQuestionRepository import br.all.infrastructure.review.MongoSystematicStudyRepository import br.all.question.utils.TestDataFactory @@ -27,7 +26,6 @@ import java.util.* class ExtractionQuestionControllerTest( @Autowired val repository: MongoQuestionRepository, @Autowired val systematicStudyRepository: MongoSystematicStudyRepository, - @Autowired val collaborationRepository: MongoCollaborationRepository, @Autowired val mockMvc: MockMvc, @Autowired private val testHelperService: TestHelperService, ) { @@ -51,13 +49,6 @@ class ExtractionQuestionControllerTest( id = systematicStudyId, owner = user.id, )) - collaborationRepository.deleteAll() - collaborationRepository.save( - br.all.review.shared.TestDataFactory().createCollaborationDocument( - systematicStudyId = systematicStudyId, - researcherId = user.id - ) - ) } @AfterEach diff --git a/web/src/test/kotlin/br/all/question/controller/RiskOfBiasQuestionControllerTest.kt b/web/src/test/kotlin/br/all/question/controller/RiskOfBiasQuestionControllerTest.kt index 36255a232..2ea33c5e5 100644 --- a/web/src/test/kotlin/br/all/question/controller/RiskOfBiasQuestionControllerTest.kt +++ b/web/src/test/kotlin/br/all/question/controller/RiskOfBiasQuestionControllerTest.kt @@ -1,7 +1,6 @@ package br.all.question.controller import br.all.domain.model.question.QuestionContextEnum -import br.all.infrastructure.collaboration.MongoCollaborationRepository import br.all.infrastructure.question.MongoQuestionRepository import br.all.infrastructure.review.MongoSystematicStudyRepository import br.all.question.utils.TestDataFactory @@ -27,7 +26,6 @@ import java.util.* class RiskOfBiasQuestionControllerTest( @Autowired val repository: MongoQuestionRepository, @Autowired val systematicStudyRepository: MongoSystematicStudyRepository, - @Autowired val collaborationRepository: MongoCollaborationRepository, @Autowired val mockMvc: MockMvc, @Autowired private val testHelperService: TestHelperService, ) { @@ -54,13 +52,6 @@ class RiskOfBiasQuestionControllerTest( owner = user.id, ) ) - collaborationRepository.deleteAll() - collaborationRepository.save( - br.all.review.shared.TestDataFactory().createCollaborationDocument( - systematicStudyId = systematicStudyId, - researcherId = user.id - ) - ) } @AfterEach diff --git a/web/src/test/kotlin/br/all/report/controller/ReportControllerTest.kt b/web/src/test/kotlin/br/all/report/controller/ReportControllerTest.kt index ca1004642..8c3cb88c4 100644 --- a/web/src/test/kotlin/br/all/report/controller/ReportControllerTest.kt +++ b/web/src/test/kotlin/br/all/report/controller/ReportControllerTest.kt @@ -1,7 +1,6 @@ package br.all.report.controller import br.all.domain.model.question.QuestionContextEnum -import br.all.infrastructure.collaboration.MongoCollaborationRepository import br.all.infrastructure.protocol.MongoProtocolRepository import br.all.infrastructure.question.MongoQuestionRepository import br.all.infrastructure.question.QuestionDocument @@ -38,7 +37,6 @@ class ReportControllerTest( @Autowired private val systematicStudyRepository: MongoSystematicStudyRepository, @Autowired private val questionRepository: MongoQuestionRepository, @Autowired private val protocolRepository: MongoProtocolRepository, - @Autowired private val collaborationRepository: MongoCollaborationRepository, @Autowired private val mockMvc: MockMvc, @Autowired private val testHelperService: TestHelperService ) { @@ -86,13 +84,6 @@ class ReportControllerTest( studyReviewRepository.save(studyReview) systematicStudyRepository.save(systematicStudy) - collaborationRepository.deleteAll() - collaborationRepository.save( - br.all.review.shared.TestDataFactory().createCollaborationDocument( - systematicStudyId = systematicStudy.id, - researcherId = user.id - ) - ) } @AfterEach diff --git a/web/src/test/kotlin/br/all/review/controller/SystematicStudyControllerTest.kt b/web/src/test/kotlin/br/all/review/controller/SystematicStudyControllerTest.kt index d2bb7e090..3a77db64e 100644 --- a/web/src/test/kotlin/br/all/review/controller/SystematicStudyControllerTest.kt +++ b/web/src/test/kotlin/br/all/review/controller/SystematicStudyControllerTest.kt @@ -1,20 +1,24 @@ package br.all.review.controller -import br.all.infrastructure.collaboration.MongoCollaborationRepository +import br.all.infrastructure.protocol.MongoProtocolRepository import br.all.infrastructure.review.MongoSystematicStudyRepository +import br.all.infrastructure.review.SystematicStudyDocument import br.all.infrastructure.shared.toNullable import br.all.review.shared.TestDataFactory import br.all.security.service.ApplicationUser import br.all.shared.TestHelperService +import br.all.utils.example.CreateSearchSessionExampleService import org.junit.jupiter.api.* import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.CsvSource +import org.mockito.Mockito import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc import org.springframework.boot.test.context.SpringBootTest import org.springframework.http.MediaType import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors +import org.springframework.test.context.bean.override.mockito.MockitoBean import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath @@ -27,25 +31,24 @@ import java.util.* @Tag("ControllerTest") class SystematicStudyControllerTest( @Autowired private val repository: MongoSystematicStudyRepository, - @Autowired private val collaborationRepository: MongoCollaborationRepository, @Autowired private val testHelperService: TestHelperService, @Autowired private val mockMvc: MockMvc, ) { private lateinit var factory: TestDataFactory private lateinit var user: ApplicationUser + // This prevents the tests breaking + @MockitoBean + private lateinit var createSearchSessionExampleService: CreateSearchSessionExampleService + + @MockitoBean + private lateinit var protocolRepository: MongoProtocolRepository + @BeforeEach fun setUp() { repository.deleteAll() factory = TestDataFactory() user = testHelperService.createApplicationUser() - collaborationRepository.deleteAll() - collaborationRepository.save( - TestDataFactory().createCollaborationDocument( - systematicStudyId = factory.systematicStudyId, - researcherId = user.id - ) - ) } @AfterEach @@ -95,6 +98,28 @@ class SystematicStudyControllerTest( .andExpect(status().isBadRequest) } + // This test should pass, but it doesn't. + // We are using a standalone MongoDB instance for our testing environment, + // which means that multi-document transactions are not supported. + // When @Transactional is used in an environment that doesn't support it, + // Spring doesn't throw an error, it simply becomes a no-op. + // The annotation is effectively ignored. + @Disabled + @Test + fun `should not save systematic study if protocol creation fails`(){ + val json = factory.createValidPostRequest() + + Mockito.`when`(protocolRepository.save(Mockito.any())).thenThrow(RuntimeException()) + + mockMvc.perform( + post(postUrl()) + .with(SecurityMockMvcRequestPostProcessors.user(user)) + .contentType(MediaType.APPLICATION_JSON).content(json) + ).andExpect(status().isBadRequest) + + assertEquals(emptyList(), repository.findAll()) + } + @Test fun `should not create study when user is unauthorized`(){ testHelperService.testForUnauthorizedUser(mockMvc, diff --git a/web/src/test/kotlin/br/all/review/shared/TestDataFactory.kt b/web/src/test/kotlin/br/all/review/shared/TestDataFactory.kt index 0844021c1..bf5ded6e2 100644 --- a/web/src/test/kotlin/br/all/review/shared/TestDataFactory.kt +++ b/web/src/test/kotlin/br/all/review/shared/TestDataFactory.kt @@ -1,7 +1,5 @@ package br.all.review.shared -import br.all.domain.model.review.SystematicStudyId -import br.all.infrastructure.collaboration.CollaborationDocument import br.all.infrastructure.review.SystematicStudyDocument import io.github.serpro69.kfaker.Faker import java.util.* @@ -20,12 +18,6 @@ class TestDataFactory { collaborators: MutableSet = mutableSetOf(), ) = SystematicStudyDocument(id, title, description, owner, collaborators.also { it.add(owner) }.toSet()) - fun createCollaborationDocument( - id: UUID = UUID.randomUUID(), - systematicStudyId: UUID = this.systematicStudyId, - researcherId : UUID = this.ownerId - ) = CollaborationDocument(id, systematicStudyId, researcherId, "ACTIVE", setOf("EDIT", "REVIEW_STUDIES", "VIEW")) - fun createValidPostRequest( title: String = faker.book.title(), description: String = faker.lorem.words(), diff --git a/web/src/test/kotlin/br/all/search/controller/SearchSessionControllerTest.kt b/web/src/test/kotlin/br/all/search/controller/SearchSessionControllerTest.kt index a36572077..1d3fe1a22 100644 --- a/web/src/test/kotlin/br/all/search/controller/SearchSessionControllerTest.kt +++ b/web/src/test/kotlin/br/all/search/controller/SearchSessionControllerTest.kt @@ -1,6 +1,5 @@ package br.all.search.controller -import br.all.infrastructure.collaboration.MongoCollaborationRepository import br.all.infrastructure.protocol.MongoProtocolRepository import br.all.infrastructure.review.MongoSystematicStudyRepository import br.all.infrastructure.search.MongoSearchSessionRepository @@ -36,7 +35,6 @@ class SearchSessionControllerTest( @Autowired val repository: MongoSearchSessionRepository, @Autowired val systematicStudyRepository: MongoSystematicStudyRepository, @Autowired val studyReviewRepository: MongoStudyReviewRepository, - @Autowired val collaborationRepository: MongoCollaborationRepository, @Autowired val protocolRepository: MongoProtocolRepository, @Autowired val idService: StudyReviewIdGeneratorService, @Autowired private val testHelperService: TestHelperService, @@ -50,7 +48,7 @@ class SearchSessionControllerTest( fun postUrl() = "/api/v1/systematic-study/$systematicStudyId/search-session" - // fun patchUrl(sessionId: UUID) = "/api/v1/systematic-study/$systematicStudyId/patch-search-session/${sessionId}" + fun patchUrl(sessionId: UUID) = "/api/v1/systematic-study/$systematicStudyId/patch-search-session/${sessionId}" fun findUrl(sessionId: UUID) = "/api/v1/systematic-study/$systematicStudyId/search-session/${sessionId}" fun findAllUrl() = "/api/v1/systematic-study/$systematicStudyId/search-session" @@ -75,14 +73,6 @@ class SearchSessionControllerTest( owner = user.id, ) ) - - collaborationRepository.deleteAll() - collaborationRepository.save( - br.all.review.shared.TestDataFactory().createCollaborationDocument( - systematicStudyId = systematicStudyId, - researcherId = user.id - ) - ) } @AfterEach diff --git a/web/src/test/kotlin/br/all/study/controller/StudyReviewControllerTest.kt b/web/src/test/kotlin/br/all/study/controller/StudyReviewControllerTest.kt index 452194717..33cda86f6 100644 --- a/web/src/test/kotlin/br/all/study/controller/StudyReviewControllerTest.kt +++ b/web/src/test/kotlin/br/all/study/controller/StudyReviewControllerTest.kt @@ -1,6 +1,5 @@ package br.all.study.controller -import br.all.infrastructure.collaboration.MongoCollaborationRepository import br.all.infrastructure.question.MongoQuestionRepository import br.all.infrastructure.review.MongoSystematicStudyRepository import br.all.infrastructure.shared.toNullable @@ -37,7 +36,6 @@ import br.all.review.shared.TestDataFactory as SystematicStudyTestDataFactory class StudyReviewControllerTest( @Autowired val repository: MongoStudyReviewRepository, @Autowired val systematicStudyRepository: MongoSystematicStudyRepository, - @Autowired val collaborationRepository: MongoCollaborationRepository, @Autowired private val testHelperService: TestHelperService, @Autowired val idService: StudyReviewIdGeneratorService, @Autowired val mockMvc: MockMvc, @@ -71,17 +69,8 @@ class StudyReviewControllerTest( fun markAsDuplicatedUrl(studyToUpdateId: Long) = "/api/v1/systematic-study/$systematicStudyId/study-review/$studyToUpdateId/duplicated" - fun answerRiskOfBiasQuestion(studyReviewId: Long) = - "/api/v1/systematic-study/$systematicStudyId/study-review/${studyReviewId}/riskOfBias-answer" - - fun answerExtractionQuestion(studyReviewId: Long) = - "/api/v1/systematic-study/$systematicStudyId/study-review/${studyReviewId}/extraction-answer" - - fun batchAnswerRiskOfBiasQuestion(studyReviewId: Long) = - "/api/v1/systematic-study/$systematicStudyId/study-review/${studyReviewId}/batch-riskOfBias-answers" - - fun batchAnswerExtractionQuestion(studyReviewId: Long) = - "/api/v1/systematic-study/$systematicStudyId/study-review/${studyReviewId}/batch-extraction-answers" + fun batchAnswerQuestion(studyReviewId: Long) = + "/api/v1/systematic-study/$systematicStudyId/study-review/${studyReviewId}/batch-answer-question" @BeforeEach fun setUp() { @@ -101,14 +90,6 @@ class StudyReviewControllerTest( owner = user.id, ) ) - - collaborationRepository.deleteAll() - collaborationRepository.save( - br.all.review.shared.TestDataFactory().createCollaborationDocument( - systematicStudyId = systematicStudyId, - researcherId = user.id - ) - ) } @AfterEach @@ -515,169 +496,28 @@ class StudyReviewControllerTest( } @Nested - @DisplayName("When answering ROB questions in a review") - inner class AnswerRobQuestionsTests( + @DisplayName("When batch answering questions in a review") + inner class BatchAnswerQuestionTests( @Autowired val questionRepository: MongoQuestionRepository ) { @Test - fun `should assign answer to question and return 200`() { - val studyId = idService.next() - val questionId = UUID.randomUUID() - - val studyReview = factory.reviewDocument(systematicStudyId, studyId) - repository.insert(studyReview) - - val question = factory.generateRobQuestionTextualDto(questionId, systematicStudyId = systematicStudyId) - questionRepository.insert(question) - - val json = factory.validAnswerQuestionRequest(studyId, questionId, "TEXTUAL", "TEST") - mockMvc.perform( - patch(answerRiskOfBiasQuestion(studyId)) - .with(SecurityMockMvcRequestPostProcessors.user(user)) - .contentType(MediaType.APPLICATION_JSON).content(json) - ) - .andExpect(status().isOk) - - val studyReviewId = StudyReviewId(systematicStudyId, studyId) - val updatedReview = repository.findById(studyReviewId) - assertEquals(updatedReview.get().qualityAnswers[questionId], "TEST") - } - - @Test - fun `should not assign answer with invalid request`() { - val studyId = idService.next() - val questionId = UUID.randomUUID() - - val studyReview = factory.reviewDocument(systematicStudyId, studyId) - repository.insert(studyReview) - - val question = factory.generateRobQuestionTextualDto(questionId, systematicStudyId = systematicStudyId) - questionRepository.insert(question) - - val json = factory.invalidAnswerRiskOfBiasPatchRequest(studyId, questionId, "TEXTUAL") - mockMvc.perform( - patch(answerRiskOfBiasQuestion(studyId)) - .with(SecurityMockMvcRequestPostProcessors.user(user)) - .contentType(MediaType.APPLICATION_JSON).content(json) - ) - .andExpect(status().isBadRequest) - } - - @Test - fun `should not update if user is unauthorized`(){ - val studyId = idService.next() - val questionId = UUID.randomUUID() - - - testHelperService.testForUnauthorizedUser( - mockMvc, - patch(answerRiskOfBiasQuestion(studyId)) - .content(factory.validAnswerQuestionRequest( - studyId, questionId, "TEXTUAL", "TEST" - )) - ) - } - - @Test - fun `should not update if user is unauthenticated`(){ + fun `should handle partial success correctly by saving answers to their respective contexts`() { val studyId = idService.next() - - testHelperService.testForUnauthenticatedUser(mockMvc, patch(answerRiskOfBiasQuestion(studyId)), + val studyReview = factory.reviewDocument(systematicStudyId, studyId).copy( + qualityAnswers = mutableMapOf(), + formAnswers = mutableMapOf() ) - } - } - - @Nested - @DisplayName("When answering Extraction questions in a review") - inner class AnswerExtractionQuestionsTests( - @Autowired val questionRepository: MongoQuestionRepository - ) { - @Test - fun `should assign answer to question and return 200`() { - val studyId = idService.next() - val questionId = UUID.randomUUID() - - val studyReview = factory.reviewDocument(systematicStudyId, studyId) repository.insert(studyReview) - val question = factory.generateExtractionQuestionTextualDto(questionId, systematicStudyId = systematicStudyId) - questionRepository.insert(question) + val validRobQId = UUID.randomUUID() + val validExtractionQId = UUID.randomUUID() + val invalidRobQId = UUID.randomUUID() - val json = factory.validAnswerQuestionRequest(studyId, questionId, "TEXTUAL", "TEST") - mockMvc.perform( - patch(answerExtractionQuestion(studyId)) - .with(SecurityMockMvcRequestPostProcessors.user(user)) - .contentType(MediaType.APPLICATION_JSON).content(json) - ) - .andExpect(status().isOk) - - val studyReviewId = StudyReviewId(systematicStudyId, studyId) - val updatedReview = repository.findById(studyReviewId) - assertEquals(updatedReview.get().formAnswers[questionId], "TEST") - } - - @Test - fun `should not assign answer with invalid request`() { - val studyId = idService.next() - val questionId = UUID.randomUUID() - - val studyReview = factory.reviewDocument(systematicStudyId, studyId) - repository.insert(studyReview) + val question1 = factory.generateRobQuestionTextualDto(validRobQId, systematicStudyId) - val question = factory.generateExtractionQuestionTextualDto(questionId, systematicStudyId = systematicStudyId) - questionRepository.insert(question) + val question2 = factory.generateExtractionQuestionTextualDto(validExtractionQId, systematicStudyId) - val json = factory.invalidAnswerRiskOfBiasPatchRequest(studyId, questionId, "TEXTUAL") - mockMvc.perform( - patch(answerExtractionQuestion(studyId)) - .with(SecurityMockMvcRequestPostProcessors.user(user)) - .contentType(MediaType.APPLICATION_JSON).content(json) - ) - .andExpect(status().isBadRequest) - } - - @Test - fun `should not update if user is unauthorized`(){ - val studyId = idService.next() - val questionId = UUID.randomUUID() - - testHelperService.testForUnauthorizedUser( - mockMvc, - patch(answerExtractionQuestion(studyId)) - .content(factory.validAnswerQuestionRequest( - studyId, questionId, "TEXTUAL", "TEST" - )) - ) - } - - @Test - fun `should not update if user is unauthenticated`(){ - val studyId = idService.next() - - testHelperService.testForUnauthenticatedUser(mockMvc, patch(answerExtractionQuestion(studyId)), - ) - } - } - - @Nested - @DisplayName("When batch answering ROB questions in a review") - inner class BatchAnswerRobQuestionsTests( - @Autowired val questionRepository: MongoQuestionRepository - ) { - @Test - @DisplayName("should save valid answers, ignore invalid ones, and return 200 with a detailed report") - fun `should handle partial success correctly`() { - val studyId = idService.next() - val studyReview = factory.reviewDocument(systematicStudyId, studyId) - repository.insert(studyReview) - - val validQId1 = UUID.randomUUID() - val validQId2 = UUID.randomUUID() - val invalidQId = UUID.randomUUID() - - val question1 = factory.generateRobQuestionTextualDto(validQId1, systematicStudyId) - val question2 = factory.generateRobQuestionTextualDto(validQId2, systematicStudyId) - val question3 = factory.generateRobQuestionNumberScaleDto(invalidQId, systematicStudyId) + val question3 = factory.generateRobQuestionNumberScaleDto(invalidRobQId, systematicStudyId) questionRepository.insert(question1) questionRepository.insert(question2) @@ -686,136 +526,50 @@ class StudyReviewControllerTest( val jsonPayload = """ { "answers": [ - { "questionId": "$validQId1", "type": "TEXTUAL", "answer": "First valid answer" }, - { "questionId": "$validQId2", "type": "TEXTUAL", "answer": "Second valid answer" }, - { "questionId": "$invalidQId", "type": "NUMBERED_SCALE", "answer": "This shouldn't be a string" } + { "questionId": "$validRobQId", "type": "TEXTUAL", "answer": "Valid ROB answer" }, + { "questionId": "$validExtractionQId", "type": "TEXTUAL", "answer": "Valid Extraction answer" }, + { "questionId": "$invalidRobQId", "type": "NUMBERED_SCALE", "answer": "This answer is invalid for a number scale" } ] } """.trimIndent() mockMvc.perform( - patch(batchAnswerRiskOfBiasQuestion(studyId)) + patch(batchAnswerQuestion(studyId)) .with(SecurityMockMvcRequestPostProcessors.user(user)) .contentType(MediaType.APPLICATION_JSON).content(jsonPayload) ) .andExpect(status().isOk) .andExpect(jsonPath("$.totalAnswered").value(2)) .andExpect(jsonPath("$.succeededAnswers", hasSize(2))) - .andExpect(jsonPath("$.succeededAnswers", hasItem(validQId1.toString()))) - .andExpect(jsonPath("$.succeededAnswers", hasItem(validQId2.toString()))) + .andExpect(jsonPath("$.succeededAnswers", hasItem(validRobQId.toString()))) + .andExpect(jsonPath("$.succeededAnswers", hasItem(validExtractionQId.toString()))) .andExpect(jsonPath("$.failedAnswers", hasSize(1))) - .andExpect(jsonPath("$.failedAnswers[0].questionId").value(invalidQId.toString())) + .andExpect(jsonPath("$.failedAnswers[0].questionId").value(invalidRobQId.toString())) .andExpect(jsonPath("$.failedAnswers[0].reason", containsString("not compatible with question type 'NUMBERED_SCALE'"))) val updatedReview = repository.findById(StudyReviewId(systematicStudyId, studyId)).get() - assertEquals(3, updatedReview.qualityAnswers.size) - assertEquals("First valid answer", updatedReview.qualityAnswers[validQId1]) - assertEquals("Second valid answer", updatedReview.qualityAnswers[validQId2]) - assertNull(updatedReview.qualityAnswers[invalidQId]) - } - - @Test - @DisplayName("should return 401 for unauthenticated users") - fun `should not update if user is unauthenticated`() { - testHelperService.testForUnauthenticatedUser(mockMvc, patch(batchAnswerRiskOfBiasQuestion(1L))) - } + assertEquals(1, updatedReview.qualityAnswers.size) + assertEquals("Valid ROB answer", updatedReview.qualityAnswers[validRobQId]) - @Test - @DisplayName("should return 403 for unauthorized users") - fun `should not update if user is unauthorized`() { - val jsonPayload = """{ "answers": [] }""" - testHelperService.testForUnauthorizedUser( - mockMvc, - patch(batchAnswerRiskOfBiasQuestion(1L)).content(jsonPayload) - ) - } - } + assertEquals(1, updatedReview.formAnswers.size) + assertEquals("Valid Extraction answer", updatedReview.formAnswers[validExtractionQId]) - @Nested - @DisplayName("When batch answering Extraction questions in a review") - inner class BatchAnswerExtractionQuestionsTests( - @Autowired val questionRepository: MongoQuestionRepository - ) { - @Test - @DisplayName("should save all valid answers and return 200 with no failures") - fun `should handle full success correctly`() { - val studyId = idService.next() - val studyReview = factory.reviewDocument(systematicStudyId, studyId) - repository.insert(studyReview) - - val textQId = UUID.randomUUID() - val pickListQId = UUID.randomUUID() - - val question1 = factory.generateExtractionQuestionTextualDto(textQId, systematicStudyId = systematicStudyId) - val question2 = factory.generateExtractionQuestionPickListDto(pickListQId, systematicStudyId = systematicStudyId) - - questionRepository.insert(question1) - questionRepository.insert(question2) - - val jsonPayload = """ - { - "answers": [ - { "questionId": "$textQId", "type": "TEXTUAL", "answer": "Another valid answer" }, - { "questionId": "$pickListQId", "type": "PICK_LIST", "answer": "Option A" } - ] - } - """.trimIndent() - - mockMvc.perform( - patch(batchAnswerExtractionQuestion(studyId)) - .with(SecurityMockMvcRequestPostProcessors.user(user)) - .contentType(MediaType.APPLICATION_JSON).content(jsonPayload) - ) - .andExpect(status().isOk) - .andExpect(jsonPath("$.totalAnswered").value(2)) - .andExpect(jsonPath("$.succeededAnswers", hasSize(2))) - .andExpect(jsonPath("$.failedAnswers", hasSize(0))) - - val updatedReview = repository.findById(StudyReviewId(systematicStudyId, studyId)).get() - assertEquals(3, updatedReview.formAnswers.size) - assertEquals("Another valid answer", updatedReview.formAnswers[textQId]) - assertEquals("Option A", updatedReview.formAnswers[pickListQId]) - } - - @Test - @DisplayName("should not save answers if the question context is wrong") - fun `should fail on context mismatch`() { - val studyId = idService.next() - repository.insert(factory.reviewDocument(systematicStudyId, studyId)) - - val extractionQId = UUID.randomUUID() - questionRepository.insert(factory.generateExtractionQuestionTextualDto(extractionQId, systematicStudyId = systematicStudyId)) - - val jsonPayload = """ - { "answers": [{ "questionId": "$extractionQId", "type": "TEXTUAL", "answer": "some answer" }] } - """ - - mockMvc.perform( - patch(batchAnswerRiskOfBiasQuestion(studyId)) - .with(SecurityMockMvcRequestPostProcessors.user(user)) - .contentType(MediaType.APPLICATION_JSON).content(jsonPayload) - ) - .andExpect(status().isOk) - .andExpect(jsonPath("$.totalAnswered").value(0)) - .andExpect(jsonPath("$.failedAnswers", hasSize(1))) - .andExpect(jsonPath("$.failedAnswers[0].questionId").value(extractionQId.toString())) - .andExpect(jsonPath("$.failedAnswers[0].reason", containsString("Should answer question with the context: ROB"))) + assertNull(updatedReview.qualityAnswers[invalidRobQId]) + assertNull(updatedReview.formAnswers[invalidRobQId]) } @Test - @DisplayName("should return 401 for unauthenticated users") fun `should not update if user is unauthenticated`() { - testHelperService.testForUnauthenticatedUser(mockMvc, patch(batchAnswerExtractionQuestion(1L))) + testHelperService.testForUnauthenticatedUser(mockMvc, patch(batchAnswerQuestion(1L))) } @Test - @DisplayName("should return 403 for unauthorized users") fun `should not update if user is unauthorized`() { val jsonPayload = """{ "answers": [] }""" testHelperService.testForUnauthorizedUser( mockMvc, - patch(batchAnswerExtractionQuestion(1L)).content(jsonPayload) + patch(batchAnswerQuestion(1L)).content(jsonPayload) ) } }