• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

source-academy / backend / d2bf00fc785f5e2499788134b1c189a881698578-PR-1252

14 May 2025 04:25PM UTC coverage: 93.136% (-0.5%) from 93.607%
d2bf00fc785f5e2499788134b1c189a881698578-PR-1252

Pull #1252

github

RichDom2185
Update CD workflow
Pull Request #1252: Upgrade CI, Elixir versions

4 of 5 new or added lines in 5 files covered. (80.0%)

18 existing lines in 5 files now uncovered.

3121 of 3351 relevant lines covered (93.14%)

7496.45 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

95.45
/lib/cadet_web/admin_controllers/admin_assets_controller.ex
1
defmodule CadetWeb.AdminAssetsController do
2
  use CadetWeb, :controller
3

4
  use PhoenixSwagger
5

6
  alias Cadet.Assets.Assets
7
  alias Cadet.Courses
8

9
  def index(conn, _params = %{"foldername" => foldername}) do
10
    course_reg = conn.assigns.course_reg
3✔
11

12
    case Assets.list_assets(Courses.assets_prefix(course_reg.course), foldername) do
3✔
13
      {:error, {status, message}} -> conn |> put_status(status) |> text(message)
1✔
14
      assets -> render(conn, "index.json", assets: assets)
2✔
15
    end
16
  end
17

18
  @spec delete(Plug.Conn.t(), map) :: Plug.Conn.t()
19
  def delete(conn, _params = %{"foldername" => foldername, "filename" => filename}) do
20
    course_reg = conn.assigns.course_reg
5✔
21
    filename = Enum.join(filename, "/")
5✔
22

23
    case Assets.delete_object(Courses.assets_prefix(course_reg.course), foldername, filename) do
5✔
24
      {:error, {status, message}} -> conn |> put_status(status) |> text(message)
2✔
25
      _ -> conn |> put_status(204) |> text("")
3✔
26
    end
27
  end
28

29
  def upload(conn, %{
30
        "upload" => upload_params,
31
        "filename" => filename,
32
        "foldername" => foldername
33
      }) do
34
    course_reg = conn.assigns.course_reg
6✔
35
    filename = Enum.join(filename, "/")
6✔
36

37
    case Assets.upload_to_s3(
6✔
38
           upload_params,
39
           Courses.assets_prefix(course_reg.course),
6✔
40
           foldername,
41
           filename
42
         ) do
43
      {:error, {status, message}} -> conn |> put_status(status) |> text(message)
3✔
UNCOV
44
      resp -> render(conn, "show.json", resp: resp)
×
45
    end
46
  end
47

48
  def swagger_definitions do
49
    %{
1✔
50
      Asset:
51
        swagger_schema do
1✔
52
          title("Asset")
53
          description("A path to an asset")
54
          example("assets/hello.png")
55
        end,
56
      Assets:
57
        swagger_schema do
1✔
58
          title("Assets")
59
          description("An array of asset paths")
60
          type(:array)
61
          items(PhoenixSwagger.Schema.ref(:Asset))
62
        end,
63
      AssetURL:
64
        swagger_schema do
1✔
65
          title("Asset URL")
66
          description("A URL to an uploaded asset")
67
          type(:string)
68
          example("https://bucket-name.s3.amazonaws.com/assets/hello.png")
69
        end
70
    }
71
  end
72

73
  swagger_path :index do
1✔
74
    get("/courses/{course_id}/admin/assets/{folderName}")
75

76
    summary("Get a list of all assets in a folder")
77

78
    parameters do
79
      folderName(:path, :string, "Folder name", required: true)
80
    end
81

82
    security([%{JWT: []}])
83

84
    produces("application/json")
85

86
    response(200, "OK", :Assets)
87
    response(400, "Invalid folder name")
88
    response(403, "User is not allowed to manage assets")
89
  end
90

91
  swagger_path :delete do
1✔
92
    PhoenixSwagger.Path.delete("/courses/{course_id}/admin/assets/{folderName}/{fileName}")
93

94
    summary("Delete a file from an asset folder")
95

96
    parameters do
97
      folderName(:path, :string, "Folder name", required: true)
98

99
      fileName(:path, :string, "File path in folder, which may contain subfolders",
100
        required: true
101
      )
102
    end
103

104
    security([%{JWT: []}])
105

106
    response(204, "OK")
107
    response(400, "Invalid folder name, file name or file type")
108
    response(403, "User is not allowed to manage assets")
109
    response(404, "File not found")
110
  end
111

112
  swagger_path :upload do
1✔
113
    post("/courses/{course_id}/admin/assets/{folderName}/{fileName}")
114

115
    summary("Upload a file to an asset folder")
116

117
    parameters do
118
      folderName(:path, :string, "Folder name", required: true)
119

120
      fileName(:path, :string, "File path in folder, which may contain subfolders",
121
        required: true
122
      )
123
    end
124

125
    security([%{JWT: []}])
126

127
    produces("application/json")
128

129
    response(200, "OK", :AssetURL)
130
    response(400, "Invalid folder name, file name or file type")
131
    response(403, "User is not allowed to manage assets")
132
  end
133
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc