Module: ActiveProject::Adapters::Basecamp::Projects

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

Instance Method Summary collapse

Instance Method Details

#create_project(attributes) ⇒ ActiveProject::Resources::Project

Creates a new project in Basecamp.

Parameters:

  • attributes (Hash)

    Project attributes. Required: :name. Optional: :description.

Returns:



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/active_project/adapters/basecamp/projects.rb', line 65

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

  path = "projects.json"
  payload = {
    name: attributes[:name],
    description: attributes[:description]
  }.compact

  project_data = make_request(:post, path, payload.to_json)

  Resources::Project.new(self,
                         id: project_data["id"],
                         key: nil,
                         name: project_data["name"],
                         adapter_source: :basecamp,
                         raw_data: project_data)
end

#delete_project(project_id) ⇒ Boolean

Archives (trashes) a project in Basecamp. Note: Basecamp API doesn’t offer permanent deletion via this endpoint.

Parameters:

  • project_id (String, Integer)

    The ID of the project to trash.

Returns:

  • (Boolean)

    true if trashing was successful (API returns 204).

Raises:



102
103
104
105
106
# File 'lib/active_project/adapters/basecamp/projects.rb', line 102

def delete_project(project_id)
  path = "projects/#{project_id}.json"
  make_request(:delete, path)
  true
end

#find_project(project_id) ⇒ ActiveProject::Resources::Project

Finds a specific project by its ID.

Parameters:

  • project_id (String, Integer)

    The ID of the Basecamp project.

Returns:

Raises:



47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/active_project/adapters/basecamp/projects.rb', line 47

def find_project(project_id)
  path = "projects/#{project_id}.json"
  project_data = make_request(:get, path)
  return nil unless project_data

  raise NotFoundError, "Basecamp project ID #{project_id} is trashed." if project_data["status"] == "trashed"

  Resources::Project.new(self,
                         id: project_data["id"],
                         key: nil,
                         name: project_data["name"],
                         adapter_source: :basecamp,
                         raw_data: project_data)
end

#list_projectsArray<ActiveProject::Resources::Project>

Lists projects accessible by the configured credentials. Handles pagination automatically using the Link header.

Returns:



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/active_project/adapters/basecamp/projects.rb', line 10

def list_projects
  all_projects = []
  path = "projects.json"

  loop do
    response = @connection.get(path)
    projects_data = begin
      JSON.parse(response.body)
    rescue StandardError
      []
    end
    break if projects_data.empty?

    projects_data.each do |project_data|
      all_projects << Resources::Project.new(self,
                                             id: project_data["id"],
                                             key: nil,
                                             name: project_data["name"],
                                             adapter_source: :basecamp,
                                             raw_data: project_data)
    end

    link_header = response.headers["Link"]
    next_url = parse_next_link(link_header)
    break unless next_url

    path = next_url.sub(@base_url, "").sub(%r{^/}, "")
  end

  all_projects
rescue Faraday::Error => e
  handle_faraday_error(e)
end

#untrash_project(project_id) ⇒ Boolean

Recovers a trashed project in Basecamp.

Parameters:

  • project_id (String, Integer)

    The ID of the project to recover.

Returns:

  • (Boolean)

    true if recovery was successful (API returns 204).



89
90
91
92
93
# File 'lib/active_project/adapters/basecamp/projects.rb', line 89

def untrash_project(project_id)
  path = "projects/#{project_id}.json"
  make_request(:put, path, { "status": "active" }.to_json)
  true
end