Explorar o código

Change form fields to array

Nicolas Meienberger %!s(int64=3) %!d(string=hai) anos
pai
achega
ac712013da
Modificáronse 46 ficheiros con 507 adicións e 408 borrados
  1. 1 1
      apps/adguard/config.json
  2. 6 6
      apps/anonaddy/config.json
  3. 1 1
      apps/calibre-web/config.json
  4. 3 3
      apps/code-server/config.json
  5. 1 1
      apps/filebrowser/config.json
  6. 1 1
      apps/filerun/config.json
  7. 1 1
      apps/freshrss/config.json
  8. 1 1
      apps/gitea/config.json
  9. 1 1
      apps/homarr/config.json
  10. 1 1
      apps/homeassistant/config.json
  11. 1 1
      apps/invidious/config.json
  12. 1 1
      apps/jackett/config.json
  13. 1 1
      apps/jellyfin/config.json
  14. 1 1
      apps/joplin/config.json
  15. 1 1
      apps/libreddit/config.json
  16. 1 1
      apps/mealie/config.json
  17. 1 1
      apps/n8n/config.json
  18. 4 4
      apps/nextcloud/config.json
  19. 1 1
      apps/nitter/config.json
  20. 1 1
      apps/nodered/config.json
  21. 3 3
      apps/photoprism/config.json
  22. 3 3
      apps/pihole/config.json
  23. 1 1
      apps/plex/config.json
  24. 1 1
      apps/prowlarr/config.json
  25. 1 1
      apps/radarr/config.json
  26. 1 1
      apps/resilio-sync/config.json
  27. 1 1
      apps/simple-torrent/config.json
  28. 1 1
      apps/sonarr/config.json
  29. 1 1
      apps/syncthing/config.json
  30. 1 1
      apps/tailscale/config.json
  31. 1 1
      apps/tautulli/config.json
  32. 4 4
      apps/transmission/config.json
  33. 26 27
      apps/ttyd/config.json
  34. 3 3
      apps/vaultwarden/config.json
  35. 5 5
      apps/wg-easy/config.json
  36. 0 10
      docker-compose.dev.yml
  37. 277 147
      packages/system-api/package-lock.json
  38. 2 3
      packages/system-api/package.json
  39. 2 7
      packages/system-api/src/config/config.ts
  40. 3 8
      packages/system-api/src/core/middlewares/sessionMiddleware.ts
  41. 10 2
      packages/system-api/src/modules/apps/app.entity.ts
  42. 3 3
      packages/system-api/src/modules/apps/apps.helpers.ts
  43. 15 3
      packages/system-api/src/modules/apps/apps.resolver.ts
  44. 3 3
      packages/system-api/src/modules/apps/apps.service.ts
  45. 29 26
      packages/system-api/src/modules/apps/apps.types.ts
  46. 80 112
      pnpm-lock.yaml

+ 1 - 1
apps/adguard/config.json

@@ -12,5 +12,5 @@
   "requirements": {
     "ports": [53]
   },
-  "form_fields": {}
+  "form_fields": []
 }

+ 6 - 6
apps/anonaddy/config.json

@@ -10,21 +10,21 @@
   "requirements": {
     "ports": [25]
   },
