Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
238 changes: 45 additions & 193 deletions apps/astarte_realm_management/lib/astarte_realm_management/queries.ex
Original file line number Diff line number Diff line change
Expand Up @@ -1247,50 +1247,22 @@ defmodule Astarte.RealmManagement.Queries do
endpoint_id,
path
) do
Xandra.Cluster.run(
:xandra_device_deletion,
&do_delete_individual_datastream_values!(
&1,
realm_name,
device_id,
interface_id,
endpoint_id,
path
)
)
end

defp do_delete_individual_datastream_values!(
conn,
realm_name,
device_id,
interface_id,
endpoint_id,
path
) do
# TODO: validate realm name
keyspace_name =
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())

statement = """
DELETE FROM #{keyspace_name}.individual_datastreams
WHERE device_id=:device_id AND interface_id=:interface_id
AND endpoint_id=:endpoint_id AND path=:path
"""

params = %{
device_id: device_id,
interface_id: interface_id,
endpoint_id: endpoint_id,
path: path
}
query =
from IndividualDatastream,
where: [
device_id: ^device_id,
interface_id: ^interface_id,
endpoint_id: ^endpoint_id,
path: ^path
]

prepared = Xandra.prepare!(conn, statement)
_ = Repo.delete_all(query, prefix: keyspace_name, consistency: :local_quorum)

Xandra.execute!(conn, prepared, params,
consistency: :local_quorum,
uuid_format: :binary
)
:ok
end

def retrieve_individual_properties_keys!(realm_name, device_id) do
Expand All @@ -1307,38 +1279,17 @@ defmodule Astarte.RealmManagement.Queries do
end

def delete_individual_properties_values!(realm_name, device_id, interface_id) do
Xandra.Cluster.run(
:xandra_device_deletion,
&do_delete_individual_properties_values!(&1, realm_name, device_id, interface_id)
)
end

defp do_delete_individual_properties_values!(
conn,
realm_name,
device_id,
interface_id
) do
# TODO: validate realm name
keyspace_name =
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())

statement = """
DELETE FROM #{keyspace_name}.individual_properties
WHERE device_id=:device_id AND interface_id=:interface_id
"""

params = %{
device_id: device_id,
interface_id: interface_id
}
query =
from IndividualProperty,
where: [device_id: ^device_id, interface_id: ^interface_id]

prepared = Xandra.prepare!(conn, statement)
_ = Repo.delete_all(query, prefix: keyspace_name, consistency: :local_quorum)

Xandra.execute!(conn, prepared, params,
consistency: :local_quorum,
uuid_format: :binary
)
:ok
end

def retrieve_object_datastream_keys!(realm_name, device_id, table_name) do
Expand All @@ -1355,39 +1306,17 @@ defmodule Astarte.RealmManagement.Queries do
end

def delete_object_datastream_values!(realm_name, device_id, path, table_name) do
Xandra.Cluster.run(
:xandra_device_deletion,
&do_delete_object_datastream_values!(&1, realm_name, device_id, path, table_name)
)
end

defp do_delete_object_datastream_values!(
conn,
realm_name,
device_id,
path,
table_name
) do
# TODO: validate realm name
keyspace_name =
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())

statement = """
DELETE FROM #{keyspace_name}.#{table_name}
WHERE device_id=:device_id AND path=:path
"""

params = %{
device_id: device_id,
path: path
}
query =
from table_name,
where: [device_id: ^device_id, path: ^path]

prepared = Xandra.prepare!(conn, statement)
_ = Repo.delete_all(query, prefix: keyspace_name, consistency: :local_quorum)

Xandra.execute!(conn, prepared, params,
consistency: :local_quorum,
uuid_format: :binary
)
:ok
end

def retrieve_aliases!(realm_name, device_id) do
Expand All @@ -1403,30 +1332,17 @@ defmodule Astarte.RealmManagement.Queries do
end

def delete_alias_values!(realm_name, device_alias) do
Xandra.Cluster.run(
:xandra_device_deletion,
&do_delete_alias_values!(&1, realm_name, device_alias)
)
end

defp do_delete_alias_values!(conn, realm_name, device_alias) do
# TODO: validate realm name
keyspace_name =
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())

statement = """
DELETE FROM #{keyspace_name}.names
WHERE object_name = :device_alias
"""

params = %{device_alias: device_alias}
query =
from Name,
where: [object_name: ^device_alias]

prepared = Xandra.prepare!(conn, statement)
_ = Repo.delete_all(query, prefix: keyspace_name, consistency: :local_quorum)

Xandra.execute!(conn, prepared, params,
consistency: :local_quorum,
uuid_format: :binary
)
:ok
end

def retrieve_groups_keys!(realm_name, device_id) do
Expand All @@ -1442,41 +1358,16 @@ defmodule Astarte.RealmManagement.Queries do
end

def delete_group_values!(realm_name, device_id, group_name, insertion_uuid) do
Xandra.Cluster.run(
:xandra_device_deletion,
&do_delete_group_values!(&1, realm_name, device_id, group_name, insertion_uuid)
)
end

defp do_delete_group_values!(
conn,
realm_name,
device_id,
group_name,
insertion_uuid
) do
# TODO: validate realm name
keyspace_name =
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())

