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