defmodule SEV.BUS do
@wsdl "priv/sevovv/wsdl/bus.esb.IntegrationService.cls.xml"
def messages(login, password, count), do:
[identity: %{SystemId: login, Password: password}, сount: count]
|> request("GetInputMessages") |> parse()
def startUpload(id, from, to, login, password, size, hash, type, time), do:
[
identity: %{SystemId: login, Password: password},
messageInfo:
%{CreationDate: time,
Creator: "Sed",
Format: "Plain",
FromOrgId: from,
FromSysId: login,
Size: size,
SessionId: "0",
MessageId: id,
ToOrgId: to,
ToSysId: "СЕВ",
Type: type},
hash: hash,
signature: ""
] |> request("OpenUploadingSession") |> parse()
def startDownloading(login, password, id), do:
[identity: %{SystemId: login, Password: password}, messageId: id]
|> request("OpenDownloadingSession") |> parse()
def uploadChunk(login, password, sessionId, data), do:
[identity: %{SystemId: login, Password: password}, sessionId: sessionId, messageChunk: data]
|> request("UploadMessageChunk") |> parse()
def downloadChunk(login, password, sessionId, pos, count), do:
[identity: %{SystemId: login, Password: password}, sessionId: sessionId, fromPosition: pos, count: count]
|> request("DownloadMessageChunk") |> parse()
def endUploading(login, password, sessionId), do:
(x = [identity: %{SystemId: login, Password: password}, sessionId: sessionId];
x |> request("GetMessageValidationInfo") |> parse() |> :maps.merge(x |> request("GetSessionInfo") |> parse()) |> check())
def endDownloading(login, password, sessionId), do:
[identity: %{SystemId: login, Password: password}, sessionId: sessionId]
|> request("GetMessageValidationInfo") |> parse()
def closeSession(login, password, %{:session => sId, :type => t}, id), do:
[identity: %{SystemId: login, Password: password},
sessionInfo: %{MessageId: id, SessionId: sId, Status: "Delivered", Type: t}]
|> request("EndProcessingDownloadedMessage")
defp request(body, f), do:
({:ok, x} = Soap.init_model(@wsdl); response(f, Soap.call(x, f, {nil, body}, [], [])))
defp response(_, {:ok, response = %Soap.Response{status_code: 200}}), do:
Soap.Response.parse(response)
defp response(f, {:ok, %Soap.Response{body: body, status_code: 500}}), do:
(%{:faultcode => c, :faultstring => s} = Soap.Response.Parser.parse(body, :fault);
SEV.UTL.error('~ts 500: ~ts ~ts', [f, c, s]); [])
defp response(_, {:ok, %Soap.Response{status_code: 503}}), do:
(SEV.UTL.error('Service Unavailable ~tp', [503]); [])
defp response(_, {:ok, %Soap.Response{status_code: 504}}), do:
(SEV.UTL.error('Gateway Timeout ~tp', [504]); [])
defp response(f, {:ok, %Soap.Response{body: body, status_code: code}}), do:
(SEV.UTL.error('~ts ~ts: ~tp', [f, code, body]); [])
defp response(f, response), do:
(SEV.UTL.error('Action: ~tp ~n Response: ~tp~n', [f, response]); [])
defp parse(%{:GetInputMessagesResponse => %{:"s01:GetInputMessagesResult" => x}}), do: check(x) |> inputMessages()
defp parse(%{:GetInputMessagesResponse => _}), do: []
defp parse(%{:OpenDownloadingSessionResponse => %{:"s01:OpenDownloadingSessionResult" => x}}), do: check(x) |> openDownSession()
defp parse(%{:DownloadMessageChunkResponse => %{:"s01:DownloadMessageChunkResult" => x}}), do: check(x) |> downloadChunk()
defp parse(%{:GetMessageValidationInfoResponse => %{:"s01:GetMessageValidationInfoResult" => x}}), do: check(x) |> endSession()
defp parse(%{:GetSessionInfoResponse => %{:"s01:GetSessionInfoResult" => x}}), do: check(x)
defp parse(%{:OpenUploadingSessionResponse => %{:"s01:OpenUploadingSessionResult" => x}}), do: check(x) |> openUploadSession()
defp parse(%{:UploadMessageChunkResponse => %{:"s01:UploadMessageChunkResult" => x}}), do: check(x) |> uploadChunk()
defp parse(_), do: :erlang.exit(self(), :error)
defp check(%{:error => c}), do: %{:error => c}
defp check(%{:Error => %{:Code => c, :Text => t}}), do: (SEV.UTL.error('~ts : ~ts', [c, t]); %{:error => c})
defp check(x), do: x
defp uploadChunk(%{:SessionId => sId}), do: %{:session => sId}
defp uploadChunk(x), do: x
defp downloadChunk(%{:Session => %{:MaxPartSize => mS}, :MessageChunk => c}), do:
%{:partSize => mS |> :nitro.to_binary() |> String.to_integer(), :message => c}
defp downloadChunk(x), do: x
defp endSession(%{:Hash => x, :Session => %{:SessionId => s, :Type => t}}), do: %{:hash => x, :type => t, :session => s}
defp endSession(x), do: x
defp openUploadSession(%{:MaxPartSize => mS, :TransferredBytesCount => bC, :SessionId => sId}), do:
%{:session => sId, :partSize => mS |> :nitro.to_binary() |> String.to_integer(), :bytesCount => bC |> :nitro.to_binary() |> String.to_integer()}
defp openUploadSession(x), do: x
defp openDownSession(%{:SessionId => sId, :MaxPartSize => mS, :MessageSize => s}), do:
%{:partSize => mS |> :nitro.to_binary() |> String.to_integer(),
:session => sId,
:size => s |> :nitro.to_binary() |> String.to_integer()}
defp openDownSession(x), do: x
defp inputMessages(%{:MessageInfo => %{:MessageId => _} = x}), do: [MessageInfo: x]
defp inputMessages([{:MessageInfo, %{:MessageId => _}} | _] = x), do: x
defp inputMessages(x), do: x
end