Skip to content

Commit 980bce8

Browse files
committed
Allow custom course prefix
1 parent f412305 commit 980bce8

File tree

15 files changed

+313
-28
lines changed

15 files changed

+313
-28
lines changed

lib/cadet/assets/assets.ex

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,18 @@ defmodule Cadet.Assets.Assets do
99
if(Mix.env() == :test, do: ["testFolder"], else: [])
1010
@accepted_file_types ~w(.jpg .jpeg .gif .png .wav .mp3 .txt)
1111

12-
def upload_to_s3(upload_params, course_id, folder_name, file_name) do
12+
def upload_to_s3(upload_params, prefix, folder_name, file_name) do
1313
file_type = Path.extname(file_name)
1414

1515
with :ok <- validate_file_name(file_name),
1616
:ok <- validate_folder_name(folder_name),
1717
:ok <- validate_file_type(file_type) do
18-
if object_exists?(course_id, folder_name, file_name) do
18+
if object_exists?(prefix, folder_name, file_name) do
1919
{:error, {:bad_request, "File already exists"}}
2020
else
2121
file = upload_params.path
2222

23-
s3_path = "#{prefix()}#{course_id}/#{folder_name}/#{file_name}"
23+
s3_path = "#{prefix}#{folder_name}/#{file_name}"
2424

2525
file
2626
|> Upload.stream_file()
@@ -32,11 +32,11 @@ defmodule Cadet.Assets.Assets do
3232
end
3333
end
3434

35-
def list_assets(course_id, folder_name) do
35+
def list_assets(prefix, folder_name) do
3636
case validate_folder_name(folder_name) do
3737
:ok ->
3838
bucket()
39-
|> S3.list_objects(prefix: "#{prefix()}#{course_id}/" <> folder_name <> "/")
39+
|> S3.list_objects(prefix: prefix <> folder_name <> "/")
4040
|> ExAws.stream!()
4141
|> Enum.map(fn file -> file.key end)
4242

@@ -45,12 +45,12 @@ defmodule Cadet.Assets.Assets do
4545
end
4646
end
4747

48-
def delete_object(course_id, folder_name, file_name) do
48+
def delete_object(prefix, folder_name, file_name) do
4949
with :ok <- validate_file_name(file_name),
5050
:ok <- validate_folder_name(folder_name) do
51-
if object_exists?(course_id, folder_name, file_name) do
51+
if object_exists?(prefix, folder_name, file_name) do
5252
bucket()
53-
|> S3.delete_object("#{prefix()}#{course_id}/#{folder_name}/#{file_name}")
53+
|> S3.delete_object("#{prefix}#{folder_name}/#{file_name}")
5454
|> ExAws.request!()
5555

5656
:ok
@@ -60,11 +60,11 @@ defmodule Cadet.Assets.Assets do
6060
end
6161
end
6262

63-
@spec object_exists?(integer(), binary, binary) :: boolean()
64-
def object_exists?(course_id, folder_name, file_name) do
63+
@spec object_exists?(integer() | binary(), binary, binary) :: boolean()
64+
def object_exists?(prefix, folder_name, file_name) do
6565
response =
6666
bucket()
67-
|> S3.head_object("#{prefix()}#{course_id}/#{folder_name}/#{file_name}")
67+
|> S3.head_object("#{prefix}#{folder_name}/#{file_name}")
6868
|> ExAws.request()
6969

7070
case response do
@@ -99,5 +99,6 @@ defmodule Cadet.Assets.Assets do
9999

100100
defp bucket, do: :cadet |> Application.fetch_env!(:uploader) |> Keyword.get(:assets_bucket)
101101

102-
defp prefix, do: :cadet |> Application.fetch_env!(:uploader) |> Keyword.get(:assets_prefix, "")
102+
def assets_prefix,
103+
do: :cadet |> Application.fetch_env!(:uploader) |> Keyword.get(:assets_prefix, "")
103104
end