-  "form_fields": {
-    "username": {
+  "form_fields": [
+    {
       "type": "text",
       "label": "Username",
       "required": true,
       "env_variable": "ANONADDY_USERNAME"
     },
-    "key": {
+    {
       "type": "text",
       "label": "App key",
       "hint": "Application key for encrypter service. Generate one with : echo \"base64:$(openssl rand -base64 32)\"",
       "required": true,
       "env_variable": "ANONADDY_KEY"
     },
-    "domain": {
+    {
       "type": "fqdn",
       "label": "Your email domain (eg. example.com)",
       "max": 50,
@@ -32,7 +32,7 @@
       "required": true,
       "env_variable": "ANONADDY_DOMAIN"
     },
-    "secret": {
+    {
       "type": "text",
       "label": "App secret",
       "hint": "Long random string used when hashing data for the anonymous replies",
@@ -41,5 +41,5 @@
       "required": true,
       "env_variable": "ANONADDY_SECRET"
     }
-  }
+  ]
 }

+ 1 - 1
apps/calibre-web/config.json

@@ -9,5 +9,5 @@
   "author": "https://github.com/janeczku/",
   "source": "https://github.com/janeczku/calibre-web",
   "image": "/logos/apps/calibre-web.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 3 - 3
apps/code-server/config.json

@@ -9,8 +9,8 @@
   "author": "https://github.com/coder",
   "source": "https://github.com/linuxserver/docker-code-server",
   "image": "https://avatars.githubusercontent.com/u/95932066",
-  "form_fields": {
-    "password": {
+  "form_fields": [
+    {
       "type": "password",
       "label": "Password",
       "max": 50,
@@ -18,5 +18,5 @@
       "required": true,
       "env_variable": "CODESERVER_PASSWORD"
     }
-  }
+  ]
 }

+ 1 - 1
apps/filebrowser/config.json

@@ -10,5 +10,5 @@
   "website": "https://filebrowser.org/",
   "source": "https://github.com/filebrowser/filebrowser",
   "image": "/logos/apps/filebrowser.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/filerun/config.json

@@ -8,5 +8,5 @@
   "author": "FileRun, LDA - Portugal",
   "source": "https://www.filerun.com/",
   "image": "https://avatars.githubusercontent.com/u/6422152?v=4",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/freshrss/config.json

@@ -9,5 +9,5 @@
   "author": "https://freshrss.org/",
   "source": "https://github.com/FreshRSS/FreshRSS",
   "image": "/logos/apps/freshrss.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/gitea/config.json

@@ -9,5 +9,5 @@
   "author": "go-gitea",
   "source": "https://github.com/go-gitea/gitea",
   "image": "/logos/apps/gitea.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/homarr/config.json

@@ -10,5 +10,5 @@
   "source": "https://github.com/ajnart/homarr",
   "website": "https://discord.gg/C2WTXkzkwK",
   "image": "/logos/apps/homarr.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/homeassistant/config.json

@@ -9,5 +9,5 @@
   "author": "ArneNaessens",
   "source": "https://github.com/home-assistant/core",
   "image": "/logos/apps/homeassistant.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/invidious/config.json

@@ -9,5 +9,5 @@
   "author": "iv-org",
   "source": "https://github.com/iv-org/invidious",
   "image": "https://raw.githubusercontent.com/iv-org/invidious/master/assets/invidious-colored-vector.svg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/jackett/config.json

@@ -9,5 +9,5 @@
   "author": "",
   "source": "https://github.com/Jackett/Jackett",
   "image": "/logos/apps/jackett.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/jellyfin/config.json

@@ -9,5 +9,5 @@
   "author": "jellyfin.org",
   "source": "https://github.com/jellyfin/jellyfin",
   "image": "https://avatars.githubusercontent.com/u/45698031?s=200&v=4",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/joplin/config.json

@@ -10,5 +10,5 @@
   "source": "https://github.com/laurent22/joplin",
   "website": "https://joplinapp.org",
   "image": "/logos/apps/joplin.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/libreddit/config.json

@@ -9,5 +9,5 @@
   "author": "spikecodes",
   "source": "https://github.com/spikecodes/libreddit",
   "image": "/logos/apps/libreddit.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/mealie/config.json

@@ -9,5 +9,5 @@
   "categories": [],
   "source": "https://github.com/hay-kot/mealie",
   "image": "https://raw.githubusercontent.com/hay-kot/mealie/mealie-next/frontend/static/icons/android-chrome-512x512.png",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/n8n/config.json

@@ -10,5 +10,5 @@
   "source": "https://github.com/n8n-io/n8n",
   "website": "https://n8n.io/",
   "image": "/logos/apps/n8n.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 4 - 4
apps/nextcloud/config.json

@@ -9,8 +9,8 @@
   "author": "Nextcloud GmbH",
   "source": "https://github.com/nextcloud/server",
   "image": "https://avatars.githubusercontent.com/u/19211038?s=200&v=4",
-  "form_fields": {
-    "username": {
+  "form_fields": [
+    {
       "type": "text",
       "label": "Username",
       "max": 50,
@@ -18,7 +18,7 @@
       "required": true,
       "env_variable": "NEXTCLOUD_ADMIN_USER"
     },
-    "password": {
+    {
       "type": "password",
       "label": "Password",
       "max": 50,
@@ -26,5 +26,5 @@
       "required": true,
       "env_variable": "NEXTCLOUD_ADMIN_PASSWORD"
     }
-  }
+  ]
 }

+ 1 - 1
apps/nitter/config.json

@@ -9,5 +9,5 @@
   "author": "zedeus",
   "source": "https://github.com/zedeus/nitter",
   "image": "/logos/apps/nitter.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/nodered/config.json

@@ -9,5 +9,5 @@
   "author": "node-red",
   "source": "https://github.com/node-red/node-red",
   "image": "https://avatars.githubusercontent.com/u/5375661?s=200&v=4",
-  "form_fields": {}
+  "form_fields": []
 }

+ 3 - 3
apps/photoprism/config.json

@@ -9,8 +9,8 @@
   "author": "PhotoPrism",
   "source": "https://github.com/photoprism/photoprism",
   "image": "/logos/apps/photoprism.jpg",
-  "form_fields": {
-    "password": {
+  "form_fields": [
+    {
       "type": "password",
       "label": "Photoprism admin password",
       "max": 50,
@@ -18,5 +18,5 @@
       "required": true,
       "env_variable": "PHOTOPRISM_ADMIN_PASSWORD"
     }
-  }
+  ]
 }

+ 3 - 3
apps/pihole/config.json

@@ -12,8 +12,8 @@
   "author": "pi-hole.net",
   "source": "https://github.com/pi-hole/pi-hole",
   "image": "/logos/apps/pihole.jpg",
-  "form_fields": {
-    "password": {
+  "form_fields": [
+    {
       "type": "password",
       "label": "Password",
       "max": 50,
@@ -21,5 +21,5 @@
       "required": true,
       "env_variable": "APP_PASSWORD"
     }
-  }
+  ]
 }

+ 1 - 1
apps/plex/config.json

@@ -10,5 +10,5 @@
   "author": "plexinc",
   "source": "https://github.com/plexinc/pms-docker",
   "image": "/logos/apps/plex.png",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/prowlarr/config.json

@@ -9,5 +9,5 @@
   "author": "Prowlarr",
   "source": "https://github.com/Prowlarr/Prowlarr/",
   "image": "/logos/apps/prowlarr.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/radarr/config.json

@@ -9,5 +9,5 @@
   "author": "radarr.video",
   "source": "https://github.com/Radarr/Radarr",
   "image": "/logos/apps/radarr.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/resilio-sync/config.json

@@ -9,5 +9,5 @@
   "author": "Resilio, Inc.",
   "source": "https://github.com/bt-sync",
   "image": "/logos/apps/resilio-sync.png",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/simple-torrent/config.json

@@ -7,5 +7,5 @@
   "author": "",
   "source": "https://github.com/boypt/simple-torrent",
   "image": "https://getumbrel.github.io/umbrel-apps-gallery/simple-torrent/icon.svg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/sonarr/config.json

@@ -9,5 +9,5 @@
   "author": "sonarr.tv",
   "source": "https://github.com/Sonarr/Sonarr",
   "image": "/logos/apps/sonarr.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/syncthing/config.json

@@ -10,5 +10,5 @@
   "source": "https://github.com/syncthing",
   "website": "https://syncthing.net",
   "image": "/logos/apps/syncthing.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/tailscale/config.json

@@ -10,5 +10,5 @@
   "source": "https://github.com/tailscale/tailscale",
   "website": "https://tailscale.com/",
   "image": "https://avatars.githubusercontent.com/u/48932923?s=200&v=4",
-  "form_fields": {}
+  "form_fields": []
 }

+ 1 - 1
apps/tautulli/config.json

@@ -9,5 +9,5 @@
   "author": "JonnyWong16",
   "source": "https://github.com/Tautulli/Tautulli",
   "image": "/logos/apps/tautulli.jpg",
-  "form_fields": {}
+  "form_fields": []
 }

+ 4 - 4
apps/transmission/config.json

@@ -12,8 +12,8 @@
   "author": "Transmission Project",
   "source": "https://github.com/transmission/transmission",
   "image": "https://avatars.githubusercontent.com/u/223312?s=200&v=4",
-  "form_fields": {
-    "username": {
+  "form_fields": [
+    {
       "type": "text",
       "label": "Username",
       "max": 50,
@@ -21,7 +21,7 @@
       "required": true,
       "env_variable": "TRANSMISSION_USERNAME"
     },
-    "password": {
+    {
       "type": "password",
       "label": "Password",
       "max": 50,
@@ -29,5 +29,5 @@
       "required": true,
       "env_variable": "TRANSMISSION_PASSWORD"
     }
-  }
+  ]
 }

+ 26 - 27
apps/ttyd/config.json

@@ -1,29 +1,28 @@
 {
-    "name": "TTYD - Web terminal",
-    "port": 8092,
-    "id": "ttyd",
-    "description": "",
-    "short_desc": "A utility that allows you to access a command line from your web browser",
-    "author": "",
-    "source": "",
-    "image": "",
-    "form_fields": {
-      "username": {
-        "type": "text",
-        "label": "Username",
-        "max": 50,
-        "min": 3,
-        "required": true,
-        "env_variable": "TRANSMISSION_USERNAME"
-      },
-      "password": {
-        "type": "password",
-        "label": "Password",
-        "max": 50,
-        "min": 3,
-        "required": true,
-        "env_variable": "TRANSMISSION_PASSWORD"
-      }
+  "name": "TTYD - Web terminal",
+  "port": 8092,
+  "id": "ttyd",
+  "description": "",
+  "short_desc": "A utility that allows you to access a command line from your web browser",
+  "author": "",
+  "source": "",
+  "image": "",
+  "form_fields": [
+    {
+      "type": "text",
+      "label": "Username",
+      "max": 50,
+      "min": 3,
+      "required": true,
+      "env_variable": "TRANSMISSION_USERNAME"
+    },
+    {
+      "type": "password",
+      "label": "Password",
+      "max": 50,
+      "min": 3,
+      "required": true,
+      "env_variable": "TRANSMISSION_PASSWORD"
     }
-  }
-  
+  ]
+}

+ 3 - 3
apps/vaultwarden/config.json

@@ -9,8 +9,8 @@
   "author": "Daniel García",
   "source": "https://github.com/dani-garcia/vaultwarden",
   "image": "/logos/apps/vaultwarden.jpg",
-  "form_fields": {
-    "admin_password": {
+  "form_fields": [
+    {
       "type": "password",
       "label": "Admin Panel Password",
       "max": 50,
@@ -18,5 +18,5 @@
       "required": true,
       "env_variable": "VAULTWARDEN_ADMIN_PASSWORD"
     }
-  }
+  ]
 }

+ 5 - 5
apps/wg-easy/config.json

@@ -12,14 +12,14 @@
   "author": "WeeJeWel",
   "source": "https://github.com/WeeJeWel/wg-easy/",
   "image": "/logos/apps/wireguard.jpg",
-  "form_fields": {
-    "host": {
+  "form_fields": [
+    {
       "type": "fqdnip",
       "label": "Your public IP address or domain name",
       "required": true,
       "env_variable": "WIREGUARD_HOST"
     },
-    "password": {
+    {
       "type": "password",
       "label": "Password",
       "max": 50,
@@ -27,11 +27,11 @@
       "required": true,
       "env_variable": "WIREGUARD_PASSWORD"
     },
-    "dns": {
+    {
       "type": "ip",
       "label": "Default DNS server",
       "required": false,
       "env_variable": "WIREGUARD_DNS"
     }
-  }
+  ]
 }

+ 0 - 10
docker-compose.dev.yml

@@ -15,15 +15,6 @@ services:
     networks:
       - tipi_main_network
 
-  redis:
-    container_name: redis
-    image: redis:latest
-    restart: on-failure
-    volumes:
-      - ./data/redis:/data
-    networks:
-      - tipi_main_network
-
   api:
     build:
       context: .
@@ -31,7 +22,6 @@ services:
     command: bash -c "cd /api && npm run dev"
     depends_on:
       - postgres
-      - redis
     container_name: api
     ports:
       - 3001:3001

+ 277 - 147
packages/system-api/package-lock.json

@@ -16,7 +16,6 @@
         "axios": "^0.26.1",
         "class-validator": "^0.13.2",
         "compression": "^1.7.4",
-        "connect-redis": "^6.1.3",
         "cookie-parser": "^1.4.6",
         "cors": "^2.8.5",
         "dotenv": "^16.0.0",
@@ -36,8 +35,8 @@
         "passport-http-bearer": "^1.0.1",
         "pg": "^8.7.3",
         "public-ip": "^5.0.0",
-        "redis": "^4.1.0",
         "reflect-metadata": "^0.1.13",
+        "session-file-store": "^1.5.0",
         "systeminformation": "^5.11.9",
         "tcp-port-used": "^1.0.2",
         "type-graphql": "^1.1.1",
@@ -46,7 +45,6 @@
       },
       "devDependencies": {
         "@types/compression": "^1.7.2",
-        "@types/connect-redis": "^0.0.18",
         "@types/cookie-parser": "^1.4.3",
         "@types/cors": "^2.8.12",
         "@types/express": "^4.17.13",
@@ -56,6 +54,7 @@
         "@types/mock-fs": "^4.13.1",
         "@types/passport": "^1.0.7",
         "@types/passport-http-bearer": "^1.0.37",
+        "@types/session-file-store": "^1.2.2",
         "@types/tcp-port-used": "^1.0.1",
         "@types/validator": "^13.7.2",
         "@typescript-eslint/eslint-plugin": "^5.18.0",
@@ -1420,6 +1419,8 @@
     "node_modules/@redis/bloom": {
       "version": "1.0.2",
       "license": "MIT",
+      "optional": true,
+      "peer": true,
       "peerDependencies": {
         "@redis/client": "^1.0.0"
       }
@@ -1427,6 +1428,8 @@
     "node_modules/@redis/client": {
       "version": "1.1.0",
       "license": "MIT",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "cluster-key-slot": "1.1.0",
         "generic-pool": "3.8.2",
@@ -1439,6 +1442,8 @@
     "node_modules/@redis/graph": {
       "version": "1.0.1",
       "license": "MIT",
+      "optional": true,
+      "peer": true,
       "peerDependencies": {
         "@redis/client": "^1.0.0"
       }
@@ -1446,6 +1451,8 @@
     "node_modules/@redis/json": {
       "version": "1.0.3",
       "license": "MIT",
+      "optional": true,
+      "peer": true,
       "peerDependencies": {
         "@redis/client": "^1.0.0"
       }
@@ -1453,6 +1460,8 @@
     "node_modules/@redis/search": {
       "version": "1.0.6",
       "license": "MIT",
+      "optional": true,
+      "peer": true,
       "peerDependencies": {
         "@redis/client": "^1.0.0"
       }
@@ -1460,6 +1469,8 @@
     "node_modules/@redis/time-series": {
       "version": "1.0.3",
       "license": "MIT",
+      "optional": true,
+      "peer": true,
       "peerDependencies": {
         "@redis/client": "^1.0.0"
       }
@@ -1590,17 +1601,6 @@
         "@types/node": "*"
       }
     },
-    "node_modules/@types/connect-redis": {
-      "version": "0.0.18",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/express": "*",
-        "@types/express-session": "*",
-        "@types/ioredis": "*",
-        "@types/redis": "^2.8.0"
-      }
-    },
     "node_modules/@types/content-disposition": {
       "version": "0.5.5",
       "dev": true,
@@ -1686,14 +1686,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/@types/ioredis": {
-      "version": "4.28.10",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
     "node_modules/@types/istanbul-lib-coverage": {
       "version": "2.0.4",
       "dev": true,
@@ -1836,14 +1828,6 @@
       "version": "1.2.4",
       "license": "MIT"
     },
-    "node_modules/@types/redis": {
-      "version": "2.8.32",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
     "node_modules/@types/responselike": {
       "version": "1.0.0",
       "license": "MIT",
@@ -1863,6 +1847,16 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/session-file-store": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@types/session-file-store/-/session-file-store-1.2.2.tgz",
+      "integrity": "sha512-l9yZ+PQ8vaXhch03MrV+25BIbhKpeWfZB++3njPIm6lKeDGRS2qF2elLuVa4XrhfJbObqW0puhB3A6FCbkraZg==",
+      "dev": true,
+      "dependencies": {
+        "@types/express": "*",
+        "@types/express-session": "*"
+      }
+    },
     "node_modules/@types/stack-utils": {
       "version": "2.0.1",
       "dev": true,
@@ -2406,6 +2400,17 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/asn1.js": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+      "dependencies": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
     "node_modules/async": {
       "version": "3.2.4",
       "license": "MIT"
@@ -2510,6 +2515,11 @@
         "@babel/core": "^7.0.0"
       }
     },
+    "node_modules/bagpipe": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/bagpipe/-/bagpipe-0.3.5.tgz",
+      "integrity": "sha512-42sAlmPDKes1nLm/aly+0VdaopSU9br+jkRELedhQxI5uXHgtk47I83Mpmf4zoNTRMASdLFtUkimlu/Z9zQ8+g=="
+    },
     "node_modules/balanced-match": {
       "version": "1.0.2",
       "license": "MIT"
@@ -2540,6 +2550,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+    },
     "node_modules/body-parser": {
       "version": "1.20.0",
       "license": "MIT",
@@ -2704,8 +2719,7 @@
     },
     "node_modules/buffer-writer": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
-      "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==",
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -2975,6 +2989,8 @@
     "node_modules/cluster-key-slot": {
       "version": "1.1.0",
       "license": "APACHE-2.0",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3166,13 +3182,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/connect-redis": {
-      "version": "6.1.3",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      }
-    },
     "node_modules/console-control-strings": {
       "version": "1.1.0",
       "license": "ISC"
@@ -4466,6 +4475,19 @@
         "node": ">= 0.6"
       }
     },
+    "node_modules/fs-extra": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=6 <7 || >=8"
+      }
+    },
     "node_modules/fs-minipass": {
       "version": "2.1.0",
       "license": "ISC",
@@ -4535,6 +4557,8 @@
     "node_modules/generic-pool": {
       "version": "3.8.2",
       "license": "MIT",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">= 4"
       }
@@ -4702,7 +4726,6 @@
     },
     "node_modules/graceful-fs": {
       "version": "4.2.10",
-      "dev": true,
       "license": "ISC"
     },
     "node_modules/graphql": {
@@ -4970,7 +4993,6 @@
     },
     "node_modules/imurmurhash": {
       "version": "0.1.4",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=0.8.19"
@@ -5318,7 +5340,6 @@
     },
     "node_modules/is-typedarray": {
       "version": "1.0.0",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/is-url": {
@@ -6308,6 +6329,14 @@
         "node": ">=6"
       }
     },
+    "node_modules/jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
     "node_modules/jsonwebtoken": {
       "version": "8.5.1",
       "license": "MIT",
@@ -6371,6 +6400,17 @@
         "node": ">=6"
       }
     },
+    "node_modules/kruptein": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/kruptein/-/kruptein-2.2.3.tgz",
+      "integrity": "sha512-BTwprBPTzkFT9oTugxKd3WnWrX630MqUDsnmBuoa98eQs12oD4n4TeI0GbpdGcYn/73Xueg2rfnw+oK4dovnJg==",
+      "dependencies": {
+        "asn1.js": "^5.4.1"
+      },
+      "engines": {
+        "node": ">6"
+      }
+    },
     "node_modules/kuler": {
       "version": "2.0.0",
       "license": "MIT"
@@ -6640,6 +6680,11 @@
         "node": ">=4"
       }
     },
