handlers/product-move-api/OpenAPISpec.yaml (239 lines of code) (raw):
openapi: 3.0.3
info:
title: Product Movement API
version: 0.0.1
description: |-
API to facilitate replacing an existing subscription
with another subscription for a different type of product.
paths:
/available-product-moves/{subscriptionName}:
get:
summary: Gets available products that can be moved to from the given subscription.
description: |
Returns an array of eligible products that the given subscription could be moved to,
which will be empty if there aren't any for the given subscription.
operationId: getAvailable-product-movesSubscriptionname
parameters:
- name: subscriptionName
in: path
description: Name of subscription whose eligibility for movement is to be
checked.
required: true
schema:
type: string
example: A-S000001
responses:
'200':
description: Success.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/product'
'404':
description: No such subscription.
content:
text/plain:
schema:
type: string
/product-move/{subscriptionName}:
post:
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.
operationId: postProduct-moveSubscriptionname
parameters:
- name: subscriptionName
in: path
description: Name of subscription to be moved to a different product.
required: true
schema:
type: string
example: A-S000001
requestBody:
description: Definition of required movement.
content:
application/json:
schema:
required:
- price
- preview
type: object
properties:
price:
type: number
description: Price of new Supporter Plus subscription
preview:
type: boolean
description: Whether to preview the move or to carry it out
required: true
responses:
'200':
description: Update Success.
content:
application/json:
schema:
required:
- amountPayableToday
- contributionRefundAmount
- supporterPlusPurchaseAmount
type: object
properties:
amountPayableToday:
type: number
description: The amount payable by the customer today
contributionRefundAmount:
type: number
description: The amount refunded from the cancelled contribution
supporterPlusPurchaseAmount:
type: number
description: The cost of the new supporter plus subscription
'500':
description: InternalServerError.
content:
text/plain:
schema:
type: string
'400':
description: 'Invalid value for: body'
content:
text/plain:
schema:
type: string
/supporter-plus-cancel/{subscriptionName}:
post:
summary: Cancels the subscription at the soonest possible date based on the
subscription type.
description: |-
Cancels the existing subscription at the default/soonest date.
Also manages all the service comms associated with the cancellation.
operationId: postSupporter-plus-cancelSubscriptionname
parameters:
- name: subscriptionName
in: path
description: Name of subscription to cancel.
required: true
schema:
type: string
example: A-S000001
requestBody:
description: Information to describe the nature of the cancellation
content:
application/json:
schema:
required:
- reason
type: object
properties:
reason:
type: string
description: User cancellation reason - from a picklist.
example: mma_other
required: true
responses:
'200':
description: Successfully cancelled the subscription.
content:
application/json:
schema:
required:
- message
type: object
properties:
message:
type: string
'500':
description: InternalServerError.
content:
text/plain:
schema:
type: string
'400':
description: 'Invalid value for: body'
content:
text/plain:
schema:
type: string
components:
schemas:
billing:
type: object
properties:
amount:
type: integer
description: |-
Absolute amount that will be billed in pence or cents etc.
Either this field or the percentage field will be populated.
format: int32
example: 1199
percentage:
type: integer
description: |-
Percentage of standard amount that will be billed.
This field only makes sense if the billing object is attached to an introductory offer.
Either this field or the amount field will be populated.
format: int32
example: 50
currency:
required:
- code
- symbol
type: object
properties:
code:
type: string
description: ISO 4217 alphabetic currency code.
example: GBP
symbol:
type: string
description: ISO 4217 currency symbol.
example: £
frequency:
$ref: '#/components/schemas/timePeriod'
startDate:
type: string
description: |-
Date on which first service period for product subscription begins.
This probably won't be known reliably before a subscription has actually been set up,
so it's an optional field.
In ISO 8601 format.
example: '2022-06-21'
description: Amount and frequency of billing.
offer:
required:
- billing
- duration
type: object
properties:
billing:
$ref: '#/components/schemas/billing'
duration:
$ref: '#/components/schemas/timePeriod'
description: |-
An optional special offer that begins either when a subscription begins
or at the end of a free trial
and lasts for a given period of time.
product:
required:
- id
- name
- billing
type: object
properties:
id:
type: string
description: ID of product in Zuora product catalogue.
name:
type: string
description: Name of product in Zuora product catalogue.
example: Digital Pack
billing:
$ref: '#/components/schemas/billing'
trial:
$ref: '#/components/schemas/trial'
introOffer:
$ref: '#/components/schemas/offer'
description: A product that's available for subscription.
timePeriod:
required:
- name
- count
type: object
properties:
name:
type: string
description: Time unit.
example: month
enum:
- month
- year
count:
type: integer
description: Number of time units in this time period.
format: int32
trial:
required:
- dayCount
type: object
properties:
dayCount:
type: integer
description: Number of days that free trial lasts.
format: int32
example: 14
description: |-
An optional free trial that begins when a subscription begins
and lasts for a given number of days.