Skip to content

Commit

Permalink
Feat/prsd 670 landlord dashboard absolute url (#244)
Browse files Browse the repository at this point in the history
  • Loading branch information
JasminConterioSW authored Feb 27, 2025
1 parent 0c7861b commit d3323eb
Show file tree
Hide file tree
Showing 15 changed files with 116 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,3 @@ const val LANDLORD_PATH_SEGMENT = "landlord"
const val PROPERTY_PATH_SEGMENT = "property"
const val DASHBOARD_PATH_SEGMENT = "dashboard"
const val SEARCH_PATH_SEGMENT = "search"

// TODO PRSD-670: Set to landlord dashboard
val LANDLORD_DASHBOARD_URL = "/$LANDLORD_PATH_SEGMENT/$DASHBOARD_PATH_SEGMENT"
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package uk.gov.communities.prsdb.webapp.controllers

import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import uk.gov.communities.prsdb.webapp.constants.DASHBOARD_PATH_SEGMENT
import uk.gov.communities.prsdb.webapp.constants.LANDLORD_PATH_SEGMENT
import java.security.Principal

@PreAuthorize("hasAnyRole('LANDLORD')")
@Controller
@RequestMapping("/$LANDLORD_PATH_SEGMENT")
class LandlordDashboardController {
@GetMapping
fun index(): CharSequence = "redirect:$LANDLORD_DASHBOARD_URL"

@GetMapping("/$DASHBOARD_PATH_SEGMENT")
fun landlordDashboard(
model: Model,
principale: Principal,
): String {
model.addAttribute("title", "Landlord Dashboard")

return "landlordDashboard"
}

companion object {
const val LANDLORD_DASHBOARD_URL = "/$LANDLORD_PATH_SEGMENT/$DASHBOARD_PATH_SEGMENT"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import uk.gov.communities.prsdb.webapp.models.viewModels.PaginationViewModel
import uk.gov.communities.prsdb.webapp.models.viewModels.emailModels.LocalAuthorityInvitationCancellationEmail
import uk.gov.communities.prsdb.webapp.models.viewModels.emailModels.LocalAuthorityInvitationEmail
import uk.gov.communities.prsdb.webapp.models.viewModels.formModels.RadiosButtonViewModel
import uk.gov.communities.prsdb.webapp.services.AbsoluteUrlProvider
import uk.gov.communities.prsdb.webapp.services.EmailNotificationService
import uk.gov.communities.prsdb.webapp.services.LocalAuthorityDataService
import uk.gov.communities.prsdb.webapp.services.LocalAuthorityInvitationService
Expand All @@ -37,6 +38,7 @@ class ManageLocalAuthorityUsersController(
var cancellationEmailSender: EmailNotificationService<LocalAuthorityInvitationCancellationEmail>,
var invitationService: LocalAuthorityInvitationService,
val localAuthorityDataService: LocalAuthorityDataService,
val absoluteUrlProvider: AbsoluteUrlProvider,
) {
@GetMapping("/manage-users")
fun index(
Expand Down Expand Up @@ -235,7 +237,7 @@ class ManageLocalAuthorityUsersController(

try {
val token = invitationService.createInvitationToken(emailModel.email, currentAuthority)
val invitationLinkAddress = invitationService.buildInvitationUri(token)
val invitationLinkAddress = absoluteUrlProvider.buildInvitationUri(token)
invitationEmailSender.sendEmail(
emailModel.email,
LocalAuthorityInvitationEmail(currentAuthority, invitationLinkAddress),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import org.springframework.security.core.context.SecurityContextHolder
import org.springframework.stereotype.Component
import org.springframework.validation.Validator
import uk.gov.communities.prsdb.webapp.constants.INTERNATIONAL_PLACE_NAMES
import uk.gov.communities.prsdb.webapp.constants.LANDLORD_DASHBOARD_URL
import uk.gov.communities.prsdb.webapp.constants.NON_ENGLAND_OR_WALES_ADDRESS_MAX_LENGTH
import uk.gov.communities.prsdb.webapp.constants.REGISTER_LANDLORD_JOURNEY_URL
import uk.gov.communities.prsdb.webapp.constants.enums.JourneyType
Expand Down Expand Up @@ -33,6 +32,7 @@ import uk.gov.communities.prsdb.webapp.models.viewModels.emailModels.LandlordReg
import uk.gov.communities.prsdb.webapp.models.viewModels.formModels.CheckboxViewModel
import uk.gov.communities.prsdb.webapp.models.viewModels.formModels.RadiosButtonViewModel
import uk.gov.communities.prsdb.webapp.models.viewModels.formModels.SelectViewModel
import uk.gov.communities.prsdb.webapp.services.AbsoluteUrlProvider
import uk.gov.communities.prsdb.webapp.services.AddressDataService
import uk.gov.communities.prsdb.webapp.services.AddressLookupService
import uk.gov.communities.prsdb.webapp.services.EmailNotificationService
Expand All @@ -46,6 +46,7 @@ class LandlordRegistrationJourney(
addressLookupService: AddressLookupService,
addressDataService: AddressDataService,
landlordService: LandlordService,
absoluteUrlProvider: AbsoluteUrlProvider,
emailNotificationService: EmailNotificationService<LandlordRegistrationConfirmationEmail>,
) : Journey<LandlordRegistrationStepId>(
journeyType = JourneyType.LANDLORD_REGISTRATION,
Expand All @@ -62,7 +63,7 @@ class LandlordRegistrationJourney(
"registerAsALandlord.section.yourDetails.heading",
),
JourneySection(
checkAndSubmitDetailsTasks(addressDataService, landlordService, emailNotificationService),
checkAndSubmitDetailsTasks(addressDataService, landlordService, absoluteUrlProvider, emailNotificationService),
"registerAsALandlord.section.checkAndSubmit.heading",
),
)
Expand All @@ -84,11 +85,14 @@ class LandlordRegistrationJourney(
private fun checkAndSubmitDetailsTasks(
addressDataService: AddressDataService,
landlordService: LandlordService,
absoluteUrlProvider: AbsoluteUrlProvider,
emailNotificationService: EmailNotificationService<LandlordRegistrationConfirmationEmail>,
): List<JourneyTask<LandlordRegistrationStepId>> =
listOf(
JourneyTask.withOneStep(checkAnswersStep(addressDataService)),
JourneyTask.withOneStep(declarationStep(journeyDataService, landlordService, addressDataService, emailNotificationService)),
JourneyTask.withOneStep(
declarationStep(journeyDataService, landlordService, addressDataService, absoluteUrlProvider, emailNotificationService),
),
)

private fun identityTask() =
Expand Down Expand Up @@ -458,6 +462,7 @@ class LandlordRegistrationJourney(
journeyDataService: JourneyDataService,
landlordService: LandlordService,
addressDataService: AddressDataService,
absoluteUrlProvider: AbsoluteUrlProvider,
emailNotificationService: EmailNotificationService<LandlordRegistrationConfirmationEmail>,
) = Step(
id = LandlordRegistrationStepId.Declaration,
Expand Down Expand Up @@ -487,6 +492,7 @@ class LandlordRegistrationJourney(
journeyDataService,
landlordService,
addressDataService,
absoluteUrlProvider,
emailNotificationService,
)
},
Expand Down Expand Up @@ -520,6 +526,7 @@ class LandlordRegistrationJourney(
journeyDataService: JourneyDataService,
landlordService: LandlordService,
addressDataService: AddressDataService,
absoluteUrlProvider: AbsoluteUrlProvider,
emailNotificationService: EmailNotificationService<LandlordRegistrationConfirmationEmail>,
): String {
val landlord =
Expand All @@ -541,7 +548,7 @@ class LandlordRegistrationJourney(
landlord.email,
LandlordRegistrationConfirmationEmail(
RegistrationNumberDataModel.fromRegistrationNumber(landlord.registrationNumber).toString(),
LANDLORD_DASHBOARD_URL,
absoluteUrlProvider.buildLandlordDashboardUri().toString(),
),
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import jakarta.persistence.EntityExistsException
import org.springframework.security.core.context.SecurityContextHolder
import org.springframework.stereotype.Component
import org.springframework.validation.Validator
import uk.gov.communities.prsdb.webapp.constants.LANDLORD_DASHBOARD_URL
import uk.gov.communities.prsdb.webapp.constants.REGISTER_PROPERTY_JOURNEY_URL
import uk.gov.communities.prsdb.webapp.constants.enums.JourneyType
import uk.gov.communities.prsdb.webapp.constants.enums.LicensingType
Expand Down Expand Up @@ -38,6 +37,7 @@ import uk.gov.communities.prsdb.webapp.models.viewModels.emailModels.PropertyReg
import uk.gov.communities.prsdb.webapp.models.viewModels.formModels.CheckboxViewModel
import uk.gov.communities.prsdb.webapp.models.viewModels.formModels.RadiosButtonViewModel
import uk.gov.communities.prsdb.webapp.models.viewModels.formModels.RadiosDividerViewModel
import uk.gov.communities.prsdb.webapp.services.AbsoluteUrlProvider
import uk.gov.communities.prsdb.webapp.services.AddressDataService
import uk.gov.communities.prsdb.webapp.services.AddressLookupService
import uk.gov.communities.prsdb.webapp.services.EmailNotificationService
Expand All @@ -55,6 +55,7 @@ class PropertyRegistrationJourney(
private val propertyRegistrationService: PropertyRegistrationService,
private val localAuthorityService: LocalAuthorityService,
private val landlordService: LandlordService,
private val absoluteUrlProvider: AbsoluteUrlProvider,
private val confirmationEmailSender: EmailNotificationService<PropertyRegistrationConfirmationEmail>,
) : JourneyWithTaskList<RegisterPropertyStepId>(
journeyType = JourneyType.PROPERTY_REGISTRATION,
Expand Down Expand Up @@ -635,7 +636,7 @@ class PropertyRegistrationJourney(
PropertyRegistrationConfirmationEmail(
RegistrationNumberDataModel.fromRegistrationNumber(propertyRegistrationNumber).toString(),
address.singleLineAddress,
LANDLORD_DASHBOARD_URL,
absoluteUrlProvider.buildLandlordDashboardUri().toString(),
),
)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package uk.gov.communities.prsdb.webapp.services

import org.springframework.stereotype.Service
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.on
import uk.gov.communities.prsdb.webapp.controllers.LandlordDashboardController
import uk.gov.communities.prsdb.webapp.controllers.RegisterLAUserController
import java.net.URI

@Service
class AbsoluteUrlProvider {
fun buildLandlordDashboardUri(): URI =
MvcUriComponentsBuilder
.fromMethodCall(on(LandlordDashboardController::class.java).index())
.build()
.toUri()

fun buildInvitationUri(token: String): URI =
MvcUriComponentsBuilder
.fromMethodCall(on(RegisterLAUserController::class.java).acceptInvitation(token))
.build()
.toUri()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@ package uk.gov.communities.prsdb.webapp.services

import jakarta.servlet.http.HttpSession
import org.springframework.stereotype.Service
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.on
import uk.gov.communities.prsdb.webapp.constants.LA_USER_INVITATION_TOKEN
import uk.gov.communities.prsdb.webapp.controllers.RegisterLAUserController
import uk.gov.communities.prsdb.webapp.database.entity.LocalAuthority
import uk.gov.communities.prsdb.webapp.database.entity.LocalAuthorityInvitation
import uk.gov.communities.prsdb.webapp.database.repository.LocalAuthorityInvitationRepository
import uk.gov.communities.prsdb.webapp.exceptions.InvalidTokenException
import java.net.URI
import java.util.UUID

@Service
Expand Down Expand Up @@ -56,12 +52,6 @@ class LocalAuthorityInvitationService(
return true
}

fun buildInvitationUri(token: String): URI =
MvcUriComponentsBuilder
.fromMethodCall(on(RegisterLAUserController::class.java).acceptInvitation(token))
.build()
.toUri()

fun storeTokenInSession(token: String) {
session.setAttribute(LA_USER_INVITATION_TOKEN, token)
}
Expand Down
8 changes: 8 additions & 0 deletions src/main/resources/templates/landlordDashboard.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<!DOCTYPE html>
<html th:replace="~{fragments/layout :: layout(#{${title}}, ~{::main}, false)}">
<main class="govuk-main-wrapper">
<div id="page-content">
<h1>Landlord dashboard</h1>
</div>
</main>
</html>
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import uk.gov.communities.prsdb.webapp.models.dataModels.LocalAuthorityUserDataM
import uk.gov.communities.prsdb.webapp.models.requestModels.LocalAuthorityUserAccessLevelRequestModel
import uk.gov.communities.prsdb.webapp.models.viewModels.emailModels.EmailTemplateModel
import uk.gov.communities.prsdb.webapp.models.viewModels.emailModels.LocalAuthorityInvitationCancellationEmail
import uk.gov.communities.prsdb.webapp.services.AbsoluteUrlProvider
import uk.gov.communities.prsdb.webapp.services.EmailNotificationService
import uk.gov.communities.prsdb.webapp.services.LocalAuthorityDataService
import uk.gov.communities.prsdb.webapp.services.LocalAuthorityInvitationService
Expand All @@ -47,6 +48,9 @@ class ManageLocalAuthorityUsersControllerTests(
@MockBean
lateinit var localAuthorityInvitationService: LocalAuthorityInvitationService

@MockBean
lateinit var absoluteUrlProvider: AbsoluteUrlProvider

@MockBean
private lateinit var localAuthorityDataService: LocalAuthorityDataService

Expand Down Expand Up @@ -123,7 +127,7 @@ class ManageLocalAuthorityUsersControllerTests(
.thenReturn(Pair(loggedInUserModel, localAuthority))
whenever(localAuthorityInvitationService.createInvitationToken(any(), any()))
.thenReturn("test-token")
whenever(localAuthorityInvitationService.buildInvitationUri("test-token"))
whenever(absoluteUrlProvider.buildInvitationUri("test-token"))
.thenReturn(URI("https://test-service.gov.uk/sign-up-la-user"))

mvc
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class PropertyRegistrationJourneyTests {
mock(),
mock(),
mock(),
mock(),
)

whenever(mockJourneyDataService.getJourneyDataFromSession()).thenReturn(mapOf())
Expand Down Expand Up @@ -68,6 +69,7 @@ class PropertyRegistrationJourneyTests {
mock(),
mock(),
mock(),
mock(),
)

whenever(mockJourneyDataService.getJourneyDataFromSession()).thenReturn(mapOf())
Expand Down Expand Up @@ -97,6 +99,7 @@ class PropertyRegistrationJourneyTests {
mock(),
mock(),
mock(),
mock(),
)

whenever(mockJourneyDataService.getJourneyDataFromSession()).thenReturn(mapOf("anything" to "Anything else"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import uk.gov.communities.prsdb.webapp.clients.OSPlacesClient
import uk.gov.communities.prsdb.webapp.config.NotifyConfig
import uk.gov.communities.prsdb.webapp.config.OSPlacesConfig
import uk.gov.communities.prsdb.webapp.integration.pageObjects.Navigator
import uk.gov.communities.prsdb.webapp.services.AbsoluteUrlProvider
import uk.gov.communities.prsdb.webapp.services.OneLoginIdentityService
import uk.gov.service.notify.NotificationClient

Expand Down Expand Up @@ -50,6 +51,9 @@ abstract class IntegrationTest {
@MockBean
lateinit var identityService: OneLoginIdentityService

@MockBean
lateinit var absoluteUrlProvider: AbsoluteUrlProvider

@SpyBean
lateinit var clientRegistrationRepository: ClientRegistrationRepository

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,22 @@ package uk.gov.communities.prsdb.webapp.integration
import com.microsoft.playwright.Page
import com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat
import org.junit.jupiter.api.Test
import org.mockito.ArgumentMatchers.anyString
import org.mockito.kotlin.whenever
import org.springframework.test.context.jdbc.Sql
import uk.gov.communities.prsdb.webapp.integration.pageObjects.components.BaseComponent.Companion.assertThat
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.InviteNewLaUserSuccessPage
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.LocalAuthorityDashboardPage
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.basePages.BasePage.Companion.assertPageIs
import java.net.URI

@Sql("/data-local.sql")
class InviteLaUsersTests : IntegrationTest() {
@Test
fun `inviting a new LA user ends with a success page with a button linking to the dashboard`(page: Page) {
whenever(absoluteUrlProvider.buildInvitationUri(anyString()))
.thenReturn(URI("www.prsd.gov.uk/register-la-user/test-token"))

val invitePage = navigator.goToInviteNewLaUser(1)
invitePage.submitMatchingEmail("[email protected]")
val successPage = assertPageIs(page, InviteNewLaUserSuccessPage::class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import org.mockito.kotlin.whenever
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.mock.mockito.SpyBean
import org.springframework.test.context.jdbc.Sql
import uk.gov.communities.prsdb.webapp.constants.LANDLORD_DASHBOARD_URL
import uk.gov.communities.prsdb.webapp.constants.MANUAL_ADDRESS_CHOSEN
import uk.gov.communities.prsdb.webapp.helpers.DateTimeHelper
import uk.gov.communities.prsdb.webapp.helpers.getFormattedInternationalPhoneNumber
Expand Down Expand Up @@ -50,6 +49,7 @@ import kotlin.test.assertNotNull
@Sql("/data-mockuser-not-landlord.sql")
class LandlordRegistrationJourneyTests : IntegrationTest() {
private val phoneNumberUtil = PhoneNumberUtil.getInstance()
private val absoluteLandlordUrl = "www.prsd.gov.uk/landlord"

@Autowired
private lateinit var landlordService: LandlordService
Expand All @@ -65,6 +65,8 @@ class LandlordRegistrationJourneyTests : IntegrationTest() {
"{'results':[{'DPA':{'ADDRESS':'1, Example Road, EG1 2AB'," +
"'LOCAL_CUSTODIAN_CODE':28,'UPRN':'1','BUILDING_NUMBER':1,'POSTCODE':'EG1 2AB'}}]}",
)

whenever(absoluteUrlProvider.buildLandlordDashboardUri()).thenReturn(URI(absoluteLandlordUrl))
}

@Test
Expand Down Expand Up @@ -107,7 +109,7 @@ class LandlordRegistrationJourneyTests : IntegrationTest() {

verify(confirmationEmailSender).sendEmail(
"[email protected]",
LandlordRegistrationConfirmationEmail(createdLandlordRegNum.toString(), LANDLORD_DASHBOARD_URL),
LandlordRegistrationConfirmationEmail(createdLandlordRegNum.toString(), absoluteLandlordUrl),
)

val confirmationPage = assertPageIs(page, ConfirmationPageLandlordRegistration::class)
Expand Down Expand Up @@ -158,7 +160,7 @@ class LandlordRegistrationJourneyTests : IntegrationTest() {

verify(confirmationEmailSender).sendEmail(
"[email protected]",
LandlordRegistrationConfirmationEmail(createdLandlordRegNum.toString(), LANDLORD_DASHBOARD_URL),
LandlordRegistrationConfirmationEmail(createdLandlordRegNum.toString(), absoluteLandlordUrl),
)

val confirmationPage = assertPageIs(page, ConfirmationPageLandlordRegistration::class)
Expand Down Expand Up @@ -213,7 +215,7 @@ class LandlordRegistrationJourneyTests : IntegrationTest() {

verify(confirmationEmailSender).sendEmail(
"[email protected]",
LandlordRegistrationConfirmationEmail(createdLandlordRegNum.toString(), LANDLORD_DASHBOARD_URL),
LandlordRegistrationConfirmationEmail(createdLandlordRegNum.toString(), absoluteLandlordUrl),
)

val confirmationPage = assertPageIs(page, ConfirmationPageLandlordRegistration::class)
Expand Down Expand Up @@ -271,7 +273,7 @@ class LandlordRegistrationJourneyTests : IntegrationTest() {

verify(confirmationEmailSender).sendEmail(
"[email protected]",
LandlordRegistrationConfirmationEmail(createdLandlordRegNum.toString(), LANDLORD_DASHBOARD_URL),
LandlordRegistrationConfirmationEmail(createdLandlordRegNum.toString(), absoluteLandlordUrl),
)

val confirmationPage = assertPageIs(page, ConfirmationPageLandlordRegistration::class)
Expand Down
Loading

0 comments on commit d3323eb

Please sign in to comment.