diff --git a/config/cadet.exs.example b/config/cadet.exs.example index 9244ab4c1..1c4760c34 100644 --- a/config/cadet.exs.example +++ b/config/cadet.exs.example @@ -100,6 +100,7 @@ config :cadet, ], uploader: [ assets_bucket: "-assets", + assets_prefix: "courses/", sourcecasts_bucket: "-cadet-sourcecasts" ], # Configuration for Sling integration (executing on remote devices) diff --git a/config/dev.secrets.exs.example b/config/dev.secrets.exs.example index 2c59d3780..92d22c780 100644 --- a/config/dev.secrets.exs.example +++ b/config/dev.secrets.exs.example @@ -78,6 +78,7 @@ config :cadet, ], uploader: [ assets_bucket: "source-academy-assets", + assets_prefix: "courses-dev/", sourcecasts_bucket: "env-cadet-sourcecasts" ], # Configuration for Sling integration (executing on remote devices) diff --git a/config/test.exs b/config/test.exs index 3f04c721b..5ed547408 100644 --- a/config/test.exs +++ b/config/test.exs @@ -76,6 +76,7 @@ config :cadet, ], uploader: [ assets_bucket: "test-sa-assets", + assets_prefix: "courses-test/", sourcecasts_bucket: "test-cadet-sourcecasts" ], remote_execution: [ diff --git a/lib/cadet/assets/assets.ex b/lib/cadet/assets/assets.ex index 79cedb78c..dd1076812 100644 --- a/lib/cadet/assets/assets.ex +++ b/lib/cadet/assets/assets.ex @@ -20,7 +20,7 @@ defmodule Cadet.Assets.Assets do else file = upload_params.path - s3_path = "#{course_id}/#{folder_name}/#{file_name}" + s3_path = "#{prefix()}#{course_id}/#{folder_name}/#{file_name}" file |> Upload.stream_file() @@ -36,7 +36,7 @@ defmodule Cadet.Assets.Assets do case validate_folder_name(folder_name) do :ok -> bucket() - |> S3.list_objects(prefix: "#{course_id}/" <> folder_name <> "/") + |> S3.list_objects(prefix: "#{prefix()}#{course_id}/" <> folder_name <> "/") |> ExAws.stream!() |> Enum.map(fn file -> file.key end) @@ -50,7 +50,7 @@ defmodule Cadet.Assets.Assets do :ok <- validate_folder_name(folder_name) do if object_exists?(course_id, folder_name, file_name) do bucket() - |> S3.delete_object("#{course_id}/#{folder_name}/#{file_name}") + |> S3.delete_object("#{prefix()}#{course_id}/#{folder_name}/#{file_name}") |> ExAws.request!() :ok @@ -63,7 +63,9 @@ defmodule Cadet.Assets.Assets do @spec object_exists?(integer(), binary, binary) :: boolean() def object_exists?(course_id, folder_name, file_name) do response = - bucket() |> S3.head_object("#{course_id}/#{folder_name}/#{file_name}") |> ExAws.request() + bucket() + |> S3.head_object("#{prefix()}#{course_id}/#{folder_name}/#{file_name}") + |> ExAws.request() case response do {:error, _error} -> false @@ -96,4 +98,6 @@ defmodule Cadet.Assets.Assets do end defp bucket, do: :cadet |> Application.fetch_env!(:uploader) |> Keyword.get(:assets_bucket) + + defp prefix, do: :cadet |> Application.fetch_env!(:uploader) |> Keyword.get(:assets_prefix, "") end diff --git a/test/cadet/assets/assets_test.exs b/test/cadet/assets/assets_test.exs index 74311dee6..3d16451d2 100644 --- a/test/cadet/assets/assets_test.exs +++ b/test/cadet/assets/assets_test.exs @@ -54,7 +54,7 @@ defmodule Cadet.Assets.AssetsTest do "testFolder", "test1.png" ) === - "https://#{bucket()}.s3.amazonaws.com/1/testFolder/test1.png" + "https://#{bucket()}.s3.amazonaws.com/courses-test/1/testFolder/test1.png" end end end diff --git a/test/cadet_web/admin_controllers/admin_assets_controller_test.exs b/test/cadet_web/admin_controllers/admin_assets_controller_test.exs index 1dd88c894..d62b771b7 100644 --- a/test/cadet_web/admin_controllers/admin_assets_controller_test.exs +++ b/test/cadet_web/admin_controllers/admin_assets_controller_test.exs @@ -128,7 +128,7 @@ defmodule CadetWeb.AdminAssetsControllerTest do }) assert json_response(conn, 200) === - "https://#{bucket()}.s3.amazonaws.com/#{course_id}/testFolder/test.png" + "https://#{bucket()}.s3.amazonaws.com/courses-test/#{course_id}/testFolder/test.png" end end end @@ -191,7 +191,7 @@ defmodule CadetWeb.AdminAssetsControllerTest do }) assert json_response(conn, 200) === - "https://#{bucket()}.s3.amazonaws.com/#{course_id}/testFolder/nestedFolder/test.png" + "https://#{bucket()}.s3.amazonaws.com/courses-test/#{course_id}/testFolder/nestedFolder/test.png" end end end diff --git a/test/fixtures/vcr_cassettes/aws/controller_delete_asset#1.json b/test/fixtures/vcr_cassettes/aws/controller_delete_asset#1.json index fb60631a2..51f7f90e2 100644 --- a/test/fixtures/vcr_cassettes/aws/controller_delete_asset#1.json +++ b/test/fixtures/vcr_cassettes/aws/controller_delete_asset#1.json @@ -15,7 +15,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/117/testFolder/test2.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/117/testFolder/test2.png" }, "response": { "binary": false, @@ -49,7 +49,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/117/testFolder/test2.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/117/testFolder/test2.png" }, "response": { "binary": false, diff --git a/test/fixtures/vcr_cassettes/aws/controller_delete_asset#2.json b/test/fixtures/vcr_cassettes/aws/controller_delete_asset#2.json index bc8e6d3c2..0166b7e18 100644 --- a/test/fixtures/vcr_cassettes/aws/controller_delete_asset#2.json +++ b/test/fixtures/vcr_cassettes/aws/controller_delete_asset#2.json @@ -15,7 +15,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/117/testFolder/nestedFolder/test2.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/117/testFolder/nestedFolder/test2.png" }, "response": { "binary": false, @@ -49,7 +49,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/117/testFolder/nestedFolder/test2.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/117/testFolder/nestedFolder/test2.png" }, "response": { "binary": false, diff --git a/test/fixtures/vcr_cassettes/aws/controller_list_assets#1.json b/test/fixtures/vcr_cassettes/aws/controller_list_assets#1.json index 519462577..cc525f19b 100644 --- a/test/fixtures/vcr_cassettes/aws/controller_list_assets#1.json +++ b/test/fixtures/vcr_cassettes/aws/controller_list_assets#1.json @@ -18,7 +18,7 @@ }, "response": { "binary": false, - "body": "\ntest-sa-assets117/testFolder/1000falsetestFolder/2020-07-04T18:53:11.000Z"d41d8cd98f00b204e9800998ecf8427e"098bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARDtestFolder/test.png2020-07-04T19:04:50.000Z"3104001edec38fadeb925b9dbddab198"803598bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARDtestFolder/test2.png2020-07-04T19:04:50.000Z"3104001edec38fadeb925b9dbddab198"803598bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARD", + "body": "\ntest-sa-assetscourses-test/117/testFolder/1000falsetestFolder/2020-07-04T18:53:11.000Z"d41d8cd98f00b204e9800998ecf8427e"098bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARDtestFolder/test.png2020-07-04T19:04:50.000Z"3104001edec38fadeb925b9dbddab198"803598bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARDtestFolder/test2.png2020-07-04T19:04:50.000Z"3104001edec38fadeb925b9dbddab198"803598bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARD", "headers": { "Date": "Sat, 04 Jul 2020 19:04:57 GMT", "x-amz-bucket-region": "ap-southeast-1", diff --git a/test/fixtures/vcr_cassettes/aws/controller_upload_asset#1.json b/test/fixtures/vcr_cassettes/aws/controller_upload_asset#1.json index 0a9064703..f03304025 100644 --- a/test/fixtures/vcr_cassettes/aws/controller_upload_asset#1.json +++ b/test/fixtures/vcr_cassettes/aws/controller_upload_asset#1.json @@ -15,7 +15,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/117/testFolder/test.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/117/testFolder/test.png" }, "response": { "binary": false, @@ -45,7 +45,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/117/testFolder/test.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/117/testFolder/test.png" }, "response": { "binary": false, @@ -75,7 +75,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/117/testFolder/test.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/117/testFolder/test.png" }, "response": { "binary": false, diff --git a/test/fixtures/vcr_cassettes/aws/controller_upload_asset#2.json b/test/fixtures/vcr_cassettes/aws/controller_upload_asset#2.json index 74c5b4137..695cac06a 100644 --- a/test/fixtures/vcr_cassettes/aws/controller_upload_asset#2.json +++ b/test/fixtures/vcr_cassettes/aws/controller_upload_asset#2.json @@ -15,7 +15,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/117/testFolder/nestedFolder/test.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/117/testFolder/nestedFolder/test.png" }, "response": { "binary": false, @@ -45,7 +45,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/117/testFolder/nestedFolder/test.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/117/testFolder/nestedFolder/test.png" }, "response": { "binary": false, @@ -75,7 +75,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/117/testFolder/nestedFolder/test.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/117/testFolder/nestedFolder/test.png" }, "response": { "binary": false, diff --git a/test/fixtures/vcr_cassettes/aws/model_delete_asset#1.json b/test/fixtures/vcr_cassettes/aws/model_delete_asset#1.json index d2b2a118a..f5387c265 100644 --- a/test/fixtures/vcr_cassettes/aws/model_delete_asset#1.json +++ b/test/fixtures/vcr_cassettes/aws/model_delete_asset#1.json @@ -15,7 +15,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/1/testFolder/test4.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/1/testFolder/test4.png" }, "response": { "binary": false, diff --git a/test/fixtures/vcr_cassettes/aws/model_delete_asset#2.json b/test/fixtures/vcr_cassettes/aws/model_delete_asset#2.json index 04a06a652..813e8f2ab 100644 --- a/test/fixtures/vcr_cassettes/aws/model_delete_asset#2.json +++ b/test/fixtures/vcr_cassettes/aws/model_delete_asset#2.json @@ -15,7 +15,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/1/testFolder/test.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/1/testFolder/test.png" }, "response": { "binary": false, @@ -49,7 +49,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/1/testFolder/test.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/1/testFolder/test.png" }, "response": { "binary": false, @@ -62,4 +62,4 @@ "type": "ok" } } -] \ No newline at end of file +] diff --git a/test/fixtures/vcr_cassettes/aws/model_list_assets#1.json b/test/fixtures/vcr_cassettes/aws/model_list_assets#1.json index 8c2532351..788ff2393 100644 --- a/test/fixtures/vcr_cassettes/aws/model_list_assets#1.json +++ b/test/fixtures/vcr_cassettes/aws/model_list_assets#1.json @@ -18,7 +18,7 @@ }, "response": { "binary": false, - "body": "\ntest-sa-assets1/testFolder/1000false1/testFolder/2021-08-02T10:23:39.000Z"d41d8cd98f00b204e9800998ecf8427e"098bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARD1/testFolder/test.png2021-08-02T10:56:36.000Z"33c5d4f094a7727780a3c63babae1083"256898bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARD1/testFolder/test2.png2021-08-02T10:25:15.000Z"af2ab457d8b118efa176bc12cff4895f"299698bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARD", + "body": "\ntest-sa-assetscourses-test/1/testFolder/1000false1/testFolder/2021-08-02T10:23:39.000Z"d41d8cd98f00b204e9800998ecf8427e"098bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARD1/testFolder/test.png2021-08-02T10:56:36.000Z"33c5d4f094a7727780a3c63babae1083"256898bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARD1/testFolder/test2.png2021-08-02T10:25:15.000Z"af2ab457d8b118efa176bc12cff4895f"299698bd2bd2de0c976fb511f741fea454cb1026b9e1f9ac9160fd9f51d07e765f19unixsp+cs1101sSTANDARD", "headers": { "Date": "Mon, 02 Aug 2021 10:59:51 GMT", "x-amz-bucket-region": "ap-southeast-1", @@ -30,4 +30,4 @@ "type": "ok" } } -] \ No newline at end of file +] diff --git a/test/fixtures/vcr_cassettes/aws/model_list_assets#2.json b/test/fixtures/vcr_cassettes/aws/model_list_assets#2.json index 90e54e9ac..952722d6d 100644 --- a/test/fixtures/vcr_cassettes/aws/model_list_assets#2.json +++ b/test/fixtures/vcr_cassettes/aws/model_list_assets#2.json @@ -18,7 +18,7 @@ }, "response": { "binary": false, - "body": "\ntest-sa-assets2/testFolder/1000false", + "body": "\ntest-sa-assetscourses-test/2/testFolder/1000false", "headers": { "Date": "Mon, 02 Aug 2021 10:59:49 GMT", "x-amz-bucket-region": "ap-southeast-1", @@ -30,4 +30,4 @@ "type": "ok" } } -] \ No newline at end of file +] diff --git a/test/fixtures/vcr_cassettes/aws/model_upload_asset#1.json b/test/fixtures/vcr_cassettes/aws/model_upload_asset#1.json index 05484f371..58d6ad0cf 100644 --- a/test/fixtures/vcr_cassettes/aws/model_upload_asset#1.json +++ b/test/fixtures/vcr_cassettes/aws/model_upload_asset#1.json @@ -15,7 +15,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/1/testFolder/test2.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/1/testFolder/test2.png" }, "response": { "binary": false, @@ -33,4 +33,4 @@ "type": "ok" } } -] \ No newline at end of file +] diff --git a/test/fixtures/vcr_cassettes/aws/model_upload_asset#2.json b/test/fixtures/vcr_cassettes/aws/model_upload_asset#2.json index 4ab2c41ad..0d79028e1 100644 --- a/test/fixtures/vcr_cassettes/aws/model_upload_asset#2.json +++ b/test/fixtures/vcr_cassettes/aws/model_upload_asset#2.json @@ -15,11 +15,11 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/1/testFolder/test1.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/1/testFolder/test1.png" }, "response": { "binary": false, - "body": "\ntest-sa-assets1/testFolder/test1.pngJk9B8v0z6kdQbTsuU9S4Wu0r5oCPGDwid8meJ4h6sdUGwNyMKSetyBSCooSrl6zormlRXJDxmzcZMQJp9ylbq.aNQql.Vf048gE28hUz5_.bSzARS8fxYzPQFjgvxgkVLK4sCM.QSI3KtEc6JpYJHg--", + "body": "\ntest-sa-assetscourses-test/1/testFolder/test1.pngJk9B8v0z6kdQbTsuU9S4Wu0r5oCPGDwid8meJ4h6sdUGwNyMKSetyBSCooSrl6zormlRXJDxmzcZMQJp9ylbq.aNQql.Vf048gE28hUz5_.bSzARS8fxYzPQFjgvxgkVLK4sCM.QSI3KtEc6JpYJHg--", "headers": { "Date": "Mon, 02 Aug 2021 10:59:53 GMT", "Transfer-Encoding": "chunked", @@ -45,7 +45,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/1/testFolder/test1.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/1/testFolder/test1.png" }, "response": { "binary": false, @@ -75,7 +75,7 @@ "recv_timeout": 660000 }, "request_body": "", - "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/1/testFolder/test1.png" + "url": "https://s3.ap-southeast-1.amazonaws.com/test-sa-assets/courses-test/1/testFolder/test1.png" }, "response": { "binary": false, @@ -90,4 +90,4 @@ "type": "ok" } } -] \ No newline at end of file +]