lib/cadet/courses/course.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ defmodule Cadet.Courses.Course do
1717
field(:source_variant, :string)
1818
field(:module_help_text, :string)
1919

20+
# for now, only settable from database
21+
field(:assets_prefix, :string, default: nil)
22+
2023
has_many(:assessment_config, AssessmentConfig)
2124

2225
timestamps()

lib/cadet/courses/courses.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ defmodule Cadet.Courses do
2020

2121
alias Cadet.Assessments
2222
alias Cadet.Assessments.Assessment
23+
alias Cadet.Assets.Assets
2324

2425
@doc """
2526
Creates a new course configuration, course registration, and sets
@@ -408,4 +409,9 @@ defmodule Cadet.Courses do
408409
|> Repo.all()
409410
|> Repo.preload(:uploader)
410411
end
412+
413+
@spec assets_prefix(%Course{}) :: binary()
414+
def assets_prefix(course) do
415+
course.assets_prefix || "#{Assets.assets_prefix()}#{course.id}/"
416+
end
411417
end

lib/cadet_web/admin_controllers/admin_assets_controller.ex

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ defmodule CadetWeb.AdminAssetsController do
22
use CadetWeb, :controller
33

44
use PhoenixSwagger
5+
56
alias Cadet.Assets.Assets
7+
alias Cadet.Courses
68

79
def index(conn, _params = %{"foldername" => foldername}) do
810
course_reg = conn.assigns.course_reg
911

10-
case Assets.list_assets(course_reg.course_id, foldername) do
12+
case Assets.list_assets(Courses.assets_prefix(course_reg.course), foldername) do
1113
{:error, {status, message}} -> conn |> put_status(status) |> text(message)
1214
assets -> render(conn, "index.json", assets: assets)
1315
end
@@ -18,7 +20,7 @@ defmodule CadetWeb.AdminAssetsController do
1820
course_reg = conn.assigns.course_reg
1921
filename = Enum.join(filename, "/")
2022

21-
case Assets.delete_object(course_reg.course_id, foldername, filename) do
23+
case Assets.delete_object(Courses.assets_prefix(course_reg.course), foldername, filename) do
2224
{:error, {status, message}} -> conn |> put_status(status) |> text(message)
2325
_ -> conn |> put_status(204) |> text('')
2426
end
@@ -32,7 +34,12 @@ defmodule CadetWeb.AdminAssetsController do
3234
course_reg = conn.assigns.course_reg
3335
filename = Enum.join(filename, "/")
3436

35-
case Assets.upload_to_s3(upload_params, course_reg.course_id, foldername, filename) do
37+
case Assets.upload_to_s3(
38+
upload_params,
39+
Courses.assets_prefix(course_reg.course),
40+
foldername,
41+
filename
42+
) do
3643
{:error, {status, message}} -> conn |> put_status(status) |> text(message)
3744
resp -> render(conn, "show.json", resp: resp)
3845
end

lib/cadet_web/admin_controllers/admin_courses_controller.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ defmodule CadetWeb.AdminCoursesController do
8484
end
8585

8686
swagger_path :update_course_config do
87-
put("/v2/courses/{course_id}/admin/onfig")
87+
put("/v2/courses/{course_id}/admin/config")
8888

8989
summary("Updates the course configuration for the specified course")
9090

lib/cadet_web/controllers/user_controller.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ defmodule CadetWeb.UserController do
291291
source_variant(Schema.ref(:SourceVariant), "Source Variant name", required: true)
292292
module_help_text(:string, "Module help text", required: true)
293293
assessment_types(:list, "Assessment Types", required: true)
294+
assets_prefix(:string, "Assets prefix, used by the game")
294295
end
295296

296297
example(%{
@@ -303,7 +304,8 @@ defmodule CadetWeb.UserController do
303304
source_chapter: 1,
304305
source_variant: "default",
305306
module_help_text: "Help text",
306-
assessment_types: ["Missions", "Quests", "Paths", "Contests", "Others"]
307+
assessment_types: ["Missions", "Quests", "Paths", "Contests", "Others"],
308+
assets_prefix: "courses-prod/1/"
307309
})
308310
end,
309311
SourceVariant:

lib/cadet_web/views/courses_view.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ defmodule CadetWeb.CoursesView do
1414
sourceChapter: :source_chapter,
1515
sourceVariant: :source_variant,
1616
moduleHelpText: :module_help_text,
17-
assessmentTypes: :assessment_configs
17+
assessmentTypes: :assessment_configs,
18+
assetsPrefix: :assets_prefix
1819
})
1920
}
2021
end

lib/cadet_web/views/user_view.ex

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
defmodule CadetWeb.UserView do
22
use CadetWeb, :view
33

4+
alias Cadet.Courses
5+
46
def render("index.json", %{
57
user: user,
68
courses: courses,
@@ -104,7 +106,8 @@ defmodule CadetWeb.UserView do
104106
enableSourcecast: :enable_sourcecast,
105107
sourceChapter: :source_chapter,
106108
sourceVariant: :source_variant,
107-
moduleHelpText: :module_help_text
109+
moduleHelpText: :module_help_text,
110+
assetsPrefix: &Courses.assets_prefix/1
108111
})
109112
end
110113
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
defmodule Cadet.Repo.Migrations.AddAssetsPrefix do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:courses) do
6+
add(:assets_prefix, :string, null: true)
7+
end
8+
end
9+
end

test/cadet/assets/assets_test.exs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ defmodule Cadet.Assets.AssetsTest do
77
describe "Manage assets" do
88
test "accessible folder" do
99
use_cassette "aws/model_list_assets#1" do
10-
assert Assets.list_assets(1, "testFolder") === [
10+
assert Assets.list_assets(prefix(1), "testFolder") === [
1111
"1/testFolder/",
1212
"1/testFolder/test.png",
1313
"1/testFolder/test2.png"
@@ -17,28 +17,28 @@ defmodule Cadet.Assets.AssetsTest do
1717

1818
test "access another course with 0 folder" do
1919
use_cassette "aws/model_list_assets#2" do
20-
assert Assets.list_assets(2, "testFolder") === []
20+
assert Assets.list_assets(prefix(2), "testFolder") === []
2121
end
2222
end
2323

2424
test "delete nonexistent file" do
2525
use_cassette "aws/model_delete_asset#1" do
26-
assert Assets.delete_object(1, "testFolder", "test4.png") ===
26+
assert Assets.delete_object(prefix(1), "testFolder", "test4.png") ===
2727
{:error, {:not_found, "File not found"}}
2828
end
2929
end
3030

3131
test "delete ok file" do
3232
use_cassette "aws/model_delete_asset#2" do
33-
assert Assets.delete_object(1, "testFolder", "test.png") === :ok
33+
assert Assets.delete_object(prefix(1), "testFolder", "test.png") === :ok
3434
end
3535
end
3636

3737
test "upload existing file" do
3838
use_cassette "aws/model_upload_asset#1" do
3939
assert Assets.upload_to_s3(
4040
build_upload("test/fixtures/upload.png"),
41-
1,
41+
prefix(1),
4242
"testFolder",
4343
"test2.png"
4444
) ===
@@ -50,7 +50,7 @@ defmodule Cadet.Assets.AssetsTest do
5050
use_cassette "aws/model_upload_asset#2" do
5151
assert Assets.upload_to_s3(
5252
build_upload("test/fixtures/upload.png"),
53-
1,
53+
prefix(1),
5454
"testFolder",
5555
"test1.png"
5656
) ===
@@ -64,4 +64,6 @@ defmodule Cadet.Assets.AssetsTest do
6464
end
6565

6666
defp bucket, do: :cadet |> Application.fetch_env!(:uploader) |> Keyword.get(:assets_bucket)
67+
68+
defp prefix(course_id), do: "#{Assets.assets_prefix()}#{course_id}/"
6769
end

0 commit comments

Comments
 (0)