Skip to content

Commit

Permalink
Merge pull request #2 from upmaru/feature/ops-562-item-accesses-schema
Browse files Browse the repository at this point in the history
Add test for increment item_access
  • Loading branch information
zacksiri authored Feb 23, 2024
2 parents f8bc8d5 + 0ce3abc commit 8811269
Show file tree
Hide file tree
Showing 8 changed files with 171 additions and 1 deletion.
6 changes: 6 additions & 0 deletions lib/polar/streams.ex
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,10 @@ defmodule Polar.Streams do
defdelegate create_version(product, attrs),
to: Version.Manager,
as: :create

alias __MODULE__.Item

defdelegate record_item_access(item, space_credential),
to: Item.Manager,
as: :record_access
end
23 changes: 23 additions & 0 deletions lib/polar/streams/item/access.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
defmodule Polar.Streams.Item.Access do
use Ecto.Schema
import Ecto.Changeset

alias Polar.Streams.Item
alias Polar.Accounts.Space

schema "item_accesses" do
belongs_to :item, Item
belongs_to :space_credential, Space.Credential

field :count, :integer, default: 0

timestamps(type: :utc_datetime_usec)
end

@doc false
def changeset(access, attrs) do
access
|> cast(attrs, [])
|> validate_required([])
end
end
31 changes: 31 additions & 0 deletions lib/polar/streams/item/manager.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
defmodule Polar.Streams.Item.Manager do
alias Polar.Repo

alias Polar.Streams.Item
alias Polar.Accounts.Space

import Ecto.Query, only: [from: 2]

def record_access(%Item{id: item_id}, %Space.Credential{id: space_credential_id}) do
Item.Access
|> Repo.get_by(item_id: item_id, space_credential_id: space_credential_id)
|> case do
nil ->
%Item.Access{
item_id: item_id,
space_credential_id: space_credential_id,
count: 1
}
|> Repo.insert!()

%Item.Access{id: item_access_id} = item_access ->
from(ia in Item.Access,
update: [inc: [count: 1]],
where: ia.id == ^item_access_id
)
|> Repo.update_all([])

Repo.reload(item_access)
end
end
end
3 changes: 3 additions & 0 deletions lib/polar_web/controllers/streams/item_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ defmodule PolarWeb.Streams.ItemController do

alias Polar.Repo
alias Polar.Accounts
alias Polar.Streams
alias Polar.Streams.Item

action_fallback PolarWeb.FallbackController
Expand All @@ -19,6 +20,8 @@ defmodule PolarWeb.Streams.ItemController do

item = Repo.get!(Item, id)

Streams.record_item_access(item, credential)

endpoint = credential.space.cdn_host || default_cdn_host

url = Path.join(["https://", endpoint, item.path])
Expand Down
16 changes: 16 additions & 0 deletions priv/repo/migrations/20240223052459_create_item_accesses.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
defmodule Polar.Repo.Migrations.CreateItemAccesses do
use Ecto.Migration

def change do
create table(:item_accesses) do
add :item_id, references(:items, on_delete: :restrict), null: false
add :space_credential_id, references(:space_credentials, on_delete: :restrict), null: false
add :count, :integer, default: 0, null: false

timestamps(type: :utc_datetime_usec)
end

create index(:item_accesses, [:item_id])
create index(:item_accesses, [:space_credential_id])
end
end
54 changes: 54 additions & 0 deletions test/polar/streams/item/manager_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
defmodule Polar.Streams.Item.ManagerTest do
use Polar.DataCase, async: true

alias Polar.Accounts
alias Polar.Streams
alias Polar.Streams.Product
alias Polar.Streams.Item

import Polar.AccountsFixtures
import Polar.StreamsFixtures

setup do
user = user_fixture()

{:ok, space} = Accounts.create_space(user, %{name: "test-item-increment"})

{:ok, credential} =
Accounts.create_space_credential(space, user, %{
expires_in: 1_296_000,
name: "test",
type: "lxd"
})

{:ok, credential: credential}
end

setup do
{:ok, %Product{} = product} =
Streams.create_product(valid_product_attributes("alpine:3.19:amd64:default"))

{:ok, version} =
Streams.create_version(product, valid_version_attributes())

[item1, _item2] = version.items

{:ok, item: item1}
end

describe "record_item_access/2" do
test "creates item_access", %{item: item, credential: credential} do
assert %Item.Access{count: count} = Streams.record_item_access(item, credential)

assert count == 1
end

test "increment item_access count", %{item: item, credential: credential} do
%Item.Access{count: count} = Streams.record_item_access(item, credential)

assert %Item.Access{count: incremented_count} = Streams.record_item_access(item, credential)

assert incremented_count > count
end
end
end
5 changes: 5 additions & 0 deletions test/polar_web/controllers/streams/item_controller_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ defmodule PolarWeb.Streams.ItemControllerTest do
test "GET /spaces/:space_token/items/:id", %{credential: credential, item: item} do
conn = get(build_conn(), ~s"/spaces/#{credential.token}/items/#{item.id}")

item_access =
Repo.get_by(Streams.Item.Access, item_id: item.id, space_credential_id: credential.id)

assert item_access.count == 1

assert response(conn, 302)
end
end
Expand Down
34 changes: 33 additions & 1 deletion test/support/fixtures/streams_fixtures.ex
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,40 @@ defmodule Polar.StreamsFixtures do
release_title: "3.19",
variant: "default",
requirements: %{
secureboot: false
"secureboot" => "false"
}
}
end

def valid_version_attributes() do
hash1 =
:crypto.strong_rand_bytes(32)
|> Base.encode16()
|> String.downcase()

hash2 =
:crypto.strong_rand_bytes(32)
|> Base.encode16()
|> String.downcase()

%{
serial: "20240209_13:00",
items: [
%{
name: "lxd.tar.gz",
file_type: "lxd.tar.gz",
hash: hash1,
size: 876,
path: "images/alpine/edge/amd64/default/20240209_13:00/incus.tar.xz"
},
%{
name: "root.squashfs",
file_type: "squashfs",
hash: hash2,
size: 2_982_800,
path: "images/alpine/edge/amd64/default/20240209_13:00/rootfs.tar.xz"
}
]
}
end
end

0 comments on commit 8811269

Please sign in to comment.