class NotionAPI::BlockTemplate

Base Template for all blocks. Inherits core methods from the Block class defined in block.rb

Attributes

id[R]
parent_id[R]
title[R]

Public Class Methods

new(id, title, parent_id) click to toggle source
# File lib/notion_api/notion_types/template.rb, line 11
def initialize(id, title, parent_id)
  @id = id
  @title = title
  @parent_id = parent_id
end

Private Class Methods

create(block_id, new_block_id, block_title, target, position_command, request_ids, options) click to toggle source
# File lib/notion_api/notion_types/template.rb, line 238
def self.create(block_id, new_block_id, block_title, target, position_command, request_ids, options)
  blocks_with_emojis = [NotionAPI::PageBlock, NotionAPI::CalloutBlock]
  cookies = Core.options["cookies"]
  headers = Core.options["headers"]

  create_hash = Utils::BlockComponents.create(new_block_id, self.notion_type)
  set_parent_alive_hash = Utils::BlockComponents.set_parent_to_alive(block_id, new_block_id)
  block_location_hash = Utils::BlockComponents.block_location_add(block_id, block_id, new_block_id, target, position_command)
  last_edited_time_parent_hash = Utils::BlockComponents.last_edited_time(block_id)
  last_edited_time_child_hash = Utils::BlockComponents.last_edited_time(block_id)
  title_hash = Utils::BlockComponents.title(new_block_id, block_title)

  operations = [
    create_hash,
    set_parent_alive_hash,
    block_location_hash,
    last_edited_time_parent_hash,
    last_edited_time_child_hash,
    title_hash,
  ]

  if blocks_with_emojis.include?(self)
    emoji_choices = ["😀", "😃", "😄", "😁", "😆", "😅", "🤣", "😂", "🙂", "🙃", "😉", "😊", "😇", "🥰", "😍", "😀", "😃"]
    emoji = emoji_choices[rand(0...emoji_choices.length)]
    emoji_icon_hash = Utils::BlockComponents.add_emoji_icon(new_block_id, emoji)
    operations.push(emoji_icon_hash)
  end

  request_url = URLS[:UPDATE_BLOCK]
  request_body = Utils::BlockComponents.build_payload(operations, request_ids)
  response = HTTParty.post(
    request_url,
    body: request_body.to_json,
    cookies: cookies,
    headers: headers,
  )
  unless response.code == 200; raise "There was an issue completing your request. Here is the response from Notion: #{response.body}, and here is the payload that was sent: #{operations}.
       Please try again, and if issues persist open an issue in GitHub.";       end

  self.new(new_block_id, block_title, block_id)
end

Public Instance Methods

convert(block_class_to_convert_to) click to toggle source
# File lib/notion_api/notion_types/template.rb, line 27
def convert(block_class_to_convert_to)
  # ! convert a block from its current type to another.
  # ! block_class_to_convert_to -> the type of block to convert to : ``cls``
  if type == block_class_to_convert_to.notion_type
    # if converting to same type, skip and return self
    self
  else
    # setup cookies, headers, and grab/create static vars for request
    cookies = Core.options["cookies"]
    headers = Core.options["headers"]
    request_url = URLS[:UPDATE_BLOCK]

    # set random IDs for request
    request_id = extract_id(SecureRandom.hex(16))
    transaction_id = extract_id(SecureRandom.hex(16))
    space_id = extract_id(SecureRandom.hex(16))
    request_ids = {
      request_id: request_id,
      transaction_id: transaction_id,
      space_id: space_id,
    }

    # build hash's that contain the operations to send to Notion
    convert_type_hash = Utils::BlockComponents.convert_type(@id, block_class_to_convert_to)
    last_edited_time_parent_hash = Utils::BlockComponents.last_edited_time(@parent_id)
    last_edited_time_child_hash = Utils::BlockComponents.last_edited_time(@id)

    operations = [
      convert_type_hash,
      last_edited_time_parent_hash,
      last_edited_time_child_hash,
    ]

    request_body = build_payload(operations, request_ids)
    response = HTTParty.post(
      request_url,
      body: request_body.to_json,
      cookies: cookies,
      headers: headers,
    )
    unless response.code == 200; raise "There was an issue completing your request. Here is the response from Notion: #{response.body}, and here is the payload that was sent: #{operations}.
         Please try again, and if issues persist open an issue in GitHub.";         end

    block_class_to_convert_to.new(@id, @title, @parent_id)
  end
