Skip to content

Commit

Permalink
Merge '#146' SAR-4562 - New Registration Connector
Browse files Browse the repository at this point in the history
  • Loading branch information
r-melvin committed Sep 16, 2019
2 parents 17aa2fa + 7117f1a commit c70e456
Show file tree
Hide file tree
Showing 9 changed files with 276 additions and 151 deletions.
17 changes: 13 additions & 4 deletions app/config/MicroserviceAppConfig.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

package config

import javax.inject.{Inject, Singleton}
import config.featureswitch.FeatureSwitching
import play.api.{Application, Configuration}
import javax.inject.{Inject, Singleton}
import play.api.Configuration
import uk.gov.hmrc.play.bootstrap.config.ServicesConfig


Expand All @@ -27,14 +27,18 @@ trait AppConfig {
val ggURL: String
val ggAdminURL: String
val ggAuthenticationURL: String

def desURL: String

val desEnvironment: String
val desToken: String
val paperlessPreferencesExpirySeconds: Int
val desAuthorisationToken: String
val desEnvironmentHeader: (String, String)
}

@Singleton
class MicroserviceAppConfig @Inject()(val configuration: Configuration, servicesConfig:ServicesConfig) extends AppConfig with FeatureSwitching {
class MicroserviceAppConfig @Inject()(val configuration: Configuration, servicesConfig: ServicesConfig) extends AppConfig with FeatureSwitching {

private def loadConfig(key: String) = configuration.getString(key).getOrElse(throw new Exception(s"Missing configuration key: $key"))

Expand All @@ -49,6 +53,11 @@ class MicroserviceAppConfig @Inject()(val configuration: Configuration, services

override def desURL: String = loadConfig(s"$desBase.url")

lazy val desAuthorisationToken: String = s"Bearer ${loadConfig(s"$desBase.authorization-token")}"

lazy val desEnvironmentHeader: (String, String) =
"Environment" -> loadConfig(s"$desBase.environment")

override lazy val desEnvironment = loadConfig(s"$desBase.environment")
override lazy val desToken = loadConfig(s"$desBase.authorization-token")
override val paperlessPreferencesExpirySeconds: Int = {
Expand All @@ -57,5 +66,5 @@ class MicroserviceAppConfig @Inject()(val configuration: Configuration, services
.getOrElse(throw new Exception(s"Missing configuration key: $key"))
}

protected def runModeConfiguration: Configuration = configuration
protected def runModeConfiguration: Configuration = configuration
}
5 changes: 2 additions & 3 deletions app/connectors/BusinessDetailsConnector.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,10 @@

package connectors

import javax.inject.Inject

import audit.{Logging, LoggingConfig}
import config.AppConfig
import connectors.utils.ConnectorUtils
import javax.inject.Inject
import models.ErrorModel
import models.registration.{GetBusinessDetailsFailureResponseModel, GetBusinessDetailsSuccessResponseModel}
import play.api.http.Status._
Expand Down Expand Up @@ -51,7 +50,7 @@ class BusinessDetailsConnector @Inject()(appConfig: AppConfig,
def getBusinessDetails(nino: String)(implicit hc: HeaderCarrier): Future[GetBusinessDetailsUtil.Response] = {
import BusinessDetailsConnector.auditGetBusinessDetails
import GetBusinessDetailsUtil._
implicit val loggingConfig = RegistrationConnector.getRegistrationLoggingConfig
implicit val loggingConfig = connectors.deprecated.RegistrationConnector.getRegistrationLoggingConfig
lazy val requestDetails: Map[String, String] = Map("nino" -> nino)
val updatedHc = createHeaderCarrierGet(hc)
logging.debug(s"Request:\n$requestDetails\n\nRequest Headers:\n$updatedHc")
Expand Down
171 changes: 33 additions & 138 deletions app/connectors/RegistrationConnector.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,153 +16,48 @@

package connectors

import javax.inject.Inject

import audit.{Logging, LoggingConfig}
import config.AppConfig
import connectors.utils.ConnectorUtils
import models.ErrorModel
import models.registration._
import play.api.http.Status._
import play.api.libs.json.{JsValue, Writes}
import uk.gov.hmrc.http._
import connectors.RegistrationConnector._
import javax.inject.Inject
import play.api.libs.json._
import uk.gov.hmrc.http.HeaderCarrier
import uk.gov.hmrc.http.HttpReads.readRaw
import uk.gov.hmrc.http.logging.Authorization
import uk.gov.hmrc.play.bootstrap.http.HttpClient

import scala.annotation.switch
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{ExecutionContext, Future}

class RegistrationConnector @Inject()(appConfig: AppConfig,
logging: Logging,
httpClient: HttpClient
) (implicit ec: ExecutionContext) extends RawResponseReads {

import Logging._

lazy val urlHeaderAuthorization: String = s"Bearer ${appConfig.desToken}"

// DES API numbering [MTD API numbering]
// API4 [API 9]
def newRegistrationUrl(nino: String): String = s"${appConfig.desURL}${RegistrationConnector.newRegistrationUri(nino)}"

// API 1(b) [API 1 (b)]
def getRegistrationUrl(nino: String): String = s"${appConfig.desURL}${RegistrationConnector.getRegistrationUri(nino)}"

def createHeaderCarrierPost(headerCarrier: HeaderCarrier): HeaderCarrier =
headerCarrier.withExtraHeaders("Environment" -> appConfig.desEnvironment, "Content-Type" -> "application/json")
.copy(authorization = Some(Authorization(urlHeaderAuthorization)))

def createHeaderCarrierGet(headerCarrier: HeaderCarrier): HeaderCarrier =
headerCarrier.withExtraHeaders("Environment" -> appConfig.desEnvironment)
.copy(authorization = Some(Authorization(urlHeaderAuthorization)))

def register(nino: String, registration: RegistrationRequestModel)(implicit hc: HeaderCarrier): Future[NewRegistrationUtil.Response] = {
import NewRegistrationUtil._
import RegistrationConnector.auditRegisterName

implicit val loggingConfig = RegistrationConnector.registerLoggingConfig
lazy val requestDetails: Map[String, String] = Map("nino" -> nino, "requestJson" -> (registration: JsValue).toString)
val updatedHc = createHeaderCarrierPost(hc)

logging.debug(s"Request:\n$requestDetails\n\nRequest Headers:\n$updatedHc")
httpClient.POST[RegistrationRequestModel, HttpResponse](newRegistrationUrl(nino), registration)(
implicitly[Writes[RegistrationRequestModel]], implicitly[HttpReads[HttpResponse]], updatedHc, ec)
.map { response =>
response.status match {
case OK =>
logging.info("Registration responded with OK")
parseSuccess(response.body)
case status =>
@switch
val suffix = status match {
case BAD_REQUEST => eventTypeBadRequest
case NOT_FOUND => eventTypeNotFound
case CONFLICT => eventTypeConflict
case INTERNAL_SERVER_ERROR => eventTypeInternalServerError
case SERVICE_UNAVAILABLE => eventTypeServerUnavailable
case _ => eventTypeUnexpectedError
}
logging.audit(
transactionName = auditRegisterName,
detail = requestDetails + ("response" -> response.body),
auditType = auditRegisterName + "-" + suffix
)(updatedHc)

val parseResponse@Left(ErrorModel(_, optCode, message)) = parseFailure(status, response.body)
val code: String = optCode.getOrElse("N/A")
logging.warn(s"Registration responded with an error, status=$status code=$code message=$message")

parseResponse
}
}
}

def getRegistration(nino: String)(implicit hc: HeaderCarrier): Future[GetRegistrationUtil.Response] = {
import GetRegistrationUtil._
import RegistrationConnector.auditGetRegistrationName

implicit val loggingConfig = RegistrationConnector.getRegistrationLoggingConfig
lazy val requestDetails: Map[String, String] = Map("nino" -> nino)
val updatedHc = createHeaderCarrierGet(hc)

lazy val auditRequest = logging.auditFor(auditGetRegistrationName, requestDetails)(updatedHc)
auditRequest(eventTypeRequest)

logging.debug(s"Request:\n$requestDetails\n\nRequest Headers:\n$updatedHc")
httpClient.GET[HttpResponse](getRegistrationUrl(nino))(implicitly[HttpReads[HttpResponse]], updatedHc, ec)
.map { response =>
response.status match {
case OK =>
logging.info("Get Registration responded with an OK")
parseSuccess(response.body)
case status =>
@switch
val suffix = status match {
case BAD_REQUEST => eventTypeBadRequest
case NOT_FOUND => eventTypeNotFound
case INTERNAL_SERVER_ERROR => eventTypeInternalServerError
case SERVICE_UNAVAILABLE => eventTypeServerUnavailable
case _ => eventTypeUnexpectedError
}
logging.audit(
transactionName = auditGetRegistrationName,
detail = requestDetails + ("response" -> response.body),
auditType = auditGetRegistrationName + "-" + suffix
)(updatedHc)

val parseResponse@Left(ErrorModel(_, optCode, message)) = parseFailure(status, response.body)
val code: String = optCode.getOrElse("N/A")
logging.warn(s"Get Registration responded with an error, status=$status code=$code message=$message")

parseResponse
}
}
httpClient: HttpClient)(implicit ec: ExecutionContext) {
def register(nino: String, isAnAgent: Boolean)(implicit hc: HeaderCarrier): Future[RegistrationSuccess.type] = {
val headerCarrier = hc
.withExtraHeaders(appConfig.desEnvironmentHeader)
.copy(authorization = Some(Authorization(appConfig.desAuthorisationToken)))

httpClient.POST(appConfig.desURL + registrationUrl(nino), registerRequestBody(isAnAgent))(
implicitly[Writes[JsObject]],
readRaw,
headerCarrier,
implicitly[ExecutionContext]
) map (_ => RegistrationSuccess)
}

}

object RegistrationConnector {

val auditRegisterName = "register-api-4"

val auditGetRegistrationName = "getRegistration-api-1(b)"

import _root_.utils.Implicits.optionUtl
case object RegistrationSuccess

val registerLoggingConfig: Option[LoggingConfig] = LoggingConfig(heading = "RegistrationConnector.register")

val getRegistrationLoggingConfig: Option[LoggingConfig] = LoggingConfig(heading = "RegistrationConnector.getRegistration")

// DES API numbering [MTD API numbering]
// API4 [API 9]
def newRegistrationUri(nino: String): String = s"/registration/individual/nino/$nino"

// API 1(b) [API 1 (b)]
def getRegistrationUri(nino: String): String = s"/registration/details?nino=$nino"
object RegistrationConnector {
val RegimeKey = "regime"
val ItsaRegime = "ITSA"
val RequiresNameMatchkey = "requiresNameMatch"
val IsAnAgentKey = "isAnAgent"

def registrationUrl(nino: String): String = s"/registration/individual/nino/$nino"

def registerRequestBody(isAnAgent: Boolean): JsObject = {
Json.obj(
RegimeKey -> ItsaRegime,
RequiresNameMatchkey -> false,
IsAnAgentKey -> isAnAgent
)
}
}


object NewRegistrationUtil extends ConnectorUtils[NewRegistrationFailureResponseModel, RegistrationSuccessResponseModel]

object GetRegistrationUtil extends ConnectorUtils[GetRegistrationFailureResponseModel, RegistrationSuccessResponseModel]
Loading

0 comments on commit c70e456

Please sign in to comment.