diff --git a/.gitignore b/.gitignore index 78affe7..90ac19e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .session_secret +.gitea_token public/files/* !public/files/.gitkeep data/labels/* diff --git a/app.rb b/app.rb index 3bf9500..7df7053 100644 --- a/app.rb +++ b/app.rb @@ -3,6 +3,7 @@ require 'sinatra' require "sinatra/reloader" require 'tmpdir' require 'net/http' +require 'json' require_relative 'lib/receipt_builder' require_relative 'lib/label_repository' @@ -154,6 +155,45 @@ helpers do receipt.print!(PRINTER_DEVICE_EPSON) end + GITEA_TOKEN_FILE = File.join(File.dirname(__FILE__), '.gitea_token') + + def fetch_open_issues(repo) + token = File.read(GITEA_TOKEN_FILE).strip + uri = URI("https://git.priesol.net/api/v1/repos/randy/#{repo}/issues?state=open&type=issues&limit=50") + req = Net::HTTP::Get.new(uri) + req['Authorization'] = "token #{token}" + res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) } + raise "Gitea API returned #{res.code}" unless res.is_a?(Net::HTTPSuccess) + + JSON.parse(res.body) + end + + # Prints a receipt-style summary of a repo's open issues -- number, title, + # labels, one separator per issue, total at the end. + def print_issues(repo) + issues = fetch_open_issues(repo).sort_by { |i| i['number'] } + + receipt = ReceiptBuilder.new + receipt.align(:center).bold.text("Open issues: #{repo}\n").bold(false) + receipt.text("#{Time.now.strftime('%Y-%m-%d %H:%M')}\n") + receipt.align(:left).text(('-' * 32) + "\n") + + if issues.empty? + receipt.text("(no open issues)\n") + else + issues.each do |issue| + receipt.bold.text("##{issue['number']} #{issue['title']}\n").bold(false) + labels = issue['labels'].map { |l| l['name'] }.join(', ') + receipt.text("#{labels}\n") unless labels.empty? + receipt.text(('-' * 32) + "\n") + end + end + + receipt.text("Total: #{issues.size}\n") + receipt.feed(3).cut + receipt.print!(PRINTER_DEVICE_EPSON) + end + # Renders ZPL to a PNG via Labelary's public API for an inline preview. # Fixed at the Datamax label size (4x6in @ 8dpmm ~= 203dpi) -- good enough # for a thumbnail, not meant to be exact for other sizes. @@ -213,6 +253,16 @@ get '/' do erb :index end +post '/issues/print' do + begin + print_issues('home-gitops') + flash 'Open issues sent to printer', 'success' + rescue => e + flash "Failed to print issues (#{e.message})", 'danger' + end + redirect '/' +end + get '/upload' do erb :upload end diff --git a/views/index.erb b/views/index.erb index 82ed7a6..3733653 100644 --- a/views/index.erb +++ b/views/index.erb @@ -9,3 +9,13 @@ + +
+
+
home-gitops open issues
+

Print a receipt-style summary of currently open issues.

+
+ +
+
+