Class: Basecamp::ApiClient

Inherits:
Object
  • Object
show all
Defined in:
app/services/basecamp/api_client.rb

Overview

HTTP client for Basecamp 4 JSON API.

Features:

  • Auto-refreshes expired access tokens
  • Respects Basecamp rate limits (429 + Retry-After)
  • Retries transient failures (502, 503)
  • User-Agent required by Basecamp API

Reference: https://github.com/basecamp/api/blob/master/sections/authentication.md

Defined Under Namespace

Classes: ApiError, NotFoundError, RateLimitError

Constant Summary collapse

BASE_URL =

URL for base.

'https://3.basecampapi.com'
USER_AGENT =

User agent.

'WarmlyYours CRM (support@warmlyyours.com)'
MAX_RETRIES =

Maximum retries.

3
RATE_LIMIT_SLEEP =

default wait if no Retry-After header

5

Instance Method Summary collapse

Constructor Details

#initialize(account: nil, oauth_service: nil) ⇒ ApiClient

Returns a new instance of ApiClient.

Parameters:

  • account (Account, nil) (defaults to: nil)

    the CRM account whose Basecamp token to use (nil for system-level)

  • oauth_service (Basecamp::OauthService, nil) (defaults to: nil)

    override for testing



47
48
49
# File 'app/services/basecamp/api_client.rb', line 47

def initialize(account: nil, oauth_service: nil)
  @oauth_service = oauth_service || Basecamp::OauthService.new(account: )
end

Instance Method Details

#campfire_lines(project_id, campfire_id) ⇒ Object

Campfire lines.

Parameters:

  • project_id (Object)
  • campfire_id (Object)

Returns:

  • (Object)


355
356
357
# File 'app/services/basecamp/api_client.rb', line 355

def campfire_lines(project_id, campfire_id)
  get("/buckets/#{project_id}/chats/#{campfire_id}/lines.json")
end

#card_tables(project_id) ⇒ Object

Card tables.

Parameters:

  • project_id (Object)

Returns:

  • (Object)


364
365
366
# File 'app/services/basecamp/api_client.rb', line 364

def card_tables(project_id)
  get("/buckets/#{project_id}/card_tables.json")
end

#cards(project_id, column_id) ⇒ Object

Cards.

Parameters:

  • project_id (Object)
  • column_id (Object)

Returns:

  • (Object)


380
381
382
# File 'app/services/basecamp/api_client.rb', line 380

def cards(project_id, column_id)
  get("/buckets/#{project_id}/card_tables/lists/#{column_id}/cards.json")
end

#columns(project_id, card_table_id) ⇒ Object

Columns.

Parameters:

  • project_id (Object)
  • card_table_id (Object)

Returns:

  • (Object)


372
373
374
# File 'app/services/basecamp/api_client.rb', line 372

def columns(project_id, card_table_id)
  get("/buckets/#{project_id}/card_tables/#{card_table_id}/columns.json")
end

#comment(project_id, comment_id) ⇒ Object

Comment.

Parameters:

  • project_id (Object)
  • comment_id (Object)

Returns:

  • (Object)


451
452
453
# File 'app/services/basecamp/api_client.rb', line 451

def comment(project_id, comment_id)
  get("/buckets/#{project_id}/comments/#{comment_id}.json")
end

#comments(project_id, recording_id) ⇒ Object

Comments.

Parameters:

  • project_id (Object)
  • recording_id (Object)

Returns:

  • (Object)


443
444
445
# File 'app/services/basecamp/api_client.rb', line 443

def comments(project_id, recording_id)
  get_paginated("/buckets/#{project_id}/recordings/#{recording_id}/comments.json")
end

#complete_todo(project_id, todo_id) ⇒ Object

Complete todo.

Parameters:

  • project_id (Object)
  • todo_id (Object)

Returns:

  • (Object)


229
230
231
# File 'app/services/basecamp/api_client.rb', line 229

def complete_todo(project_id, todo_id)
  post("/buckets/#{project_id}/todos/#{todo_id}/completion.json")
end

#create_card(project_id, column_id, title:, content: nil, due_on: nil) ⇒ Object

Create card.

