diff --git a/code/API_definitions/geofencing-subscriptions.yaml b/code/API_definitions/geofencing-subscriptions.yaml index e08512e..462ff0d 100644 --- a/code/API_definitions/geofencing-subscriptions.yaml +++ b/code/API_definitions/geofencing-subscriptions.yaml @@ -36,7 +36,7 @@ info: It is mandatory in the subscription to provide the event `type` for which the client would like to subscribe. - Following event ``type`` are managed for this API: + Following event ``types`` are managed for this API: - ``org.camaraproject.geofencing-subscriptions.v0.area-entered`` - Event triggered when the device enters the given area - ``org.camaraproject.geofencing-subscriptions.v0.area-left`` - Event triggered when the device leaves the given area @@ -47,21 +47,23 @@ info: It is used when: - the subscription expire time (optionally set by the requester) has been reached - the maximum number of subscription events (optionally set by the requester) has been reached + - the Access Token `sinkCredential` (optionally set by the requester) expiration time has been reached - the API server has to stop sending notification prematurely ### Notification callback - This endpoint describes the event notification received on subscription listener side when the event occurred. As for subscription, detailed description of the event notification is provided in the CAMARA API design guideline document. + This endpoint describes the event notification received on subscription listener side when the event occurred. + As for subscription, detailed description of the event notification is provided in the CAMARA API design guideline document. - _**WARNING**: This callback endpoint must be exposed on the consumer side as `POST /{$request.body#/webhook/notificationUrl}`. + _**WARNING**: This callback endpoint must be exposed on the consumer side as `POST /{$request.body#/sink}`. Developers may provide a callback URL on which notifications regarding geofencing can be received from the service provider. - If an event occurs the application will send events to the provided webhook - 'notificationUrl'._ + If an event occurs the application will send events to the provided webhook - 'sink'._ # Further info and support (FAQs will be added in a later version of the documentation) - termsOfService: http://swagger.io/terms/ + termsOfService: https://swagger.io/terms/ contact: email: project-email@sample.com license: @@ -91,27 +93,32 @@ paths: description: Create a subscription for a device to receive notifications when a device enters or exits a specified area operationId: createSubscription parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "#/components/parameters/x-correlator" + security: + - openId: + - geofencing-subscriptions:org.camaraproject.geofencing-subscriptions.v0.area-entered:create + - geofencing-subscriptions:org.camaraproject.geofencing-subscriptions.v0.area-left:create requestBody: content: application/json: schema: - $ref: "#/components/schemas/CreateSubscription" + $ref: "#/components/schemas/SubscriptionRequest" examples: CIRCLE_AREA_ENTERED: $ref: "#/components/examples/REQUEST_CIRCLE_AREA_ENTERED" required: true callbacks: - event-notifications: - "{$request.body#/webhook/notificationUrl}": + notifications: + "{$request.body#/sink}": post: - summary: "Subscription notification callback" + summary: "notifications callback" description: | Important: this endpoint is to be implemented by the API consumer. - The Device Location server will call this endpoint whenever a device geofencing related event occurs. + The Geofencing server will call this endpoint whenever a Geofencing event occurs. + `operationId` value will have to be replaced accordingly with WG API specific semantic operationId: postNotification parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "#/components/parameters/x-correlator" requestBody: required: true content: @@ -130,13 +137,17 @@ paths: description: Successful notification headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" "400": $ref: "#/components/responses/Generic400" "401": $ref: "#/components/responses/Generic401" "403": $ref: "#/components/responses/Generic403" + "410": + $ref: "#/components/responses/Generic410" + "429": + $ref: "#/components/responses/Generic429" "500": $ref: "#/components/responses/Generic500" "503": @@ -149,48 +160,62 @@ paths: description: Created (Successful creation of subscription) headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/Subscription" + "202": + description: Request accepted to be processed. It applies for async creation process. + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" content: application/json: schema: - $ref: "#/components/schemas/SubscriptionInfo" + $ref: "#/components/schemas/SubscriptionAsync" "400": - $ref: "#/components/responses/Generic400" + $ref: "#/components/responses/CreateSubscriptionBadRequest400" "401": $ref: "#/components/responses/Generic401" "403": - $ref: "#/components/responses/Generic403" + $ref: "#/components/responses/CreateSubscription403" "409": $ref: "#/components/responses/Generic409" + "415": + $ref: "#/components/responses/Generic415" + "422": + $ref: "#/components/responses/CreateSubscription422" + "429": + $ref: "#/components/responses/Generic429" "500": $ref: "#/components/responses/Generic500" "503": $ref: "#/components/responses/Generic503" - security: - - openId: - - geofencing-subscriptions:org.camaraproject.geofencing-subscriptions.v0.area-entered:create - - geofencing-subscriptions:org.camaraproject.geofencing-subscriptions.v0.area-left:create get: tags: - Geofencing subscriptions - summary: "Operation to retrieve a list of subscriptions." - operationId: getSubscriptionList - description: Operation to list subscriptions authorized to be retrieved by the provided access token. + summary: "Retrieve a list of geofencing event subscription" + description: Retrieve a list of geofencing event subscription(s) + operationId: retrieveGeofencingSubscriptionList parameters: - - $ref: '#/components/parameters/x-correlator' + - $ref: "#/components/parameters/x-correlator" + security: + - openId: + - geofencing-subscriptions:read responses: "200": - description: The list of subscriptions is retrieved. + description: List of event subscription details headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" content: application/json: schema: type: array minItems: 0 items: - $ref: "#/components/schemas/SubscriptionInfo" + $ref: "#/components/schemas/Subscription" "400": $ref: "#/components/responses/Generic400" "401": @@ -201,37 +226,31 @@ paths: $ref: "#/components/responses/Generic500" "503": $ref: "#/components/responses/Generic503" - security: - - openId: - - geofencing-subscriptions:read - - /subscriptions/{subscriptionsId}: + /subscriptions/{subscriptionId}: get: tags: - Geofencing subscriptions summary: "Operation to retrieve a subscription based on the provided ID" - operationId: getSubscription - description: Retrieve a given subscription by ID + description: retrieve Geofencing subscription information for a given subscription ID. + operationId: retrieveGeofencingSubscription + security: + - openId: + - geofencing-subscriptions:read parameters: - - $ref: '#/components/parameters/x-correlator' - - name: subscriptionsId - in: path - description: Subscription identifier that was obtained from the create event subscription operation - required: true - schema: - type: string + - $ref: "#/components/parameters/SubscriptionId" + - $ref: "#/components/parameters/x-correlator" responses: "200": - description: Contains information about Subscriptions + description: OK headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" content: application/json: schema: - $ref: "#/components/schemas/SubscriptionInfo" + $ref: "#/components/schemas/Subscription" "400": - $ref: "#/components/responses/Generic400" + $ref: "#/components/responses/SubscriptionIdRequired" "401": $ref: "#/components/responses/Generic401" "403": @@ -242,32 +261,35 @@ paths: $ref: "#/components/responses/Generic500" "503": $ref: "#/components/responses/Generic503" - security: - - openId: - - geofencing-subscriptions:read delete: tags: - Geofencing subscriptions - summary: "Operation to delete a subscription" - operationId: deleteSubscription - description: Delete a given subscription by ID - + summary: "Delete a Geofencing event subscription" + operationId: deleteGeofencingSubscription + description: delete a given Geofencing subscription. + security: + - openId: + - geofencing-subscriptions:delete parameters: - - $ref: '#/components/parameters/x-correlator' - - name: subscriptionsId - in: path - description: subscription identifier - required: true - schema: - type: string + - $ref: "#/components/parameters/SubscriptionId" + - $ref: "#/components/parameters/x-correlator" responses: "204": - description: Event subscription deleted + description: Geofencing subscription deleted + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + "202": + description: Request accepted to be processed. It applies for async deletion process. headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/SubscriptionAsync" "400": - $ref: "#/components/responses/Generic400" + $ref: "#/components/responses/SubscriptionIdRequired" "401": $ref: "#/components/responses/Generic401" "403": @@ -278,16 +300,19 @@ paths: $ref: "#/components/responses/Generic500" "503": $ref: "#/components/responses/Generic503" - security: - - openId: - - geofencing-subscriptions:delete - components: securitySchemes: openId: type: openIdConnect openIdConnectUrl: https://example.com/.well-known/openid-configuration parameters: + SubscriptionId: + name: subscriptionId + in: path + description: Subscription identifier that was obtained from the create event subscription operation + required: true + schema: + $ref: "#/components/schemas/SubscriptionId" x-correlator: name: x-correlator in: header @@ -300,79 +325,300 @@ components: schema: type: string schemas: - Area: + ErrorInfo: + description: The error info object for possible error cases type: object + required: + - status + - code + - message properties: - areaType: - $ref: "#/components/schemas/AreaType" + status: + type: integer + description: HTTP response status code + code: + type: string + description: Code given to this error + message: + type: string + description: Detailed error description + + SubscriptionRequest: + description: The request for creating a event-type event subscription + type: object required: - - areaType + - sink + - protocol + - config + - types + properties: + protocol: + $ref: "#/components/schemas/Protocol" + sink: + type: string + format: url + description: The address to which events shall be delivered using the selected protocol. + example: "https://endpoint.example.com/sink" + sinkCredential: + allOf: + - description: A sink credential provides authentication or authorization information necessary to enable delivery of events to a target. + - $ref: "#/components/schemas/SinkCredential" + types: + description: | + Camara Event types eligible to be delivered by this subscription. + Note: As of now we enforce to have only event type per subscription. + type: array + minItems: 1 + maxItems: 1 + items: + $ref: "#/components/schemas/SubscriptionEventType" + config: + $ref: "#/components/schemas/Config" discriminator: - propertyName: areaType + propertyName: protocol mapping: - CIRCLE: "#/components/schemas/Circle" - - AreaType: + HTTP: "#/components/schemas/HTTPSubscriptionRequest" + MQTT3: "#/components/schemas/MQTTSubscriptionRequest" + MQTT5: "#/components/schemas/MQTTSubscriptionRequest" + AMQP: "#/components/schemas/AMQPSubscriptionRequest" + NATS: "#/components/schemas/NATSSubscriptionRequest" + KAFKA: "#/components/schemas/ApacheKafkaSubscriptionRequest" + + Protocol: type: string + enum: ["HTTP", "MQTT3", "MQTT5", "AMQP", "NATS", "KAFKA"] + description: Identifier of a delivery protocol. Only HTTP is allowed for now + example: "HTTP" + + Config: description: | - Type of this area. - CIRCLE - The area is defined as a circle. - enum: - - CIRCLE + Implementation-specific configuration parameters needed by the subscription manager for acquiring events. + In CAMARA we have predefined attributes like `subscriptionExpireTime`, `subscriptionMaxEvents`, `initialEvent` + Specific event type attributes must be defined in `subscriptionDetail` + Note: if a request is performed for several event type, all subscribed event will use same `config` parameters. + type: object + required: + - subscriptionDetail + properties: + subscriptionDetail: + $ref: "#/components/schemas/SubscriptionDetail" + subscriptionExpireTime: + type: string + format: date-time + example: 2023-01-17T13:18:23.682Z + description: The subscription expiration time (in date-time format) requested by the API consumer. + subscriptionMaxEvents: + type: integer + description: Identifies the maximum number of event reports to be generated (>=1) requested by the API consumer - Once this number is reached, the subscription ends. + minimum: 1 + example: 5 + initialEvent: + type: boolean + description: | + Set to `true` by API consumer if consumer wants to get an event as soon as the subscription is created and current situation reflects event request. + Example: Consumer request area entered event. If consumer sets initialEvent to true and device is already in the geofence, an event is triggered - Circle: - description: Circular area + SinkCredential: + type: object + properties: + credentialType: + type: string + enum: + - PLAIN + - ACCESSTOKEN + - REFRESHTOKEN + description: "The type of the credential." + discriminator: + propertyName: credentialType + mapping: + PLAIN: "#/components/schemas/PlainCredential" + ACCESSTOKEN: "#/components/schemas/AccessTokenCredential" + REFRESHTOKEN: "#/components/schemas/RefreshTokenCredential" + required: + - credentialType + PlainCredential: + type: object + description: A plain credential as a combination of an identifier and a secret. allOf: - - $ref: "#/components/schemas/Area" + - $ref: "#/components/schemas/SinkCredential" - type: object + required: + - identifier + - secret properties: - center: - $ref: "#/components/schemas/Point" - radius: - type: integer - description: Expected accuracy for the subscription event of device location in m, from location (radius) - minimum: 2000 - maximum: 200000 + identifier: + description: The identifier might be an account or username. + type: string + secret: + description: The secret might be a password or passphrase. + type: string + AccessTokenCredential: + type: object + description: An access token credential. + allOf: + - $ref: "#/components/schemas/SinkCredential" + - type: object + properties: + accessToken: + description: REQUIRED. An access token is a previously acquired token granting access to the target resource. + type: string + accessTokenExpiresUtc: + type: string + format: date-time + description: REQUIRED. An absolute UTC instant at which the token shall be considered expired. + accessTokenType: + description: REQUIRED. Type of the access token (See [OAuth 2.0](https://tools.ietf.org/html/rfc6749#section-7.1)). + type: string + enum: + - bearer required: - - center - - radius - example: - areaType: CIRCLE - center: - latitude: 50.735851 - longitude: 7.10066 - radius: 50000 - - Point: + - accessToken + - accessTokenExpiresUtc + - accessTokenType + RefreshTokenCredential: type: object - description: Coordinates (latitude, longitude) defining a location in a map + description: An access token credential with a refresh token. + allOf: + - $ref: "#/components/schemas/SinkCredential" + - type: object + properties: + accessToken: + description: REQUIRED. An access token is a previously acquired token granting access to the target resource. + type: string + accessTokenExpiresUtc: + type: string + format: date-time + description: REQUIRED. An absolute UTC instant at which the token shall be considered expired. + accessTokenType: + description: REQUIRED. Type of the access token (See [OAuth 2.0](https://tools.ietf.org/html/rfc6749#section-7.1)). + type: string + enum: + - bearer + refreshToken: + description: REQUIRED. An refresh token credential used to acquire access tokens. + type: string + refreshTokenEndpoint: + type: string + format: uri + description: REQUIRED. A URL at which the refresh token can be traded for an access token. required: - - latitude - - longitude + - accessToken + - accessTokenExpiresUtc + - accessTokenType + - refreshToken + - refreshTokenEndpoint + + SubscriptionDetail: + description: The detail of the requested event subscription + type: object properties: - latitude: - $ref: "#/components/schemas/Latitude" - longitude: - $ref: "#/components/schemas/Longitude" - example: - latitude: 50.735851 - longitude: 7.10066 + device: + $ref: "#/components/schemas/Device" + area: + $ref: "#/components/schemas/Area" + required: + - device + - area - Latitude: - description: Latitude component of a location - type: number - format: double - minimum: -90 - maximum: 90 - example: 50.735851 + SubscriptionEventType: + type: string + description: | + area-entered - Event triggered when the device enters the given area - Longitude: - description: Longitude component of location - type: number - format: double - minimum: -180 - maximum: 180 - example: 7.10066 + area-left - Event triggered when the device leaves the given area + enum: + - org.camaraproject.geofencing-subscriptions.v0.area-entered + - org.camaraproject.geofencing-subscriptions.v0.area-left + + NotificationEventType: + type: string + description: | + area-entered - Event triggered when the device enters the given area + + area-left - Event triggered when the device leaves the given area + + subscription-ends - Event triggered when the subscription ends + enum: + - org.camaraproject.geofencing-subscriptions.v0.area-entered + - org.camaraproject.geofencing-subscriptions.v0.area-left + - org.camaraproject.geofencing-subscriptions.v0.subscription-ends + + Subscription: + description: Represents a event-type subscription. + type: object + required: + - sink + - protocol + - config + - types + - id + - startsAt + properties: + protocol: + $ref: "#/components/schemas/Protocol" + sink: + type: string + format: url + description: The address to which events shall be delivered using the selected protocol. + example: "https://endpoint.example.com/sink" + sinkCredential: + $ref: "#/components/schemas/SinkCredential" + types: + description: | + Camara Event types eligible to be delivered by this subscription. + type: array + items: + type: string + config: + $ref: "#/components/schemas/Config" + id: + type: string + description: The unique identifier of the subscription in the scope of the subscription manager. When this information is contained within an event notification, this concept SHALL be referred as `subscriptionId` as per [Commonalities Event Notification Model](https://github.com/camaraproject/Commonalities/blob/main/documentation/API-design-guidelines.md#122-event-notification). + example: "1119920371" + startsAt: + type: string + format: date-time + description: Date when the event subscription will begin/began + expiresAt: + type: string + format: date-time + description: Date when the event subscription will expire. Only provided when `subscriptionExpireTime` is indicated by API client or Telco Operator has specific policy about that. + status: + type: string + description: |- + Current status of the subscription - Management of Subscription State engine is not mandatory for now. Note not all statuses may be considered to be implemented. Details: + - `ACTIVATION_REQUESTED`: Subscription creation (POST) is triggered but subscription creation process is not finished yet. + - `ACTIVE`: Subscription creation process is completed. Subscription is fully operative. + - `INACTIVE`: Subscription is temporarily inactive, but its workflow logic is not deleted. + - `EXPIRED`: Subscription is ended (no longer active). This status applies when subscription is ended due to `SUBSCRIPTION_EXPIRED` or `ACCESS_TOKEN_EXPIRED` event. + - `DELETED`: Subscription is ended as deleted (no longer active). This status applies when subscription information is kept (i.e. subscription workflow is no longer active but its meta-information is kept). + enum: + - ACTIVATION_REQUESTED + - ACTIVE + - EXPIRED + - INACTIVE + - DELETED + discriminator: + propertyName: protocol + mapping: + HTTP: "#/components/schemas/HTTPSubscriptionResponse" + MQTT3: "#/components/schemas/MQTTSubscriptionResponse" + MQTT5: "#/components/schemas/MQTTSubscriptionResponse" + AMQP: "#/components/schemas/AMQPSubscriptionResponse" + NATS: "#/components/schemas/NATSSubscriptionResponse" + KAFKA: "#/components/schemas/ApacheKafkaSubscriptionResponse" + + SubscriptionAsync: + description: Response for a event-type subscription request managed asynchronously (Creation or Deletion) + type: object + properties: + id: + $ref: "#/components/schemas/SubscriptionId" + + SubscriptionId: + type: string + description: The unique identifier of the subscription in the scope of the subscription manager. When this information is contained within an event notification, this concept SHALL be referred as `subscriptionId` as per [Commonalities Event Notification Model](https://github.com/camaraproject/Commonalities/blob/main/documentation/API-design-guidelines.md#122-event-notification). + example: qs15-h556-rt89-1298 Device: description: | @@ -452,174 +698,112 @@ components: format: ipv6 example: 2001:db8:85a3:8d3:1319:8a2e:370:7344 - ErrorInfo: - type: object - required: - - status - - code - - message - properties: - status: - type: integer - description: HTTP status code returned along with this error response - code: - type: string - description: Code given to this error - message: - type: string - description: Detailed error description - - Webhook: + Area: type: object - description: Detail for event channel properties: - notificationUrl: - $ref: "#/components/schemas/NotificationUrl" - notificationAuthToken: - $ref: "#/components/schemas/NotificationAuthToken" + areaType: + $ref: "#/components/schemas/AreaType" required: - - notificationUrl + - areaType + discriminator: + propertyName: areaType + mapping: + CIRCLE: "#/components/schemas/Circle" - SubscriptionId: + AreaType: type: string - format: uuid - description: Identifier of the event subscription - This attribute must not be present in the POST request as it is provided by API server + description: | + Type of this area. + CIRCLE - The area is defined as a circle. + enum: + - CIRCLE - SubscriptionDetail: - type: object - description: Subscription detail - properties: - device: - $ref: "#/components/schemas/Device" - area: - $ref: "#/components/schemas/Area" - type: - $ref: "#/components/schemas/SubscriptionEventType" - required: - - device - - area - - type - - SubscriptionEventType: - type: string - description: | - area-entered - Event triggered when the device enters the given area - - area-left - Event triggered when the device leaves the given area - enum: - - org.camaraproject.geofencing-subscriptions.v0.area-entered - - org.camaraproject.geofencing-subscriptions.v0.area-left - - NotificationEventType: - type: string - description: | - area-entered - Event triggered when the device enters the given area - - area-left - Event triggered when the device leaves the given area - - subscription-ends - Event triggered when the subscription ends - enum: - - org.camaraproject.geofencing-subscriptions.v0.area-entered - - org.camaraproject.geofencing-subscriptions.v0.area-left - - org.camaraproject.geofencing-subscriptions.v0.subscription-ends - - NotificationUrl: - type: string - example: "https://application-server.com" - description: https callback address where the event notification must be POST-ed - - NotificationAuthToken: - type: string - example: "c8974e592c2fa383d4a3960714" - description: "OAuth2 token to be used by the callback API endpoint. It MUST be indicated within HTTP Authorization header e.g. Authorization: Bearer $notificationAuthToken" - - CreateSubscription: - description: The request for creating a geofencing subscription - type: object - properties: - webhook: - $ref: "#/components/schemas/Webhook" - subscriptionDetail: - $ref: "#/components/schemas/SubscriptionDetail" - subscriptionExpireTime: - type: string - format: date-time - description: The date time when the location-tracking has to be terminated. - It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. - Recommended format is yyyy-MM-dd'T'HH:mm:ss.SSSZ (i.e. which allows 2023-07-03T14:27:08.312+02:00 or 2023-07-03T12:27:08.312Z) - subscriptionMaxEvents: - type: integer - description: Identifies the maximum number of event reports to be generated (>=1) - Once this number is reached, the subscription ends. - minimum: 1 - example: 5 - required: - - webhook - - subscriptionDetail - - SubscriptionInfo: - description: Represents a geofencing event subscription. - type: object + Circle: + description: Circular area allOf: - - $ref: "#/components/schemas/CreateSubscription" + - $ref: "#/components/schemas/Area" - type: object properties: - subscriptionId: - $ref: "#/components/schemas/SubscriptionId" - startsAt: - type: string - format: date-time - description: The date time when the subscription started. - It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. - Recommended format is yyyy-MM-dd'T'HH:mm:ss.SSSZ (i.e. which allows 2023-07-03T14:27:08.312+02:00 or 2023-07-03T12:27:08.312Z) - expiresAt: - type: string - format: date-time - description: The date time when the subscription will expire or expired. - It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. - Recommended format is yyyy-MM-dd'T'HH:mm:ss.SSSZ (i.e. which allows 2023-07-03T14:27:08.312+02:00 or 2023-07-03T12:27:08.312Z) + center: + $ref: "#/components/schemas/Point" + radius: + type: integer + description: Expected accuracy for the subscription event of device location in m, from location (radius) + minimum: 2000 + maximum: 200000 required: - - subscriptionId + - center + - radius + example: + areaType: CIRCLE + center: + latitude: 50.735851 + longitude: 7.10066 + radius: 50000 - EventTime: - format: date-time - type: string - description: | - Timestamp of when the occurrence happened. - If the time of the occurrence cannot be determined then this attribute MAY be set to some other time (such as the current time) by the CloudEvents producer, - however all producers for the same source MUST be consistent in this respect. In other words, - either they all use the actual time of the occurrence or they all use the same algorithm to determine the value used. - It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. - Recommended format is yyyy-MM-dd'T'HH:mm:ss.SSSZ (i.e. which allows 2023-07-03T14:27:08.312+02:00 or 2023-07-03T12:27:08.312Z) + Point: + type: object + description: Coordinates (latitude, longitude) defining a location in a map + required: + - latitude + - longitude + properties: + latitude: + $ref: "#/components/schemas/Latitude" + longitude: + $ref: "#/components/schemas/Longitude" + example: + latitude: 50.735851 + longitude: 7.10066 + + Latitude: + description: Latitude component of a location + type: number + format: double + minimum: -90 + maximum: 90 + example: 50.735851 + + Longitude: + description: Longitude component of location + type: number + format: double + minimum: -180 + maximum: 180 + example: 7.10066 CloudEvent: - description: The Cloud-Event used for the callback. - type: object + description: The notification callback required: - id - source - - type - specversion + - type - time + - data properties: id: - description: Identifier of this event, that must be unique in the source context. type: string + description: identifier of this event, that must be unique in the source context. source: $ref: "#/components/schemas/Source" type: $ref: "#/components/schemas/NotificationEventType" specversion: - description: Version of the specification to which this event conforms (must be 1.0 if it conforms to cloudevents 1.0.2 version) type: string + description: Version of the specification to which this event conforms (must be 1.0 if it conforms to cloudevents 1.0.2 version) enum: - "1.0" datacontenttype: - description: 'media-type that describes the event payload encoding, must be "application/json" for CAMARA APIs' type: string + description: 'media-type that describes the event payload encoding, must be "application/json" for CAMARA APIs' enum: - application/json + data: + type: object + description: Event details payload described in each CAMARA API and referenced by its type time: - $ref: "#/components/schemas/EventTime" + $ref: "#/components/schemas/DateTime" discriminator: propertyName: "type" mapping: @@ -627,13 +811,33 @@ components: org.camaraproject.geofencing-subscriptions.v0.area-entered: "#/components/schemas/EventAreaEntered" org.camaraproject.geofencing-subscriptions.v0.subscription-ends: "#/components/schemas/EventSubscriptionEnds" + Source: + type: string + format: uri-reference + minLength: 1 + description: | + Identifies the context in which an event happened - be a non-empty `URI-reference` like: + - URI with a DNS authority: + * https://github.com/cloudevents + * mailto:cncf-wg-serverless@lists.cncf.io + - Universally-unique URN with a UUID: + * urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66 + - Application-specific identifier: + * /cloudevents/spec/pull/123 + * 1-555-123-4567 + example: "https://notificationSendServer12.supertelco.com" + + DateTime: + type: string + format: date-time + description: Timestamp of when the occurrence happened. Must adhere to RFC 3339. + example: "2018-04-05T17:31:00Z" + EventAreaLeft: description: event structure for event when the device leaves the area allOf: - $ref: "#/components/schemas/CloudEvent" - type: object - required: - - data properties: data: $ref: "#/components/schemas/AreaLeft" @@ -643,8 +847,6 @@ components: allOf: - $ref: "#/components/schemas/CloudEvent" - type: object - required: - - data properties: data: $ref: "#/components/schemas/AreaEntered" @@ -654,8 +856,6 @@ components: allOf: - $ref: "#/components/schemas/CloudEvent" - type: object - required: - - data properties: data: $ref: "#/components/schemas/SubscriptionEnds" @@ -708,81 +908,266 @@ components: subscriptionId: $ref: "#/components/schemas/SubscriptionId" - Source: - type: string - format: uri-reference - minLength: 1 - description: | - Identifies the context in which an event happened, as a non-empty `URI-reference` like: - - URI with a DNS authority: - * https://github.com/cloudevents - * mailto:cncf-wg-serverless@lists.cncf.io - - Universally-unique URN with a UUID: - * urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66 - - Application-specific identifier: - * /cloudevents/spec/pull/123 - * 1-555-123-4567 - example: "https://notificationSendServer12.supertelco.com" - TerminationReason: type: string description: | - NETWORK_TERMINATED - API server stopped sending notification - SUBSCRIPTION_EXPIRED - Subscription expire time (optionally set by the requester) has been reached - MAX_EVENTS_REACHED - maximum number of events (optionally set by the requester) has been reached + - NETWORK_TERMINATED - API server stopped sending notification + - SUBSCRIPTION_EXPIRED - Subscription expire time (optionally set by the requester) has been reached + - MAX_EVENTS_REACHED - Maximum number of events (optionally set by the requester) has been reached + - ACCESS_TOKEN_EXPIRED - Access Token sinkCredential (optionally set by the requester) expiration time has been reached enum: - MAX_EVENTS_REACHED - NETWORK_TERMINATED - SUBSCRIPTION_EXPIRED + - ACCESS_TOKEN_EXPIRED + + HTTPSubscriptionRequest: + allOf: + - $ref: "#/components/schemas/SubscriptionRequest" + - type: object + properties: + protocolSettings: + $ref: "#/components/schemas/HTTPSettings" + + HTTPSubscriptionResponse: + allOf: + - $ref: "#/components/schemas/Subscription" + - type: object + properties: + protocolSettings: + $ref: "#/components/schemas/HTTPSettings" + + HTTPSettings: + type: object + properties: + headers: + type: object + description: |- + A set of key/value pairs that is copied into the HTTP request as custom headers. + + NOTE: Use/Applicability of this concept has not been discussed in Commonalities under the scope of Meta Release v0.4. When required by an API project as an option to meet a UC/Requirement, please generate an issue for Commonalities discussion about it. + additionalProperties: + type: string + method: + type: string + description: The HTTP method to use for sending the message. + enum: + - POST + + MQTTSubscriptionRequest: + allOf: + - $ref: "#/components/schemas/SubscriptionRequest" + - type: object + properties: + protocolSettings: + $ref: "#/components/schemas/MQTTSettings" + + MQTTSubscriptionResponse: + allOf: + - $ref: "#/components/schemas/Subscription" + - type: object + properties: + protocolSettings: + $ref: "#/components/schemas/MQTTSettings" + + MQTTSettings: + type: object + properties: + topicName: + type: string + qos: + type: integer + format: int32 + retain: + type: boolean + expiry: + type: integer + format: int32 + userProperties: + type: object + required: + - topicName + + AMQPSubscriptionRequest: + allOf: + - $ref: "#/components/schemas/SubscriptionRequest" + - type: object + properties: + protocolSettings: + $ref: "#/components/schemas/AMQPSettings" + + AMQPSubscriptionResponse: + allOf: + - $ref: "#/components/schemas/Subscription" + - type: object + properties: + protocolSettings: + $ref: "#/components/schemas/AMQPSettings" + + AMQPSettings: + type: object + properties: + address: + type: string + linkName: + type: string + senderSettlementMode: + type: string + enum: ["settled", "unsettled"] + linkProperties: + type: object + additionalProperties: + type: string + + ApacheKafkaSubscriptionRequest: + allOf: + - $ref: "#/components/schemas/SubscriptionRequest" + - type: object + properties: + protocolSettings: + $ref: "#/components/schemas/ApacheKafkaSettings" + + ApacheKafkaSubscriptionResponse: + allOf: + - $ref: "#/components/schemas/Subscription" + - type: object + properties: + protocolSettings: + $ref: "#/components/schemas/ApacheKafkaSettings" + + ApacheKafkaSettings: + type: object + properties: + topicName: + type: string + partitionKeyExtractor: + type: string + clientId: + type: string + ackMode: + type: integer + required: + - topicName + NATSSubscriptionRequest: + allOf: + - $ref: "#/components/schemas/SubscriptionRequest" + - type: object + properties: + protocolSettings: + $ref: "#/components/schemas/NATSSettings" + + NATSSubscriptionResponse: + allOf: + - $ref: "#/components/schemas/Subscription" + - type: object + properties: + protocolSettings: + $ref: "#/components/schemas/NATSSettings" + + NATSSettings: + type: object + properties: + subject: + type: string + required: + - subject responses: + CreateSubscriptionBadRequest400: + description: Problem with the client request + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorInfo" + examples: + InvalidArgument: + value: + status: 400 + code: "INVALID_ARGUMENT" + message: "Client specified an invalid argument, request body or query param" + InvalidProtocol: + value: + status: 400 + code: "INVALID_PROTOCOL" + message: "Only HTTP is supported" + InvalidCredential: + value: + status: 400 + code: "INVALID_CREDENTIAL" + message: "Only Access token is supported" + InvalidToken: + value: + status: 400 + code: "INVALID_TOKEN" + message: "Only bearer token is supported" Generic400: - description: Invalid argument + description: Problem with the client request headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" content: application/json: schema: $ref: "#/components/schemas/ErrorInfo" example: status: 400 - code: INVALID_ARGUMENT - message: "Invalid argument" - + code: "INVALID_ARGUMENT" + message: "Client specified an invalid argument, request body or query param" Generic401: - description: Unauthenticated + description: Authentication problem with the client request headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" content: application/json: schema: $ref: "#/components/schemas/ErrorInfo" example: status: 401 - code: UNAUTHENTICATED - message: "Authorization failed: ..." + code: "UNAUTHENTICATED" + message: "Request not authenticated due to missing, invalid, or expired credentials" + CreateSubscription403: + description: Client does not have sufficient permission + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorInfo" + examples: + PermissionDenied: + value: + status: 403 + code: "PERMISSION_DENIED" + message: "Client does not have sufficient permissions to perform this action" + TokenMismatch: + value: + status: 403 + code: "SUBSCRIPTION_MISMATCH" + message: "Inconsistent access token for requested events subscription" Generic403: - description: Permission denied + description: Client does not have sufficient permission headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" content: application/json: schema: $ref: "#/components/schemas/ErrorInfo" example: status: 403 - code: PERMISSION_DENIED - message: "Operation not allowed: ..." - + code: "PERMISSION_DENIED" + message: "Client does not have sufficient permissions to perform this action" Generic404: - description: Not found + description: Resource Not Found headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" content: application/json: schema: @@ -791,68 +1176,144 @@ components: status: 404 code: NOT_FOUND message: "The specified resource is not found" - Generic409: description: Conflict headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" content: application/json: schema: $ref: "#/components/schemas/ErrorInfo" example: status: 409 - code: Conflict - message: "There is conflict in the request" - + code: CONFLICT + message: "The specified resource is in a conflict" + Generic410: + description: Gone + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorInfo" + example: + status: 410 + code: GONE + message: "The specified resource is no longer available at the requested address" + Generic415: + description: Unsupported Media Type + headers: + X-Correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorInfo" + example: + status: 415 + code: UNSUPPORTED_MEDIA_TYPE + message: "The specified media type is not supported" + CreateSubscription422: + description: Unprocessable Entity + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorInfo" + examples: + PermissionDenied: + value: + status: 422 + code: "MULTIEVENT_SUBSCRIPTION_NOT_SUPPORTED" + message: "Multi event types subscription not managed" + Generic429: + description: Too Many Requests + headers: + X-Correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorInfo" + example: + status: 429 + code: TOO_MANY_REQUESTS + message: "Endpoint does not support as many requests per time slot" Generic500: - description: Internal server error + description: Server error headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" content: application/json: schema: $ref: "#/components/schemas/ErrorInfo" example: status: 500 - code: INTERNAL - message: "Internal server error" - + code: "INTERNAL" + message: "Server error" Generic503: - description: Service unavailable + description: Service unavailable. Typically the server is down. headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" content: application/json: schema: $ref: "#/components/schemas/ErrorInfo" example: status: 503 - code: UNAVAILABLE + code: "UNAVAILABLE" message: "Service unavailable" - - + SubscriptionIdRequired: + description: Problem with the client request + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorInfo" + examples: + Generic400: + summary: Schema validation failed + value: + status: 400 + code: INVALID_ARGUMENT + message: "Client specified an invalid argument, request body or query param" + subscriptionIdRequired: + summary: subscription id is required + value: + status: 400 + code: INVALID_ARGUMENT + message: "Expected property is missing: subscriptionId" examples: REQUEST_CIRCLE_AREA_ENTERED: + description: A sample geofence for entering for a circle area value: - webhook: - notificationUrl: https://application-server.com - notificationAuthToken: c8974e592c2fa383d4a3960714 - subscriptionDetail: - device: - phoneNumber: "+12345678912" - area: - areaType: CIRCLE - center: - latitude: 50.735851 - longitude: 7.10066 - radius: 2000 - type: org.camaraproject.geofencing-subscriptions.v0.area-entered - subscriptionExpireTime: 2024-03-22T05:40:58.469Z + protocol: "HTTP" + sink: https://notificationSendServer12.supertelco.com + types: + - org.camaraproject.geofencing-subscriptions.v0.area-entered + config: + subscriptionDetail: + device: + phoneNumber: "+12345678912" + area: + areaType: CIRCLE + center: + latitude: 50.735851 + longitude: 7.10066 + radius: 2000 + initialEvent: true + subscriptionMaxEvents: 10 + subscriptionExpireTime: 2024-03-22T05:40:58.469Z CIRCLE_AREA_ENTERED: + description: The cloud event when a geofence area was entered value: id: "123655" source: https://notificationSendServer12.supertelco.com @@ -871,6 +1332,7 @@ components: longitude: 7.10066 radius: 2000 CIRCLE_AREA_LEFT: + description: The cloud event when a geofence area was left value: id: "123655" source: https://notificationSendServer12.supertelco.com @@ -890,6 +1352,7 @@ components: radius: 2000 SUBSCRIPTION_ENDS: + description: The cloud event when a geofence subscription ends value: id: "123655" source: https://notificationSendServer12.supertelco.com