defmodule ExAws.Timestream.Write do
import ExAws.Utils, only: [camelize_keys: 2]
@namespace "Timestream_20181101"
@moduledoc """
The following actions are supported by Amazon Timestream Write.
https://docs.aws.amazon.com/timestream/latest/developerguide/API_Operations_Amazon_Timestream_Write.html
"""
@type database_name :: binary
@type table_name :: binary
@type tag :: ExAws.Timestream.Write.Tag.t()
@type tags :: list(tag)
@type retention_properties :: %{
magnetic_retention: pos_integer,
memory_retention: pos_integer
}
@type resource_arn :: binary
@type record :: %ExAws.Timestream.Write.Record{}
@doc "DescribeEndpoints returns a list of available endpoints to make Timestream API calls against"
@spec describe_endpoints() :: ExAws.Operation.JSON.t()
def describe_endpoints do
endpoint_operation()
end
## Amazon Timestream Write : Database
######################
@doc """
Creates a new Timestream database.
## Options
* `km_key_id` - The KMS key for the database.
* `tags` - A list of tags to label the database.
## Examples - create_database/1
ExAws.Timestream.Write.create_database("database_name")
## Examples - create_database/2
tag = ExAws.Timestream.Write.Tag.new("tag_key", "tag_value")
ExAws.Timestream.Write.create_database("database_name", km_key_id: 1, tags: [tag])
"""
@type create_database_opts :: [
{:km_key_id, pos_integer}
| {:tags, tags}
]
@spec create_database(database_name :: database_name) :: ExAws.Operation.EndpointDiscovery.t()
@spec create_database(database_name :: database_name, opts :: create_database_opts) ::
ExAws.Operation.JSON.t()
def create_database(database_name, opts \\ []) do
request(:create_database, %{
"DatabaseName" => database_name,
"KmsKeyId" => Keyword.get(opts, :km_key_id, nil),
"Tags" => Keyword.get(opts, :tags, []) |> build_tags
})
|> dynamic_endpoint_request()
end
defp build_tags(tags) do
tags
|> Enum.map(fn %ExAws.Timestream.Write.Tag{key: key, value: value} ->
%{
"Key" => key,
"Value" => value
}
end)
end
@doc "Deletes a given Timestream database."
@spec delete_database(database_name :: database_name) :: ExAws.Operation.EndpointDiscovery.t()
def delete_database(database_name) do
request(:delete_database, %{"DatabaseName" => database_name})
|> dynamic_endpoint_request()
end
@doc "Returns information about the database."
@spec describe_database(database_name :: database_name) :: ExAws.Operation.EndpointDiscovery.t()
def describe_database(database_name) do
request(:describe_database, %{"DatabaseName" => database_name})
|> dynamic_endpoint_request()
end
@doc "Returns a list of your Timestream databases."
@type list_databases_opts :: [
{:max_results, pos_integer}
| {:next_token, binary}
]
@spec list_databases() :: ExAws.Operation.EndpointDiscovery.t()
@spec list_databases(list_databases_opts :: list_databases_opts) ::
ExAws.Operation.EndpointDiscovery.t()
def list_databases(opts \\ []) do
request(:list_databases, %{
"MaxResults" => Keyword.get(opts, :max_results, nil),
"NextToken" => Keyword.get(opts, :next_token, nil)
})
|> dynamic_endpoint_request()
end
@doc "Modifies the KMS key for an existing database."
@spec update_database(database_name :: database_name, km_key_id :: pos_integer) ::
ExAws.Operation.JSON.t()
def update_database(database_name, km_key_id) do
request(:update_database, %{
"DatabaseName" => database_name,
"KmsKeyId" => km_key_id
})
|> dynamic_endpoint_request()
end
## Amazon Timestream Write : Table
######################
@doc """
The CreateTable operation adds a new table to an existing database in your account.
## Options
* `retention_properties` - The duration for which your time series data must be stored in the memory store and the magnetic store.
* `tags` - A list of tags to label the database.
## Examples - create_table/2
ExAws.Timestream.Write.create_table("database_name", "table_name")
## Examples - create_table/3
tag = ExAws.Timestream.Write.Tag.new("tag_key", "tag_value")
retention_properties = %{ magnetic_retention: 1, memory_retention: 1 }
ExAws.Timestream.Write.create_table("database_name", "table_name",
retention_properties: retention_properties, tags: [tag])
"""
@type create_table_opts :: [
{:tags, tags}
| {:retention_properties, retention_properties}
]
@spec create_table(database_name :: database_name, table_name :: table_name) ::
ExAws.Operation.JSON.t()
@spec create_table(
database_name :: database_name,
table_name :: table_name,
create_table_opts :: create_table_opts
) :: ExAws.Operation.EndpointDiscovery.t()
def create_table(database_name, table_name, opts \\ []) do
request(:create_table, %{
"DatabaseName" => database_name,
"TableName" => table_name,
"Tags" => Keyword.get(opts, :tags, []) |> build_tags,
"RetentionProperties" =>
Keyword.get(opts, :retention_properties, nil) |> build_retention_properties
})
|> dynamic_endpoint_request()
end
defp build_retention_properties(retention_properties) when is_nil(retention_properties), do: nil
defp build_retention_properties(%{
magnetic_retention: magnetic_retention,
memory_retention: memory_retention
}) do
%{
"MagneticStoreRetentionPeriodInDays" => magnetic_retention,
"MemoryStoreRetentionPeriodInHours" => memory_retention
}
end
@doc "Deletes a given Timestream table."
@spec delete_table(database_name :: database_name, km_key_id :: table_name) ::
ExAws.Operation.JSON.t()
def delete_table(database_name, table_name) do
request(:delete_table, %{
"DatabaseName" => database_name,
"TableName" => table_name
})
|> dynamic_endpoint_request()
end
@doc "Returns information about the table."
@spec describe_table(database_name :: database_name, km_key_id :: table_name) ::
ExAws.Operation.JSON.t()
def describe_table(database_name, table_name) do
request(:describe_table, %{
"DatabaseName" => database_name,
"TableName" => table_name
})
|> dynamic_endpoint_request()
end
@doc "Returns a list of your Timestream tables."
@type list_tables_opts :: [
{:database_name, database_name}
| {:max_results, pos_integer}
| {:next_token, binary}
]
@spec list_tables() :: ExAws.Operation.EndpointDiscovery.t()
@spec list_tables(list_tables_opts) :: ExAws.Operation.EndpointDiscovery.t()
def list_tables(opts \\ []) do
request(:list_tables, %{
"DatabaseName" => Keyword.get(opts, :database_name, nil),
"MaxResults" => Keyword.get(opts, :max_results, nil),
"NextToken" => Keyword.get(opts, :next_token, nil)
})
|> dynamic_endpoint_request()
end
@doc "Modifies the retention duration of the memory store and magnetic store for your Timestream table."
@spec update_table(
database_name :: database_name,
km_key_id :: table_name,
retention_properties :: retention_properties
) :: ExAws.Operation.EndpointDiscovery.t()
def update_table(database_name, table_name, retention_properties) do
request(:update_table, %{
"DatabaseName" => database_name,
"TableName" => table_name,
"RetentionProperties" => retention_properties |> build_retention_properties
})
|> dynamic_endpoint_request()
end
## Amazon Timestream Write : TagResource
######################
@doc "List all tags on a Timestream resource."
@spec list_tags_for_resource(resource_arn :: resource_arn) ::
ExAws.Operation.EndpointDiscovery.t()
def list_tags_for_resource(resource_arn) do
request(:list_tags_for_resource, %{
"ResourceARN" => resource_arn
})
|> dynamic_endpoint_request()
end
@doc """
Associate a set of tags with a Timestream resource.
## Examples
tags = [
ExAws.Timestream.Write.Tag.new("tag_key_1", "tag_value_1"),
ExAws.Timestream.Write.Tag.new("tag_key_2", "tag_value_2")
]
ExAws.Timestream.Write.tag_resource("resource_arn", tags)
"""
@spec tag_resource(resource_arn :: resource_arn, tags :: tags) ::
ExAws.Operation.EndpointDiscovery.t()
def tag_resource(resource_arn, tags) do
request(:tag_resource, %{
"ResourceARN" => resource_arn,
"Tags" => tags |> build_tags
})
|> dynamic_endpoint_request()
end
@doc "Removes the association of tags from a Timestream resource."
@spec untag_resource(resource_arn :: resource_arn, tag_keys :: [binary]) ::
ExAws.Operation.JSON.t()
def untag_resource(resource_arn, tag_keys) do
request(:untag_resource, %{
"ResourceARN" => resource_arn,
"TagKeys" => tag_keys
})
|> dynamic_endpoint_request()
end
## Amazon Timestream Write : time series data
######################
@doc "The WriteRecords operation enables you to write your time series data into Timestream."
@type write_records_opts :: [
{:common_attributes, record}
]
@spec write_records(
records :: [record],
database_name :: database_name,
table_name :: table_name
) :: ExAws.Operation.EndpointDiscovery.t()
@spec write_records(
records :: [record],
database_name :: database_name,
table_name :: table_name,
write_records :: write_records_opts
) :: ExAws.Operation.EndpointDiscovery.t()
def write_records(records, database_name, table_name, opts \\ []) do
request(:write_records, %{
"DatabaseName" => database_name,
"TableName" => table_name,
"Records" => Enum.map(records, &build_record/1),
"CommonAttributes" => Keyword.get(opts, :common_attributes, nil) |> build_record
})
|> dynamic_endpoint_request()
end
defp build_record(record) when is_nil(record), do: nil
defp build_record(record) do
record
|> Map.from_struct()
|> Map.update!(:dimensions, fn current_dimensions ->
current_dimensions
|> Enum.map(fn dimension ->
dimension
|> Map.from_struct()
|> camelize_keys(deep: false)
end)
end)
|> Map.update!(:measure_values, fn current_measure_value ->
if current_measure_value == nil or current_measure_value == [] do
nil
else
current_measure_value
|> Enum.map(fn measure_value ->
measure_value
|> Map.from_struct()
|> camelize_keys(deep: false)
end)
end
end)
|> Enum.filter(fn {_k, v} -> not is_nil(v) end)
|> Map.new()
|> camelize_keys(deep: false)
end
defp request(op, data) do
ExAws.Operation.JSON.new(
:ingest_timestream,
http_method: :post,
data: data,
headers: [
{"x-amz-target", "#{@namespace}.#{format_operation_name(op)}"},
{"content-type", "application/x-amz-json-1.0"}
]
)
end
defp format_operation_name(operation) do
operation
|> Atom.to_string()
|> Macro.camelize()
end
defp dynamic_endpoint_request(request_op, endpoint_op \\ endpoint_operation()) do
ExAws.Operation.EndpointDiscovery.new(:ingest_timestream,
request_operation: request_op,
endpoint_operation: endpoint_op
)
end
defp endpoint_operation() do
request(:describe_endpoints, %{})
end
end