Change summary
bin/generate_promo_codes | 66 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
Detailed changes
@@ -0,0 +1,66 @@
+#!/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