end
create(block_type, block_title, target = nil, position = "after", options: {}) click to toggle source
# File lib/notion_api/notion_types/template.rb, line 207
def create(block_type, block_title, target = nil, position = "after", options: {})
  # ! create a new block
  # ! block_type -> the type of block to create : ``cls``
  # ! block_title -> the title of the new block : ``str``
  # ! target -> the block_id that the new block should be placed after. ``str``
  # ! position -> 'after' or 'before'

  positions_hash = {
    "after" => "listAfter",
    "before" => "listBefore",
  }
  unless positions_hash.keys.include?(position); raise "Invalid position. You said: #{position}, valid options are: #{positions_hash.keys.join(", ")}"; end

  position_command = positions_hash[position]

  new_block_id = extract_id(SecureRandom.hex(16))
  request_id = extract_id(SecureRandom.hex(16))
  transaction_id = extract_id(SecureRandom.hex(16))
  space_id = extract_id(SecureRandom.hex(16))

  request_ids = {
    request_id: request_id,
    transaction_id: transaction_id,
    space_id: space_id,
  }

  block_type.create(@id, new_block_id, block_title, target, position_command, request_ids, options)
end
duplicate(target_block = nil) click to toggle source
# File lib/notion_api/notion_types/template.rb, line 74
def duplicate(target_block = nil)
  # ! duplicate the block that this method is invoked upon.
  # ! target_block -> the block to place the duplicated block after. Can be any valid Block ID! : ``str``
  cookies = Core.options["cookies"]
  headers = Core.options["headers"]
  request_url = URLS[:UPDATE_BLOCK]

  new_block_id = extract_id(SecureRandom.hex(16))
  request_id = extract_id(SecureRandom.hex(16))
  transaction_id = extract_id(SecureRandom.hex(16))
  space_id = extract_id(SecureRandom.hex(16))

  root_children = children_ids(@id)
  sub_children = []
  root_children.each { |root_id| sub_children.push(children_ids(root_id)) }

  request_ids = {
    request_id: request_id,
    transaction_id: transaction_id,
    space_id: space_id,
  }
  body = {
    pageId: @id,
    chunkNumber: 0,
    limit: 100,
    verticalColumns: false,
  }

  user_notion_id = get_notion_id(body)

  block = target_block ? get(target_block) : self # allows dev to place block anywhere!

  props_and_formatting = get_block_props_and_format(@id, @title)
  props = props_and_formatting[:properties]
  formats = props_and_formatting[:format]
  duplicate_hash = Utils::BlockComponents.duplicate(type, @title, block.id, new_block_id, user_notion_id, root_children, props, formats)
  set_parent_alive_hash = Utils::BlockComponents.set_parent_to_alive(block.parent_id, new_block_id)
  block_location_hash = Utils::BlockComponents.block_location_add(block.parent_id, block.id, new_block_id, target_block, "listAfter")
  last_edited_time_parent_hash = Utils::BlockComponents.last_edited_time(block.parent_id)
  last_edited_time_child_hash = Utils::BlockComponents.last_edited_time(block.id)

  operations = [
    duplicate_hash,
    set_parent_alive_hash,
    block_location_hash,
    last_edited_time_parent_hash,
    last_edited_time_child_hash,
  ]

  request_body = build_payload(operations, request_ids)
  response = HTTParty.post(
    request_url,
    body: request_body.to_json,
    cookies: cookies,
    headers: headers,
  )
  unless response.code == 200; raise "There was an issue completing your request. Here is the response from Notion: #{response.body}, and here is the payload that was sent: #{operations}.
       Please try again, and if issues persist open an issue in GitHub.";       end

  class_to_return = NotionAPI.const_get(Classes.select { |cls| NotionAPI.const_get(cls).notion_type == type }.join.to_s)
  class_to_return.new(new_block_id, @title, block.parent_id)
end
move(target_block, position = "after") click to toggle source
# File lib/notion_api/notion_types/template.rb, line 137
def move(target_block, position = "after")
  # ! move the block to a new location.
  # ! target_block -> the targetted block to move to. : ``str``
  # ! position -> where the block should be listed, in positions relative to the target_block [before, after, top-child, last-child]
  positions_hash = {
    "after" => "listAfter",
    "before" => "listBefore",
  }

  unless positions_hash.keys.include?(position); raise ArgumentError, "Invalid position. You said: #{position}, valid options are: #{positions_hash.keys.join(", ")}"; end

  position_command = positions_hash[position]
  cookies = Core.options["cookies"]
  headers = Core.options["headers"]
  request_url = URLS[:UPDATE_BLOCK]

  request_id = extract_id(SecureRandom.hex(16))
  transaction_id = extract_id(SecureRandom.hex(16))
  space_id = extract_id(SecureRandom.hex(16))

  request_ids = {
    request_id: request_id,
    transaction_id: transaction_id,
    space_id: space_id,
  }

  is_same_parent = (@parent_id == target_block.parent_id)
  set_block_dead_hash = Utils::BlockComponents.set_block_to_dead(@id) # kill the block this method is invoked on...
  block_location_remove_hash = Utils::BlockComponents.block_location_remove(@parent_id, @id) # remove the block this method is invoked on...
  parent_location_hash = Utils::BlockComponents.parent_location_add(is_same_parent ? @parent_id : target_block.parent_id, @id) # set parent location to alive
  block_location_add_hash = Utils::BlockComponents.block_location_add(is_same_parent ? @parent_id : target_block.parent_id, @id, target_block.id, position_command)
  last_edited_time_parent_hash = Utils::BlockComponents.last_edited_time(@parent_id)

  if is_same_parent
    last_edited_time_child_hash = Utils::BlockComponents.last_edited_time(@id)
    operations = [
      set_block_dead_hash,
      block_location_remove_hash,
      parent_location_hash,
      block_location_add_hash,
      last_edited_time_parent_hash,
      last_edited_time_child_hash,
    ]
  else
    last_edited_time_new_parent_hash = Utils::BlockComponents.last_edited_time(target_block.parent_id)
    last_edited_time_child_hash = Utils::BlockComponents.last_edited_time(@id)
    @parent_id = target_block.parent_id
    operations = [
      set_block_dead_hash,
      block_location_remove_hash,
      parent_location_hash,
      block_location_add_hash,
      last_edited_time_parent_hash,
      last_edited_time_new_parent_hash,
      last_edited_time_child_hash,
    ]
  end
  request_body = build_payload(operations, request_ids)
  response = HTTParty.post(
    request_url,
    body: request_body.to_json,
    cookies: cookies,
    headers: headers,
  )
  unless response.code == 200; raise "There was an issue completing your request. Here is the response from Notion: #{response.body}, and here is the payload that was sent: #{operations}.
       Please try again, and if issues persist open an issue in GitHub.";       end

  self