statement = """
DELETE FROM #{keyspace_name}.grouped_devices
WHERE group_name = :group_name AND insertion_uuid = :insertion_uuid AND device_id = :device_id
"""

params = %{
group_name: group_name,
insertion_uuid: insertion_uuid,
device_id: device_id
}
query =
from GroupedDevice,
where: [group_name: ^group_name, insertion_uuid: ^insertion_uuid, device_id: ^device_id]

prepared = Xandra.prepare!(conn, statement)
_ = Repo.delete_all(query, prefix: keyspace_name, consistency: :local_quorum)

Xandra.execute!(conn, prepared, params,
consistency: :local_quorum,
uuid_format: :binary,
timeuuid_format: :binary
)
:ok
end

def retrieve_kv_store_entries!(realm_name, device_id) do
Expand All @@ -1492,84 +1383,45 @@ defmodule Astarte.RealmManagement.Queries do
end

def delete_kv_store_entry!(realm_name, group, key) do
Xandra.Cluster.run(
:xandra_device_deletion,
&do_delete_kv_store_entry!(&1, realm_name, group, key)
)
end

defp do_delete_kv_store_entry!(conn, realm_name, group, key) do
# TODO: validate realm name
keyspace_name =
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())

statement = """
DELETE FROM #{keyspace_name}.kv_store
WHERE group = :group AND key = :key
"""

params = %{group: group, key: key}
query =
from KvStore,
where: [group: ^group, key: ^key]

prepared = Xandra.prepare!(conn, statement)
_ = Repo.delete_all(query, prefix: keyspace_name, consistency: :local_quorum)

Xandra.execute!(conn, prepared, params,
consistency: :local_quorum,
uuid_format: :binary
)
:ok
end

def delete_device!(realm_name, device_id) do
Xandra.Cluster.run(
:xandra_device_deletion,
&do_delete_device!(&1, realm_name, device_id)
)
end

defp do_delete_device!(conn, realm_name, device_id) do
# TODO: validate realm name
keyspace_name =
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())

statement = """
DELETE FROM #{keyspace_name}.devices
WHERE device_id = :device_id
"""

params = %{device_id: device_id}
query =
from RealmsDevice,
where: [device_id: ^device_id]

prepared = Xandra.prepare!(conn, statement)
_ = Repo.delete_all(query, prefix: keyspace_name, consistency: :local_quorum)

Xandra.execute!(conn, prepared, params,
consistency: :local_quorum,
uuid_format: :binary
)
:ok
end

def remove_device_from_deletion_in_progress!(realm_name, device_id) do
Xandra.Cluster.run(
:xandra_device_deletion,
&do_remove_device_from_deletion_in_progress!(&1, realm_name, device_id)
)
end

defp do_remove_device_from_deletion_in_progress!(conn, realm_name, device_id) do
# TODO: validate realm name
keyspace_name =
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())

statement = """
DELETE FROM #{keyspace_name}.deletion_in_progress
WHERE device_id = :device_id
"""

params = %{device_id: device_id}
query =
from DeletionInProgress,
where: [device_id: ^device_id]

prepared = Xandra.prepare!(conn, statement)
_ = Repo.delete_all(query, prefix: keyspace_name, consistency: :local_quorum)

Xandra.execute!(conn, prepared, params,
consistency: :local_quorum,
uuid_format: :binary
)
:ok
end

def retrieve_realms!() do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,7 @@ defmodule Astarte.RealmManagement.QueriesTest do

assert ^endpoint_id = CQLUtils.endpoint_id(interface_name, interface_major, endpoint)

assert %Xandra.Void{} =
assert :ok =
Queries.delete_individual_datastream_values!(
@realm_name,
device_id,
Expand Down Expand Up @@ -660,7 +660,7 @@ defmodule Astarte.RealmManagement.QueriesTest do

assert ^interface_id = CQLUtils.interface_id(interface_name, interface_major)

assert %Xandra.Void{} =
assert :ok =
Queries.delete_individual_properties_values!(
@realm_name,
device_id,
Expand Down Expand Up @@ -703,7 +703,7 @@ defmodule Astarte.RealmManagement.QueriesTest do
table_name
)

assert %Xandra.Void{} =
assert :ok =
Queries.delete_object_datastream_values!(
@realm_name,
device_id,
Expand Down Expand Up @@ -775,7 +775,7 @@ defmodule Astarte.RealmManagement.QueriesTest do
}
] = Queries.retrieve_aliases!(@realm_name, device_id)

assert %Xandra.Void{} =
assert :ok =
Queries.delete_alias_values!(
@realm_name,
device_alias
Expand Down Expand Up @@ -804,7 +804,7 @@ defmodule Astarte.RealmManagement.QueriesTest do
}
] = Queries.retrieve_groups_keys!(@realm_name, device_id)

assert %Xandra.Void{} =
assert :ok =
Queries.delete_group_values!(
@realm_name,
device_id,
Expand Down Expand Up @@ -835,7 +835,7 @@ defmodule Astarte.RealmManagement.QueriesTest do
}
] = Queries.retrieve_kv_store_entries!(@realm_name, encoded_device_id)

assert %Xandra.Void{} =
assert :ok =
Queries.delete_kv_store_entry!(
@realm_name,
group,
Expand Down
Loading