Parameters:

  • project_id (Object)
  • column_id (Object)
  • title (Object)
  • content (Object, nil) (defaults to: nil)
  • due_on (Object, nil) (defaults to: nil)

Returns:

  • (Object)


391
392
393
394
395
396
# File 'app/services/basecamp/api_client.rb', line 391

def create_card(project_id, column_id, title:, content: nil, due_on: nil)
  body = { title: title }
  body[:content] = content if content
  body[:due_on] = due_on if due_on
  post("/buckets/#{project_id}/card_tables/lists/#{column_id}/cards.json", body)
end

#create_comment(project_id, recording_id, content:) ⇒ Object

Create comment.

Parameters:

  • project_id (Object)
  • recording_id (Object)
  • content (Object)

Returns:

  • (Object)


460
461
462
# File 'app/services/basecamp/api_client.rb', line 460

def create_comment(project_id, recording_id, content:)
  post("/buckets/#{project_id}/recordings/#{recording_id}/comments.json", { content: content })
end

#create_document(project_id, vault_id, title:, content:, status: nil) ⇒ Object

Create document.

Parameters:

  • project_id (Object)
  • vault_id (Object)
  • title (Object)
  • content (Object)
  • status (Object, nil) (defaults to: nil)

Returns:

  • (Object)


596
597
598
599
600
# File 'app/services/basecamp/api_client.rb', line 596

def create_document(project_id, vault_id, title:, content:, status: nil)
  body = { title: title, content: content }
  body[:status] = status if status
  post("/buckets/#{project_id}/vaults/#{vault_id}/documents.json", body)
end

#create_message(project_id, message_board_id, subject:, status:, content: nil, category_id: nil, subscriptions: nil) ⇒ Object

Create message.

Parameters:

  • project_id (Object)
  • message_board_id (Object)
  • subject (Object)
  • status (Object)
  • content (Object, nil) (defaults to: nil)
  • category_id (Object, nil) (defaults to: nil)
  • subscriptions (Object, nil) (defaults to: nil)

Returns:

  • (Object)


312
313
314
315
316
317
318
# File 'app/services/basecamp/api_client.rb', line 312

def create_message(project_id, message_board_id, subject:, status:, content: nil, category_id: nil, subscriptions: nil)
  body = { subject: subject, status: status }
  body[:content] = content if content
  body[:category_id] = category_id if category_id
  body[:subscriptions] = subscriptions if subscriptions
  post("/buckets/#{project_id}/message_boards/#{message_board_id}/messages.json", body)
end

#create_project(name:, description: nil) ⇒ Object

Create project.

Parameters:

  • name (Object)
  • description (Object, nil) (defaults to: nil)

Returns:

  • (Object)


73
74
75
76
77
# File 'app/services/basecamp/api_client.rb', line 73

def create_project(name:, description: nil)
  body = { name: name }
  body[:description] = description if description
  post('/projects.json', body)
end

#create_todo(project_id, todolist_id, content:, description: nil, assignee_ids: nil, due_on: nil, starts_on: nil) ⇒ Object

Create todo.

Parameters:

  • project_id (Object)
  • todolist_id (Object)
  • content (Object)
  • description (Object, nil) (defaults to: nil)
  • assignee_ids (Object, nil) (defaults to: nil)
  • due_on (Object, nil) (defaults to: nil)
  • starts_on (Object, nil) (defaults to: nil)

Returns:

  • (Object)


191
192
193
194
195
196
197
198
# File 'app/services/basecamp/api_client.rb', line 191

def create_todo(project_id, todolist_id, content:, description: nil, assignee_ids: nil, due_on: nil, starts_on: nil)
  body = { content: content }
  body[:description] = description if description
  body[:assignee_ids] = assignee_ids if assignee_ids
  body[:due_on] = due_on if due_on
  body[:starts_on] = starts_on if starts_on
  post("/buckets/#{project_id}/todolists/#{todolist_id}/todos.json", body)
end

#create_todo_group(project_id, todolist_id, name:, color: nil) ⇒ Object

Create todo group.

Parameters:

  • project_id (Object)
  • todolist_id (Object)
  • name (Object)
  • color (Object, nil) (defaults to: nil)

Returns:

  • (Object)


258
259
260
261
262
# File 'app/services/basecamp/api_client.rb', line 258

