Skip to content

Commit

Permalink
Merge pull request #107 from CaptainFact/feat/videos-added-by-user
Browse files Browse the repository at this point in the history
Videos: add unlisted and get all added by user
  • Loading branch information
Betree committed Jan 5, 2019
2 parents e6d4114 + 73e0ea7 commit e20be7d
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 8 deletions.
20 changes: 18 additions & 2 deletions apps/cf/lib/videos/videos.ex
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,19 @@ defmodule CF.Videos do
def videos_list(filters, false),
do: Repo.all(Video.query_list(Video, filters))

@doc """
Get videos added by given user. This will return all videos, included the ones
marked as `unlisted`.
"""
def added_by_user(user, paginate_options \\ []) do
Video
|> join(:inner, [v], a in DB.Schema.UserAction, a.video_id == v.id)
|> where([_, a], a.user_id == ^user.id)
|> where([_, a], a.type == ^:add and a.entity == ^:video)
|> DB.Query.order_by_last_inserted_desc()
|> Repo.paginate(paginate_options)
end

@doc """
Return the corresponding video if it has already been added, `nil` otherwise
"""
Expand All @@ -61,14 +74,17 @@ defmodule CF.Videos do
Returns video if success or {:error, reason} if something bad append.
Can also throw if bad permissions.
"""
def create!(user, video_url, is_partner \\ nil) do
def create!(user, video_url, params \\ []) do
UserPermissions.check!(user, :add, :video)

with metadata_fetcher when not is_nil(metadata_fetcher) <- get_metadata_fetcher(video_url),
{:ok, metadata} <- metadata_fetcher.(video_url) do
# Videos posted by publishers are recorded as partner unless explicitely
# specified otherwise (false)
base_video = %Video{is_partner: user.is_publisher && is_partner != false}
base_video = %Video{
is_partner: user.is_publisher && Keyword.get(params, :is_partner) != false,
unlisted: Keyword.get(params, :unlisted, false)
}

Multi.new()
|> Multi.insert(:video_without_hash_id, Video.changeset(base_video, metadata))
Expand Down
8 changes: 4 additions & 4 deletions apps/cf/test/videos/videos_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ defmodule CF.VideosTest do
publisher = insert(:user, is_publisher: true)

{:ok, video_unspecified} = Videos.create!(publisher, test_url())
{:ok, video_nil} = Videos.create!(publisher, test_url(), nil)
{:ok, video_true} = Videos.create!(publisher, test_url(), true)
{:ok, video_false} = Videos.create!(publisher, test_url(), false)
{:ok, video_nil} = Videos.create!(publisher, test_url(), is_partner: nil)
{:ok, video_true} = Videos.create!(publisher, test_url(), is_partner: true)
{:ok, video_false} = Videos.create!(publisher, test_url(), is_partner: false)

assert video_unspecified.is_partner == true
assert video_nil.is_partner == true
Expand All @@ -44,7 +44,7 @@ defmodule CF.VideosTest do
test "regular user cannot set is_partner" do
regular_user = insert(:user, reputation: 50_000)
{:ok, video} = Videos.create!(regular_user, test_url())
{:ok, video_2} = Videos.create!(regular_user, test_url(), true)
{:ok, video_2} = Videos.create!(regular_user, test_url(), is_partner: true)

assert video.is_partner == false
assert video_2.is_partner == false
Expand Down
7 changes: 7 additions & 0 deletions apps/cf_graphql/lib/resolvers/users.ex
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,11 @@ defmodule CF.GraphQL.Resolvers.Users do
|> Repo.paginate(page: offset, page_size: limit)
|> Result.ok()
end

@doc """
Get videos added by this user
"""
def videos_added(user, %{offset: offset, limit: limit}, _) do
{:ok, CF.Videos.added_by_user(user, page: offset, page_size: limit)}
end
end
8 changes: 8 additions & 0 deletions apps/cf_graphql/lib/schema/types/user.ex
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@ defmodule CF.GraphQL.Schema.Types.User do
arg(:limit, :integer, default_value: 10)
resolve(&Resolvers.Users.activity_log/3)
end

@desc "A paginated list of videos added by this user"
field :videos_added, :paginated_videos do
complexity(join_complexity())
arg(:offset, :integer, default_value: 1)
arg(:limit, :integer, default_value: 10)
resolve(&Resolvers.Users.videos_added/3)
end
end

@desc "A paginated list of user actions"
Expand Down
2 changes: 1 addition & 1 deletion apps/cf_rest_api/lib/controllers/video_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ defmodule CF.RestApi.VideoController do
nil ->
conn
|> Guardian.Plug.current_resource()
|> create!(url, params["is_partner"])
|> create!(url, is_partner: params["is_partner"], unlisted: params["unlisted"])
|> case do
{:error, error} when is_binary(error) ->
conn
Expand Down
3 changes: 2 additions & 1 deletion apps/cf_rest_api/lib/views/video_view.ex
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ defmodule CF.RestApi.VideoView do
posted_at: video.inserted_at,
speakers: render_many(video.speakers, CF.RestApi.SpeakerView, "speaker.json"),
language: video.language,
is_partner: video.is_partner
is_partner: video.is_partner,
unlisted: video.unlisted
}
end
end

0 comments on commit e20be7d

Please sign in to comment.