Skip to content

Commit 1bc61bb

Browse files
authored
Merge pull request #672 from code-corps/add-cloudinary-uploads
Add cloudinary uploads
2 parents 43e1833 + 0852e53 commit 1bc61bb

38 files changed

+279
-420
lines changed

.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
export AWS_ACCESS_KEY_ID=
22
export AWS_SECRET_ACCESS_KEY=
3+
export CLOUDEX_API_KEY=
4+
export CLOUDEX_CLOUD_NAME=
5+
export CLOUDEX_SECRET=
36
export CLOUDFRONT_DOMAIN=
47
export POSTMARK_API_KEY=
58
export S3_BUCKET=

elixir_buildpack.config

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
erlang_version=19.1
2-
elixir_version=1.3.4
1+
erlang_version=19.2
2+
elixir_version=1.4.1
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
defmodule CodeCorps.Helpers.CloudinaryUrl do
2+
3+
@host Application.get_env(:arc, :asset_host)
4+
5+
def for(nil, _options, version, default_color, type) do
6+
"#{@host}/icons/#{type}_default_#{version}_#{default_color}.png"
7+
end
8+
def for(public_id, options, _version, _default_color, _type) do
9+
Cloudex.Url.for(public_id, options)
10+
end
11+
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmodule CodeCorps.Helpers.RandomIconColor do
2+
alias Ecto.Changeset
3+
4+
@icon_color_generator Application.get_env(:code_corps, :icon_color_generator)
5+
6+
def generate_icon_color(changeset, icon_color_key) do
7+
case changeset do
8+
%Changeset{valid?: true, changes: changes} ->
9+
Changeset.put_change(changeset, icon_color_key, @icon_color_generator.generate())
10+
_ ->
11+
changeset
12+
end
13+
end
14+
end

lib/code_corps/services/base64_image.ex

Lines changed: 0 additions & 38 deletions
This file was deleted.

lib/code_corps/services/base64_image_uploader.ex

Lines changed: 0 additions & 35 deletions
This file was deleted.

lib/code_corps/services/markdown_renderer.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ defmodule CodeCorps.Services.MarkdownRendererService do
1515
changeset
1616
|> Ecto.Changeset.get_change(source_field)
1717

18-
html =
18+
{html, _errors} =
1919
markdown
20-
|> Earmark.to_html
20+
|> Earmark.as_html()
2121

2222
changeset
2323
|> Ecto.Changeset.put_change(destination_field, html)

