def main()

in handlers/product-move-api/src/main/scala/com/gu/productmove/endpoint/move/ProductMoveEndpoint.scala [48:147]


  def main(args: Array[String]): Unit = LambdaEndpoint.runTest(
    run(
      SwitchType.RecurringContributionToSupporterPlus,
      SubscriptionName("A-S00448793"),
      ExpectedInput(1, false, None, None),
      None,
    ),
  )

  val server: sttp.tapir.server.ServerEndpoint.Full[
    Unit,
    Unit,
    (SwitchType, SubscriptionName, ProductMoveEndpointTypes.ExpectedInput, Option[IdentityId]),
    Unit,
    ProductMoveEndpointTypes.OutputBody,
    Any,
    Task,
  ] = {
    val subscriptionNameCapture: EndpointInput.PathCapture[SubscriptionName] = {
      EndpointInput.PathCapture[SubscriptionName](
        Some("subscriptionName"),
        implicitly,
        EndpointIO.Info.empty.copy(
          description = Some("Name of subscription to be moved to a different product."),
          examples = List(Example(SubscriptionName("A-S000001"), None, None)),
        ), // A-S000001
      )
    }

    given PlainCodec[SwitchType] =
      Codec.derivedEnumeration[String, SwitchType](
        id => SwitchType.values.find(_.id == id),
        _.id,
      )

    val switchTypeCapture: EndpointInput.PathCapture[SwitchType] = {
      EndpointInput.PathCapture[SwitchType](
        Some("switchType"),
        implicitly,
        EndpointIO.Info.empty.copy(
          description = Some("Switch type."),
          examples = List(
            Example(SwitchType.RecurringContributionToSupporterPlus, None, None),
            Example(SwitchType.ToRecurringContribution, None, None),
          ),
        ), // A-S000001
      )
    }

    val endpointDescription: PublicEndpoint[
      (SwitchType, SubscriptionName, ProductMoveEndpointTypes.ExpectedInput, Option[IdentityId]),
      Unit,
      ProductMoveEndpointTypes.OutputBody,
      Any,
    ] =
      endpoint.post
        .in("product-move")
        .in(switchTypeCapture)
        .in(subscriptionNameCapture)
        .in(
          jsonBody[ExpectedInput].copy(info =
            EndpointIO.Info.empty[ExpectedInput].copy(description = Some("Definition of required movement.")),
          ),
        )
        .in(header[Option[IdentityId]]("x-identity-id"))
        .out(
          oneOf(
            oneOfVariant(
              sttp.model.StatusCode.Ok,
              jsonBody[Success].copy(info = EndpointIO.Info.empty.copy(description = Some("Update Success."))),
            ),
            oneOfVariant(
              sttp.model.StatusCode.Ok,
              jsonBody[PreviewResult].copy(info = EndpointIO.Info.empty.copy(description = Some("Preview result."))),
            ),
            oneOfVariant(
              sttp.model.StatusCode.InternalServerError,
              jsonBody[InternalServerError]
                .copy(info = EndpointIO.Info.empty.copy(description = Some("InternalServerError."))),
            ),
            oneOfVariant(
              sttp.model.StatusCode.BadRequest,
              jsonBody[BadRequest]
                .copy(info = EndpointIO.Info.empty.copy(description = Some("BadRequest."))),
            ),
            oneOfVariant(
              TransactionErrorStatusCode,
              jsonBody[TransactionError]
                .copy(info = EndpointIO.Info.empty.copy(description = Some("TransactionError."))),
            ),
          ),
        )
        .summary("Replaces the existing subscription with a new one.")
        .description(
          """Cancels the existing subscription and replaces it with a new subscription
            |to a different type of product.
            |Also manages all the service comms associated with the movement.""".stripMargin,
        )
    endpointDescription.serverLogic[Task](run)
  }