def create_todo_group(project_id, todolist_id, name:, color: nil)
  body = { name: name }
  body[:color] = color if color
  post("/buckets/#{project_id}/todolists/#{todolist_id}/groups.json", body)
end

#create_todolist(project_id, todoset_id, name:, description: nil) ⇒ Object

Create todolist.

Parameters:

  • project_id (Object)
  • todoset_id (Object)
  • name (Object)
  • description (Object, nil) (defaults to: nil)

Returns:

  • (Object)


143
144
145
146
147
# File 'app/services/basecamp/api_client.rb', line 143

def create_todolist(project_id, todoset_id, name:, description: nil)
  body = { name: name }
  body[:description] = description if description
  post("/buckets/#{project_id}/todosets/#{todoset_id}/todolists.json", body)
end

#create_upload(project_id, vault_id, attachable_sgid:, description: nil, base_name: nil) ⇒ Object

Create upload.

Parameters:

  • project_id (Object)
  • vault_id (Object)
  • attachable_sgid (Object)
  • description (Object, nil) (defaults to: nil)
  • base_name (Object, nil) (defaults to: nil)

Returns:

  • (Object)


637
638
639
640
641
642
# File 'app/services/basecamp/api_client.rb', line 637

def create_upload(project_id, vault_id, attachable_sgid:, description: nil, base_name: nil)
  body = { attachable_sgid: attachable_sgid }
  body[:description] = description if description
  body[:base_name] = base_name if base_name
  post("/buckets/#{project_id}/vaults/#{vault_id}/uploads.json", body)
end

#document(project_id, document_id) ⇒ Object

Document.

Parameters:

  • project_id (Object)
  • document_id (Object)

Returns:

  • (Object)


585
586
587
# File 'app/services/basecamp/api_client.rb', line 585

def document(project_id, document_id)
  get("/buckets/#{project_id}/documents/#{document_id}.json")
end

#documents(project_id, vault_id) ⇒ Object

Documents.

Parameters:

  • project_id (Object)
  • vault_id (Object)

Returns:

  • (Object)


577
578
579
# File 'app/services/basecamp/api_client.rb', line 577

def documents(project_id, vault_id)
  get_paginated("/buckets/#{project_id}/vaults/#{vault_id}/documents.json")
end

#message(project_id, message_id) ⇒ Object

Message.

Parameters:

  • project_id (Object)
  • message_id (Object)

Returns:

  • (Object)


299
300
301
# File 'app/services/basecamp/api_client.rb', line 299

def message(project_id, message_id)
  get("/buckets/#{project_id}/messages/#{message_id}.json")
end

#message_board(project_id, message_board_id = nil) ⇒ Object

Message board.

Parameters:

  • project_id (Object)
  • message_board_id (Object, nil) (defaults to: nil)

Returns:

  • (Object)


279
280
281
282
283
284
285
# File 'app/services/basecamp/api_client.rb', line 279

def message_board(project_id, message_board_id = nil)
  if message_board_id
    get("/buckets/#{project_id}/message_boards/#{message_board_id}.json")
  else
    get("/buckets/#{project_id}/message_board.json")
  end
end

#messages(project_id, message_board_id) ⇒ Object

Messages.

Parameters:

  • project_id (Object)
  • message_board_id (Object)

Returns:

  • (Object)


291
292
293
# File 'app/services/basecamp/api_client.rb', line 291

def messages(project_id, message_board_id)
  get_paginated("/buckets/#{project_id}/message_boards/#{message_board_id}/messages.json")
end

#my_assignments(completed: false, group_by: 'bucket') ⇒ Object

Query tasks assigned to the current authenticated user.

For open assignments we use the reports endpoint, which returns pending to-dos
assigned to a person and matches Basecamp's assignment report behavior.
For completed assignments we fall back to /my/assignments.json.

Parameters:

  • completed (Boolean) (defaults to: false)
  • group_by (String) (defaults to: 'bucket')

Returns:

  • (Object)


523
524
525
526
527
528
# File 'app/services/basecamp/api_client.rb', line 523

def my_assignments(completed: false, group_by: 'bucket')
  return get_paginated('/my/assignments.json', params: { completed: true }) if completed

  person_id = my_profile['id']
  todo_assignments_for_person(person_id, group_by: group_by)
