feat: add promo code generation script

Amolith created

Change summary

bin/generate_promo_codes | 66 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)

Detailed changes

bin/generate_promo_codes 🔗

@@ -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