#!/usr/bin/env ruby # frozen_string_literal: true require "pg/em/connection_pool" require "eventmachine" require "em_promise" require "em-hiredis" require "csv" require "optparse" options = { count: 10, creator_id: "86812532466", # one of Denver's JMP accounts output: "promo_codes.csv" } OptionParser.new do |opts| opts.banner = "Usage: generate_promo_codes [-c COUNT] [-i ID] [-o FILE]" opts.on("-c", "--count N", Integer, "Number of codes to generate (default: 10)") do |v| options[:count] = v end opts.on("-i", "--creator-id ID", "Creator ID for codes (default: one of Denver's)") do |v| options[:creator_id] = v end opts.on("-o", "--output FILE", "Output CSV file (default: promo_codes.csv)") do |v| options[:output] = v end opts.on("-h", "--help", "Show this help") do puts opts exit end end.parse! require_relative "../lib/postgres" require_relative "../lib/invites_repo" EM.run do DB = Postgres.connect(dbname: "jmp") REDIS = EM::Hiredis.connect InvitesRepo.new(DB, REDIS).create_n_codes( options[:creator_id], options[:count] ).then do |codes| CSV.open(options[:output], "w") do |csv| csv << ["code"] codes.each { |code| csv << [code] } end puts "Generated #{codes.length} promo codes" puts "Saved to: #{options[:output]}" puts "Creator ID: #{options[:creator_id]}" puts "\nFirst 5 codes:" codes.first(5).each { |code| puts " #{code}" } rescue => e warn "Error: #{e.message}" warn e.backtrace.join("\n") exit 1 ensure EM.stop end end