end

#my_profileObject

My profile.

Returns:

  • (Object)


567
568
569
# File 'app/services/basecamp/api_client.rb', line 567

def my_profile
  get('/my/profile.json')
end

#overdue_todosObject

Overdue todos.

Returns:

  • (Object)


547
548
549
# File 'app/services/basecamp/api_client.rb', line 547

def overdue_todos
  get('/reports/todos/overdue.json')
end

#peopleObject

--- People ---



399
400
401
# File 'app/services/basecamp/api_client.rb', line 399

def people
  get_paginated('/people.json')
end

#person(person_id) ⇒ Object

Person.

Parameters:

  • person_id (Object)

Returns:

  • (Object)


406
407
408
# File 'app/services/basecamp/api_client.rb', line 406

def person(person_id)
  get("/people/#{person_id}.json")
end

#pin_recording(project_id, recording_id) ⇒ Object

Pin recording.

Parameters:

  • project_id (Object)
  • recording_id (Object)

Returns:

  • (Object)


339
340
341
# File 'app/services/basecamp/api_client.rb', line 339

def pin_recording(project_id, recording_id)
  post("/buckets/#{project_id}/recordings/#{recording_id}/pin.json")
end

#pingable_peopleObject

Pingable people.

Returns:

  • (Object)


433
434
435
# File 'app/services/basecamp/api_client.rb', line 433

def pingable_people
  get('/circles/people.json')
end

#project(project_id) ⇒ Object

Project.

Parameters:

  • project_id (Object)

Returns:

  • (Object)


65
66
67
# File 'app/services/basecamp/api_client.rb', line 65

def project(project_id)
  get("/projects/#{project_id}.json")
end

#project_people(project_id) ⇒ Object

Project people.

Parameters:

  • project_id (Object)

Returns:

  • (Object)


413
414
415
# File 'app/services/basecamp/api_client.rb', line 413

def project_people(project_id)
  get_paginated("/projects/#{project_id}/people.json")
end

#projects(status: nil) ⇒ Object

List projects.

Parameters:

  • status (Object, nil) (defaults to: nil)

Returns:

  • (Object)


56
57
58
59
60
# File 'app/services/basecamp/api_client.rb', line 56

def projects(status: nil)
  params = {}
  params[:status] = status if status.present?
  get_paginated('/projects.json', params: params.presence)
end

#reposition_todo(project_id, todo_id, position:, parent_id: nil) ⇒ Object

Reposition todo.

Parameters:

  • project_id (Object)
  • todo_id (Object)
  • position (Object)
  • parent_id (Object, nil) (defaults to: nil)

Returns:

  • (Object)


219
220
221
222
223
# File 'app/services/basecamp/api_client.rb', line 219

def reposition_todo(project_id, todo_id, position:, parent_id: nil)
  body = { position: position }
  body[:parent_id] = parent_id if parent_id
  put("/buckets/#{project_id}/todos/#{todo_id}/position.json", body)
end

#reposition_todo_group(project_id, group_id, position:) ⇒ Object

Reposition todo group.

Parameters:

  • project_id (Object)
  • group_id (Object)
  • position (Object)

Returns:

  • (Object)


269
270
271
# File 'app/services/basecamp/api_client.rb', line 269

def reposition_todo_group(project_id, group_id, position:)
  put("/buckets/#{project_id}/todolists/groups/#{group_id}/position.json", { position: position })
end

#search(q:, type: nil, bucket_id: nil, creator_id: nil, file_type: nil, exclude_chat: nil, page: nil, per_page: nil, fetch_all: false) ⇒ Object

Search.

Parameters:

  • q (Object)
  • type (Object, nil) (defaults to: nil)
  • bucket_id (Object, nil) (defaults to: nil)
  • creator_id (Object, nil) (defaults to: nil)
  • file_type (Object, nil) (defaults to: nil)
  • exclude_chat (Object, nil) (defaults to: nil)
  • page (Object, nil) (defaults to: nil)
  • per_page (Object, nil) (defaults to: nil)
  • fetch_all (Boolean) (defaults to: false)

Returns:

  • (Object)


497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
# File 'app/services/basecamp/api_client.rb', line 497