+    "node_modules/minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+    },
     "node_modules/minimatch": {
       "version": "3.1.2",
       "license": "ISC",
@@ -7255,8 +7300,7 @@
     },
     "node_modules/packet-reader": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
-      "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+      "license": "MIT"
     },
     "node_modules/parent-module": {
       "version": "1.0.1",
@@ -7392,8 +7436,7 @@
     },
     "node_modules/pg": {
       "version": "8.7.3",
-      "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
-      "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
+      "license": "MIT",
       "dependencies": {
         "buffer-writer": "2.0.0",
         "packet-reader": "1.0.0",
@@ -7417,34 +7460,29 @@
     },
     "node_modules/pg-connection-string": {
       "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
-      "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="
+      "license": "MIT"
     },
     "node_modules/pg-int8": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
-      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+      "license": "ISC",
       "engines": {
         "node": ">=4.0.0"
       }
     },
     "node_modules/pg-pool": {
       "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
-      "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==",
+      "license": "MIT",
       "peerDependencies": {
         "pg": ">=8.0"
       }
     },
     "node_modules/pg-protocol": {
       "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
-      "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+      "license": "MIT"
     },
     "node_modules/pg-types": {
       "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
-      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+      "license": "MIT",
       "dependencies": {
         "pg-int8": "1.0.1",
         "postgres-array": "~2.0.0",
@@ -7458,8 +7496,7 @@
     },
     "node_modules/pgpass": {
       "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
-      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+      "license": "MIT",
       "dependencies": {
         "split2": "^4.1.0"
       }
@@ -7565,32 +7602,28 @@
     },
     "node_modules/postgres-array": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
-      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/postgres-bytea": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
-      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/postgres-date": {
       "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
-      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/postgres-interval": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
-      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+      "license": "MIT",
       "dependencies": {
         "xtend": "^4.0.0"
       },
@@ -7860,6 +7893,8 @@
     "node_modules/redis": {
       "version": "4.1.0",
       "license": "MIT",
+      "optional": true,
+      "peer": true,
       "workspaces": [
         "./packages/*"
       ],
@@ -8161,6 +8196,41 @@
         "node": ">= 0.8.0"
       }
     },