end
title=(new_title) click to toggle source
# File lib/notion_api/notion_types/template.rb, line 17
def title=(new_title)
  # ! Change the title of a block.
  # ! new_title -> new title for the block : ``str``
  request_id = extract_id(SecureRandom.hex(16))
  transaction_id = extract_id(SecureRandom.hex(16))
  space_id = extract_id(SecureRandom.hex(16))
  update_title(new_title.to_s, request_id, transaction_id, space_id)
  @title = new_title
end

Private Instance Methods

get(url_or_id) click to toggle source
# File lib/notion_api/notion_types/template.rb, line 280
def get(url_or_id)
  # ! retrieve a Notion Block and return its instantiated class object.
  # ! url_or_id -> the block ID or URL : ``str``
  clean_id = extract_id(url_or_id)

  request_body = {
    pageId: clean_id,
    chunkNumber: 0,
    limit: 100,
    verticalColumns: false,
  }
  jsonified_record_response = get_all_block_info(request_body)

  block_type = extract_type(clean_id, jsonified_record_response)
  block_parent_id = extract_parent_id(clean_id, jsonified_record_response)

  if block_type.nil?
    {}
  else
    block_class = NotionAPI.const_get(BLOCK_TYPES[block_type].to_s)
    if [NotionAPI::CollectionView, NotionAPI::CollectionViewPage].include?(block_class)
      block_collection_id = extract_collection_id(clean_id, jsonified_record_response)
      block_view_id = extract_view_ids(clean_id, jsonified_record_response)
      collection_title = extract_collection_title(clean_id, block_collection_id, jsonified_record_response)

      block = block_class.new(clean_id, collection_title, block_parent_id, block_collection_id, block_view_id.join)
      schema = extract_collection_schema(block_collection_id, block_view_id[0])
      column_mappings = schema.keys
      column_names = column_mappings.map { |mapping| schema[mapping]["name"] }
      block.instance_variable_set(:@column_names, column_names)
      CollectionView.class_eval { attr_reader :column_names }

      block
    else
      block_title = extract_title(clean_id, jsonified_record_response)
      block_class.new(clean_id, block_title, block_parent_id)
    end
  end
end
update_title(new_title, request_id, transaction_id, space_id) click to toggle source
# File lib/notion_api/notion_types/template.rb, line 320
def update_title(new_title, request_id, transaction_id, space_id)
  # ! Helper method for sending POST request to change title of block.
  # ! new_title -> new title for the block : ``str``
  # ! request_id -> the unique ID for the request key. Generated using SecureRandom : ``str``
  # ! transaction_id -> the unique ID for the transaction key. Generated using SecureRandom: ``str``
  # ! transaction_id -> the unique ID for the space key. Generated using SecureRandom: ``str``
  # setup cookies, headers, and grab/create static vars for request
  cookies = Core.options["cookies"]
  headers = Core.options["headers"]
  request_url = URLS[:UPDATE_BLOCK]

  # set unique IDs for request
  request_ids = {
    request_id: request_id,
    transaction_id: transaction_id,
    space_id: space_id,
  }

  # build and set operations to send to Notion
  title_hash = Utils::BlockComponents.title(@id, new_title)
  last_edited_time_child_hash = Utils::BlockComponents.last_edited_time(@id)
  operations = [
    title_hash,
    last_edited_time_child_hash,
  ]

  request_body = build_payload(operations, request_ids) # defined in utils.rb

  response = HTTParty.post(
    request_url,
    body: request_body.to_json,
    cookies: cookies,
    headers: headers,
  )
  response.body
end