2020-05-05 14:43:00 +02:00
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ApiSpec.SubscriptionOperation do
alias OpenApiSpex.Operation
alias OpenApiSpex.Schema
alias Pleroma.Web.ApiSpec.Helpers
alias Pleroma.Web.ApiSpec.Schemas.ApiError
alias Pleroma.Web.ApiSpec.Schemas.PushSubscription
def open_api_operation ( action ) do
operation = String . to_existing_atom ( " #{ action } _operation " )
apply ( __MODULE__ , operation , [ ] )
end
def create_operation do
% Operation {
tags : [ " Push Subscriptions " ] ,
summary : " Subscribe to push notifications " ,
description :
" Add a Web Push API subscription to receive notifications. Each access token can have one push subscription. If you create a new subscription, the old subscription is deleted. " ,
operationId : " SubscriptionController.create " ,
security : [ %{ " oAuth " = > [ " push " ] } ] ,
requestBody : Helpers . request_body ( " Parameters " , create_request ( ) , required : true ) ,
responses : %{
200 = > Operation . response ( " Push Subscription " , " application/json " , PushSubscription ) ,
400 = > Operation . response ( " Error " , " application/json " , ApiError ) ,
403 = > Operation . response ( " Error " , " application/json " , ApiError )
}
}
end
def show_operation do
% Operation {
tags : [ " Push Subscriptions " ] ,
summary : " Get current subscription " ,
description : " View the PushSubscription currently associated with this access token. " ,
operationId : " SubscriptionController.show " ,
security : [ %{ " oAuth " = > [ " push " ] } ] ,
responses : %{
200 = > Operation . response ( " Push Subscription " , " application/json " , PushSubscription ) ,
403 = > Operation . response ( " Error " , " application/json " , ApiError ) ,
404 = > Operation . response ( " Error " , " application/json " , ApiError )
}
}
end
def update_operation do
% Operation {
tags : [ " Push Subscriptions " ] ,
summary : " Change types of notifications " ,
description :
" Updates the current push subscription. Only the data part can be updated. To change fundamentals, a new subscription must be created instead. " ,
operationId : " SubscriptionController.update " ,
security : [ %{ " oAuth " = > [ " push " ] } ] ,
requestBody : Helpers . request_body ( " Parameters " , update_request ( ) , required : true ) ,
responses : %{
200 = > Operation . response ( " Push Subscription " , " application/json " , PushSubscription ) ,
403 = > Operation . response ( " Error " , " application/json " , ApiError )
}
}
end
def delete_operation do
% Operation {
tags : [ " Push Subscriptions " ] ,
summary : " Remove current subscription " ,
description : " Removes the current Web Push API subscription. " ,
operationId : " SubscriptionController.delete " ,
security : [ %{ " oAuth " = > [ " push " ] } ] ,
responses : %{
200 = > Operation . response ( " Empty object " , " application/json " , % Schema { type : :object } ) ,
403 = > Operation . response ( " Error " , " application/json " , ApiError ) ,
404 = > Operation . response ( " Error " , " application/json " , ApiError )
}
}
end
defp create_request do
% Schema {
title : " SubscriptionCreateRequest " ,
description : " POST body for creating a push subscription " ,
type : :object ,
properties : %{
subscription : % Schema {
type : :object ,
properties : %{
endpoint : % Schema {
type : :string ,
description : " Endpoint URL that is called when a notification event occurs. "
} ,
keys : % Schema {
type : :object ,
properties : %{
p256dh : % Schema {
type : :string ,
description :
" User agent public key. Base64 encoded string of public key of ECDH key using `prime256v1` curve. "
} ,
auth : % Schema {
type : :string ,
description : " Auth secret. Base64 encoded string of 16 bytes of random data. "
}
} ,
required : [ :p256dh , :auth ]
}
} ,
required : [ :endpoint , :keys ]
} ,
data : % Schema {
2020-05-15 12:55:41 +02:00
nullable : true ,
2020-05-05 14:43:00 +02:00
type : :object ,
properties : %{
alerts : % Schema {
2020-05-15 12:55:41 +02:00
nullable : true ,
2020-05-05 14:43:00 +02:00
type : :object ,
properties : %{
2020-05-15 12:55:41 +02:00
follow : % Schema {
type : :boolean ,
nullable : true ,
description : " Receive follow notifications? "
} ,
2020-05-05 14:43:00 +02:00
favourite : % Schema {
type : :boolean ,
2020-05-15 12:55:41 +02:00
nullable : true ,
2020-05-05 14:43:00 +02:00
description : " Receive favourite notifications? "
} ,
2020-05-15 12:55:41 +02:00
reblog : % Schema {
type : :boolean ,
nullable : true ,
description : " Receive reblog notifications? "
} ,
mention : % Schema {
type : :boolean ,
nullable : true ,
description : " Receive mention notifications? "
} ,
poll : % Schema {
type : :boolean ,
nullable : true ,
description : " Receive poll notifications? "
}
2020-05-05 14:43:00 +02:00
}
}
}
}
} ,
required : [ :subscription ] ,
example : %{
" subscription " = > %{
" endpoint " = > " https://example.com/example/1234 " ,
" keys " = > %{
" auth " = > " 8eDyX_uCN0XRhSbY5hs7Hg== " ,
" p256dh " = >
" BCIWgsnyXDv1VkhqL2P7YRBvdeuDnlwAPT2guNhdIoW3IP7GmHh1SMKPLxRf7x8vJy6ZFK3ol2ohgn_-0yP7QQA= "
}
} ,
" data " = > %{
" alerts " = > %{
" follow " = > true ,
" mention " = > true ,
" poll " = > false
}
}
}
}
end
defp update_request do
% Schema {
title : " SubscriptionUpdateRequest " ,
type : :object ,
properties : %{
data : % Schema {
2020-05-15 12:55:41 +02:00
nullable : true ,
2020-05-05 14:43:00 +02:00
type : :object ,
properties : %{
alerts : % Schema {
2020-05-15 12:55:41 +02:00
nullable : true ,
2020-05-05 14:43:00 +02:00
type : :object ,
properties : %{
2020-05-15 12:55:41 +02:00
follow : % Schema {
type : :boolean ,
nullable : true ,
description : " Receive follow notifications? "
} ,
2020-05-05 14:43:00 +02:00
favourite : % Schema {
type : :boolean ,
2020-05-15 12:55:41 +02:00
nullable : true ,
2020-05-05 14:43:00 +02:00
description : " Receive favourite notifications? "
} ,
2020-05-15 12:55:41 +02:00
reblog : % Schema {
type : :boolean ,
nullable : true ,
description : " Receive reblog notifications? "
} ,
mention : % Schema {
type : :boolean ,
nullable : true ,
description : " Receive mention notifications? "
} ,
poll : % Schema {
type : :boolean ,
nullable : true ,
description : " Receive poll notifications? "
}
2020-05-05 14:43:00 +02:00
}
}
}
}
} ,
example : %{
" data " = > %{
" alerts " = > %{
" follow " = > true ,
" favourite " = > true ,
" reblog " = > true ,
" mention " = > true ,
" poll " = > true
}
}
}
}
end
end