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

source-academy / backend / e0330f2cf38b2d8af12bffd20f4cac2158d607fc-PR-1236

31 Mar 2025 09:12AM UTC coverage: 19.982% (-73.6%) from 93.607%
e0330f2cf38b2d8af12bffd20f4cac2158d607fc-PR-1236

Pull #1236

github

RichDom2185
Redate migrations to maintain total ordering
Pull Request #1236: Added Exam mode

12 of 57 new or added lines in 8 files covered. (21.05%)

2430 existing lines in 97 files now uncovered.

671 of 3358 relevant lines covered (19.98%)

3.03 hits per line

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

0.0
/lib/cadet/stories/stories.ex
1
defmodule Cadet.Stories.Stories do
2
  @moduledoc """
3
  Manages stories for the Source Academy game
4
  """
5
  use Cadet, [:context, :display]
6

7
  import Ecto.Query
8

9
  alias Cadet.Repo
10
  alias Cadet.Stories.Story
11

12
  def list_stories(course_id, list_all) do
UNCOV
13
    if list_all do
×
14
      Story
UNCOV
15
      |> where(course_id: ^course_id)
×
UNCOV
16
      |> Repo.all()
×
17
    else
18
      Story
19
      |> where(course_id: ^course_id)
20
      |> where(is_published: ^true)
UNCOV
21
      |> where([s], s.open_at <= ^Timex.now())
×
UNCOV
22
      |> Repo.all()
×
23
    end
24
  end
25

26
  def create_story(attrs = %{}, course_id) do
UNCOV
27
    case %Story{}
×
28
         |> Story.changeset(Map.put(attrs, :course_id, course_id))
29
         |> Repo.insert() do
30
      {:ok, _} = result ->
UNCOV
31
        result
×
32

UNCOV
33
      {:error, changeset} ->
×
34
        {:error, {:bad_request, full_error_messages(changeset)}}
35
    end
36
  end
37

38
  def update_story(attrs = %{}, id, course_id) do
UNCOV
39
    case Repo.get(Story, id) do
×
UNCOV
40
      nil ->
×
41
        {:error, {:not_found, "Story not found"}}
42

43
      story ->
UNCOV
44
        if story.course_id == course_id do
×
45
          story
46
          |> Story.changeset(attrs)
UNCOV
47
          |> Repo.update()
×
48
        else
49
          {:error, {:forbidden, "User not allowed to manage stories from another course"}}
50
        end
51
    end
52
  end
53

54
  def delete_story(id, course_id) do
UNCOV
55
    case Repo.get(Story, id) do
×
UNCOV
56
      nil ->
×
57
        {:error, {:not_found, "Story not found"}}
58

59
      story ->
UNCOV
60
        if story.course_id == course_id do
×
UNCOV
61
          Repo.delete(story)
×
62
        else
63
          {:error, {:forbidden, "User not allowed to manage stories from another course"}}
64
        end
65
    end
66
  end
67
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

© 2025 Coveralls, Inc