+    "node_modules/session-file-store": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/session-file-store/-/session-file-store-1.5.0.tgz",
+      "integrity": "sha512-60IZaJNzyu2tIeHutkYE8RiXVx3KRvacOxfLr2Mj92SIsRIroDsH0IlUUR6fJAjoTW4RQISbaOApa2IZpIwFdQ==",
+      "dependencies": {
+        "bagpipe": "^0.3.5",
+        "fs-extra": "^8.0.1",
+        "kruptein": "^2.0.4",
+        "object-assign": "^4.1.1",
+        "retry": "^0.12.0",
+        "write-file-atomic": "3.0.3"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/session-file-store/node_modules/retry": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/session-file-store/node_modules/write-file-atomic": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "dependencies": {
+        "imurmurhash": "^0.1.4",
+        "is-typedarray": "^1.0.0",
+        "signal-exit": "^3.0.2",
+        "typedarray-to-buffer": "^3.1.5"
+      }
+    },
     "node_modules/set-blocking": {
       "version": "2.0.0",
       "license": "ISC"
@@ -8266,8 +8336,7 @@
     },
     "node_modules/split2": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz",
-      "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==",
+      "license": "ISC",
       "engines": {
         "node": ">= 10.x"
       }
@@ -8827,7 +8896,6 @@
     },
     "node_modules/typedarray-to-buffer": {
       "version": "3.1.5",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "is-typedarray": "^1.0.0"
@@ -8991,6 +9059,14 @@
         "node": ">=8"
       }
     },
+    "node_modules/universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
     "node_modules/unpipe": {
       "version": "1.0.0",
       "license": "MIT",
@@ -9286,8 +9362,7 @@
     },
     "node_modules/xtend": {
       "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "license": "MIT",
       "engines": {
         "node": ">=0.4"
       }
@@ -10220,10 +10295,14 @@
     },
     "@redis/bloom": {
       "version": "1.0.2",
+      "optional": true,
+      "peer": true,
       "requires": {}
     },
     "@redis/client": {
       "version": "1.1.0",
+      "optional": true,
+      "peer": true,
       "requires": {
         "cluster-key-slot": "1.1.0",
         "generic-pool": "3.8.2",
@@ -10232,18 +10311,26 @@
     },
     "@redis/graph": {
       "version": "1.0.1",
+      "optional": true,
+      "peer": true,
       "requires": {}
     },
     "@redis/json": {
       "version": "1.0.3",
+      "optional": true,
+      "peer": true,
       "requires": {}
     },
     "@redis/search": {
       "version": "1.0.6",
+      "optional": true,
+      "peer": true,
       "requires": {}
     },
     "@redis/time-series": {
       "version": "1.0.3",
+      "optional": true,
+      "peer": true,
       "requires": {}
     },
     "@runtipi/common": {
@@ -10351,16 +10438,6 @@
         "@types/node": "*"
       }
     },
-    "@types/connect-redis": {
-      "version": "0.0.18",
-      "dev": true,
-      "requires": {
-        "@types/express": "*",
-        "@types/express-session": "*",
-        "@types/ioredis": "*",
-        "@types/redis": "^2.8.0"
-      }
-    },
     "@types/content-disposition": {
       "version": "0.5.5",
       "dev": true
@@ -10434,13 +10511,6 @@
       "version": "1.8.2",
       "dev": true
     },
-    "@types/ioredis": {
-      "version": "4.28.10",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
     "@types/istanbul-lib-coverage": {
       "version": "2.0.4",
       "dev": true
@@ -10561,13 +10631,6 @@
     "@types/range-parser": {
       "version": "1.2.4"
     },
-    "@types/redis": {
-      "version": "2.8.32",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
     "@types/responselike": {
       "version": "1.0.0",
       "requires": {
@@ -10584,6 +10647,16 @@
         "@types/node": "*"
       }
     },
+    "@types/session-file-store": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@types/session-file-store/-/session-file-store-1.2.2.tgz",
+      "integrity": "sha512-l9yZ+PQ8vaXhch03MrV+25BIbhKpeWfZB++3njPIm6lKeDGRS2qF2elLuVa4XrhfJbObqW0puhB3A6FCbkraZg==",
+      "dev": true,
+      "requires": {
+        "@types/express": "*",
+        "@types/express-session": "*"
+      }
+    },
     "@types/stack-utils": {
       "version": "2.0.1",
       "dev": true
@@ -10894,6 +10967,17 @@
         "es-shim-unscopables": "^1.0.0"
       }
     },
+    "asn1.js": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
     "async": {
       "version": "3.2.4"
     },
@@ -10969,6 +11053,11 @@
         "babel-preset-current-node-syntax": "^1.0.0"
       }
     },
+    "bagpipe": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/bagpipe/-/bagpipe-0.3.5.tgz",
+      "integrity": "sha512-42sAlmPDKes1nLm/aly+0VdaopSU9br+jkRELedhQxI5uXHgtk47I83Mpmf4zoNTRMASdLFtUkimlu/Z9zQ8+g=="
+    },
     "balanced-match": {
       "version": "1.0.2"
     },
@@ -10979,6 +11068,11 @@
       "version": "2.2.0",
       "dev": true
     },
+    "bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+    },
     "body-parser": {
       "version": "1.20.0",
       "requires": {
@@ -11081,9 +11175,7 @@
       "dev": true
     },
     "buffer-writer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
-      "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
+      "version": "2.0.0"
     },
     "bytes": {
       "version": "3.1.2"
@@ -11243,7 +11335,9 @@
       }
     },
     "cluster-key-slot": {
-      "version": "1.1.0"
+      "version": "1.1.0",
+      "optional": true,
+      "peer": true
     },
     "co": {
       "version": "4.6.0",
@@ -11385,9 +11479,6 @@
       "version": "1.0.11",
       "dev": true
     },
