Skip to content

Commit eaadf78

Browse files
committed
Migrate update_device_after_credentials_request query to Ecto
Use Ecto to compose and run the query. Signed-off-by: Davide Briani <davide.briani@secomind.com>
1 parent 0cc304f commit eaadf78

File tree

2 files changed

+18
-51
lines changed

2 files changed

+18
-51
lines changed

apps/astarte_pairing/lib/astarte_pairing/engine.ex

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ defmodule Astarte.Pairing.Engine do
2828
alias Astarte.Pairing.CredentialsSecret
2929
alias Astarte.Pairing.Queries
3030
alias CQEx.Client
31-
alias Astarte.Core.CQLUtils
3231

3332
require Logger
3433

@@ -71,19 +70,9 @@ defmodule Astarte.Pairing.Engine do
7170
)
7271

7372
:telemetry.execute([:astarte, :pairing, :get_credentials], %{}, %{realm: realm})
74-
keyspace_name = CQLUtils.realm_name_to_keyspace_name(realm, Config.astarte_instance_id!())
75-
76-
cqex_options =
77-
Config.cqex_options!()
78-
|> Keyword.put(:keyspace, keyspace_name)
7973

8074
with {:ok, device_id} <- Device.decode_device_id(hardware_id, allow_extended_id: true),
8175
{:ok, ip_tuple} <- parse_ip(device_ip),
82-
{:ok, client} <-
83-
Client.new(
84-
Config.cassandra_node!(),
85-
cqex_options
86-
),
8776
{:ok, device} <- Queries.fetch_device(realm, device_id),
8877
{:authorized?, true} <-
8978
{:authorized?, CredentialsSecret.verify(credentials_secret, device.credentials_secret)},
@@ -93,10 +82,10 @@ defmodule Astarte.Pairing.Engine do
9382
encoded_device_id <- Device.encode_device_id(device_id),
9483
{:ok, %{cert: cert, aki: _aki, serial: _serial} = cert_data} <-
9584
CFSSLCredentials.get_certificate(csr, realm, encoded_device_id),
96-
:ok <-
85+
{:ok, _device} <-
9786
Queries.update_device_after_credentials_request(
98-
client,
99-
device_id,
87+
realm,
88+
device,
10089
cert_data,
10190
ip_tuple,
10291
device.first_credentials_request
@@ -109,9 +98,6 @@ defmodule Astarte.Pairing.Engine do
10998
{:credentials_inhibited?, true} ->
11099
{:error, :credentials_request_inhibited}
111100

112-
{:error, :shutdown} ->
113-
{:error, :realm_not_found}
114-
115101
{:error, reason} ->
116102
{:error, reason}
117103
end

apps/astarte_pairing/lib/astarte_pairing/queries.ex

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ defmodule Astarte.Pairing.Queries do
3232
require Logger
3333
import Ecto.Query
3434

35-
@protocol_revision 1
3635
@keyspace_does_not_exist_regex ~r/Keyspace (.*) does not exist/
3736

3837
def get_agent_public_key_pems(realm_name) do
@@ -170,54 +169,36 @@ defmodule Astarte.Pairing.Queries do
170169
end
171170
end
172171

173-
def update_device_after_credentials_request(client, device_id, cert_data, device_ip, nil) do
172+
def update_device_after_credentials_request(realm_name, device, cert_data, device_ip, nil) do
174173
first_credentials_request_timestamp = DateTime.utc_now()
175174

176175
update_device_after_credentials_request(
177-
client,
178-
device_id,
176+
realm_name,
177+
device,
179178
cert_data,
180179
device_ip,
181180
first_credentials_request_timestamp
182181
)
183182
end
184183

185184
def update_device_after_credentials_request(
186-
client,
187-
device_id,
185+
realm_name,
186+
%Device{} = device,
188187
%{serial: serial, aki: aki} = _cert_data,
189188
device_ip,
190189
%DateTime{} = first_credentials_request_timestamp
191190
) do
192-
statement = """
193-
UPDATE devices
194-
SET cert_aki=:cert_aki, cert_serial=:cert_serial, last_credentials_request_ip=:last_credentials_request_ip,
195-
first_credentials_request=:first_credentials_request
196-
WHERE device_id=:device_id
197-
"""
198-
199-
query =
200-
Query.new()
201-
|> Query.statement(statement)
202-
|> Query.put(:device_id, device_id)
203-
|> Query.put(:cert_aki, aki)
204-
|> Query.put(:cert_serial, serial)
205-
|> Query.put(:last_credentials_request_ip, device_ip)
206-
|> Query.put(
207-
:first_credentials_request,
208-
first_credentials_request_timestamp |> DateTime.to_unix(:millisecond)
209-
)
210-
|> Query.put(:protocol_revision, @protocol_revision)
211-
|> Query.consistency(:quorum)
212-
213-
case Query.call(client, query) do
214-
{:ok, _res} ->
215-
:ok
191+
keyspace_name =
192+
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())
216193

217-
error ->
218-
Logger.warning("DB error: #{inspect(error)}")
219-
{:error, :database_error}
220-
end
194+
device
195+
|> Ecto.Changeset.change(%{
196+
cert_aki: aki,
197+
cert_serial: serial,
198+
last_credentials_request_ip: device_ip,
199+
first_credentials_request: first_credentials_request_timestamp
200+
})
201+
|> Repo.update(prefix: keyspace_name, consistency: :quorum)
221202
end
222203

223204
def fetch_device_registration_limit(realm_name) do

0 commit comments

Comments
 (0)