def search(q:, type: nil, bucket_id: nil, creator_id: nil, file_type: nil, exclude_chat: nil, page: nil, per_page: nil, fetch_all: false)
  params = { q: q }
  params[:type] = type if type.present?
  params[:bucket_id] = bucket_id if bucket_id.present?
  params[:creator_id] = creator_id if creator_id.present?
  params[:file_type] = file_type if file_type.present?
  params[:exclude_chat] = exclude_chat unless exclude_chat.nil?
  params[:page] = page if page.present?
  params[:per_page] = per_page if per_page.present?
  if fetch_all
    get_paginated('/search.json', params: params)
  else
    get('/search.json', params: params)
  end
end

#search_metadataObject

--- Search ---



482
483
484
# File 'app/services/basecamp/api_client.rb', line 482

def 
  get('/searches/metadata.json')
end

#todo(project_id, todo_id) ⇒ Object

Todo.

Parameters:

  • project_id (Object)
  • todo_id (Object)

Returns:

  • (Object)


178
179
180
# File 'app/services/basecamp/api_client.rb', line 178

def todo(project_id, todo_id)
  get("/buckets/#{project_id}/todos/#{todo_id}.json")
end

#todo_assigneesObject

--- Reports ---



531
532
533
# File 'app/services/basecamp/api_client.rb', line 531

def todo_assignees
  get_paginated('/reports/todos/assigned.json')
end

#todo_assignments_for_person(person_id, group_by: 'bucket') ⇒ Object

Todo assignments for person.

Parameters:

  • person_id (Object)
  • group_by (String) (defaults to: 'bucket')

Returns:

  • (Object)


539
540
541
542
543
# File 'app/services/basecamp/api_client.rb', line 539

def todo_assignments_for_person(person_id, group_by: 'bucket')
  params = {}
  params[:group_by] = group_by if group_by.present?
  get("/reports/todos/assigned/#{person_id}.json", params: params.presence)
end

#todo_groups(project_id, todolist_id, status: nil) ⇒ Object

Todo groups.

Parameters:

  • project_id (Object)
  • todolist_id (Object)
  • status (Object, nil) (defaults to: nil)

Returns:

  • (Object)


246
247
248
249
250
# File 'app/services/basecamp/api_client.rb', line 246

def todo_groups(project_id, todolist_id, status: nil)
  params = {}
  params[:status] = status if status.present?
  get_paginated("/buckets/#{project_id}/todolists/#{todolist_id}/groups.json", params: params.presence)
end

#todolist(project_id, todolist_id) ⇒ Object

Todolist.

Parameters:

  • project_id (Object)
  • todolist_id (Object)

Returns:

  • (Object)


133
134
135
# File 'app/services/basecamp/api_client.rb', line 133

def todolist(project_id, todolist_id)
  get("/buckets/#{project_id}/todolists/#{todolist_id}.json")
end

#todolists(project_id) ⇒ Object

Todolists.

Parameters:

  • project_id (Object)

Returns:

  • (Object)


114
115
116
# File 'app/services/basecamp/api_client.rb', line 114

def todolists(project_id)
  get_paginated("/buckets/#{project_id}/todolists.json")
end

#todolists_in_set(project_id, todoset_id, status: nil) ⇒ Object

Todolists in set.

Parameters:

  • project_id (Object)
  • todoset_id (Object)
  • status (Object, nil) (defaults to: nil)

Returns:

  • (Object)


123
124
125
126
127
# File 'app/services/basecamp/api_client.rb', line 123

def todolists_in_set(project_id, todoset_id, status: nil)
  params = {}
  params[:status] = status if status.present?
  get_paginated("/buckets/#{project_id}/todosets/#{todoset_id}/todolists.json", params: params.presence)
end

#todos(project_id, todolist_id, status: nil, completed: nil) ⇒ Object

Todos.

Parameters:

  • project_id (Object)
  • todolist_id (Object)
  • status (Object, nil) (defaults to: nil)
  • completed (Object, nil) (defaults to: nil)

Returns:

  • (Object)


167
168
169
170
171
172
# File 'app/services/basecamp/api_client.rb', line 167