-    "connect-redis": {
-      "version": "6.1.3"
-    },
     "console-control-strings": {
       "version": "1.1.0"
     },
@@ -12205,6 +12296,16 @@
     "fresh": {
       "version": "0.5.2"
     },
+    "fs-extra": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+      "requires": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
     "fs-minipass": {
       "version": "2.1.0",
       "requires": {
@@ -12250,7 +12351,9 @@
       }
     },
     "generic-pool": {
-      "version": "3.8.2"
+      "version": "3.8.2",
+      "optional": true,
+      "peer": true
     },
     "gensync": {
       "version": "1.0.0-beta.2",
@@ -12345,8 +12448,7 @@
       }
     },
     "graceful-fs": {
-      "version": "4.2.10",
-      "dev": true
+      "version": "4.2.10"
     },
     "graphql": {
       "version": "15.8.0"
@@ -12487,8 +12589,7 @@
       }
     },
     "imurmurhash": {
-      "version": "0.1.4",
-      "dev": true
+      "version": "0.1.4"
     },
     "inflight": {
       "version": "1.0.6",
@@ -12677,8 +12778,7 @@
       }
     },
     "is-typedarray": {
-      "version": "1.0.0",
-      "dev": true
+      "version": "1.0.0"
     },
     "is-url": {
       "version": "1.2.4"
@@ -13356,6 +13456,14 @@
       "version": "2.2.1",
       "dev": true
     },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+      "requires": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
     "jsonwebtoken": {
       "version": "8.5.1",
       "requires": {
@@ -13402,6 +13510,14 @@
       "version": "3.0.3",
       "dev": true
     },
+    "kruptein": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/kruptein/-/kruptein-2.2.3.tgz",
+      "integrity": "sha512-BTwprBPTzkFT9oTugxKd3WnWrX630MqUDsnmBuoa98eQs12oD4n4TeI0GbpdGcYn/73Xueg2rfnw+oK4dovnJg==",
+      "requires": {
+        "asn1.js": "^5.4.1"
+      }
+    },
     "kuler": {
       "version": "2.0.0"
     },
@@ -13567,6 +13683,11 @@
     "mimic-response": {
       "version": "1.0.1"
     },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+    },
     "minimatch": {
       "version": "3.1.2",
       "requires": {
@@ -13943,9 +14064,7 @@
       }
     },
     "packet-reader": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
-      "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+      "version": "1.0.0"
     },
     "parent-module": {
       "version": "1.0.1",
@@ -14029,8 +14148,6 @@
     },
     "pg": {
       "version": "8.7.3",
-      "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
-      "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
       "requires": {
         "buffer-writer": "2.0.0",
         "packet-reader": "1.0.0",
@@ -14042,30 +14159,20 @@
       }
     },
     "pg-connection-string": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
-      "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="
+      "version": "2.5.0"
     },
     "pg-int8": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
-      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
+      "version": "1.0.1"
     },
     "pg-pool": {
       "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
-      "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==",
       "requires": {}
     },
     "pg-protocol": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
-      "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+      "version": "1.5.0"
     },
     "pg-types": {
       "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
-      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
       "requires": {
         "pg-int8": "1.0.1",
         "postgres-array": "~2.0.0",
@@ -14076,8 +14183,6 @@
     },
     "pgpass": {
       "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
-      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
       "requires": {
         "split2": "^4.1.0"
       }
@@ -14141,24 +14246,16 @@
       }
     },
     "postgres-array": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
-      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="
+      "version": "2.0.0"
     },
     "postgres-bytea": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
-      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="
+      "version": "1.0.0"
     },
     "postgres-date": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
-      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="
+      "version": "1.0.7"
     },
     "postgres-interval": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
-      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
       "requires": {
         "xtend": "^4.0.0"
       }
@@ -14311,6 +14408,8 @@
     },
     "redis": {
       "version": "4.1.0",
+      "optional": true,
+      "peer": true,
       "requires": {
         "@redis/bloom": "1.0.2",
         "@redis/client": "1.1.0",
@@ -14498,6 +14597,37 @@
         "send": "0.18.0"
       }
     },
+    "session-file-store": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/session-file-store/-/session-file-store-1.5.0.tgz",
+      "integrity": "sha512-60IZaJNzyu2tIeHutkYE8RiXVx3KRvacOxfLr2Mj92SIsRIroDsH0IlUUR6fJAjoTW4RQISbaOApa2IZpIwFdQ==",
+      "requires": {
+        "bagpipe": "^0.3.5",
+        "fs-extra": "^8.0.1",
+        "kruptein": "^2.0.4",
+        "object-assign": "^4.1.1",
+        "retry": "^0.12.0",
+        "write-file-atomic": "3.0.3"
+      },
+      "dependencies": {
+        "retry": {
+          "version": "0.12.0",
+          "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+          "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="
+        },
+        "write-file-atomic": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+          "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+          "requires": {
+            "imurmurhash": "^0.1.4",
+            "is-typedarray": "^1.0.0",
+            "signal-exit": "^3.0.2",
+            "typedarray-to-buffer": "^3.1.5"
+          }
+        }
+      }
+    },
     "set-blocking": {
       "version": "2.0.0"
     },
@@ -14571,9 +14701,7 @@
       "dev": true
     },
     "split2": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz",
-      "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ=="
+      "version": "4.1.0"
     },
     "sprintf-js": {
       "version": "1.0.3",
@@ -14895,7 +15023,6 @@
     },
     "typedarray-to-buffer": {
       "version": "3.1.5",
-      "dev": true,
       "requires": {
         "is-typedarray": "^1.0.0"
       }
@@ -14953,6 +15080,11 @@
         "crypto-random-string": "^2.0.0"
       }
     },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+    },
     "unpipe": {
       "version": "1.0.0"
     },
