module Api::Controllers::Base

def apply_pagination

def apply_pagination
  collection = instance_variable_get collection_variable
  @pagy, collection = pagy_cursor collection, after: params[:after], order: {id: :asc}
  instance_variable_set collection_variable, collection
end

def collection_variable

def collection_variable
  @collection_variable ||= "@#{self.class.name.split("::").last.gsub("Controller", "").underscore}"
end

def controller_namespace

def controller_namespace
  name.split("::").first(2).join("::")
end

def current_membership

def current_membership
  current_user.memberships.where(team: current_team).first
end

def current_team

def current_team
  # Application agents are users but only have one team.
  current_user&.teams&.first
end

def current_user

def current_user
  @current_user ||= if doorkeeper_token
    User.find_by(id: doorkeeper_token[:resource_owner_id])
  else
    warden.authenticate(scope: :user)
  end
  # TODO Remove this rescue once workspace clusters can write to this column on the identity server.
  if doorkeeper_token
    begin
      doorkeeper_token.update(last_used_at: Time.zone.now)
    rescue ActiveRecord::StatementInvalid => _
    end
  end
  raise NotAuthenticatedError unless @current_user
  @current_user
end

def modify_url_params(url, new_params)

def modify_url_params(url, new_params)
  uri = URI.parse(url)
  query = Rack::Utils.parse_query(uri.query)
  new_params.each do |key, value|
    query[key.to_s] = value
  end
  uri.query = Rack::Utils.build_query(query)
  uri.to_s
end

def permitted_arrays

def permitted_arrays
  {}
end

def permitted_fields

def permitted_fields
  []
end

def process_params(strong_params)

def process_params(strong_params)
end

def regex_to_remove_controller_namespace

def regex_to_remove_controller_namespace
  /^#{controller_namespace + "::"}/
end

def set_default_response_format

def set_default_response_format
  request.format = :json
end

def set_pagination_headers

def set_pagination_headers
  return unless @pagy
  if @pagy.has_more?
    if (collection = instance_variable_get(collection_variable))
      next_cursor = collection.last.id
      link_header = response.headers["Link"]
      link_value = "<#{modify_url_params(request.url, after: next_cursor)}>; rel=\"next\""
      response.headers["Link"] = link_header ? "#{link_header}, #{link_value}" : link_value
      response.headers["Pagination-Next"] = next_cursor
    end
  end
end