diff --git a/.latest-tag-aws-sdk-go b/.latest-tag-aws-sdk-go index 7fa3401a..fd512c7c 100644 --- a/.latest-tag-aws-sdk-go +++ b/.latest-tag-aws-sdk-go @@ -1 +1 @@ -v1.47.2 +v1.47.3 diff --git a/src/aws_connect.erl b/src/aws_connect.erl index 48d72b8e..fbfa62d2 100644 --- a/src/aws_connect.erl +++ b/src/aws_connect.erl @@ -63,6 +63,8 @@ create_integration_association/4, create_participant/2, create_participant/3, + create_persistent_contact_association/4, + create_persistent_contact_association/5, create_prompt/3, create_prompt/4, create_queue/3, @@ -1131,6 +1133,32 @@ create_participant(Client, Input0, Options0) -> request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode). +%% @doc Enables rehydration of chats for the lifespan of a contact. +%% +%% For more information about chat rehydration, see Enable persistent chat in +%% the Amazon Connect Administrator Guide. +create_persistent_contact_association(Client, InitialContactId, InstanceId, Input) -> + create_persistent_contact_association(Client, InitialContactId, InstanceId, Input, []). +create_persistent_contact_association(Client, InitialContactId, InstanceId, Input0, Options0) -> + Method = post, + Path = ["/contact/persistent-contact-association/", aws_util:encode_uri(InstanceId), "/", aws_util:encode_uri(InitialContactId), ""], + SuccessStatusCode = undefined, + Options = [{send_body_as_binary, false}, + {receive_body_as_binary, false}, + {append_sha256_content_hash, false} + | Options0], + + Headers = [], + Input1 = Input0, + + CustomHeaders = [], + Input2 = Input1, + + Query_ = [], + Input = Input2, + + request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode). + %% @doc Creates a prompt. %% %% For more information about prompts, such as supported file types and diff --git a/src/aws_launch_wizard.erl b/src/aws_launch_wizard.erl new file mode 100644 index 00000000..aa1b383f --- /dev/null +++ b/src/aws_launch_wizard.erl @@ -0,0 +1,336 @@ +%% WARNING: DO NOT EDIT, AUTO-GENERATED CODE! +%% See https://github.com/aws-beam/aws-codegen for more details. + +%% @doc Launch Wizard offers a guided way of sizing, configuring, and +%% deploying Amazon Web Services resources for third party applications, such +%% as Microsoft SQL Server Always On and HANA based SAP systems, without the +%% need to manually identify and provision individual Amazon Web Services +%% resources. +-module(aws_launch_wizard). + +-export([create_deployment/2, + create_deployment/3, + delete_deployment/2, + delete_deployment/3, + get_deployment/2, + get_deployment/3, + get_workload/2, + get_workload/3, + list_deployment_events/2, + list_deployment_events/3, + list_deployments/2, + list_deployments/3, + list_workload_deployment_patterns/2, + list_workload_deployment_patterns/3, + list_workloads/2, + list_workloads/3]). + +-include_lib("hackney/include/hackney_lib.hrl"). + +%%==================================================================== +%% API +%%==================================================================== + +%% @doc Creates a deployment for the given workload. +%% +%% Deployments created by this operation are not available in the Launch +%% Wizard console to use the `Clone deployment' action on. +create_deployment(Client, Input) -> + create_deployment(Client, Input, []). +create_deployment(Client, Input0, Options0) -> + Method = post, + Path = ["/createDeployment"], + SuccessStatusCode = 200, + Options = [{send_body_as_binary, false}, + {receive_body_as_binary, false}, + {append_sha256_content_hash, false} + | Options0], + + Headers = [], + Input1 = Input0, + + CustomHeaders = [], + Input2 = Input1, + + Query_ = [], + Input = Input2, + + request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode). + +%% @doc Deletes a deployment. +delete_deployment(Client, Input) -> + delete_deployment(Client, Input, []). +delete_deployment(Client, Input0, Options0) -> + Method = post, + Path = ["/deleteDeployment"], + SuccessStatusCode = 200, + Options = [{send_body_as_binary, false}, + {receive_body_as_binary, false}, + {append_sha256_content_hash, false} + | Options0], + + Headers = [], + Input1 = Input0, + + CustomHeaders = [], + Input2 = Input1, + + Query_ = [], + Input = Input2, + + request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode). + +%% @doc Returns information about the deployment. +get_deployment(Client, Input) -> + get_deployment(Client, Input, []). +get_deployment(Client, Input0, Options0) -> + Method = post, + Path = ["/getDeployment"], + SuccessStatusCode = 200, + Options = [{send_body_as_binary, false}, + {receive_body_as_binary, false}, + {append_sha256_content_hash, false} + | Options0], + + Headers = [], + Input1 = Input0, + + CustomHeaders = [], + Input2 = Input1, + + Query_ = [], + Input = Input2, + + request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode). + +%% @doc Returns information about a workload. +get_workload(Client, Input) -> + get_workload(Client, Input, []). +get_workload(Client, Input0, Options0) -> + Method = post, + Path = ["/getWorkload"], + SuccessStatusCode = 200, + Options = [{send_body_as_binary, false}, + {receive_body_as_binary, false}, + {append_sha256_content_hash, false} + | Options0], + + Headers = [], + Input1 = Input0, + + CustomHeaders = [], + Input2 = Input1, + + Query_ = [], + Input = Input2, + + request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode). + +%% @doc Lists the events of a deployment. +list_deployment_events(Client, Input) -> + list_deployment_events(Client, Input, []). +list_deployment_events(Client, Input0, Options0) -> + Method = post, + Path = ["/listDeploymentEvents"], + SuccessStatusCode = 200, + Options = [{send_body_as_binary, false}, + {receive_body_as_binary, false}, + {append_sha256_content_hash, false} + | Options0], + + Headers = [], + Input1 = Input0, + + CustomHeaders = [], + Input2 = Input1, + + Query_ = [], + Input = Input2, + + request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode). + +%% @doc Lists the deployments that have been created. +list_deployments(Client, Input) -> + list_deployments(Client, Input, []). +list_deployments(Client, Input0, Options0) -> + Method = post, + Path = ["/listDeployments"], + SuccessStatusCode = 200, + Options = [{send_body_as_binary, false}, + {receive_body_as_binary, false}, + {append_sha256_content_hash, false} + | Options0], + + Headers = [], + Input1 = Input0, + + CustomHeaders = [], + Input2 = Input1, + + Query_ = [], + Input = Input2, + + request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode). + +%% @doc Lists the workload deployment patterns. +list_workload_deployment_patterns(Client, Input) -> + list_workload_deployment_patterns(Client, Input, []). +list_workload_deployment_patterns(Client, Input0, Options0) -> + Method = post, + Path = ["/listWorkloadDeploymentPatterns"], + SuccessStatusCode = 200, + Options = [{send_body_as_binary, false}, + {receive_body_as_binary, false}, + {append_sha256_content_hash, false} + | Options0], + + Headers = [], + Input1 = Input0, + + CustomHeaders = [], + Input2 = Input1, + + Query_ = [], + Input = Input2, + + request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode). + +%% @doc Lists the workloads. +list_workloads(Client, Input) -> + list_workloads(Client, Input, []). +list_workloads(Client, Input0, Options0) -> + Method = post, + Path = ["/listWorkloads"], + SuccessStatusCode = 200, + Options = [{send_body_as_binary, false}, + {receive_body_as_binary, false}, + {append_sha256_content_hash, false} + | Options0], + + Headers = [], + Input1 = Input0, + + CustomHeaders = [], + Input2 = Input1, + + Query_ = [], + Input = Input2, + + request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode). + +%%==================================================================== +%% Internal functions +%%==================================================================== + +-spec request(aws_client:aws_client(), atom(), iolist(), list(), + list(), map() | undefined, list(), pos_integer() | undefined) -> + {ok, {integer(), list()}} | + {ok, Result, {integer(), list(), hackney:client()}} | + {error, Error, {integer(), list(), hackney:client()}} | + {error, term()} when + Result :: map(), + Error :: map(). +request(Client, Method, Path, Query, Headers0, Input, Options, SuccessStatusCode) -> + RequestFun = fun() -> do_request(Client, Method, Path, Query, Headers0, Input, Options, SuccessStatusCode) end, + aws_request:request(RequestFun, Options). + +do_request(Client, Method, Path, Query, Headers0, Input, Options, SuccessStatusCode) -> + Client1 = Client#{service => <<"launchwizard">>}, + Host = build_host(<<"launchwizard">>, Client1), + URL0 = build_url(Host, Path, Client1), + URL = aws_request:add_query(URL0, Query), + AdditionalHeaders1 = [ {<<"Host">>, Host} + , {<<"Content-Type">>, <<"application/x-amz-json-1.1">>} + ], + Payload = + case proplists:get_value(send_body_as_binary, Options) of + true -> + maps:get(<<"Body">>, Input, <<"">>); + false -> + encode_payload(Input) + end, + AdditionalHeaders = case proplists:get_value(append_sha256_content_hash, Options, false) of + true -> + add_checksum_hash_header(AdditionalHeaders1, Payload); + false -> + AdditionalHeaders1 + end, + Headers1 = aws_request:add_headers(AdditionalHeaders, Headers0), + + MethodBin = aws_request:method_to_binary(Method), + SignedHeaders = aws_request:sign_request(Client1, MethodBin, URL, Headers1, Payload), + Response = hackney:request(Method, URL, SignedHeaders, Payload, Options), + DecodeBody = not proplists:get_value(receive_body_as_binary, Options), + handle_response(Response, SuccessStatusCode, DecodeBody). + +add_checksum_hash_header(Headers, Body) -> + [ {<<"X-Amz-CheckSum-SHA256">>, base64:encode(crypto:hash(sha256, Body))} + | Headers + ]. + +handle_response({ok, StatusCode, ResponseHeaders}, SuccessStatusCode, _DecodeBody) + when StatusCode =:= 200; + StatusCode =:= 202; + StatusCode =:= 204; + StatusCode =:= 206; + StatusCode =:= SuccessStatusCode -> + {ok, {StatusCode, ResponseHeaders}}; +handle_response({ok, StatusCode, ResponseHeaders}, _, _DecodeBody) -> + {error, {StatusCode, ResponseHeaders}}; +handle_response({ok, StatusCode, ResponseHeaders, Client}, SuccessStatusCode, DecodeBody) + when StatusCode =:= 200; + StatusCode =:= 202; + StatusCode =:= 204; + StatusCode =:= 206; + StatusCode =:= SuccessStatusCode -> + case hackney:body(Client) of + {ok, <<>>} when StatusCode =:= 200; + StatusCode =:= SuccessStatusCode -> + {ok, #{}, {StatusCode, ResponseHeaders, Client}}; + {ok, Body} -> + Result = case DecodeBody of + true -> + try + jsx:decode(Body) + catch + Error:Reason:Stack -> + erlang:raise(error, {body_decode_failed, Error, Reason, StatusCode, Body}, Stack) + end; + false -> #{<<"Body">> => Body} + end, + {ok, Result, {StatusCode, ResponseHeaders, Client}} + end; +handle_response({ok, StatusCode, _ResponseHeaders, _Client}, _, _DecodeBody) + when StatusCode =:= 503 -> + %% Retriable error if retries are enabled + {error, service_unavailable}; +handle_response({ok, StatusCode, ResponseHeaders, Client}, _, _DecodeBody) -> + {ok, Body} = hackney:body(Client), + try + DecodedError = jsx:decode(Body), + {error, DecodedError, {StatusCode, ResponseHeaders, Client}} + catch + Error:Reason:Stack -> + erlang:raise(error, {body_decode_failed, Error, Reason, StatusCode, Body}, Stack) + end; +handle_response({error, Reason}, _, _DecodeBody) -> + {error, Reason}. + +build_host(_EndpointPrefix, #{region := <<"local">>, endpoint := Endpoint}) -> + Endpoint; +build_host(_EndpointPrefix, #{region := <<"local">>}) -> + <<"localhost">>; +build_host(EndpointPrefix, #{region := Region, endpoint := Endpoint}) -> + aws_util:binary_join([EndpointPrefix, Region, Endpoint], <<".">>). + +build_url(Host, Path0, Client) -> + Proto = aws_client:proto(Client), + Path = erlang:iolist_to_binary(Path0), + Port = aws_client:port(Client), + aws_util:binary_join([Proto, <<"://">>, Host, <<":">>, Port, Path], <<"">>). + +-spec encode_payload(undefined | map()) -> binary(). +encode_payload(undefined) -> + <<>>; +encode_payload(Input) -> + jsx:encode(Input).