mix.exs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ defmodule CodeCorps.Mixfile do
44
def project do
55
[app: :code_corps,
66
version: "0.0.1",
7-
elixir: "1.3.4",
7+
elixir: "1.4.1",
88
elixirc_paths: elixirc_paths(Mix.env),
99
compilers: [:phoenix, :gettext] ++ Mix.compilers,
1010
build_embedded: Mix.env == :prod,
@@ -32,6 +32,7 @@ defmodule CodeCorps.Mixfile do
3232
:phoenix_ecto,
3333
:postgrex,
3434
:arc_ecto,
35+
:cloudex,
3536
:comeonin,
3637
:corsica,
3738
:earmark,
@@ -71,6 +72,7 @@ defmodule CodeCorps.Mixfile do
7172
{:arc_ecto, "~> 0.5"},
7273
{:benchfella, "~> 0.3.0", only: :dev},
7374
{:canary, "~> 1.1"}, # Authorization
75+
{:cloudex, "~> 0.1.10"},
7476
{:comeonin, "~> 2.0"},
7577
{:corsica, "~> 0.4"}, # CORS
7678
{:credo, "~> 0.5", only: [:dev, :test]}, # Code style suggestions

mix.lock

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"canada": {:hex, :canada, "1.0.1", "da96d0ff101a0c2a6cc7b07d92b8884ff6508f058781d3679999416feacf41c5", [:mix], []},
99
"canary": {:hex, :canary, "1.1.0", "3599012f5393c2fdb18c9129853a9fc6cd115ebfdcc0725af7b52398b9ed5c7b", [:mix], [{:canada, "~> 1.0.0", [hex: :canada, optional: false]}, {:ecto, ">= 1.1.0", [hex: :ecto, optional: false]}, {:plug, "~> 1.0", [hex: :plug, optional: false]}]},
1010
"certifi": {:hex, :certifi, "0.4.0", "a7966efb868b179023618d29a407548f70c52466bf1849b9e8ebd0e34b7ea11f", [:rebar3], []},
11+
"cloudex": {:hex, :cloudex, "0.1.10", "a16f08bc7e7eaabe90dba874f012910dade36c1aa541d2dba26465feedafb8ff", [:mix], [{:httpoison, "~> 0.9.0", [hex: :httpoison, optional: false]}, {:poison, "~> 2.2.0", [hex: :poison, optional: false]}, {:timex, "~> 3.0.8", [hex: :timex, optional: false]}, {:tzdata, "~> 0.5.9", [hex: :tzdata, optional: false]}]},
1112
"combine": {:hex, :combine, "0.9.6", "8d1034a127d4cbf6924c8a5010d3534d958085575fa4d9b878f200d79ac78335", [:mix], []},
1213
"comeonin": {:hex, :comeonin, "2.6.0", "74c288338b33205f9ce97e2117bb9a2aaab103a1811d243443d76fdb62f904ac", [:make, :mix], []},
1314
"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], []},
@@ -17,17 +18,17 @@
1718
"credo": {:hex, :credo, "0.6.0", "44a82f82b94eeb4ba6092c89b8a6730ca1a3291c7940739d5acc8806d25ac991", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, optional: false]}]},
1819
"db_connection": {:hex, :db_connection, "1.1.0", "b2b88db6d7d12f99997b584d09fad98e560b817a20dab6a526830e339f54cdb3", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
1920
"decimal": {:hex, :decimal, "1.3.1", "157b3cedb2bfcb5359372a7766dd7a41091ad34578296e951f58a946fcab49c6", [:mix], []},
20-
"earmark": {:hex, :earmark, "1.0.3", "89bdbaf2aca8bbb5c97d8b3b55c5dd0cff517ecc78d417e87f1d0982e514557b", [:mix], []},
21-
"ecto": {:hex, :ecto, "2.1.2", "8d7bde4170b33e1049850a5dbe0112bfd232824e63c73ee63383df4c6ffd4064", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
21+
"earmark": {:hex, :earmark, "1.1.0", "8c2bf85d725050a92042bc1edf362621004d43ca6241c756f39612084e95487f", [:mix], []},
22+
"ecto": {:hex, :ecto, "2.1.3", "ffb24e150b519a4c0e4c84f9eabc8587199389bc499195d5d1a93cd3b2d9a045", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
2223
"ecto_ordered": {:hex, :ecto_ordered, "0.2.0-beta1", "cb066bc608f1c8913cea85af8293261720e6a88e3c99061e6877d7025352f045", [:mix], [{:ecto, "~> 2.0", [hex: :ecto, optional: false]}]},
2324
"ex_aws": {:hex, :ex_aws, "1.0.0", "509368ffbd38b405faefda95eb30012fc7b791fad6574ef427cc4ad0f4f5b533", [:mix], [{:configparser_ex, "~> 0.2.1", [hex: :configparser_ex, optional: true]}, {:gen_stage, "~> 0.8.0", [hex: :gen_stage, optional: false]}, {:hackney, "1.6.1", [hex: :hackney, optional: true]}, {:jsx, "~> 2.8", [hex: :jsx, optional: true]}, {:poison, ">= 1.2.0", [hex: :poison, optional: true]}, {:sweet_xml, "~> 0.5", [hex: :sweet_xml, optional: true]}]},
2425
"ex_doc": {:hex, :ex_doc, "0.14.5", "c0433c8117e948404d93ca69411dd575ec6be39b47802e81ca8d91017a0cf83c", [:mix], [{:earmark, "~> 1.0", [hex: :earmark, optional: false]}]},
2526
"ex_machina": {:hex, :ex_machina, "1.0.2", "1cc49e1a09e3f7ab2ecb630c17f14c2872dc4ec145d6d05a9c3621936a63e34f", [:mix], [{:ecto, "~> 2.0", [hex: :ecto, optional: true]}]},
2627
"excoveralls": {:hex, :excoveralls, "0.6.1", "9e946b6db84dba592f47632157ecd135a46384b98a430fd16007dc910c70348b", [:mix], [{:exjsx, "~> 3.0", [hex: :exjsx, optional: false]}, {:hackney, ">= 0.12.0", [hex: :hackney, optional: false]}]},
2728
"exjsx": {:hex, :exjsx, "3.2.1", "1bc5bf1e4fd249104178f0885030bcd75a4526f4d2a1e976f4b428d347614f0f", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, optional: false]}]},
28-
"fs": {:hex, :fs, "0.9.2", "ed17036c26c3f70ac49781ed9220a50c36775c6ca2cf8182d123b6566e49ec59", [:rebar], []},
29+
"fs": {:hex, :fs, "2.12.0", "ad631efacc9a5683c8eaa1b274e24fa64a1b8eb30747e9595b93bec7e492e25e", [:rebar3], []},
2930
"gen_stage": {:hex, :gen_stage, "0.8.0", "a76e3f0530f86fae8b8a1021c06527b1ec171cf4c0bdfecd8d5ad0376d1205af", [:mix], []},
30-
"gettext": {:hex, :gettext, "0.13.0", "daafbddc5cda12738bb93b01d84105fe75b916a302f1c50ab9fb066b95ec9db4", [:mix], []},
31+
"gettext": {:hex, :gettext, "0.13.1", "5e0daf4e7636d771c4c71ad5f3f53ba09a9ae5c250e1ab9c42ba9edccc476263", [:mix], []},
3132
"guardian": {:hex, :guardian, "0.14.2", "b1db9ef172b3d47259eed3cf463321a3ed2cfadee471f271810b0e4c18b2ac22", [:mix], [{:jose, "~> 1.8", [hex: :jose, optional: false]}, {:phoenix, "~> 1.2.0", [hex: :phoenix, optional: true]}, {:plug, "~> 1.0", [hex: :plug, optional: false]}, {:poison, ">= 1.3.0", [hex: :poison, optional: false]}, {:uuid, ">=1.1.1", [hex: :uuid, optional: false]}]},
3233
"hackney": {:hex, :hackney, "1.6.1", "ddd22d42db2b50e6a155439c8811b8f6df61a4395de10509714ad2751c6da817", [:rebar3], [{:certifi, "0.4.0", [hex: :certifi, optional: false]}, {:idna, "1.2.0", [hex: :idna, optional: false]}, {:metrics, "1.0.1", [hex: :metrics, optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, optional: false]}, {:ssl_verify_fun, "1.1.0", [hex: :ssl_verify_fun, optional: false]}]},
3334
"httpoison": {:hex, :httpoison, "0.9.2", "a211a8e87403a043c41218e64df250d321f236ac57f786c6a0ccf3e9e817c819", [:mix], [{:hackney, "~> 1.6.0", [hex: :hackney, optional: false]}]},
@@ -41,12 +42,12 @@
4142
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], []},
4243
"mime": {:hex, :mime, "1.0.1", "05c393850524767d13a53627df71beeebb016205eb43bfbd92d14d24ec7a1b51", [:mix], []},
4344
"mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], []},
44-
"mix_test_watch": {:hex, :mix_test_watch, "0.2.6", "9fcc2b1b89d1594c4a8300959c19d50da2f0ff13642c8f681692a6e507f92cab", [:mix], [{:fs, "~> 0.9.1", [hex: :fs, optional: false]}]},
45+
"mix_test_watch": {:hex, :mix_test_watch, "0.3.0", "25c335ebb241ad06fed34453e340a64f9cc1dfcd7011bd98ef097fdf3d6a92d7", [:mix], [{:fs, "~> 2.12", [hex: :fs, optional: false]}]},
4546
"money": {:hex, :money, "1.2.1", "fdcc7b021b894dbcc2cd0f57d2ccdd2224eced747231337a849424ffaa196b13", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 2.1", [hex: :ecto, optional: true]}, {:phoenix_html, "~> 2.0", [hex: :phoenix_html, optional: true]}]},
4647
"phoenix": {:hex, :phoenix, "1.2.1", "6dc592249ab73c67575769765b66ad164ad25d83defa3492dc6ae269bd2a68ab", [:mix], [{:cowboy, "~> 1.0", [hex: :cowboy, optional: true]}, {:phoenix_pubsub, "~> 1.0", [hex: :phoenix_pubsub, optional: false]}, {:plug, "~> 1.1", [hex: :plug, optional: false]}, {:poison, "~> 1.5 or ~> 2.0", [hex: :poison, optional: false]}]},
4748
"phoenix_ecto": {:hex, :phoenix_ecto, "3.2.1", "6cf11d590c61977f50fcb98ad8a10ee90ba8670a82cbf5eaf49cfaee2e95e8b7", [:mix], [{:ecto, "~> 2.1", [hex: :ecto, optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, optional: false]}, {:plug, "~> 1.0", [hex: :plug, optional: false]}]},
4849
"phoenix_html": {:hex, :phoenix_html, "2.9.2", "371160b30cf4e10443b015efce6f03e1f19aae98ff6487620477b13a5b2ef660", [:mix], [{:plug, "~> 1.0", [hex: :plug, optional: false]}]},
49-
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.0.6", "4490d588c4f60248b1c5f1f0dc0a7271e1aed4bddbd8b1542630f7bf6bc7b012", [:mix], [{:fs, "~> 0.9.1", [hex: :fs, optional: false]}, {:phoenix, "~> 1.0 or ~> 1.2-rc", [hex: :phoenix, optional: false]}]},
50+
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.0.7", "167ab0942e88d1d4a597996cf7dd8d2b014cc14d3f9472b58858cde8dd9ac2e4", [:mix], [{:fs, "~> 2.12.0", [hex: :fs, optional: false]}, {:phoenix, "~> 1.0 or ~> 1.2-rc", [hex: :phoenix, optional: false]}]},
5051
"phoenix_pubsub": {:hex, :phoenix_pubsub, "1.0.1", "c10ddf6237007c804bf2b8f3c4d5b99009b42eca3a0dfac04ea2d8001186056a", [:mix], []},
5152
"plug": {:hex, :plug, "1.3.0", "6e2b01afc5db3fd011ca4a16efd9cb424528c157c30a44a0186bcc92c7b2e8f3", [:mix], [{:cowboy, "~> 1.0.1 or ~> 1.1", [hex: :cowboy, optional: true]}, {:mime, "~> 1.0", [hex: :mime, optional: false]}]},
5253
"poison": {:hex, :poison, "2.2.0", "4763b69a8a77bd77d26f477d196428b741261a761257ff1cf92753a0d4d24a63", [:mix], []},
@@ -58,10 +59,10 @@
5859
"segment": {:hex, :segment, "0.1.1", "47bf9191590e7a533c105d1e21518e0d6da47c91e8d98ebb649c624db5dfc359", [:mix], [{:httpoison, "~> 0.8", [hex: :httpoison, optional: false]}, {:poison, "~> 1.3 or ~> 2.0", [hex: :poison, optional: false]}]},
5960
"sentry": {:hex, :sentry, "2.1.0", "51e7ca261b519294ac73b30763893c4a7ad2005205514aefa5bf37ccb83e44ea", [:mix], [{:hackney, "~> 1.6.1", [hex: :hackney, optional: false]}, {:plug, "~> 1.0", [hex: :plug, optional: true]}, {:poison, "~> 1.5 or ~> 2.0 or ~> 3.0", [hex: :poison, optional: false]}, {:uuid, "~> 1.0", [hex: :uuid, optional: false]}]},
6061
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.0", "edee20847c42e379bf91261db474ffbe373f8acb56e9079acb6038d4e0bf414f", [:make, :rebar], []},
61-
"stripity_stripe": {:git, "https://github.com/code-corps/stripity_stripe.git", "adb86034f308d756d307725f7ff67603cebefe6a", [branch: "2.0"]},
62+
"stripity_stripe": {:git, "https://github.com/code-corps/stripity_stripe.git", "fab5b573f327f760d51949488bab30c2eae346b5", [branch: "2.0"]},
6263
"sweet_xml": {:hex, :sweet_xml, "0.6.4", "5d613e63033b1d6362898f3f1d65f70a352b32d4b32e1367bb20b8c2e30ba79d", [:mix], []},
6364
"timber": {:hex, :timber, "0.4.7", "df3fcd79bcb4eb4b53874d906ef5f3a212937b4bc7b7c5b244745202cc389443", [:mix], [{:ecto, "~> 2.0", [hex: :ecto, optional: true]}, {:phoenix, "~> 1.2", [hex: :phoenix, optional: true]}, {:plug, "~> 1.2", [hex: :plug, optional: true]}, {:poison, "~> 2.0 or ~> 3.0", [hex: :poison, optional: false]}]},
64-
"timex": {:hex, :timex, "3.1.7", "71f9c32e13ff4860e86a314303757cc02b3ead5db6e977579a2935225ce9a666", [:mix], [{:combine, "~> 0.7", [hex: :combine, optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, optional: false]}]},
65+
"timex": {:hex, :timex, "3.0.8", "71d5ebafcdc557c6c866cdc196c5054f587e7cd1118ad8937e2293d51fc85608", [:mix], [{:combine, "~> 0.7", [hex: :combine, optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, optional: false]}]},
6566
"timex_ecto": {:hex, :timex_ecto, "3.1.1", "37d54f6879d96a6789bb497296531cfb853631de78e152969d95cff03c1368dd", [:mix], [{:ecto, "~> 2.1.0", [hex: :ecto, optional: false]}, {:timex, "~> 3.0", [hex: :timex, optional: false]}]},
6667
"tzdata": {:hex, :tzdata, "0.5.10", "087e8dfe8c0283473115ad8ca6974b898ecb55ca5c725427a142a79593391e90", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, optional: false]}]},
6768
"uuid": {:hex, :uuid, "1.1.6", "4927232f244e69c6e255643014c2d639dad5b8313dc2a6976ee1c3724e6ca60d", [:mix], []}}

