From 256664056c79950c1cb6a9887dca5a2c4ae239ac Mon Sep 17 00:00:00 2001 From: Noah van der Aa Date: Thu, 20 Jul 2023 18:37:14 +0200 Subject: [PATCH] Allow specifying offset for orders, remove terraform stuff --- src/api/index.js | 7 ++ src/artist/index.js | 18 +++- src/index.js | 3 + src/ws/handler/orders.js | 7 ++ terraform/grafana.tf | 82 --------------- terraform/ingress-grafana.yml | 28 ----- terraform/ingress.yml | 29 ------ terraform/main.tf | 163 ------------------------------ terraform/postgres.tf | 99 ------------------ terraform/vars.tf | 10 -- web/artist/createorder/index.html | 14 +++ web/index.html | 2 +- 12 files changed, 48 insertions(+), 414 deletions(-) delete mode 100644 terraform/grafana.tf delete mode 100644 terraform/ingress-grafana.yml delete mode 100644 terraform/ingress.yml delete mode 100644 terraform/main.tf delete mode 100644 terraform/postgres.tf delete mode 100644 terraform/vars.tf diff --git a/src/api/index.js b/src/api/index.js index 9e8b1b4..e69acf3 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -32,6 +32,11 @@ router.get('/orders', async (req, res) => { width: order.width }; + order.offset = { + x: order.offset_x, + y: order.offset_y + }; + order.createdAt = order.created_at; delete order.created_at; @@ -39,6 +44,8 @@ router.get('/orders', async (req, res) => { delete order.flags; // implementation detail delete order.height; delete order.width; + delete order.offset_x; + delete order.offset_y; } res.json(orders); diff --git a/src/artist/index.js b/src/artist/index.js index a4e5b14..acea0ae 100644 --- a/src/artist/index.js +++ b/src/artist/index.js @@ -132,13 +132,16 @@ router.post('/order', upload.fields([{ fs.copyFileSync(priority.path, path.join(IMAGES_DIRECTORY, `${id}-priority.png`)); } + let xOffset = Number(req.body['x-offset']) || 0; + let yOffset = Number(req.body['y-offset']) || 0; + await chief.sql`INSERT INTO users (id, name, avatar) VALUES (${userData.id}, ${userData.username}, ${avatar}) ON CONFLICT (id) DO UPDATE SET name = ${userData.username}, avatar = ${avatar};`; - await chief.sql`INSERT INTO orders (id, message, flags, width, height, created_by) + await chief.sql`INSERT INTO orders (id, message, flags, width, height, created_by, offset_x, offset_y) VALUES (${id}, ${req.body.message || null}, ${flags}, ${orderPng.width}, ${orderPng.height}, - ${userData.id})`; + ${userData.id}, ${xOffset}, ${yOffset})`; const payload = { id, @@ -155,6 +158,10 @@ router.post('/order', upload.fields([{ order: `${BASE_URL}/orders/${id}.png`, priority: req.files.priority ? `${BASE_URL}/orders/${id}-priority.png` : null }, + offset: { + x: xOffset, + y: yOffset + }, createdAt: new Date() }; @@ -233,6 +240,13 @@ async function validate(req) { perfect = false; messages.push(`Order has a different size than the current order (${orderPng.width}x${orderPng.height} new, ${previousOrder.width}x${previousOrder.height} old). If the canvas has been resized, you can ignore this warning.`); } + + let xOffset = Number(req.body['x-offset']) || 0; + let yOffset = Number(req.body['y-offset']) || 0; + if (previousOrder.offset_x !== xOffset || previousOrder.offset_y !== yOffset) { + perfect = false; + messages.push(`Order has a different offset than the current order (${xOffset},${yOffset} new, ${previousOrder.offset_x},${previousOrder.offset_y} old). If the canvas has been resized, you can ignore this warning.`); + } } if (!req.body.message) { diff --git a/src/index.js b/src/index.js index cdf70bb..7bf2b56 100644 --- a/src/index.js +++ b/src/index.js @@ -34,6 +34,9 @@ CREATE TABLE IF NOT EXISTS orders ( CONSTRAINT fk_created_by FOREIGN KEY(created_by) REFERENCES users(id) ); + +ALTER TABLE orders ADD COLUMN IF NOT EXISTS offset_x INTEGER NOT NULL DEFAULT -500; +ALTER TABLE orders ADD COLUMN IF NOT EXISTS offset_y INTEGER NOT NULL DEFAULT -500; `); expressWs(app); diff --git a/src/ws/handler/orders.js b/src/ws/handler/orders.js index 27030ff..732e8a0 100644 --- a/src/ws/handler/orders.js +++ b/src/ws/handler/orders.js @@ -22,6 +22,11 @@ export async function handleGetOrder(chief, client) { width: order.width }; + order.offset = { + x: order.offset_x, + y: order.offset_y + }; + order.createdAt = order.created_at; delete order.created_at; @@ -29,6 +34,8 @@ export async function handleGetOrder(chief, client) { delete order.flags; // implementation detail delete order.height; delete order.width; + delete order.offset_x; + delete order.offset_y; client.ws.sendPayload('order', order); } diff --git a/terraform/grafana.tf b/terraform/grafana.tf deleted file mode 100644 index 7d61062..0000000 --- a/terraform/grafana.tf +++ /dev/null @@ -1,82 +0,0 @@ -resource "random_password" "grafana-password" { - length = 32 - special = false -} -resource "random_password" "grafana-username" { - length = 32 - special = false -} - -resource "kubernetes_deployment" "grafana" { - metadata { - name = "grafana" - namespace = kubernetes_namespace.placenl-namespace.metadata[0].name - labels = { - app = "grafana" - } - } - - spec { - selector { - match_labels = { - app = "grafana" - } - } - - template { - metadata { - labels = { - app = "grafana" - } - } - - spec { - container { - image = "grafana/grafana:latest" - name = "grafana" - - env { - name = "GF_SERVER_ROOT_URL" - value = "http://localhost:3000" - } - env { - name = "GF_SECURITY_ADMIN_USER" - value = random_password.grafana-password.result - } - - env { - name = "GF_SECURITY_ADMIN_PASSWORD" - value = random_password.grafana-password.result - } - - - port { - container_port = 3000 - } - } - } - } - } -} - -resource "kubernetes_service" "grafana" { - metadata { - name = "grafana" - namespace = kubernetes_namespace.placenl-namespace.metadata[0].name - } - - spec { - selector = { - app = "grafana" - } - - port { - port = 80 - target_port = 3000 - } - } -} -resource "kubectl_manifest" "grafana-ingress" { - yaml_body = file("./ingress-grafana.yml") -} - diff --git a/terraform/ingress-grafana.yml b/terraform/ingress-grafana.yml deleted file mode 100644 index b8551d3..0000000 --- a/terraform/ingress-grafana.yml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - annotations: - cert-manager.io/cluster-issuer: letsencrypt-prod - cert-manager.io/issue-temporary-certificate: "true" - ingress.kubernetes.io/force-ssl-redirect: "true" - kubernetes.io/ingress.class: contour - kubernetes.io/tls-acme: "true" - projectcontour.io/response-timeout: infinite - name: placenl-grafana - namespace: placenl -spec: - rules: - - host: placenl.goud.host - http: - paths: - - backend: - service: - name: grafana - port: - number: 80 - path: / - pathType: Prefix - tls: - - hosts: - - placenl.goud.host - secretName: placenl-grafana diff --git a/terraform/ingress.yml b/terraform/ingress.yml deleted file mode 100644 index 0c492a3..0000000 --- a/terraform/ingress.yml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - annotations: - cert-manager.io/cluster-issuer: letsencrypt-prod - cert-manager.io/issue-temporary-certificate: "true" - ingress.kubernetes.io/force-ssl-redirect: "true" - kubernetes.io/ingress.class: contour - kubernetes.io/tls-acme: "true" - projectcontour.io/response-timeout: infinite - projectcontour.io/websocket-routes: / - name: placenl-app - namespace: placenl -spec: - rules: - - host: chief.placenl.nl - http: - paths: - - backend: - service: - name: placenl-app-service - port: - number: 3000 - path: / - pathType: Prefix - tls: - - hosts: - - chief.placenl.nl - secretName: placen-tls diff --git a/terraform/main.tf b/terraform/main.tf deleted file mode 100644 index b9f36bc..0000000 --- a/terraform/main.tf +++ /dev/null @@ -1,163 +0,0 @@ -terraform { - required_providers { - digitalocean = { - source = "digitalocean/digitalocean" - version = "2.27.1" - } - kubectl = { - source = "gavinbunney/kubectl" - version = ">= 1.7.0" - } - kubernetes = { - source = "hashicorp/kubernetes" - version = "2.19.0" - } - } -} - -provider "digitalocean" { - token = var.do_token -} - -data "digitalocean_kubernetes_cluster" "doks" { - name = "nl01" -} - -provider "kubernetes" { - host = data.digitalocean_kubernetes_cluster.doks.endpoint - token = data.digitalocean_kubernetes_cluster.doks.kube_config[0].token - cluster_ca_certificate = base64decode( - data.digitalocean_kubernetes_cluster.doks.kube_config[0].cluster_ca_certificate - ) -} - -resource "kubernetes_namespace" "placenl-namespace" { - metadata { - name = "placenl" - } -} - - -resource "kubernetes_persistent_volume_claim" "placenl-image-pvc" { - metadata { - name = "placenl-image-pvc" - namespace = kubernetes_namespace.placenl-namespace.metadata[0].name - } - spec { - access_modes = ["ReadWriteMany"] - storage_class_name = "longhorn-2" - resources { - requests = { - storage = "10Gi" - } - } - - } -} - - -resource "kubernetes_deployment" "placenl-app-deploy" { - depends_on = [ - kubernetes_deployment.placenl-db-deploy - ] - metadata { - name = "placenl-app" - namespace = kubernetes_namespace.placenl-namespace.metadata[0].name - labels = { - app = "placenl" - } - } - - spec { - replicas = 1 - - selector { - match_labels = { - app = "placenl" - } - } - - template { - metadata { - labels = { - app = "placenl" - } - } - spec { - container { - image = var.placenl_image - name = "placenl-app" - image_pull_policy = "Always" - volume_mount { - mount_path = var.IMAGES_DIRECTORY - name = "placenl-image-pv" - } - - env { - name = "BASE_URL" - value = var.BASE_URL - } - env { - name = "DISCORD_CLIENT_ID" - value = var.DISCORD_CLIENT_ID - } - env { - name = "DISCORD_CLIENT_SECRET" - value = var.DISCORD_CLIENT_SECRET - } - env { - name = "DISCORD_SERVER_ID" - value = var.DISCORD_SERVER_ID - } - env { - name = "DISCORD_ROLE_ID" - value = var.DISCORD_ROLE_ID - } - env { - name = "IMAGES_DIRECTORY" - value = var.IMAGES_DIRECTORY - } - env { - name = "POSTGRES_CONNECTION_URI" - value = "postgres://${random_password.placenl-db-user-username.result}:${random_password.placenl-db-user-password.result}@placenl-db-service/postgres" - } - } - volume { - name = "placenl-image-pv" - persistent_volume_claim { - claim_name = kubernetes_persistent_volume_claim.placenl-image-pvc.metadata[0].name - } - } - } - } - } -} - -resource "kubernetes_service" "placenl-app-service" { - metadata { - name = "placenl-app-service" - namespace = kubernetes_namespace.placenl-namespace.metadata[0].name - } - spec { - selector = { - app = "placenl" - } - port { - target_port = "3000" - port = "3000" - } - } -} - -provider "kubectl" { - host = data.digitalocean_kubernetes_cluster.doks.endpoint - token = data.digitalocean_kubernetes_cluster.doks.kube_config[0].token - cluster_ca_certificate = base64decode( - data.digitalocean_kubernetes_cluster.doks.kube_config[0].cluster_ca_certificate - ) - load_config_file = false -} - -resource "kubectl_manifest" "placenl-ingress" { - yaml_body = file("./ingress.yml") -} \ No newline at end of file diff --git a/terraform/postgres.tf b/terraform/postgres.tf deleted file mode 100644 index ffe3690..0000000 --- a/terraform/postgres.tf +++ /dev/null @@ -1,99 +0,0 @@ -resource "random_password" "placenl-db-user-password" { - length = 32 - special = false -} -resource "random_password" "placenl-db-user-username" { - length = 32 - special = false -} -resource "kubernetes_persistent_volume_claim" "placenl-db-pvc" { - metadata { - name = "placenl-db-pvc" - namespace = kubernetes_namespace.placenl-namespace.metadata[0].name - } - spec { - access_modes = ["ReadWriteMany"] - storage_class_name = "longhorn-2" - resources { - requests = { - storage = "10Gi" - } - } - - } -} - - -resource "kubernetes_deployment" "placenl-db-deploy" { - metadata { - name = "placenl-db" - namespace = kubernetes_namespace.placenl-namespace.metadata[0].name - labels = { - db = "placenl" - } - } - - spec { - replicas = 1 - - selector { - match_labels = { - db = "placenl" - } - } - - template { - metadata { - labels = { - db = "placenl" - } - } - spec { - container { - image = "postgres:latest" - name = "placenl-db" - image_pull_policy = "Always" - volume_mount { - mount_path = "/var/lib/postgresql/" - name = "placenl-db-pv" - } - - env { - name = "POSTGRES_DB" - value = "postgres" - } - env { - name = "POSTGRES_PASSWORD" - value = random_password.placenl-db-user-password.result - } - env { - name = "POSTGRES_USER" - value = random_password.placenl-db-user-username.result - } - } - volume { - name = "placenl-db-pv" - persistent_volume_claim { - claim_name = kubernetes_persistent_volume_claim.placenl-db-pvc.metadata[0].name - } - } - } - } - } -} - -resource "kubernetes_service" "placenl-db-service" { - metadata { - name = "placenl-db-service" - namespace = kubernetes_namespace.placenl-namespace.metadata[0].name - } - spec { - selector = { - db = "placenl" - } - port { - target_port = "5432" - port = "5432" - } - } -} \ No newline at end of file diff --git a/terraform/vars.tf b/terraform/vars.tf deleted file mode 100644 index 29861de..0000000 --- a/terraform/vars.tf +++ /dev/null @@ -1,10 +0,0 @@ -variable "do_token" {} -variable "BASE_URL" {} -variable "DISCORD_CLIENT_ID" {} -variable "DISCORD_CLIENT_SECRET" {} -variable "DISCORD_SERVER_ID" {} -variable "DISCORD_ROLE_ID" {} -variable "IMAGES_DIRECTORY" {} -variable "placenl_image" { - default = "ghcr.io/placenl/chief:0.1.1" -} diff --git a/web/artist/createorder/index.html b/web/artist/createorder/index.html index 4aae4c9..ab99d9f 100644 --- a/web/artist/createorder/index.html +++ b/web/artist/createorder/index.html @@ -43,6 +43,18 @@

Create new order

+
+ +
+ + , + +
+
+ 0,0 on this image corresponds to the coordinates specified above on the canvas. +
+
+
@@ -130,6 +142,8 @@

Create new order

formData.append('priority', document.querySelector('#priority-mapping').files[0]); formData.append('message', document.querySelector('#message').value); formData.append('show-creator', document.querySelector('#show-creator').value); + formData.append('x-offset', document.querySelector('#x-offset').value); + formData.append('y-offset', document.querySelector('#y-offset').value); if (includeAuth) { formData.append('code', new URLSearchParams(window.location.search.slice(1)).get('code')); } diff --git a/web/index.html b/web/index.html index dde3a50..e24ecae 100644 --- a/web/index.html +++ b/web/index.html @@ -12,7 +12,7 @@ crossorigin="anonymous" referrerpolicy="no-referrer"/> -
+
Loading...