Skip to content

Commit 4a66355

Browse files
committed
Add :jitp to CACertificate API response
1 parent e3c3491 commit 4a66355

File tree

3 files changed

+59
-30
lines changed

3 files changed

+59
-30
lines changed

lib/nerves_hub/devices.ex

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -412,34 +412,37 @@ defmodule NervesHub.Devices do
412412
end
413413

414414
def get_ca_certificates(%Org{id: org_id}) do
415-
from(ca in CACertificate, where: ca.org_id == ^org_id, preload: :jitp)
415+
from(ca in CACertificate, where: ca.org_id == ^org_id, preload: [jitp: :product])
416416
|> Repo.all()
417417
end
418418

419419
@spec get_ca_certificate_by_aki(binary) :: {:ok, CACertificate.t()} | {:error, any()}
420420
def get_ca_certificate_by_aki(aki) do
421-
Repo.get_by(CACertificate, aki: aki)
422-
|> case do
421+
q = from(CACertificate, where: [aki: ^aki], preload: [jitp: :product])
422+
423+
case Repo.one(q) do
423424
nil -> {:error, :not_found}
424-
ca_cert -> preload_cert(ca_cert)
425+
ca_cert -> {:ok, ca_cert}
425426
end
426427
end
427428

428429
@spec get_ca_certificate_by_ski(binary) :: {:ok, CACertificate.t()} | {:error, any()}
429430
def get_ca_certificate_by_ski(ski) do
430-
Repo.get_by(CACertificate, ski: ski)
431-
|> case do
431+
q = from(CACertificate, where: [ski: ^ski], preload: [jitp: :product])
432+
433+
case Repo.one(q) do
432434
nil -> {:error, :not_found}
433-
ca_cert -> preload_cert(ca_cert)
435+
ca_cert -> {:ok, ca_cert}
434436
end
435437
end
436438

437439
@spec get_ca_certificate_by_serial(binary) :: {:ok, CACertificate.t()} | {:error, any()}
438440
def get_ca_certificate_by_serial(serial) do
439-
Repo.get_by(CACertificate, serial: serial)
440-
|> case do
441+
q = from(CACertificate, where: [serial: ^serial], preload: [jitp: :product])
442+
443+
case Repo.one(q) do
441444
nil -> {:error, :not_found}
442-
ca_cert -> preload_cert(ca_cert)
445+
ca_cert -> {:ok, ca_cert}
443446
end
444447
end
445448

@@ -449,24 +452,19 @@ defmodule NervesHub.Devices do
449452
query =
450453
from(
451454
ca in CACertificate,
452-
where: ca.serial == ^serial and ca.org_id == ^org_id
455+
where: ca.serial == ^serial and ca.org_id == ^org_id,
456+
preload: [jitp: :product]
453457
)
454458

455-
query
456-
|> Repo.one()
457-
|> case do
459+
case Repo.one(query) do
458460
nil ->
459461
{:error, :not_found}
460462

461463
ca_cert ->
462-
preload_cert(ca_cert)
464+
{:ok, ca_cert}
463465
end
464466
end
465467

466-
def preload_cert(%CACertificate{} = certificate) do
467-
{:ok, Repo.preload(certificate, [:jitp])}
468-
end
469-
470468
def update_ca_certificate(%CACertificate{} = certificate, params) do
471469
certificate
472470
|> CACertificate.update_changeset(params)

lib/nerves_hub_web/views/api/ca_certificate_view.ex

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
defmodule NervesHubWeb.API.CACertificateView do
22
use NervesHubWeb, :api_view
33

4+
alias NervesHub.Devices.CACertificate.JITP
45
alias NervesHubWeb.API.CACertificateView
56

67
def render("index.json", %{ca_certificates: ca_certificates}) do
@@ -16,7 +17,18 @@ defmodule NervesHubWeb.API.CACertificateView do
1617
serial: ca_certificate.serial,
1718
not_before: ca_certificate.not_before,
1819
not_after: ca_certificate.not_after,
19-
description: ca_certificate.description
20+
description: ca_certificate.description,
21+
jitp: maybe_add_jitp(ca_certificate.jitp)
2022
}
2123
end
24+
25+
defp maybe_add_jitp(%JITP{} = jitp) do
26+
%{
27+
product_name: jitp.product.name,
28+
tags: jitp.tags,
29+
description: jitp.description
30+
}
31+
end
32+
33+
defp maybe_add_jitp(_), do: nil
2234
end

test/nerves_hub_web/controllers/api/ca_certificate_controller_test.exs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,39 @@ defmodule NervesHubWeb.API.CACertificateControllerTest do
5252
end
5353
end
5454

55-
defp create_ca_certificate(%{org: org}) do
55+
test "includes jitp when available", context do
56+
params = %{jitp: %{description: "Jitter", tags: ["howdy"], product_id: context.product.id}}
57+
{:ok, %{ca_certificate: ca_cert}} = create_ca_certificate(context, params)
58+
59+
conn =
60+
get(
61+
context.conn,
62+
Routes.api_ca_certificate_path(context.conn, :show, context.org.name, ca_cert.serial)
63+
)
64+
65+
assert json_response(conn, 200)["data"]["jitp"] == %{
66+
"description" => "Jitter",
67+
"tags" => ["howdy"],
68+
"product_name" => context.product.name
69+
}
70+
end
71+
72+
defp create_ca_certificate(%{org: org}, params \\ %{}) do
5673
ca_key = X509.PrivateKey.new_ec(:secp256r1)
5774
ca = X509.Certificate.self_signed(ca_key, "CN=#{org.name}", template: :root_ca)
5875
{not_before, not_after} = Certificate.get_validity(ca)
5976

60-
params = %{
61-
serial: Certificate.get_serial_number(ca),
62-
aki: Certificate.get_aki(ca),
63-
ski: Certificate.get_ski(ca),
64-
not_before: not_before,
65-
not_after: not_after,
66-
der: X509.Certificate.to_der(ca),
67-
description: "My CA"
68-
}
77+
params =
78+
%{
79+
serial: Certificate.get_serial_number(ca),
80+
aki: Certificate.get_aki(ca),
81+
ski: Certificate.get_ski(ca),
82+
not_before: not_before,
83+
not_after: not_after,
84+
der: X509.Certificate.to_der(ca),
85+
description: "My CA"
86+
}
87+
|> Map.merge(params)
6988

7089
{:ok, ca_certificate} = Devices.create_ca_certificate(org, params)
7190
{:ok, %{ca_certificate: ca_certificate}}

0 commit comments

Comments
 (0)