Visma.Api (Visma v0.1.0)
Visma API Elixir implementation. This module offers a way to play with visma API. It has been tested on the demo API, and should work as well on the main one. This is a low level interface, you should probably use other module to directly craft the correct request.
Link to this section Summary
Functions
TODO: not tested yet.
TODO: not tested yet.
Cancel a transaction. The transaction id can be found with get_signing_status/2 function.
TODO: not tested yet.
TODO: not tested yet.
Get all running campaigns.
TODO: not tested yet.
TODO: not tested yet.
Get signing state of a specific signature.
Get the signing status of each documents. A transaction id is associated with each of them, and can be cancelled with cancel_transaction/2 function.
Returns a signing template available. A signing template
is needed when using initiate_signing/2 function. Choose
one method, and extract its id.
TODO: not tested yet.
Initiate a new campaign.
This function initiate a signing procedure by sending information about a sender, a list of recipients and a list of document.
Similar than login/2 except it requires a token to be set.
Log to Visma API using email and password as credentials. A valid connection returns a token. Be careful, the token has a limited lifetime, if you are reusing it, you should ensure it is still valid.
Initialize a new Visma.Api data-structure used to
generate request. By default, the base_url key
is initialized using environment but it can be
bypassed by using new/1 function.
Prepare a request by adding a token or any mandatory elements.
Send a request and wait for its response. It automatically uses prepare/1 function to prepare the request. Reponse is parsed using parse_response/1 internal function.
Link to this section Types
add_user_to_group_arguments()
campaign_name()
@type campaign_name() :: String.t()
cancel_signing_arguments()
@type cancel_signing_arguments() :: [{:signing_token, signing_token()}]
cancel_transaction_arguments()
@type cancel_transaction_arguments() :: [{:transaction_token, token()}]
create_group_arguments()
create_user_arguments()
document()
@type document() :: map()
documents()
@type documents() :: [document(), ...]
email()
@type email() :: String.t()
get_campaigns_arguments()
@type get_campaigns_arguments() :: [{:reference, token()}]
get_rejection_comment_arguments()
@type get_rejection_comment_arguments() :: [{:signing_token, signing_token()}]
get_signing_arguments()
@type get_signing_arguments() :: [{:signing_token, signing_token()}]
get_signing_status_arguments()
@type get_signing_status_arguments() :: [{:signing_token, signing_token()}]
get_template_messages_arguments()
@type get_template_messages_arguments() :: [{:template_id, Ecto.UUID.t()}]
group_id()
@type group_id() :: Ecto.UUID.t()
group_name()
@type group_name() :: String.t()
initiate_campaign_arguments()
@type initiate_campaign_arguments() :: [ signing_template_id: Ecto.UUID.t(), recipients: [], site: String.t(), transaction_state_change_url: String.t(), last_reminder: integer(), signing_method: integer() ]
initiate_signing_arguments()
@type initiate_signing_arguments() :: [{:signing_request, map()}]
login_arguments()
name()
@type name() :: String.t()
options()
@type options() :: Keyword.t()
password()
@type password() :: String.t()
recipient()
@type recipient() :: map()
recipients()
@type recipients() :: [recipient(), ...]
sender()
@type sender() :: Visma.Api.Types.Sender.sender()
signing_token()
@type signing_token() :: Ecto.UUID.t()
template_id()
@type template_id() :: Ecto.UUID.t()
token()
@type token() :: Ecto.UUID.t()
transaction_token()
@type transaction_token() :: Ecto.UUID.t()
user_name()
@type user_name() :: String.t()
Link to this section Functions
add_user_to_group(api, args)
@spec add_user_to_group( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, add_user_to_group_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
TODO: not tested yet.
examples
Examples
cancel_signing(api, args)
@spec cancel_signing( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, cancel_signing_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
TODO: not tested yet.
examples
Examples
cancel_transaction(api, args)
@spec cancel_transaction( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, cancel_transaction_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
Cancel a transaction. The transaction id can be found with get_signing_status/2 function.
examples
Examples
create_group(api, args)
@spec create_group( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, create_group_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
TODO: not tested yet.
examples
Examples
create_user(api, args)
@spec create_user( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, create_user_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
TODO: not tested yet.
examples
Examples
get_campaigns(api, args)
@spec get_campaigns( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, get_campaigns_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
Get all running campaigns.
examples
Examples
get_groups(api)
@spec get_groups(%Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
TODO: not tested yet.
examples
Examples
get_rejection_comment(api, args)
@spec get_rejection_comment( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, get_rejection_comment_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
TODO: not tested yet.
examples
Examples
get_signing(api, args)
@spec get_signing( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, get_signing_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
Get signing state of a specific signature.
examples
Examples
iex> api = Visma.Api.new()
iex> request = Visma.Api.get_signing_arguments(token: "my-token", signing_token: "my-signing-token")
iex> Visma.Api.send(request)
get_signing_status(api, args)
@spec get_signing_status( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, get_signing_status_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
Get the signing status of each documents. A transaction id is associated with each of them, and can be cancelled with cancel_transaction/2 function.
examples
Examples
get_signing_templates(api)
@spec get_signing_templates(%Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
Returns a signing template available. A signing template
is needed when using initiate_signing/2 function. Choose
one method, and extract its id.
example
example
iex> api = Visma.Api.new()
iex> request = Visma.Api.get_signing_templates(api, token: "my_token")
iex> Visma.Api.send(request)
{:ok, %{ "SigningTemplateItems" => templates }}
get_template_messages(api, args)
@spec get_template_messages( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, Keyword.t() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
TODO: not tested yet.
examples
Examples
initiate_campaign(api, args)
@spec initiate_campaign( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, initiate_campaign_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
Initiate a new campaign.
examples
Examples
initiate_signing(api, args)
@spec initiate_signing( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, initiate_signing_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
This function initiate a signing procedure by sending information about a sender, a list of recipients and a list of document.
example
example
iex> signing = Visma.Signing.new()
iex> signing = Visma.Signing.request(signing,
signing_template_id: "template_id"
)
iex> signing = Visma.Signing.sender(signing, ...)
iex> signing = Visma.Signing.document(signing, ...)
iex> signing = Visma.Signing.recipient(signing, ...)
iex> signing_map = Visma.Signing.to_map(signing)
iex> api = Visma.Api.new()
iex> request = Visma.Api.initiate_signing(api,
token: "my-token",
signing_request: signing_map
)
iex> Visma.Api.send(request)
login2(api, args)
@spec login2( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, login_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
Similar than login/2 except it requires a token to be set.
examples
Examples
iex> api = Visma.Api.new()
iex> request = Visma.Api.login(api,
email: "foo@bar.com",
password: "my_password"
)
iex> prepared_request = Visma.Api.prepare(request, token: token)
iex> Visma.Api.send(prepared_request)
{:ok, "00000000-0000-0000-0000-000000000000"}
login(api, args)
@spec login( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, login_arguments() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
Log to Visma API using email and password as credentials. A valid connection returns a token. Be careful, the token has a limited lifetime, if you are reusing it, you should ensure it is still valid.
example
example
Simple example, change with the correctly values.
iex> api = Visma.Api.new()
iex> request = Visma.Api.login(api,
email: "foo@bar.com",
password: "my_password"
)
iex> prepared_request = Visma.Api.prepare(request)
iex> Visma.Api.send(prepared_request)
{:ok, "00000000-0000-0000-0000-000000000000"}A Working example with demo credentials from official. It will return a valid token.
iex> api = Visma.Api.new(base_url: "https://demo.vismaaddo.net/WebService/v2.0/restsigningservice.svc")
iex> request = Visma.Api.login(api,
email: "fake.email.for.api.test@visma.com",
password: Base.decode64!("c/SjPSMTRcZW1yzcvs6qdUOrnx4GyHoH0fyD0h9XnAAYP7PP/sNgTjKDMSUGlZAXB+ZFmm20JWK6hrsgJHsGYw=="),
password_is_base64: true)
)
iex> Visma.Api.send(request)
{:ok, "00000000-0000-0000-0000-000000000000"}Using an invalid email
iex> api = Visma.Api.new()
iex> request = Visma.Api.login(api,
email: "invalid@email.com",
password: "test"
)
iex> Visma.Api.send(request)
{:error, [%{"FaultCode" => 900, "Reason" => "Invalid email"}]}
new()
@spec new() :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
Initialize a new Visma.Api data-structure used to
generate request. By default, the base_url key
is initialized using environment but it can be
bypassed by using new/1 function.
TODO: sanitize base_url field
examples
Examples
iex> Visma.Api.new()
iex> Visma.Api.new(base_url: "http://my-url.com/api")
new(opts)
prepare(api)
Prepare a request by adding a token or any mandatory elements.
prepare(api, args)
@spec prepare( %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }, Keyword.t() ) :: %Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }
send(api)
@spec send(%Visma.Api{ api_path: term(), base_url: term(), body: term(), full_url: term(), headers: term(), method: term(), query: term(), token: term(), token_in_body: term(), token_required: term() }) :: {:ok, any()} | {:error, any()}
Send a request and wait for its response. It automatically uses prepare/1 function to prepare the request. Reponse is parsed using parse_response/1 internal function.