Class: Attio::Task

Inherits:
APIResource show all
Defined in:
lib/attio/resources/task.rb

Overview

Represents a task in Attio

Constant Summary

Constants inherited from APIResource

APIResource::SKIP_KEYS

Instance Attribute Summary

Attributes inherited from APIResource

#created_at, #id, #metadata

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from APIResource

#==, #[], #[]=, api_operations, attr_attio, #changed, #changed?, #changed_attributes, #changes, #each, execute_request, #fetch, #hash, id_param_name, #initialize, #inspect, #key?, #keys, #persisted?, prepare_params_for_create, prepare_params_for_update, #reset_changes!, resource_name, #revert!, #to_h, #to_json, #update_attributes, #update_from, validate_id!, #values

Constructor Details

This class inherits a constructor from Attio::APIResource

Class Method Details

.create(content: nil, format: "plaintext", **params) ⇒ Object

Override create to handle required content parameter

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/attio/resources/task.rb', line 32

def self.create(content: nil, format: "plaintext", **params)
  raise ArgumentError, "Content is required" if content.nil? || content.to_s.empty?

  request_params = {
    data: {
      content: content,  # API expects 'content'
      format: format,    # Format is required
      is_completed: params[:is_completed] || false,
      linked_records: params[:linked_records] || [],
      assignees: params[:assignees] || []
    }
  }

  # deadline_at must be present (null or valid date)
  request_params[:data][:deadline_at] = params[:deadline_at]

  # Remove the params that we've already included in request_params
  opts = params.except(:content, :format, :deadline_at, :is_completed, :linked_records, :assignees)

  response = execute_request(:POST, resource_path, request_params, opts)
  new(response["data"] || response, opts)
end

.list(**params) ⇒ Object Also known as: all

Custom list implementation to handle query params properly



18
19
20
21
22
23
24
25
# File 'lib/attio/resources/task.rb', line 18

def self.list(**params)
  # Query params should be part of the request, not opts
  query_params = params.slice(:limit, :offset, :sort, :linked_object, :linked_record_id, :assignee, :is_completed)
  opts = params.except(:limit, :offset, :sort, :linked_object, :linked_record_id, :assignee, :is_completed)

  response = execute_request(:GET, resource_path, query_params, opts)
  ListObject.new(response, self, params, opts)
end

.resource_pathString

API endpoint path for tasks

Returns:

  • (String)

    The API path



13
14
15
# File 'lib/attio/resources/task.rb', line 13

def self.resource_path
  "tasks"
end

.update(id, **params) ⇒ Object

Override update to use PATCH with data wrapper



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/attio/resources/task.rb', line 56

def self.update(id, **params)
  validate_id!(id)

  request_params = {
    data: params.slice(:content, :format, :deadline_at, :is_completed, :linked_records, :assignees).compact
  }

  # Remove the params that we've already included in request_params
  opts = params.except(:content, :format, :deadline_at, :is_completed, :linked_records, :assignees)

  response = execute_request(:PATCH, "#{resource_path}/#{id}", request_params, opts)
  new(response["data"] || response, opts)
end

Instance Method Details

#complete!(**opts) ⇒ Object

Convenience method to mark task as completed



89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/attio/resources/task.rb', line 89

def complete!(**opts)
  raise InvalidRequestError, "Cannot complete a task without an ID" unless persisted?

  params = {
    data: {
      is_completed: true
    }
  }

  response = self.class.send(:execute_request, :PATCH, resource_path, params, opts)
  update_from(response["data"] || response)
  self
end

#deadline_atObject

Parse deadline_at as Time



74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/attio/resources/task.rb', line 74

def deadline_at
  value = @attributes[:deadline_at]
  return nil if value.nil?

  case value
  when Time
    value
  when String
    Time.parse(value)
  else
    value
  end
end

#destroy(**opts) ⇒ Object

Override destroy to use the correct task ID



120
121
122
123
124
125
126
127
128
129
# File 'lib/attio/resources/task.rb', line 120

def destroy(**opts)
  raise InvalidRequestError, "Cannot destroy a task without an ID" unless persisted?

  task_id = extract_task_id
  self.class.send(:execute_request, :DELETE, "#{self.class.resource_path}/#{task_id}", {}, opts)
  @attributes.clear
  @changed_attributes.clear
  @id = nil
  true
end

#save(**opts) ⇒ Object

Override save to handle task-specific attributes



104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/attio/resources/task.rb', line 104

def save(**opts)
  raise InvalidRequestError, "Cannot save a task without an ID" unless persisted?

  params = {
    data: changed_attributes.slice(:content, :deadline_at, :is_completed, :linked_records, :assignees).compact
  }

  return self unless params[:data].any?

  response = self.class.send(:execute_request, :PATCH, resource_path, params, opts)
  update_from(response["data"] || response)
  reset_changes!
  self
end