def todos(project_id, todolist_id, status: nil, completed: nil)
  params = {}
  params[:status] = status if status.present?
  params[:completed] = completed unless completed.nil?
  get_paginated("/buckets/#{project_id}/todolists/#{todolist_id}/todos.json", params: params.presence)
end

#todoset(project_id, todoset_id) ⇒ Object

Todoset.

Parameters:

  • project_id (Object)
  • todoset_id (Object)

Returns:

  • (Object)


107
108
109
# File 'app/services/basecamp/api_client.rb', line 107

def todoset(project_id, todoset_id)
  get("/buckets/#{project_id}/todosets/#{todoset_id}.json")
end

#trash_project(project_id) ⇒ Object

Trash project.

Parameters:

  • project_id (Object)

Returns:

  • (Object)


97
98
99
# File 'app/services/basecamp/api_client.rb', line 97

def trash_project(project_id)
  delete("/projects/#{project_id}.json")
end

#trash_recording(project_id, recording_id) ⇒ Object

Trash recording.

Parameters:

  • project_id (Object)
  • recording_id (Object)

Returns:

  • (Object)


477
478
479
# File 'app/services/basecamp/api_client.rb', line 477

def trash_recording(project_id, recording_id)
  post("/buckets/#{project_id}/recordings/#{recording_id}/status/trashed.json")
end

#uncomplete_todo(project_id, todo_id) ⇒ Object

Uncomplete todo.

Parameters:

  • project_id (Object)
  • todo_id (Object)

Returns:

  • (Object)


237
238
239
# File 'app/services/basecamp/api_client.rb', line 237

def uncomplete_todo(project_id, todo_id)
  delete("/buckets/#{project_id}/todos/#{todo_id}/completion.json")
end

#unpin_recording(project_id, recording_id) ⇒ Object

Unpin recording.

Parameters:

  • project_id (Object)
  • recording_id (Object)

Returns:

  • (Object)


347
348
349
# File 'app/services/basecamp/api_client.rb', line 347

def unpin_recording(project_id, recording_id)
  delete("/buckets/#{project_id}/recordings/#{recording_id}/pin.json")
end

#upcoming_schedule(window_starts_on:, window_ends_on:) ⇒ Object

Upcoming schedule.

Parameters:

  • window_starts_on (Object)
  • window_ends_on (Object)

Returns:

  • (Object)


555
556
557
558
559
560
561
562
563
# File 'app/services/basecamp/api_client.rb', line 555

def upcoming_schedule(window_starts_on:, window_ends_on:)
  get(
    '/reports/schedules/upcoming.json',
    params: {
      window_starts_on: window_starts_on,
      window_ends_on: window_ends_on
    }
  )
end

#update_comment(project_id, comment_id, content:) ⇒ Object

Update comment.

Parameters:

  • project_id (Object)
  • comment_id (Object)
  • content (Object)

Returns:

  • (Object)


469
470
471
# File 'app/services/basecamp/api_client.rb', line 469

def update_comment(project_id, comment_id, content:)
  put("/buckets/#{project_id}/comments/#{comment_id}.json", { content: content })
end

#update_document(project_id, document_id, title:, content:) ⇒ Object

Update document.

Parameters:

  • project_id (Object)
  • document_id (Object)
  • title (Object)
  • content (Object)

Returns:

  • (Object)


608
609
610
# File 'app/services/basecamp/api_client.rb', line 608

def update_document(project_id, document_id, title:, content:)
  put("/buckets/#{project_id}/documents/#{document_id}.json", { title: title, content: content })
end

#update_message(project_id, message_id, subject: nil, content: nil, category_id: nil) ⇒ Object

Update message.

Parameters:

  • project_id (Object)
  • message_id (Object)
  • subject (Object, nil) (defaults to: nil)
  • content (Object, nil) (defaults to: nil)
  • category_id (Object, nil) (defaults to: nil)

Returns:

  • (Object)


327
328
329
330
331
332
333
# File 'app/services/basecamp/api_client.rb', line 327

def update_message(project_id, message_id, subject: nil, content: nil, category_id: nil)
  body = {}
  body[:subject] = subject if subject
  body[:content] = content if content
  body[:category_id] = category_id if category_id
  put("/buckets/#{project_id}/messages/#{message_id}.json", body)
end

