Module: ActiveProject::Adapters::Basecamp::Lists

Included in:
ActiveProject::Adapters::BasecampAdapter
Defined in:
lib/active_project/adapters/basecamp/lists.rb

Instance Method Summary collapse

Instance Method Details

#create_list(project_id, attributes) ⇒ Hash

Creates a new Todolist within a project.

Parameters:

  • project_id (String, Integer)

    The ID of the Basecamp project (bucket).

  • attributes (Hash)

    Todolist attributes. Required: :name. Optional: :description.

Returns:

  • (Hash)

    The raw data hash of the created todolist.

Raises:



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/active_project/adapters/basecamp/lists.rb', line 11

def create_list(project_id, attributes)
  unless attributes[:name] && !attributes[:name].empty?
    raise ArgumentError, "Missing required attribute for Basecamp todolist creation: :name"
  end

  project_data = make_request(:get, "projects/#{project_id}.json")
  todoset_dock_entry = project_data&.dig("dock")&.find { |d| d["name"] == "todoset" }
  todoset_url = todoset_dock_entry&.dig("url")
  raise ApiError, "Could not find todoset URL for project #{project_id}" unless todoset_url

  todoset_id = todoset_url.match(%r{todosets/(\d+)\.json$})&.captures&.first
  raise ApiError, "Could not extract todoset ID from URL: #{todoset_url}" unless todoset_id

  path = "buckets/#{project_id}/todosets/#{todoset_id}/todolists.json"
  payload = {
    name: attributes[:name],
    description: attributes[:description]
  }.compact

  make_request(:post, path, payload.to_json)
end

#find_first_todolist_id(project_id) ⇒ String?

Finds the ID of the first todolist in a project.

Parameters:

  • project_id (String, Integer)

Returns:

  • (String, nil)


36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/active_project/adapters/basecamp/lists.rb', line 36

def find_first_todolist_id(project_id)
  project_data = make_request(:get, "projects/#{project_id}.json")
  todoset_dock_entry = project_data&.dig("dock")&.find { |d| d["name"] == "todoset" }
  todoset_url = todoset_dock_entry&.dig("url")
  return nil unless todoset_url

  todoset_id = todoset_url.match(%r{todosets/(\d+)\.json$})&.captures&.first
  return nil unless todoset_id

  todolists_url_path = "buckets/#{project_id}/todosets/#{todoset_id}/todolists.json"
  todolists_data = make_request(:get, todolists_url_path)
  todolists_data&.first&.dig("id")
rescue NotFoundError
  nil
end