class WolfCore::NoSqlDbInstanceDataSource

def self.init(region: "us-east-1")

def self.init(region: "us-east-1")
  return @instance if @instance
  dynamodb_client = Aws::DynamoDB::Client.new(region: region)
  @instance = new(client: dynamodb_client)
end

def get_item(table_name:, key:)

def get_item(table_name:, key:)
  Result.try do
    get_params = {
      table_name: table_name,
      key: key
    }
    item = @client.get_item(get_params).item
    Result.success(data: { item: item })
  end
end

def get_item_by_index(table_name:, key_condition_expression:, expression_attribute_values:, index_name: nil)

def get_item_by_index(table_name:, key_condition_expression:, expression_attribute_values:, index_name: nil)
  Result.try do
    query(
      table_name: table_name,
      key_condition_expression: key_condition_expression,
      expression_attribute_values: expression_attribute_values,
      index_name: index_name,
      limit: 1
    ).fold do |data|
      items = data.items
      Result.success(data: { item: items.first })
    end
  end
end

def initialize(client:)

def initialize(client:)
  @client = client
end

def put_item(table_name:, item:)

def put_item(table_name:, item:)
  Result.try do
    response = @client.put_item({
                                  table_name: table_name,
                                  item: item
                                })
    Result.success(data: { response: response })
  end
end

def query(table_name:, key_condition_expression:, expression_attribute_values:, index_name: nil, limit: nil)

def query(table_name:, key_condition_expression:, expression_attribute_values:, index_name: nil, limit: nil)
  Result.try do
    query_params = {
      table_name: table_name,
      key_condition_expression: key_condition_expression,
      expression_attribute_values: expression_attribute_values
    }
    query_params[:index_name] = index_name if index_name
    query_params[:limit] = limit if limit
    items = @client.query(query_params).items
    Result.success(data: { items: items })
  end
end