Skip to content

Commit 3bb3b42

Browse files
committed
Updated video action creator and added tests
1 parent 78bb551 commit 3bb3b42

File tree

4 files changed

+80
-15
lines changed

4 files changed

+80
-15
lines changed

apps/cf/lib/actions/action_creator.ex

+4-4
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ defmodule CF.Actions.ActionCreator do
7070
)
7171
end
7272

73-
def action_add(user_id, video = %Video{}) do
73+
def action_add(user_id, video_entity, video = %Video{}) do
7474
action(
7575
user_id,
76-
:video,
76+
video_entity,
7777
:add,
7878
video_id: video.id,
7979
changes: %{
@@ -95,10 +95,10 @@ defmodule CF.Actions.ActionCreator do
9595
)
9696
end
9797

98-
def action_update(user_id, %{data: video = %Video{}, changes: changes}) do
98+
def action_update(user_id, video_entity, %{data: video = %Video{}, changes: changes}) do
9999
action(
100100
user_id,
101-
:video,
101+
video_entity,
102102
:update,
103103
video_id: video.id,
104104
changes: changes

apps/cf/lib/videos/videos.ex

+25-8
Original file line numberDiff line numberDiff line change
@@ -80,18 +80,26 @@ defmodule CF.Videos do
8080
Can also throw if bad permissions.
8181
"""
8282
def create!(user, video_url, params \\ []) do
83-
case Keyword.get(params, :unlisted, false) do
84-
false -> UserPermissions.check!(user, :add, :video)
85-
true -> UserPermissions.check!(user, :add, :unlisted_video)
86-
end
83+
is_unlisted =
84+
case Keyword.get(params, :unlisted, false) do
85+
v when v in [nil, false] ->
86+
UserPermissions.check!(user, :add, :video)
87+
false
88+
89+
true ->
90+
UserPermissions.check!(user, :add, :unlisted_video)
91+
true
92+
end
93+
94+
video_entity = if is_unlisted, do: :unlisted_video, else: :video
8795

8896
with metadata_fetcher when not is_nil(metadata_fetcher) <- get_metadata_fetcher(video_url),
8997
{:ok, metadata} <- metadata_fetcher.(video_url) do
9098
# Videos posted by publishers are recorded as partner unless explicitely
9199
# specified otherwise (false)
92100
base_video = %Video{
93101
is_partner: user.is_publisher && Keyword.get(params, :is_partner) != false,
94-
unlisted: Keyword.get(params, :unlisted, false)
102+
unlisted: is_unlisted
95103
}
96104

97105
Multi.new()
@@ -102,7 +110,7 @@ defmodule CF.Videos do
102110
|> Repo.update()
103111
end)
104112
|> Multi.run(:action, fn _repo, %{video: video} ->
105-
Repo.insert(ActionCreator.action_add(user.id, video))
113+
Repo.insert(ActionCreator.action_add(user.id, video_entity, video))
106114
end)
107115
|> Repo.transaction()
108116
|> case do
@@ -125,13 +133,22 @@ defmodule CF.Videos do
125133
Returned statements contains only an id and a key
126134
"""
127135
def shift_statements(user, video_id, offsets) do
128-
UserPermissions.check!(user, :update, :video)
129136
video = Repo.get!(Video, video_id)
137+
138+
case video.unlisted do
139+
false ->
140+
UserPermissions.check!(user, :update, :video)
141+
142+
true ->
143+
UserPermissions.check!(user, :update, :unlisted_video)
144+
end
145+
146+
video_entity = if video.unlisted, do: :unlisted_video, else: :video
130147
changeset = Video.changeset_shift_offsets(video, offsets)
131148

132149
Multi.new()
133150
|> Multi.update(:video, changeset)
134-
|> Multi.insert(:action_update, action_update(user.id, changeset))
151+
|> Multi.insert(:action_update, ActionCreator.action_update(user.id, video_entity, changeset))
135152
|> Repo.transaction()
136153
|> case do
137154
{:ok, %{video: video}} ->

apps/cf/priv/limitations.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ add:
1313
update:
1414
statement: [ 0 , 0 , 5 , 15 , 30 , 75 , 125 , 150 , 200 ]
1515
speaker: [ 0 , 0 , 0 , 0 , 5 , 20 , 30 , 50 , 100 ]
16+
unlisted_video: [ 0 , 0 , 1 , 1 , 3 , 6 , 12 , 25 , 40 ]
1617
video: [ 0 , 0 , 0 , 0 , 3 , 6 , 12 , 25 , 40 ]
1718
user: [ 1 , 10 , 15 , 20 , 20 , 30 , 30 , 50 , 50 ]
1819
delete:

apps/cf/test/videos/videos_test.exs

+50-3
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,29 @@ defmodule CF.VideosTest do
77

88
defp test_url, do: "https://www.youtube.com/watch?v=#{DB.Utils.TokenGenerator.generate(11)}"
99

10-
describe "Add video" do
11-
test "without enough reputation" do
10+
describe "Add" do
11+
test "video as unlisted without enough reputation" do
12+
user = insert(:user, reputation: 0, is_publisher: false)
13+
14+
assert_raise PermissionsError, fn ->
15+
Videos.create!(user, test_url(), unlisted: true)
16+
end
17+
end
18+
19+
test "video as unlisted with enough reputation" do
20+
user = insert(:user, reputation: 15)
21+
{:ok, _video} = Videos.create!(user, test_url(), unlisted: true)
22+
end
23+
24+
test "video as listed without enough reputation" do
1225
user = insert(:user, reputation: 0, is_publisher: false)
1326

1427
assert_raise PermissionsError, fn ->
1528
Videos.create!(user, test_url())
1629
end
1730
end
1831

19-
test "with enough reputation" do
32+
test "video as listed with enough reputation" do
2033
user = insert(:user, reputation: 50_000)
2134
{:ok, _video} = Videos.create!(user, test_url())
2235
end
@@ -57,6 +70,40 @@ defmodule CF.VideosTest do
5770
end
5871
end
5972

73+
describe "Update" do
74+
test "an unlisted video without enough reputation" do
75+
user = insert(:user, reputation: 50_000)
76+
user2 = insert(:user, reputation: 0)
77+
{:ok, video} = Videos.create!(user, test_url(), unlisted: true)
78+
79+
assert_raise PermissionsError, fn ->
80+
Videos.shift_statements(user2, video.id, %{youtube_offset: 42})
81+
end
82+
end
83+
84+
test "an unlisted video with enough reputation" do
85+
user = insert(:user, reputation: 15)
86+
{:ok, video} = Videos.create!(user, test_url(), unlisted: true)
87+
{:ok, _video} = Videos.shift_statements(user, video.id, %{youtube_offset: 42})
88+
end
89+
90+
test "a listed video without enough reputation" do
91+
user = insert(:user, reputation: 50_000)
92+
user2 = insert(:user, reputation: 0)
93+
{:ok, video} = Videos.create!(user, test_url())
94+
95+
assert_raise PermissionsError, fn ->
96+
Videos.shift_statements(user2, video.id, %{youtube_offset: 42})
97+
end
98+
end
99+
100+
test "a listed video with enough reputation" do
101+
user = insert(:user, reputation: 50_000)
102+
{:ok, video} = Videos.create!(user, test_url())
103+
{:ok, _video} = Videos.shift_statements(user, video.id, %{youtube_offset: 42})
104+
end
105+
end
106+
60107
describe "Fetch captions" do
61108
test "fetch captions" do
62109
video =

0 commit comments

Comments
 (0)