generate_promo_codes

 1#!/usr/bin/env ruby
 2# frozen_string_literal: true
 3
 4require "pg/em/connection_pool"
 5require "eventmachine"
 6require "em_promise"
 7require "em-hiredis"
 8require "csv"
 9require "optparse"
10
11options = {
12 count: 10,
13 creator_id: "86812532466", # one of Denver's JMP accounts
14 output: "promo_codes.csv"
15}
16
17OptionParser.new do |opts|
18 opts.banner = "Usage: generate_promo_codes [-c COUNT] [-i ID] [-o FILE]"
19
20 opts.on("-c", "--count N", Integer, "Number of codes to generate (default: 10)") do |v|
21  options[:count] = v
22 end
23
24 opts.on("-i", "--creator-id ID", "Creator ID for codes (default: one of Denver's)") do |v|
25  options[:creator_id] = v
26 end
27
28 opts.on("-o", "--output FILE", "Output CSV file (default: promo_codes.csv)") do |v|
29  options[:output] = v
30 end
31
32 opts.on("-h", "--help", "Show this help") do
33  puts opts
34  exit
35 end
36end.parse!
37
38require_relative "../lib/postgres"
39require_relative "../lib/invites_repo"
40
41EM.run do
42 DB = Postgres.connect(dbname: "jmp")
43 REDIS = EM::Hiredis.connect
44
45 InvitesRepo.new(DB, REDIS).create_n_codes(
46  options[:creator_id],
47  options[:count]
48 ).then do |codes|
49  CSV.open(options[:output], "w") do |csv|
50   csv << ["code"]
51   codes.each { |code| csv << [code] }
52  end
53
54  puts "Generated #{codes.length} promo codes"
55  puts "Saved to: #{options[:output]}"
56  puts "Creator ID: #{options[:creator_id]}"
57  puts "\nFirst 5 codes:"
58  codes.first(5).each { |code| puts "  #{code}" }
59 rescue => e
60  warn "Error: #{e.message}"
61  warn e.backtrace.join("\n")
62  exit 1
63 ensure
64  EM.stop
65 end
66end