From 4d31a33a7241ca3aee36c8ae45f5b3992bc2555c Mon Sep 17 00:00:00 2001
From: tv <tv@krebsco.de>
Date: Fri, 27 Nov 2020 10:55:21 +0100
Subject: [PATCH] tv elm-package-proxy: add POST /all-packages

---
 tv/2configs/elm-packages-proxy.nix | 63 ++++++++++++++++++++++--------
 1 file changed, 47 insertions(+), 16 deletions(-)

diff --git a/tv/2configs/elm-packages-proxy.nix b/tv/2configs/elm-packages-proxy.nix
index 7961bce37..b8bbcff4b 100644
--- a/tv/2configs/elm-packages-proxy.nix
+++ b/tv/2configs/elm-packages-proxy.nix
@@ -19,6 +19,11 @@ in {
     sslCertificate = cfg.sslCertificate;
     sslCertificateKey = cfg.sslCertificateKey;
 
+    locations."/all-packages".extraConfig = ''
+      proxy_pass http://127.0.0.1:${toString config.krebs.htgen.elm-packages-proxy.port};
+      proxy_pass_header Server;
+    '';
+
     locations."/all-packages/since/".extraConfig = ''
       proxy_pass http://127.0.0.1:${toString config.krebs.htgen.elm-packages-proxy.port};
       proxy_pass_header Server;
@@ -166,11 +171,47 @@ in {
           fi
           exit
         ;;
+        'POST /all-packages')
+
+          response=$(mktemp -t htgen.$$.elm-packages-proxy.all-packages.XXXXXXXX)
+          trap "rm $response >&2" EXIT
+
+          {
+            # upstream packages
+            curl -fsS https://package.elm-lang.org"$Request_URI"
+
+            # private packages
+            (cd ${cfg.packageDir}; find -mindepth 3 -maxdepth 3) |
+            jq -Rs '
+              split("\n") |
+              map(
+                select(.!="") |
+                match("^\\./(?<author>[^/]+)/(?<pname>[^/]+)/(?<version>[^/]+)$").captures |
+                map({key:.name,value:.string}) |
+                from_entries
+              ) |
+              reduce .[] as $item ({};
+                ($item|"\(.author)/\(.pname)") as $name |
+                . + { "\($name)": ((.[$name] // []) + [$item.version]) }
+              )
+            '
+          } |
+          jq -cs add > $response
+
+          file_response 200 OK "$response" 'application/json; charset=UTF-8'
+          exit
+        ;;
         'POST /all-packages/since/'*)
 
-          my_packages=$(
-            cd ${cfg.packageDir}
-            find -mindepth 3 -maxdepth 3 |
+          response=$(mktemp -t htgen.$$.elm-packages-proxy.all-packages.XXXXXXXX)
+          trap "rm $response >&2" EXIT
+
+          {
+            # upstream packages
+            curl -fsS https://package.elm-lang.org"$Request_URI"
+
+            # private packages
+            (cd ${cfg.packageDir}; find -mindepth 3 -maxdepth 3) |
             jq -Rs '
               split("\n") |
               map(
@@ -180,20 +221,10 @@ in {
               sort_by(split("@") | [.[0]]+(.[1]|split("."))) |
               reverse
             '
-          )
+          } |
+          jq -cs add > $response
 
-          new_upstream_packages=$(
-            curl -fsS https://package.elm-lang.org"$Request_URI"
-          )
-
-          response=$(
-            jq -n \
-                --argjson my_packages "$my_packages" \
-                --argjson new_upstream_packages "$new_upstream_packages" \
-                '$new_upstream_packages + $my_packages'
-          )
-
-          string_response 200 OK "$response" 'application/json; charset=UTF-8'
+          file_response 200 OK "$response" 'application/json; charset=UTF-8'
           exit
         ;;
       esac