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

camatcode / basenji / 94f3ab42de1f911c3f75eedf130b6055eea11bdd

12 Jul 2025 01:11AM UTC coverage: 71.253% (-0.5%) from 71.731%
94f3ab42de1f911c3f75eedf130b6055eea11bdd

Pull #38

github

camatcode
chore: stashing
Pull Request #38: WIP: chore: stashing

4 of 11 new or added lines in 1 file covered. (36.36%)

9 existing lines in 2 files now uncovered.

580 of 814 relevant lines covered (71.25%)

556.94 hits per line

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

61.54
/lib/basenji_web/controllers/api/json_api/collections_controller.ex
1
defmodule BasenjiWeb.JSONAPI.CollectionsController do
2
  @moduledoc false
3
  use BasenjiWeb, :controller
4

5
  alias Basenji.Collections
6
  alias BasenjiWeb.API.Utils
7
  alias BasenjiWeb.Plugs.JSONAPIPlug, as: BasenjiJSONAPIPlug
8

9
  plug BasenjiJSONAPIPlug, api: BasenjiWeb.API, path: "collections", resource: Basenji.Collection
10

11
  def index(%{private: %{jsonapi_plug: jsonapi_plug}} = conn, _params) do
12
    collections = Collections.list_collections(Utils.to_opts(jsonapi_plug))
39✔
13
    render(conn, "index.json", %{data: collections})
39✔
14
  end
15

16
  def create(%{private: %{jsonapi_plug: jsonapi_plug}} = conn, params) do
17
    # validate params!
18
    attrs = params["data"]["attributes"] |> Utils.atomize()
1✔
19

20
    Collections.create_collection(attrs, Utils.to_opts(jsonapi_plug))
21
    |> case do
1✔
22
      {:ok, collection} ->
23
        render(conn, "create.json", %{data: collection})
1✔
24

25
      error ->
UNCOV
26
        Utils.bad_request_handler(conn, error)
×
27
    end
28
  end
29

30
  def show(%{private: %{jsonapi_plug: jsonapi_plug}} = conn, params) do
31
    Collections.get_collection(params["id"], Utils.to_opts(jsonapi_plug))
32
    |> case do
1✔
33
      {:ok, comic} ->
34
        render(conn, "create.json", %{data: comic})
1✔
35

36
      _ ->
UNCOV
37
        Utils.bad_request_handler(conn, {:error, :not_found})
×
38
    end
39
  end
40

41
  def update(%{private: %{jsonapi_plug: jsonapi_plug}} = conn, params) do
42
    id = params["id"]
1✔
43

44
    # Handle both attributes and relationships
45
    attrs = params["data"]["attributes"] |> Utils.atomize()
1✔
46
    relationships = Map.get(params["data"], "relationships", %{})
1✔
47

48
    # If comics relationship is provided, handle it
49
    attrs_with_relationships =
1✔
50
      case Map.get(relationships, "comics") do
51
        %{"data" => comics_data} when is_list(comics_data) ->
52
          # For JSON:API, we replace the entire relationship
NEW
53
          new_comic_ids = Enum.map(comics_data, fn %{"id" => id} -> id end)
×
54

55
          # Get current comics to determine what to add/remove
NEW
56
          case Collections.get_collection(id, preload: [:comics]) do
×
57
            {:ok, current_collection} ->
NEW
58
              current_comic_ids = Enum.map(current_collection.comics, & &1.id)
×
NEW
UNCOV
59
              comics_to_add = new_comic_ids -- current_comic_ids
×
NEW
UNCOV
60
              comics_to_remove = current_comic_ids -- new_comic_ids
×
61

62
              attrs
63
              |> Map.put(:comics_to_add, comics_to_add)
NEW
UNCOV
64
              |> Map.put(:comics_to_remove, comics_to_remove)
×
65

66
            _ ->
NEW
67
              attrs
×
68
          end
69

70
        _ ->
71
          attrs
1✔
72
      end
73

74
    Collections.update_collection(id, attrs_with_relationships, Utils.to_opts(jsonapi_plug))
75
    |> case do
1✔
76
      {:ok, collection} -> render(conn, "update.json", %{data: collection})
1✔
77
      e -> Utils.bad_request_handler(conn, e)
×
78
    end
79
  end
80

81
  def delete(conn, params) do
82
    {:ok, deleted} = Collections.delete_collection(params["id"])
1✔
83
    render(conn, "show.json", %{data: deleted})
1✔
84
  end
85
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