#update_project(project_id, name:, description: nil, admissions: nil, schedule_attributes: nil) ⇒ Object

Update project.

Parameters:

  • project_id (Object)
  • name (Object)
  • description (Object, nil) (defaults to: nil)
  • admissions (Object, nil) (defaults to: nil)
  • schedule_attributes (Object, nil) (defaults to: nil)

Returns:

  • (Object)


86
87
88
89
90
91
92
# File 'app/services/basecamp/api_client.rb', line 86

def update_project(project_id, name:, description: nil, admissions: nil, schedule_attributes: nil)
  body = { name: name }
  body[:description] = description if description
  body[:admissions] = admissions if admissions
  body[:schedule_attributes] = schedule_attributes if schedule_attributes
  put("/projects/#{project_id}.json", body)
end

#update_project_people(project_id, grant: nil, revoke: nil, create: nil) ⇒ Object

Update project people.

Parameters:

  • project_id (Object)
  • grant (Object, nil) (defaults to: nil)
  • revoke (Object, nil) (defaults to: nil)
  • create (Object, nil) (defaults to: nil)

Returns:

  • (Object)


423
424
425
426
427
428
429
# File 'app/services/basecamp/api_client.rb', line 423

def update_project_people(project_id, grant: nil, revoke: nil, create: nil)
  body = {}
  body[:grant] = grant if grant.present?
  body[:revoke] = revoke if revoke.present?
  body[:create] = create if create.present?
  put("/projects/#{project_id}/people/users.json", body)
end

#update_todo(project_id, todo_id, **attrs) ⇒ Object

Parameters:

  • project_id (Integer)

    Basecamp project (bucket) id

  • todo_id (Integer)

    todo id

  • attrs (Hash)

    todo attributes to update (passed through to the Basecamp API)

Options Hash (**attrs):

  • content (String)

    todo title

  • description (String)

    todo description

  • assignee_ids (Array<Integer>)

    assignee person ids

  • due_on (String)

    due date (ISO 8601)

  • starts_on (String)

    start date (ISO 8601)

  • completed (Boolean)

    completion flag



209
210
211
# File 'app/services/basecamp/api_client.rb', line 209

def update_todo(project_id, todo_id, **attrs)
  put("/buckets/#{project_id}/todos/#{todo_id}.json", attrs.compact)
end

#update_todolist(project_id, todolist_id, name:, description: nil) ⇒ Object

Update todolist.

Parameters:

  • project_id (Object)
  • todolist_id (Object)
  • name (Object)
  • description (Object, nil) (defaults to: nil)

Returns:

  • (Object)


155
156
157
158
159
# File 'app/services/basecamp/api_client.rb', line 155

def update_todolist(project_id, todolist_id, name:, description: nil)
  body = { name: name }
  body[:description] = description if description
  put("/buckets/#{project_id}/todolists/#{todolist_id}.json", body)
end

#update_upload(project_id, upload_id, description: nil, base_name: nil) ⇒ Object

Update upload.

Parameters:

  • project_id (Object)
  • upload_id (Object)
  • description (Object, nil) (defaults to: nil)
  • base_name (Object, nil) (defaults to: nil)

Returns:

  • (Object)


650
651
652
653
654
655
# File 'app/services/basecamp/api_client.rb', line 650

def update_upload(project_id, upload_id, description: nil, base_name: nil)
  body = {}
  body[:description] = description if description
  body[:base_name] = base_name if base_name
  put("/buckets/#{project_id}/uploads/#{upload_id}.json", body)
end

#upload(project_id, upload_id) ⇒ Object

Upload.

Parameters:

  • project_id (Object)
  • upload_id (Object)

Returns:

  • (Object)


626
627
628
# File 'app/services/basecamp/api_client.rb', line 626

def upload(project_id, upload_id)
  get("/buckets/#{project_id}/uploads/#{upload_id}.json")
end

#uploads(project_id, vault_id) ⇒ Object

Uploads.

Parameters:

  • project_id (Object)
  • vault_id (Object)

Returns:

  • (Object)


618
619
620
# File 'app/services/basecamp/api_client.rb', line 618

def uploads(project_id, vault_id)
  get_paginated("/buckets/#{project_id}/vaults/#{vault_id}/uploads.json")
end