defmodule Mix.Tasks.Cdn.Push do use Mix.Task require Logger import Cdn.File import Cdn.S3 import Cdn.Utils @shortdoc "Push Assets to CDN" def run(_args) do {:ok, _} = Application.ensure_all_started(:ex_aws) {:ok, _} = Application.ensure_all_started(:httpoison) bucket = Application.get_env(:cdn, :bucket) files_on_aws = list_files_already_on_bucket(bucket) upload_to_cdn(bucket, list_files_in_local, files_on_aws) end def upload_to_cdn(bucket, assets, files_on_aws) do assets |> Enum.filter(&(should_upload?(&1, files_on_aws))) |> put_objects(bucket) end def should_upload?({_, asset} = _target, files_on_aws) do case already_exists?(asset.path, files_on_aws) do true -> file_on_aws = files_on_aws[:"#{asset.path}"] # select to upload files that are different in last modified time and size asset.mtime != iso_z_to_secs(file_on_aws.last_modified) and asset.size != file_on_aws.size |> String.to_integer false -> true end end def already_exists?(asset_path, files_on_aws) do Keyword.has_key?(files_on_aws, asset_path |> String.to_atom) end end