priv/repo/image_migration.exs

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
defmodule CodeCorps.Repo.Seeds.ImageMigration do
2+
alias CodeCorps.Organization
3+
alias CodeCorps.Project
4+
alias CodeCorps.Repo
5+
alias CodeCorps.User
6+
7+
@icon_color_generator Application.get_env(:code_corps, :icon_color_generator)
8+
9+
def migrate() do
10+
Organization
11+
|> Repo.all()
12+
|> Enum.each(&handle_organization_migration/1)
13+
14+
Project
15+
|> Repo.all()
16+
|> Enum.each(&handle_project_migration/1)
17+
18+
User
19+
|> Repo.all()
20+
|> Enum.each(&handle_user_migration/1)
21+
end
22+
23+
defp handle_organization_migration(organization) do
24+
cond do
25+
organization.cloudinary_public_id != nil ->
26+
IO.puts "Cloudinary image already exists for #{organization.name}, skipping migration."
27+
organization.icon == nil ->
28+
IO.puts "No icon exists for #{organization.name}, generating color only."
29+
color = @icon_color_generator.generate
30+
{:ok, organization} =
31+
Organization.changeset(organization, %{default_color: color})
32+
|> Repo.update
33+
true ->
34+
IO.puts "Migrating image from S3 to Cloudinary for #{organization.name}."
35+
36+
color = @icon_color_generator.generate
37+
38+
original_image_url = CodeCorps.OrganizationIcon.url({organization.icon, organization}, :original)
39+
40+
[ok: %Cloudex.UploadedImage{public_id: public_id}] =
41+
original_image_url
42+
|> Cloudex.upload()
43+
44+
{:ok, organization} =
45+
Organization.changeset(organization, %{cloudinary_public_id: public_id, default_color: color})
46+
|> Repo.update
47+
end
48+
end
49+
50+
defp handle_project_migration(project) do
51+
cond do
52+
project.cloudinary_public_id != nil ->
53+
IO.puts "Cloudinary image already exists for #{project.title}, skipping migration."
54+
project.icon == nil ->
55+
IO.puts "No icon exists for #{project.title}, generating color only."
56+
color = @icon_color_generator.generate
57+
{:ok, project} =
58+
Project.changeset(project, %{default_color: color})
59+
|> Repo.update
60+
true ->
61+
IO.puts "Migrating image from S3 to Cloudinary for #{project.title}."
62+
63+
color = @icon_color_generator.generate
64+
65+
original_image_url = CodeCorps.ProjectIcon.url({project.icon, project}, :original)
66+
67+
[ok: %Cloudex.UploadedImage{public_id: public_id}] =
68+
original_image_url
69+
|> Cloudex.upload()
70+
71+
{:ok, project} =
72+
Project.changeset(project, %{cloudinary_public_id: public_id, default_color: color})
73+
|> Repo.update
74+
end
75+
end
76+
77+
defp handle_user_migration(user) do
78+
cond do
79+
user.cloudinary_public_id != nil ->
80+
IO.puts "Cloudinary image already exists for #{user.username}, skipping migration."
81+
user.photo == nil ->
82+
IO.puts "No photo exists for #{user.username}, generating color only."
83+
color = @icon_color_generator.generate
84+
{:ok, user} =
85+
User.changeset(user, %{default_color: color})
86+
|> Repo.update
87+
true ->
88+
IO.puts "Migrating image from S3 to Cloudinary for #{user.username}."
89+
90+
color = @icon_color_generator.generate
91+
92+
original_image_url = CodeCorps.UserPhoto.url({user.photo, user}, :original)
93+
94+
[ok: %Cloudex.UploadedImage{public_id: public_id}] =
95+
original_image_url
96+
|> Cloudex.upload()
97+
98+
{:ok, user} =
99+
User.changeset(user, %{cloudinary_public_id: public_id, default_color: color})
100+
|> Repo.update
101+
end
102+
end
103+
end
104+
105+
CodeCorps.Repo.Seeds.ImageMigration.migrate()

0 commit comments

Comments
 (0)