Skip to content

Commit

Permalink
Aggregate media creation logic
Browse files Browse the repository at this point in the history
  • Loading branch information
noah-schechter committed Dec 30, 2024
1 parent 47c6d49 commit 08d25c7
Showing 1 changed file with 30 additions and 74 deletions.
104 changes: 30 additions & 74 deletions platform/lib/platform/material.ex
Original file line number Diff line number Diff line change
Expand Up @@ -316,105 +316,61 @@ defmodule Platform.Material do
|> Repo.insert()
end

def create_media_audited(user_or_token, attrs \\ %{}, opts \\ [])

def create_media_audited(%User{} = user, attrs, opts) do
def create_media_audited(user_or_token, attrs \\ %{}, opts \\ []) when is_struct(user_or_token, User) or is_struct(user_or_token, APIToken) do
changeset =
%Media{}
|> Media.changeset(attrs, user)
|> Media.changeset(attrs, user_or_token)

cond do
!changeset.valid? ->
{:error, changeset}

true ->
Repo.transaction(fn ->
changeset = change_media(%Media{}, attrs, user)
changeset = change_media(%Media{}, attrs, user_or_token)

{:ok, media} =
changeset
|> Repo.insert()

if Keyword.get(opts, :post_updates, true) do
{:ok, _} =
Updates.change_from_media_creation(media, user)
Updates.change_from_media_creation(media, user_or_token)
|> Updates.create_update_from_changeset()
end

# Automatically tag new incidents created by regular users, if desirable
user_project_membership =
Projects.get_project_membership_by_user_and_project_id(user, media.project_id)

{:ok, media} =
with false <- Enum.member?([:owner, :manager], user_project_membership.role),
new_tags_json <- System.get_env("AUTOTAG_USER_INCIDENTS"),
false <- is_nil(new_tags_json) or String.trim(new_tags_json) == "",
{:ok, new_tags} <- Jason.decode(new_tags_json),
false <- Enum.empty?(new_tags) do
{:ok, new_media} =
update_media_attribute_audited(
media,
Attribute.get_attribute(:tags),
Accounts.get_auto_account(),
%{"attr_tags" => (media.attr_tags || []) ++ new_tags}
)
if is_struct(user_or_token, User) do
# Automatically tag new incidents created by regular users, if desirable
user_project_membership =
Projects.get_project_membership_by_user_and_project_id(user_or_token, media.project_id)

{:ok, media} =
with false <- Enum.member?([:owner, :manager], user_project_membership.role),
new_tags_json <- System.get_env("AUTOTAG_USER_INCIDENTS"),
false <- is_nil(new_tags_json) or String.trim(new_tags_json) == "",
{:ok, new_tags} <- Jason.decode(new_tags_json),
false <- Enum.empty?(new_tags) do
{:ok, new_media} =
update_media_attribute_audited(
media,
Attribute.get_attribute(:tags),
Accounts.get_auto_account(),
%{"attr_tags" => (media.attr_tags || []) ++ new_tags}
)

{:ok, new_media}
else
_ -> {:ok, media}
end

{:ok, new_media}
else
_ -> {:ok, media}
# Subscribe the creator
{:ok, _} = subscribe_user(media, user_or_token)
end

# Subscribe the creator
{:ok, _} = subscribe_user(media, user)

# Upload media, if provided
for url <- Ecto.Changeset.get_field(changeset, :urls_parsed) do
{:ok, version} =
create_media_version_audited(media, user, %{
upload_type: :direct,
status: :pending,
source_url: url,
media_id: media.id
})

archive_media_version(version)
end

# Schedule metadata generation
schedule_media_auto_metadata_update(media)

media
end)
end
end

def create_media_audited(%APIToken{} = api_token, attrs, opts) do
changeset =
%Media{}
|> Media.changeset(attrs, api_token)

cond do
!changeset.valid? ->
{:error, changeset}

true ->
Repo.transaction(fn ->
changeset = change_media(%Media{}, attrs, api_token)

{:ok, media} =
changeset
|> Repo.insert()

if Keyword.get(opts, :post_updates, true) do
{:ok, _} =
Updates.change_from_media_creation(media, api_token)
|> Updates.create_update_from_changeset()
end

# Upload media, if provided
for url <- Ecto.Changeset.get_field(changeset, :urls_parsed) do
{:ok, version} =
create_media_version_audited(media, api_token, %{
create_media_version_audited(media, user_or_token, %{
upload_type: :direct,
status: :pending,
source_url: url,
Expand Down

0 comments on commit 08d25c7

Please sign in to comment.