lib/sklik-api/campaign_parts/keyword.rb in sklik-api-0.0.16 vs lib/sklik-api/campaign_parts/keyword.rb in sklik-api-0.1.0

- old
+ new

@@ -2,56 +2,113 @@ class SklikApi class Keyword NAME = "keyword" - include Object + ADDITIONAL_FIELDS = [ + :cpc, :url + ] + ADDITIONAL_READ_FIELDS = [ + :disabled, :cpc, :url, :minCpc + ] + + include SklikObject =begin Example of input hash { :keyword => "\"some funny keyword\"" } =end - - def initialize adgroup, args + + def initialize args, deprecated_args = {} + + #deprecated way to set up new adgroup! + if args.is_a?(SklikApi::Adgroup) + puts "DEPRECATION WARNING: Please update your code for SklikApi::Keyword.new(adgroup, args) to SklikApi::Keyword.new(args = {}) possible to add parent adgroup by adding :adgroup => your adgroup" + #set adgroup owner campaign + @adgroup = args + args = deprecated_args + + #new way to set adgroups! + else + #set adgroup owner campaign + #if in input args there is pointer to parent campaign! + @adgroup = args.delete(:adgroup) + end + @args = args + @keyword_data = nil - #set keyword owner adgroup - @adgroup = adgroup super args end - + def create_args - raise ArgumentError, "Keyword need's to know adgroup_id" unless @adgroup.args[:adgroup_id] + raise ArgumentError, "Keyword need's to know adgroup_id" unless @args[:adgroup_id] || @adgroup.args[:adgroup_id] out = [] #add campaign id to know where to create adgroup - out << @adgroup.args[:adgroup_id] - + out << @args[:adgroup_id] || @adgroup.args[:adgroup_id] + #add adtext struct - args = {} - args[:name] = strip_match_type @args[:keyword] - args[:matchType] = get_math_type @args[:keyword] - out << args - + c_args = {} + c_args[:name] = strip_match_type @args[:keyword] + c_args[:matchType] = get_math_type @args[:keyword] + #Currently not working :( + c_args[:status] = status_for_update if status_for_update + + ADDITIONAL_FIELDS.each do |add_info| + field_name = add_info.to_s.underscore.to_sym + c_args[add_info] = @args[field_name] if @args[field_name] + end + + if @args[:cpc] + c_args[:cpc] = (@args[:cpc] * 100).to_i + end + + + out << c_args + #return output out end - + + def update_args + out = [] + + #add campaign id on which will be performed update + out << @args[:keyword_id] + + #prepare campaign struct + u_args = {} + u_args[:status] = status_for_update if status_for_update + + ADDITIONAL_FIELDS.each do |add_info| + field_name = add_info.to_s.underscore.to_sym + u_args[add_info] = @args[field_name] if @args[field_name] + end + if @args[:cpc] + u_args[:cpc] = (@args[:cpc] * 100).to_i + end + out << u_args + + #return output + out + end + def strip_match_type keyword keyword.gsub(/(\[|\]|\")/, "").gsub(/^-/, "") end - + def get_math_type keyword - if /^-\[.*\]$/ =~ keyword + if /^-\[.*\]$/ =~ keyword return "negativeExact" - elsif /^\[.*\]$/ =~ keyword + elsif /^\[.*\]$/ =~ keyword return "exact" - elsif /^-\".*\"$/ =~ keyword + elsif /^-\".*\"$/ =~ keyword return "negativePhrase" - elsif /^\".*\"$/ =~ keyword + elsif /^\".*\"$/ =~ keyword return "phrase" - elsif /^-.*$/ =~ keyword + elsif /^-.*$/ =~ keyword return "negativeBroad" else return "broad" end end @@ -65,26 +122,70 @@ when "negativePhrase" then "-\"#{keyword}\"" when "negativeExact" then "-[#{keyword}]" else keyword end end - - def self.find adgroup, args = {} + + def self.get id + if keyword = super(NAME, id) + SklikApi::Keyword.new(process_sklik_data keyword) + else + nil + end + end + + def self.find args, deprecated_args = {} out = [] - super(NAME, adgroup.args[:adgroup_id]).each do |keyword| + + if args.is_a?(Integer) + return get args + + #asking for adgroup deprecated way! + elsif args.is_a?(SklikApi::Adgroup) + puts "DEPRECATION WARNING: Please update your code for SklikApi::Keyword.find(adgroup, args) to SklikApi::Keyword.find(adgroup_id: 1234) possible to add parent adgroup by adding :adgroup => your adgroup" + adgroup_id = args.args[:adgroup_id] + args = deprecated_args + + #asking for adgroup by hash with keyword_id + elsif args.is_a?(Hash) && args[:keyword_id] + if keyword = get(args[:keyword_id]) + return [keyword] + else + return [] + end + + #asking for keyword by hash + else + adgroup_id = args[:adgroup_id] + end + + return [] unless adgroup_id + + super(NAME, adgroup_id).each do |keyword| if args[:keyword_id].nil? || (args[:keyword_id] && args[:keyword_id].to_i == keyword[:id].to_i) - out << SklikApi::Keyword.new( - adgroup, - :keyword_id => keyword[:id], - :keyword => apply_math_type(keyword[:name], keyword[:matchType] ), - :status => fix_status(keyword) - ) + out << SklikApi::Keyword.new(process_sklik_data keyword) end end out end + def self.process_sklik_data keyword = {} + out = { + :adgroup_id => keyword[:groupId], + :keyword_id => keyword[:id], + :keyword => apply_math_type(keyword[:name], keyword[:matchType] ), + :status => fix_status(keyword) + } + ADDITIONAL_READ_FIELDS.each do |add_info| + field_name = add_info.to_s.underscore.to_sym + out[field_name] = keyword[add_info] if keyword[add_info] + end + out[:cpc] = keyword[:cpc].to_f/100.0 if keyword[:cpc] + + out + end + def self.fix_status keyword if keyword[:removed] == true return :stopped elsif keyword[:status] == "active" return :running @@ -99,20 +200,73 @@ def to_hash if @keyword_data @keyword_data else - @keyword_data = {:keyword => @args[:keyword], :status => @args[:status]} + @keyword_data = @args end + end + + + def self.get_current_status args = {} + raise ArgumentError, "Keyword_id is required" unless args[:keyword_id] + if adgroup = self.get(args[:keyword_id]) + adgroup.args[:status] + else + raise ArgumentError, "Keyword by #{args.inspect} couldn't be found!" end end - - def save + + def get_current_status + self.class.get_current_status :keyword_id => @args[:keyword_id] + end + + def update args = {} + @args.merge!(args) + save + end + + def save + @args[:adgroup_id] = @adgroup.args[:adgroup_id] if !@args[:adgroup_id] && @adgroup.args[:adgroup_id] + if @args[:keyword_id] #do update - + #get current status of campaign + before_status = get_current_status + + #restore campaign before update + restore if before_status == :stopped + + begin + update_object + + rescue Exception => e + log_error e.message + end + + #remove it if new status is stopped or status doesn't changed and before it was stopped + remove if (@args[:status] == :stopped) || (@args[:status].nil? && before_status == :stopped) else #do save - #create adtext - create + #create keyword + begin + create + + rescue Exception => e + log_error e.message + + return false + end + + #remove it if new status is stopped + remove if @args[:status] && @args[:status].to_s.to_sym == :stopped end - end + + !errors.any? + end + + def log_error message + puts message + @adgroup.log_error "Keyword: #{@args[:keyword]} -> #{message}" if @adgroup + errors << message + end + end end - +