2020-04-01 19:00:59 +00: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.AppOperation do
alias OpenApiSpex.Operation
alias OpenApiSpex.Schema
2020-04-03 18:52:25 +00:00
alias Pleroma.Web.ApiSpec.Helpers
2020-04-01 19:00:59 +00:00
@spec open_api_operation ( atom ) :: Operation . t ( )
def open_api_operation ( action ) do
operation = String . to_existing_atom ( " #{ action } _operation " )
apply ( __MODULE__ , operation , [ ] )
end
@spec create_operation ( ) :: Operation . t ( )
def create_operation do
% Operation {
tags : [ " apps " ] ,
summary : " Create an application " ,
description : " Create a new application to obtain OAuth2 credentials " ,
operationId : " AppController.create " ,
2020-04-24 10:46:59 +00:00
requestBody : Helpers . request_body ( " Parameters " , create_request ( ) , required : true ) ,
2020-04-01 19:00:59 +00:00
responses : %{
2020-04-24 10:46:59 +00:00
200 = > Operation . response ( " App " , " application/json " , create_response ( ) ) ,
2020-04-01 19:00:59 +00:00
422 = >
Operation . response (
" Unprocessable Entity " ,
" application/json " ,
% Schema {
type : :object ,
description :
" If a required parameter is missing or improperly formatted, the request will fail. " ,
properties : %{
error : % Schema { type : :string }
} ,
example : %{
" error " = > " Validation failed: Redirect URI must be an absolute URI. "
}
}
)
}
}
end
def verify_credentials_operation do
% Operation {
tags : [ " apps " ] ,
summary : " Verify your app works " ,
description : " Confirm that the app's OAuth2 credentials work. " ,
operationId : " AppController.verify_credentials " ,
2020-04-02 13:33:23 +00:00
security : [
%{
" oAuth " = > [ " read " ]
}
2020-04-01 19:00:59 +00:00
] ,
responses : %{
200 = >
Operation . response ( " App " , " application/json " , % Schema {
type : :object ,
description :
" If the Authorization header was provided with a valid token, you should see your app returned as an Application entity. " ,
properties : %{
name : % Schema { type : :string } ,
vapid_key : % Schema { type : :string } ,
website : % Schema { type : :string , nullable : true }
} ,
example : %{
" name " = > " My App " ,
" vapid_key " = >
" BCk-QqERU0q-CfYZjcuB6lnyyOYfJ2AifKqfeGIm7Z-HiTU5T9eTG5GxVA0_OH5mMlI4UkkDTpaZwozy0TzdZ2M= " ,
" website " = > " https://myapp.com/ "
}
} ) ,
422 = >
Operation . response (
" Unauthorized " ,
" application/json " ,
% Schema {
type : :object ,
description :
" If the Authorization header contains an invalid token, is malformed, or is not present, an error will be returned indicating an authorization failure. " ,
properties : %{
error : % Schema { type : :string }
} ,
example : %{
" error " = > " The access token is invalid. "
}
}
)
}
}
end
2020-04-24 10:46:59 +00:00
defp create_request do
% Schema {
title : " AppCreateRequest " ,
description : " POST body for creating an app " ,
type : :object ,
properties : %{
client_name : % Schema { type : :string , description : " A name for your application. " } ,
redirect_uris : % Schema {
type : :string ,
description :
" Where the user should be redirected after authorization. To display the authorization code to the user instead of redirecting to a web page, use `urn:ietf:wg:oauth:2.0:oob` in this parameter. "
} ,
scopes : % Schema {
type : :string ,
description : " Space separated list of scopes " ,
default : " read "
} ,
website : % Schema { type : :string , description : " A URL to the homepage of your app " }
} ,
required : [ :client_name , :redirect_uris ] ,
example : %{
" client_name " = > " My App " ,
" redirect_uris " = > " https://myapp.com/auth/callback " ,
" website " = > " https://myapp.com/ "
}
}
end
defp create_response do
% Schema {
title : " AppCreateResponse " ,
description : " Response schema for an app " ,
type : :object ,
properties : %{
id : % Schema { type : :string } ,
name : % Schema { type : :string } ,
client_id : % Schema { type : :string } ,
client_secret : % Schema { type : :string } ,
redirect_uri : % Schema { type : :string } ,
vapid_key : % Schema { type : :string } ,
website : % Schema { type : :string , nullable : true }
} ,
example : %{
" id " = > " 123 " ,
" name " = > " My App " ,
" client_id " = > " TWhM-tNSuncnqN7DBJmoyeLnk6K3iJJ71KKXxgL1hPM " ,
" client_secret " = > " ZEaFUFmF0umgBX1qKJDjaU99Q31lDkOU8NutzTOoliw " ,
" vapid_key " = >
" BCk-QqERU0q-CfYZjcuB6lnyyOYfJ2AifKqfeGIm7Z-HiTU5T9eTG5GxVA0_OH5mMlI4UkkDTpaZwozy0TzdZ2M= " ,
" website " = > " https://myapp.com/ "
}
}
end
2020-04-01 19:00:59 +00:00
end