@@ -15139,9 +15271,7 @@
       }
     },
     "xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+      "version": "4.0.2"
     },
     "y18n": {
       "version": "5.0.8"

+ 2 - 3
packages/system-api/package.json

@@ -28,7 +28,6 @@
     "axios": "^0.26.1",
     "class-validator": "^0.13.2",
     "compression": "^1.7.4",
-    "connect-redis": "^6.1.3",
     "cookie-parser": "^1.4.6",
     "cors": "^2.8.5",
     "dotenv": "^16.0.0",
@@ -48,8 +47,8 @@
     "passport-http-bearer": "^1.0.1",
     "pg": "^8.7.3",
     "public-ip": "^5.0.0",
-    "redis": "^4.1.0",
     "reflect-metadata": "^0.1.13",
+    "session-file-store": "^1.5.0",
     "systeminformation": "^5.11.9",
     "tcp-port-used": "^1.0.2",
     "type-graphql": "^1.1.1",
@@ -58,7 +57,6 @@
   },
   "devDependencies": {
     "@types/compression": "^1.7.2",
-    "@types/connect-redis": "^0.0.18",
     "@types/cookie-parser": "^1.4.3",
     "@types/cors": "^2.8.12",
     "@types/express": "^4.17.13",
@@ -68,6 +66,7 @@
     "@types/mock-fs": "^4.13.1",
     "@types/passport": "^1.0.7",
     "@types/passport-http-bearer": "^1.0.37",
+    "@types/session-file-store": "^1.2.2",
     "@types/tcp-port-used": "^1.0.1",
     "@types/validator": "^13.7.2",
     "@typescript-eslint/eslint-plugin": "^5.18.0",

+ 2 - 7
packages/system-api/src/config/config.ts

@@ -1,6 +1,6 @@
 import * as dotenv from 'dotenv';
-import redis from 'redis';
 import { DataSourceOptions } from 'typeorm';
+import App from '../modules/apps/app.entity';
 import { __prod__ } from './constants/constants';
 
 interface IConfig {
@@ -10,7 +10,6 @@ interface IConfig {
     LOGS_ERROR: string;
   };
   typeorm: DataSourceOptions;
-  redis: Parameters<typeof redis.createClient>[0];
   NODE_ENV: string;
   ROOT_FOLDER: string;
   JWT_SECRET: string;
@@ -51,11 +50,7 @@ const config: IConfig = {
     port: 5432,
     logging: !__prod__,
     synchronize: true,
-    entities: [],
-  },
-  redis: {
-    url: 'redis://redis:6379',
-    legacyMode: true,
+    entities: [App],
   },
   NODE_ENV,
   ROOT_FOLDER: '/tipi',

+ 3 - 8
packages/system-api/src/core/middlewares/sessionMiddleware.ts

@@ -1,19 +1,14 @@
-import connectRedis from 'connect-redis';
 import session from 'express-session';
-import { createClient } from 'redis';
 import config from '../../config';
+import SessionFileStore from 'session-file-store';
 import { COOKIE_MAX_AGE, __prod__ } from '../../config/constants/constants';
 
 const getSessionMiddleware = async (): Promise<any> => {
-  const RedisStore = connectRedis(session);
-
-  const redisClient = createClient(config.redis);
-
-  await redisClient.connect();
+  const FileStore = SessionFileStore(session);
 
   return session({
     name: 'qid',
-    store: new RedisStore({ client: redisClient as any, disableTouch: true }),
+    store: new FileStore(),
     cookie: { maxAge: COOKIE_MAX_AGE, secure: __prod__, sameSite: 'lax', httpOnly: true },
     secret: config.JWT_SECRET,
     resave: false,

+ 10 - 2
packages/system-api/src/modules/apps/app.entity.ts

@@ -6,17 +6,25 @@ import { BaseEntity, Column, CreateDateColumn, Entity, UpdateDateColumn } from '
 @Entity()
 class App extends BaseEntity {
   @Field(() => String)
-  @Column({ primary: true, unique: true })
+  @Column({ type: 'varchar', primary: true, unique: true })
   id!: string;
 
   @Field(() => Boolean)
   @Column({ type: 'boolean', default: false })
   installed!: boolean;
 
-  @Field(() => AppStatusEnum)
+  @Field(() => String)
   @Column({ type: 'enum', enum: AppStatusEnum, default: AppStatusEnum.STOPPED, nullable: false })
   status!: AppStatusEnum;
 
+  @Field(() => Date)
+  @Column({ type: 'date', nullable: true })
+  lastOpened!: Date;
+
+  @Field(() => Number)
+  @Column({ type: 'integer', default: 0, nullable: false })
+  numOpened!: number;
+
   @Field(() => Date)
   @CreateDateColumn()
   createdAt!: Date;

+ 3 - 3
packages/system-api/src/modules/apps/apps.helpers.ts

@@ -55,12 +55,12 @@ export const getInitalFormValues = (appName: string): Record<string, string> =>
   const envMap = getEnvMap(appName);
   const formValues: Record<string, string> = {};
 
-  Object.keys(configFile.form_fields).forEach((key) => {
-    const envVar = configFile.form_fields[key].env_variable;
+  configFile.form_fields.forEach((field) => {
+    const envVar = field.env_variable;
     const envVarValue = envMap.get(envVar);
 
     if (envVarValue) {
-      formValues[key] = envVarValue;
+      formValues[field.env_variable] = envVarValue;
     }
   });
 

+ 15 - 3
packages/system-api/src/modules/apps/apps.resolver.ts

@@ -1,11 +1,23 @@
-import { Query, Resolver } from 'type-graphql';
+import { Arg, Authorized, Query, Resolver } from 'type-graphql';
 import AppsService from './apps.service';
-import { ListAppsResonse } from './apps.types';
+import { AppConfig, ListAppsResonse } from './apps.types';
+import App from './app.entity';
 
 @Resolver()
 export default class AppsResolver {
   @Query(() => ListAppsResonse)
-  getChannels(): Promise<ListAppsResonse> {
+  listAppsInfo(): Promise<ListAppsResonse> {
     return AppsService.listApps();
   }
+
+  @Query(() => AppConfig)
+  getAppInfo(@Arg('id', () => String) appId: string): Promise<AppConfig> {
+    return AppsService.getAppInfo(appId);
+  }
+
+  @Authorized()
+  @Query(() => [App])
+  async installedApps(): Promise<App[]> {
+    return App.find();
+  }
 }

+ 3 - 3
packages/system-api/src/modules/apps/apps.service.ts

@@ -1,8 +1,8 @@
 import si from 'systeminformation';
-import { AppConfig, AppStatusEnum } from '@runtipi/common';
+import { AppStatusEnum } from '@runtipi/common';
 import { createFolder, fileExists, readFile, readJsonFile } from '../fs/fs.helpers';
 import { checkAppExists, checkAppRequirements, checkEnvFile, ensureAppState, generateEnvFile, getAvailableApps, getInitalFormValues, getStateFile, runAppScript } from './apps.helpers';
-import { ListAppsResonse } from './apps.types';
+import { AppConfig, ListAppsResonse } from './apps.types';
 
 const startApp = async (appName: string): Promise<void> => {
   checkAppExists(appName);
@@ -66,7 +66,7 @@ const listApps = async (): Promise<ListAppsResonse> => {
     app.description = readFile(`/apps/${app.id}/metadata/description.md`);
   });
 
-  return { apps };
+  return { apps, total: apps.length };
 };
 
 const getAppInfo = async (id: string): Promise<AppConfig> => {

+ 29 - 26
packages/system-api/src/modules/apps/apps.types.ts

@@ -1,32 +1,32 @@
-import { AppCategoriesEnum, AppStatusEnum } from '@runtipi/common';
+import { AppCategoriesEnum, AppStatusEnum, FieldTypes } from '@runtipi/common';
 import { Field, ObjectType } from 'type-graphql';
 
-// @ObjectType(() => FormField)
-// class FormField {
-//   @Field()
-//   type!: FieldTypes;
+@ObjectType()
+class FormField {
+  @Field(() => String)
+  type!: FieldTypes;
 
-//   @Field()
-//   label!: string;
+  @Field(() => String)
+  label!: string;
 
-//   @Field({ nullable: true })
-//   max?: number;
+  @Field(() => Number, { nullable: true })
+  max?: number;
 
-//   @Field({ nullable: true })
-//   min?: number;
+  @Field(() => Number, { nullable: true })
+  min?: number;
 
-//   @Field({ nullable: true })
-//   hint?: string;
+  @Field(() => String, { nullable: true })
+  hint?: string;
 
-//   @Field({ nullable: true })
-//   required?: boolean;
+  @Field(() => Boolean, { nullable: true })
+  required?: boolean;
 
-//   @Field()
-//   env_variable!: string;
-// }
+  @Field(() => String)
+  env_variable!: string;
+}
 
 @ObjectType()
-class App {
+class AppConfig {
   @Field(() => String)
   id!: string;
 
@@ -60,23 +60,26 @@ class App {
   @Field(() => Boolean)
   installed!: boolean;
 
-  @Field(() => [AppCategoriesEnum])
+  @Field(() => [String])
   categories!: AppCategoriesEnum[];
 
-  @Field(() => AppStatusEnum)
+  @Field(() => String)
   status!: AppStatusEnum;
 
   @Field(() => String, { nullable: true })
   url_suffix?: string;
 
-  // @Field(() => [FormField])
-  // form_fields?: FormField[];
+  @Field(() => [FormField])
+  form_fields?: FormField[];
 }
 
 @ObjectType()
 class ListAppsResonse {
-  @Field(() => [App])
-  apps!: App[];
+  @Field(() => [AppConfig])
+  apps!: AppConfig[];
+
+  @Field(() => Number)
+  total!: number;
 }
 
-export { ListAppsResonse, App };
+export { ListAppsResonse, AppConfig };

+ 80 - 112
pnpm-lock.yaml

@@ -127,7 +127,6 @@ importers:
     specifiers:
       '@runtipi/common': file:../common
       '@types/compression': ^1.7.2
-      '@types/connect-redis': ^0.0.18
       '@types/cookie-parser': ^1.4.3
       '@types/cors': ^2.8.12
       '@types/express': ^4.17.13
@@ -137,6 +136,7 @@ importers:
       '@types/mock-fs': ^4.13.1
       '@types/passport': ^1.0.7
       '@types/passport-http-bearer': ^1.0.37
+      '@types/session-file-store': ^1.2.2
       '@types/tcp-port-used': ^1.0.1
       '@types/validator': ^13.7.2
       '@typescript-eslint/eslint-plugin': ^5.18.0
@@ -148,7 +148,6 @@ importers:
       class-validator: ^0.13.2
       compression: ^1.7.4
       concurrently: ^7.1.0
-      connect-redis: ^6.1.3
       cookie-parser: ^1.4.6
       cors: ^2.8.5
       dotenv: ^16.0.0
@@ -177,9 +176,9 @@ importers:
       pg: ^8.7.3
       prettier: 2.6.2
       public-ip: ^5.0.0
-      redis: ^4.1.0
       reflect-metadata: ^0.1.13
       rimraf: ^3.0.2
+      session-file-store: ^1.5.0
       systeminformation: ^5.11.9
       tcp-port-used: ^1.0.2
       ts-jest: ^28.0.2
@@ -195,7 +194,6 @@ importers:
       axios: 0.26.1
       class-validator: 0.13.2
       compression: 1.7.4
-      connect-redis: 6.1.3
       cookie-parser: 1.4.6
       cors: 2.8.5
       dotenv: 16.0.0
@@ -215,16 +213,15 @@ importers:
       passport-http-bearer: 1.0.1
       pg: 8.7.3
       public-ip: 5.0.0
-      redis: 4.1.0
       reflect-metadata: 0.1.13
+      session-file-store: 1.5.0
       systeminformation: 5.11.14
       tcp-port-used: 1.0.2
       type-graphql: 1.1.1_v2revtygxcm7xrdg2oz3ssohfu
-      typeorm: 0.3.6_pg@8.7.3+redis@4.1.0
+      typeorm: 0.3.6_pg@8.7.3
       winston: 3.7.2
     devDependencies:
       '@types/compression': 1.7.2
-      '@types/connect-redis': 0.0.18
       '@types/cookie-parser': 1.4.3
       '@types/cors': 2.8.12
       '@types/express': 4.17.13
@@ -234,6 +231,7 @@ importers:
       '@types/mock-fs': 4.13.1
       '@types/passport': 1.0.7
       '@types/passport-http-bearer': 1.0.37
+      '@types/session-file-store': 1.2.2
       '@types/tcp-port-used': 1.0.1
       '@types/validator': 13.7.2
       '@typescript-eslint/eslint-plugin': 5.22.0_tal4xlmvnofklupd3hwjtzfb4q
@@ -2194,55 +2192,6 @@ packages:
     resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
     dev: false
 
-  /@redis/bloom/1.0.2_@redis+client@1.1.0:
-    resolution: {integrity: sha512-EBw7Ag1hPgFzdznK2PBblc1kdlj5B5Cw3XwI9/oG7tSn85/HKy3X9xHy/8tm/eNXJYHLXHJL/pkwBpFMVVefkw==}
-    peerDependencies:
-      '@redis/client': ^1.0.0
-    dependencies:
-      '@redis/client': 1.1.0
-    dev: false
-
-  /@redis/client/1.1.0:
-    resolution: {integrity: sha512-xO9JDIgzsZYDl3EvFhl6LC52DP3q3GCMUer8zHgKV6qSYsq1zB+pZs9+T80VgcRogrlRYhi4ZlfX6A+bHiBAgA==}
-    engines: {node: '>=14'}
-    dependencies:
-      cluster-key-slot: 1.1.0
-      generic-pool: 3.8.2
-      yallist: 4.0.0
-    dev: false
-
-  /@redis/graph/1.0.1_@redis+client@1.1.0:
-    resolution: {integrity: sha512-oDE4myMCJOCVKYMygEMWuriBgqlS5FqdWerikMoJxzmmTUErnTRRgmIDa2VcgytACZMFqpAOWDzops4DOlnkfQ==}
-    peerDependencies:
-      '@redis/client': ^1.0.0
-    dependencies:
-      '@redis/client': 1.1.0
-    dev: false
-
-  /@redis/json/1.0.3_@redis+client@1.1.0:
-    resolution: {integrity: sha512-4X0Qv0BzD9Zlb0edkUoau5c1bInWSICqXAGrpwEltkncUwcxJIGEcVryZhLgb0p/3PkKaLIWkjhHRtLe9yiA7Q==}
-    peerDependencies:
-      '@redis/client': ^1.0.0
-    dependencies:
-      '@redis/client': 1.1.0
-    dev: false
-
-  /@redis/search/1.0.6_@redis+client@1.1.0:
-    resolution: {integrity: sha512-pP+ZQRis5P21SD6fjyCeLcQdps+LuTzp2wdUbzxEmNhleighDDTD5ck8+cYof+WLec4csZX7ks+BuoMw0RaZrA==}
-    peerDependencies:
-      '@redis/client': ^1.0.0
-    dependencies:
-      '@redis/client': 1.1.0
-    dev: false
-
-  /@redis/time-series/1.0.3_@redis+client@1.1.0:
-    resolution: {integrity: sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==}
-    peerDependencies:
-      '@redis/client': ^1.0.0
-    dependencies:
-      '@redis/client': 1.1.0
-    dev: false
-
   /@rushstack/eslint-patch/1.0.8:
     resolution: {integrity: sha512-ZK5v4bJwgXldAUA8r3q9YKfCwOqoHTK/ZqRjSeRXQrBXWouoPnS4MQtgC4AXGiiBuUu5wxrRgTlv0ktmM4P1Aw==}
     dev: true
@@ -2352,15 +2301,6 @@ packages:
       '@types/express': 4.17.13
     dev: true
 
-  /@types/connect-redis/0.0.18:
-    resolution: {integrity: sha512-iGygGbXgPIr94DEAuoluWhzre3c2/ew5NPlbW9IWvwCTXMM1YCmc7M9wpXMkYqt6kB9aO1sjZnmDzyugUu+2vQ==}
-    dependencies:
-      '@types/express': 4.17.13
-      '@types/express-session': 1.17.4
-      '@types/ioredis': 4.28.10
-      '@types/redis': 2.8.32
-    dev: true
-
   /@types/connect/3.4.35:
     resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==}
     dependencies:
@@ -2464,12 +2404,6 @@ packages:
     resolution: {integrity: sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==}
     dev: true
 
-  /@types/ioredis/4.28.10:
-    resolution: {integrity: sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==}
-    dependencies:
-      '@types/node': 17.0.31
-    dev: true
-
   /@types/istanbul-lib-coverage/2.0.4:
     resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
     dev: true
@@ -2651,12 +2585,6 @@ packages:
       '@types/scheduler': 0.16.2
       csstype: 3.0.11
 
-  /@types/redis/2.8.32:
-    resolution: {integrity: sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==}
-    dependencies:
-      '@types/node': 17.0.31
-    dev: true
-
   /@types/responselike/1.0.0:
     resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
     dependencies:
@@ -2675,6 +2603,13 @@ packages:
       '@types/mime': 1.3.2
       '@types/node': 17.0.31
 
+  /@types/session-file-store/1.2.2:
+    resolution: {integrity: sha512-l9yZ+PQ8vaXhch03MrV+25BIbhKpeWfZB++3njPIm6lKeDGRS2qF2elLuVa4XrhfJbObqW0puhB3A6FCbkraZg==}
+    dependencies:
+      '@types/express': 4.17.13
+      '@types/express-session': 1.17.4
+    dev: true
+
   /@types/stack-utils/2.0.1:
     resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
     dev: true
@@ -3296,6 +3231,15 @@ packages:
       es-shim-unscopables: 1.0.0
     dev: true
 
+  /asn1.js/5.4.1:
+    resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==}
+    dependencies:
+      bn.js: 4.12.0
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+      safer-buffer: 2.1.2
+    dev: false
+
   /ast-types-flow/0.0.7:
     resolution: {integrity: sha1-9wtzXGvKGlycItmCw+Oef+ujva0=}
     dev: true
@@ -3423,6 +3367,10 @@ packages:
       babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.10
     dev: true
 
+  /bagpipe/0.3.5:
+    resolution: {integrity: sha512-42sAlmPDKes1nLm/aly+0VdaopSU9br+jkRELedhQxI5uXHgtk47I83Mpmf4zoNTRMASdLFtUkimlu/Z9zQ8+g==}
+    dev: false
+
   /bail/2.0.2:
     resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
     dev: false
@@ -3439,6 +3387,10 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /bn.js/4.12.0:
+    resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==}
+    dev: false
+
   /body-parser/1.20.0:
     resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==}
     engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -3731,11 +3683,6 @@ packages:
     engines: {node: '>=6'}
     dev: false
 
-  /cluster-key-slot/1.1.0:
-    resolution: {integrity: sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==}
-    engines: {node: '>=0.10.0'}
-    dev: false
-
   /co/4.6.0:
     resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=}
     engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
@@ -3868,11 +3815,6 @@ packages:
     resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
     dev: true
 
-  /connect-redis/6.1.3:
-    resolution: {integrity: sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw==}
-    engines: {node: '>=12'}
-    dev: false
-
   /console-control-strings/1.1.0:
     resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=}
     dev: false
@@ -4741,7 +4683,7 @@ packages:
       eslint-import-resolver-webpack:
         optional: true
     dependencies:
-      '@typescript-eslint/parser': 5.22.0_hcfsmds2fshutdssjqluwm76uu
+      '@typescript-eslint/parser': 5.22.0_uhoeudlwl7kc47h4kncsfowede
       debug: 3.2.7
       eslint-import-resolver-node: 0.3.6
       find-up: 2.1.0
@@ -5382,6 +5324,15 @@ packages:
     engines: {node: '>= 0.6'}
     dev: false
 
+  /fs-extra/8.1.0:
+    resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
+    engines: {node: '>=6 <7 || >=8'}
+    dependencies:
+      graceful-fs: 4.2.10
+      jsonfile: 4.0.0
+      universalify: 0.1.2
+    dev: false
+
   /fs-minipass/2.1.0:
     resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
     engines: {node: '>= 8'}
@@ -5436,11 +5387,6 @@ packages:
       wide-align: 1.1.5
     dev: false
 
-  /generic-pool/3.8.2:
-    resolution: {integrity: sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==}
-    engines: {node: '>= 4'}
-    dev: false
-
   /gensync/1.0.0-beta.2:
     resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
     engines: {node: '>=6.9.0'}
@@ -5598,7 +5544,6 @@ packages:
 
   /graceful-fs/4.2.10:
     resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
-    dev: true
 
   /graphql-query-complexity/0.7.2_graphql@15.8.0:
     resolution: {integrity: sha512-+VgmrfxGEjHI3zuojWOR8bsz7Ycz/BZjNjxnlUieTz5DsB92WoIrYCSZdWG7UWZ3rfcA1Gb2Nf+wB80GsaZWuQ==}
@@ -5812,7 +5757,6 @@ packages:
   /imurmurhash/0.1.4:
     resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=}
     engines: {node: '>=0.8.19'}
-    dev: true
 
   /inflight/1.0.6:
     resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
@@ -6072,8 +6016,7 @@ packages:
     dev: true
 
   /is-typedarray/1.0.0:
-    resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=}
-    dev: true
+    resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
 
   /is-url/1.2.4:
     resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
@@ -6726,6 +6669,12 @@ packages:
     hasBin: true
     dev: true
 
+  /jsonfile/4.0.0:
+    resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+    optionalDependencies:
+      graceful-fs: 4.2.10
+    dev: false
+
   /jsonwebtoken/8.5.1:
     resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==}
     engines: {node: '>=4', npm: '>=1.4.28'}
@@ -6788,6 +6737,13 @@ packages:
     engines: {node: '>=6'}
     dev: false
 
+  /kruptein/2.2.3:
+    resolution: {integrity: sha512-BTwprBPTzkFT9oTugxKd3WnWrX630MqUDsnmBuoa98eQs12oD4n4TeI0GbpdGcYn/73Xueg2rfnw+oK4dovnJg==}
+    engines: {node: '>6'}
+    dependencies:
+      asn1.js: 5.4.1
+    dev: false
+
   /kuler/2.0.0:
     resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
     dev: false
@@ -7553,6 +7509,10 @@ packages:
     engines: {node: '>=10'}
     dev: false
 
+  /minimalistic-assert/1.0.1:
+    resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+    dev: false
+
   /minimatch/3.1.2:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
     dependencies:
@@ -8707,17 +8667,6 @@ packages:
       picomatch: 2.3.1
     dev: true
 
-  /redis/4.1.0:
-    resolution: {integrity: sha512-5hvJ8wbzpCCiuN1ges6tx2SAh2XXCY0ayresBmu40/SGusWHFW86TAlIPpbimMX2DFHOX7RN34G2XlPA1Z43zg==}
-    dependencies:
-      '@redis/bloom': 1.0.2_@redis+client@1.1.0
-      '@redis/client': 1.1.0
-      '@redis/graph': 1.0.1_@redis+client@1.1.0
-      '@redis/json': 1.0.3_@redis+client@1.1.0
-      '@redis/search': 1.0.6_@redis+client@1.1.0
-      '@redis/time-series': 1.0.3_@redis+client@1.1.0
-    dev: false
-
   /reflect-metadata/0.1.13:
     resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==}
     dev: false
@@ -8864,6 +8813,11 @@ packages:
       lowercase-keys: 2.0.0
     dev: false
 
+  /retry/0.12.0:
+    resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
+    engines: {node: '>= 4'}
+    dev: false
+
   /retry/0.13.1:
     resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
     engines: {node: '>= 4'}
@@ -8981,6 +8935,18 @@ packages:
       - supports-color
     dev: false
 
+  /session-file-store/1.5.0:
+    resolution: {integrity: sha512-60IZaJNzyu2tIeHutkYE8RiXVx3KRvacOxfLr2Mj92SIsRIroDsH0IlUUR6fJAjoTW4RQISbaOApa2IZpIwFdQ==}
+    engines: {node: '>= 6'}
+    dependencies:
+      bagpipe: 0.3.5
+      fs-extra: 8.1.0
+      kruptein: 2.2.3
+      object-assign: 4.1.1
+      retry: 0.12.0
+      write-file-atomic: 3.0.3
+    dev: false
+
   /set-blocking/2.0.0:
     resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=}
     dev: false
