Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions config/cadet.exs.example
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,7 @@ config :cadet,
],
uploader: [
assets_bucket: "<unique-identifier>-assets",
assets_prefix: "courses/",
sourcecasts_bucket: "<unique-identifier>-cadet-sourcecasts"
assets_prefix: "courses/"
],
# Configuration for Sling integration (executing on remote devices)
remote_execution: [
Expand Down
3 changes: 1 addition & 2 deletions config/dev.secrets.exs.example
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,7 @@ config :cadet,
],
uploader: [
assets_bucket: "source-academy-assets",
assets_prefix: "courses-dev/",
sourcecasts_bucket: "env-cadet-sourcecasts"
assets_prefix: "courses-dev/"
],
# Configuration for Sling integration (executing on remote devices)
remote_execution: [
Expand Down
3 changes: 1 addition & 2 deletions config/test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,7 @@ config :cadet,
],
uploader: [
assets_bucket: "test-sa-assets",
assets_prefix: "courses-test/",
sourcecasts_bucket: "test-cadet-sourcecasts"
assets_prefix: "courses-test/"
],
remote_execution: [
thing_prefix: "env-sling",
Expand Down
4 changes: 1 addition & 3 deletions deployment/terraform/iam.tf
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ data "aws_iam_policy_document" "assets" {
effect = "Allow"
actions = ["s3:*"]
resources = [
aws_s3_bucket.sourcecasts.arn,
"${aws_s3_bucket.sourcecasts.arn}/*",
data.aws_s3_bucket.assets.arn,
"${data.aws_s3_bucket.assets.arn}/*",
]
Expand Down Expand Up @@ -116,7 +114,7 @@ resource "aws_iam_role" "frontend" {

resource "aws_iam_policy" "assets" {
name = "${var.env}-cadet-assets"
description = "Allows R/W access to the ${aws_s3_bucket.sourcecasts.bucket} and ${data.aws_s3_bucket.assets.bucket} S3 buckets"
description = "Allows R/W access to the ${data.aws_s3_bucket.assets.bucket} S3 bucket"
policy = data.aws_iam_policy_document.assets.json
}

Expand Down
10 changes: 0 additions & 10 deletions deployment/terraform/s3.tf
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
resource "aws_s3_bucket" "sourcecasts" {
bucket = "${var.env}-cadet-sourcecasts"
acl = "public-read"

tags = {
Name = "${title(var.env)} Cadet Sourcecasts"
Environment = var.env
}
}

data "aws_s3_bucket" "assets" {
bucket = var.assets_bucket
}
Expand Down
4 changes: 1 addition & 3 deletions lib/cadet/courses/course.ex
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ defmodule Cadet.Courses.Course do
enable_contest_leaderboard: boolean(),
top_leaderboard_display: integer(),
top_contest_leaderboard_display: integer(),
enable_sourcecast: boolean(),
enable_stories: boolean(),
enable_llm_grading: boolean(),
llm_api_key: String.t() | nil,
Expand All @@ -43,7 +42,6 @@ defmodule Cadet.Courses.Course do
field(:enable_contest_leaderboard, :boolean, default: true)
field(:top_leaderboard_display, :integer, default: 100)
field(:top_contest_leaderboard_display, :integer, default: 10)
field(:enable_sourcecast, :boolean, default: true)
field(:enable_stories, :boolean, default: false)
field(:enable_llm_grading, :boolean, default: false)
field(:llm_api_key, :string, default: nil)
Expand All @@ -66,7 +64,7 @@ defmodule Cadet.Courses.Course do
end

@required_fields ~w(course_name viewable enable_game
enable_achievements enable_overall_leaderboard enable_contest_leaderboard top_leaderboard_display top_contest_leaderboard_display enable_sourcecast enable_stories source_chapter source_variant)a
enable_achievements enable_overall_leaderboard enable_contest_leaderboard top_leaderboard_display top_contest_leaderboard_display enable_stories source_chapter source_variant)a
@optional_fields ~w(course_short_name module_help_text enable_llm_grading llm_api_key llm_model llm_api_url llm_course_level_prompt pixelbot_routing_prompt pixelbot_answer_prompt feedback_url)a

def changeset(course, params) do
Expand Down
122 changes: 1 addition & 121 deletions lib/cadet/courses/courses.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@ defmodule Cadet.Courses do
alias Cadet.Courses.{
AssessmentConfig,
Course,
Group,
Sourcecast,
SourcecastUpload
Group
}

alias Cadet.Assessments
Expand Down Expand Up @@ -367,124 +365,6 @@ defmodule Cadet.Courses do
end
end

@doc """
Upload a sourcecast file.

Note that there are no checks for whether the user belongs to the course,
as this has been checked inside a plug in the router.
"""
def upload_sourcecast_file(
_inserter = %CourseRegistration{user_id: user_id, course_id: course_id},
attrs = %{}
) do
Logger.info("Uploading sourcecast file for user #{user_id} in course #{course_id}")

changeset =
Sourcecast.changeset(%Sourcecast{uploader_id: user_id, course_id: course_id}, attrs)

case Repo.insert(changeset) do
{:ok, sourcecast} ->
Logger.info("Successfully uploaded sourcecast #{sourcecast.id} for user #{user_id}")
{:ok, sourcecast}

{:error, changeset} ->
Logger.error(
"Failed to upload sourcecast for user #{user_id}: #{full_error_messages(changeset)}"
)

{:error, {:bad_request, full_error_messages(changeset)}}
end
end

# @doc """
# Upload a public sourcecast file.

# Note that there are no checks for whether the user belongs to the course,
# as this has been checked inside a plug in the router.
# unused in the current version
# """
# def upload_sourcecast_file_public(
# inserter,
# _inserter_course_reg = %CourseRegistration{role: role},
# attrs = %{}
# ) do
# if role in @upload_file_roles do
# changeset =
# %Sourcecast{}
# |> Sourcecast.changeset(attrs)
# |> put_assoc(:uploader, inserter)

# case Repo.insert(changeset) do
# {:ok, sourcecast} ->
# {:ok, sourcecast}

# {:error, changeset} ->
# {:error, {:bad_request, full_error_messages(changeset)}}
# end
# else
# {:error, {:forbidden, "User is not permitted to upload"}}
# end
# end

@doc """
Delete a sourcecast file

Note that there are no checks for whether the user belongs to the course, as this has been checked
inside a plug in the router.
"""
def delete_sourcecast_file(sourcecast_id) do
Logger.info("Deleting sourcecast file #{sourcecast_id}")

sourcecast = Repo.get(Sourcecast, sourcecast_id)

case sourcecast do
nil ->
Logger.error("Sourcecast #{sourcecast_id} not found")
{:error, {:not_found, "Sourcecast not found!"}}

sourcecast ->
SourcecastUpload.delete({sourcecast.audio, sourcecast})
result = Repo.delete(sourcecast)

case result do
{:ok, _} ->
Logger.info("Successfully deleted sourcecast #{sourcecast_id}")

{:error, changeset} ->
Logger.error(
"Failed to delete sourcecast #{sourcecast_id}: #{full_error_messages(changeset)}"
)
end

result
end
end

@doc """
Get sourcecast files
"""
def get_sourcecast_files(course_id) when is_ecto_id(course_id) do
Logger.info("Retrieving sourcecast files for course #{course_id}")

sourcecasts =
Sourcecast
|> where(course_id: ^course_id)
|> Repo.all()
|> Repo.preload(:uploader)

Logger.info("Retrieved #{length(sourcecasts)} sourcecast files for course #{course_id}")
sourcecasts
end

# unused in the current version
# def get_sourcecast_files do
# Sourcecast
# # Public sourcecasts are those without course_id
# |> where([s], is_nil(s.course_id))
# |> Repo.all()
# |> Repo.preload(:uploader)
# end

@spec assets_prefix(Course.t()) :: binary()
def assets_prefix(course) do
course.assets_prefix || "#{Assets.assets_prefix()}#{course.id}/"
Expand Down
52 changes: 0 additions & 52 deletions lib/cadet/courses/sourcecast.ex

This file was deleted.

27 changes: 0 additions & 27 deletions lib/cadet/courses/sourcecast_upload.ex

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ defmodule CadetWeb.AdminCoursesController do
enable_contest_leaderboard(:body, :boolean, "Enable contest leaderboard")
top_leaderboard_display(:body, :integer, "Top Leaderboard Display")
top_contest_leaderboard_display(:body, :integer, "Top Contest Leaderboard Display")
enable_sourcecast(:body, :boolean, "Enable sourcecast")
enable_stories(:body, :boolean, "Enable stories")
enable_llm_grading(:body, :boolean, "Enable LLM grading")
llm_api_key(:body, :string, "OpenAI API key for this course")
Expand Down
Loading
Loading