Skip to content

Commit 1a31faf

Browse files
committed
Migrate select query of register_device to Ecto
Use Ecto to compose and run the query. Signed-off-by: Davide Briani <davide.briani@secomind.com>
1 parent 5a6bb06 commit 1a31faf

File tree

2 files changed

+62
-53
lines changed

2 files changed

+62
-53
lines changed

apps/astarte_pairing/lib/astarte_pairing/engine.ex

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -164,22 +164,12 @@ defmodule Astarte.Pairing.Engine do
164164
)
165165

166166
:telemetry.execute([:astarte, :pairing, :register_new_device], %{}, %{realm: realm})
167-
keyspace_name = CQLUtils.realm_name_to_keyspace_name(realm, Config.astarte_instance_id!())
168-
169-
cqex_options =
170-
Config.cqex_options!()
171-
|> Keyword.put(:keyspace, keyspace_name)
172167

173168
with {:ok, device_id} <- Device.decode_device_id(hardware_id, allow_extended_id: true),
174169
:ok <- verify_can_register_device(realm, device_id),
175-
{:ok, client} <-
176-
Client.new(
177-
Config.cassandra_node!(),
178-
cqex_options
179-
),
180170
credentials_secret <- CredentialsSecret.generate(),
181171
secret_hash <- CredentialsSecret.hash(credentials_secret),
182-
:ok <- Queries.register_device(client, device_id, hardware_id, secret_hash, opts) do
172+
:ok <- Queries.register_device(realm, device_id, hardware_id, secret_hash, opts) do
183173
{:ok, credentials_secret}
184174
else
185175
{:error, :shutdown} ->

apps/astarte_pairing/lib/astarte_pairing/queries.ex

Lines changed: 61 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ defmodule Astarte.Pairing.Queries do
2121
This module is responsible for the interaction with the database.
2222
"""
2323

24+
alias CQEx.Client
2425
alias CQEx.Query
25-
alias CQEx.Result
2626
alias Astarte.Core.CQLUtils
2727
alias Astarte.Pairing.Config
2828
alias Astarte.Pairing.Astarte.Realm
@@ -83,51 +83,42 @@ defmodule Astarte.Pairing.Queries do
8383
end
8484
end
8585

86-
def register_device(client, device_id, extended_id, credentials_secret, opts \\ []) do
87-
statement = """
88-
SELECT first_credentials_request, first_registration
89-
FROM devices
90-
WHERE device_id=:device_id
91-
"""
92-
93-
device_exists_query =
94-
Query.new()
95-
|> Query.statement(statement)
96-
|> Query.put(:device_id, device_id)
97-
|> Query.consistency(:quorum)
86+
def register_device(realm_name, device_id, extended_id, credentials_secret, opts \\ []) do
87+
case fetch_device(realm_name, device_id) do
88+
{:error, :device_not_found} ->
89+
Logger.info("register request for new device: #{inspect(extended_id)}")
9890

99-
with {:ok, res} <- Query.call(client, device_exists_query) do
100-
case Result.head(res) do
101-
:empty_dataset ->
102-
registration_timestamp =
103-
DateTime.utc_now()
104-
|> DateTime.to_unix(:millisecond)
91+
registration_timestamp = DateTime.utc_now()
10592

106-
Logger.info("register request for new device: #{inspect(extended_id)}")
107-
do_register_device(client, device_id, credentials_secret, registration_timestamp, opts)
93+
do_register_device(
94+
realm_name,
95+
device_id,
96+
credentials_secret,
97+
registration_timestamp,
98+
opts
99+
)
108100

109-
[first_credentials_request: nil, first_registration: registration_timestamp] ->
101+
{:ok, device} ->
102+
if is_nil(device.first_credentials_request) do
110103
Logger.info("register request for existing unconfirmed device: #{inspect(extended_id)}")
111104

112105
do_register_unconfirmed_device(
113-
client,
106+
realm_name,
114107
device_id,
115108
credentials_secret,
116-
registration_timestamp,
109+
device.first_registration,
117110
opts
118111
)
119-
120-
[first_credentials_request: _timestamp, first_registration: _registration_timestamp] ->
112+
else
121113
Logger.warning(
122114
"register request for existing confirmed device: #{inspect(extended_id)}"
123115
)
124116

125117
{:error, :already_registered}
126-
end
127-
else
128-
error ->
129-
Logger.warning("DB error: #{inspect(error)}")
130-
{:error, :database_error}
118+
end
119+
120+
{:error, reason} ->
121+
{:error, reason}
131122
end
132123
end
133124

@@ -302,7 +293,13 @@ defmodule Astarte.Pairing.Queries do
302293
end
303294
end
304295

305-
defp do_register_device(client, device_id, credentials_secret, registration_timestamp, opts) do
296+
defp do_register_device(
297+
realm_name,
298+
device_id,
299+
credentials_secret,
300+
%DateTime{} = registration_timestamp,
301+
opts
302+
) do
306303
statement = """
307304
INSERT INTO devices
308305
(device_id, first_registration, credentials_secret, inhibit_credentials_request,
@@ -323,7 +320,7 @@ defmodule Astarte.Pairing.Queries do
323320
Query.new()
324321
|> Query.statement(statement)
325322
|> Query.put(:device_id, device_id)
326-
|> Query.put(:first_registration, registration_timestamp)
323+
|> Query.put(:first_registration, registration_timestamp |> DateTime.to_unix(:millisecond))
327324
|> Query.put(:credentials_secret, credentials_secret)
328325
|> Query.put(:inhibit_credentials_request, false)
329326
|> Query.put(:protocol_revision, 0)
@@ -333,21 +330,32 @@ defmodule Astarte.Pairing.Queries do
333330
|> Query.put(:introspection_minor, introspection_minor)
334331
|> Query.consistency(:quorum)
335332

336-
case Query.call(client, query) do
337-
{:ok, _res} ->
338-
:ok
333+
keyspace_name =
334+
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())
339335

336+
cqex_options =
337+
Config.cqex_options!()
338+
|> Keyword.put(:keyspace, keyspace_name)
339+
340+
with {:ok, client} <-
341+
Client.new(
342+
Config.cassandra_node!(),
343+
cqex_options
344+
),
345+
{:ok, _res} <- Query.call(client, query) do
346+
:ok
347+
else
340348
error ->
341349
Logger.warning("DB error: #{inspect(error)}")
342350
{:error, :database_error}
343351
end
344352
end
345353

346354
defp do_register_unconfirmed_device(
347-
client,
355+
realm_name,
348356
device_id,
349357
credentials_secret,
350-
registration_timestamp,
358+
%DateTime{} = registration_timestamp,
351359
opts
352360
) do
353361
statement = """
@@ -372,18 +380,29 @@ defmodule Astarte.Pairing.Queries do
372380
Query.new()
373381
|> Query.statement(statement)
374382
|> Query.put(:device_id, device_id)
375-
|> Query.put(:first_registration, registration_timestamp)
383+
|> Query.put(:first_registration, registration_timestamp |> DateTime.to_unix(:millisecond))
376384
|> Query.put(:credentials_secret, credentials_secret)
377385
|> Query.put(:inhibit_credentials_request, false)
378386
|> Query.put(:protocol_revision, 0)
379387
|> Query.put(:introspection, introspection)
380388
|> Query.put(:introspection_minor, introspection_minor)
381389
|> Query.consistency(:quorum)
382390

383-
case Query.call(client, query) do
384-
{:ok, _res} ->
385-
:ok
391+
keyspace_name =
392+
CQLUtils.realm_name_to_keyspace_name(realm_name, Config.astarte_instance_id!())
386393

394+
cqex_options =
395+
Config.cqex_options!()
396+
|> Keyword.put(:keyspace, keyspace_name)
397+
398+
with {:ok, client} <-
399+
Client.new(
400+
Config.cassandra_node!(),
401+
cqex_options
402+
),
403+
{:ok, _res} <- Query.call(client, query) do
404+
:ok
405+
else
387406
error ->
388407
Logger.warning("DB error: #{inspect(error)}")
389408
{:error, :database_error}

0 commit comments

Comments
 (0)