@@ -9557,9 +9523,8 @@ packages:
     resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
     dependencies:
       is-typedarray: 1.0.0
-    dev: true
 
-  /typeorm/0.3.6_pg@8.7.3+redis@4.1.0:
+  /typeorm/0.3.6_pg@8.7.3:
     resolution: {integrity: sha512-DRqgfqcelMiGgWSMbBmVoJNFN2nPNA3EeY2gC324ndr2DZoGRTb9ILtp2oGVGnlA+cu5zgQ6it5oqKFNkte7Aw==}
     engines: {node: '>= 12.9.0'}
     hasBin: true
@@ -9629,7 +9594,6 @@ packages:
       js-yaml: 4.1.0
       mkdirp: 1.0.4
       pg: 8.7.3
-      redis: 4.1.0
       reflect-metadata: 0.1.13
       sha.js: 2.4.11
       tslib: 2.4.0
@@ -9754,6 +9718,11 @@ packages:
       unist-util-visit-parents: 5.1.0
     dev: false
 
+  /universalify/0.1.2:
+    resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+    engines: {node: '>= 4.0.0'}
+    dev: false
+
   /unpipe/1.0.0:
     resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
     engines: {node: '>= 0.8'}
@@ -9998,7 +9967,6 @@ packages:
       is-typedarray: 1.0.0
       signal-exit: 3.0.7
       typedarray-to-buffer: 3.1.5
-    dev: true
 
   /write-file-atomic/4.0.1:
     resolution: {integrity: sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==}