Canvas: Issue update if previously deployed

Change-Id: I7ffbba814154eb9129fbe035ce15278cb8e25fe9
diff --git a/.gitignore b/.gitignore
index a4db0a6..ced49da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,4 +17,6 @@
 .vscode/
 .hugo_build.lock
 dist
-node_modules
\ No newline at end of file
+node_modules
+prisma
+*.db
\ No newline at end of file
diff --git a/apps/canvas/back/index.js b/apps/canvas/back/index.js
index c5ffd89..425285c 100644
--- a/apps/canvas/back/index.js
+++ b/apps/canvas/back/index.js
@@ -98,7 +98,6 @@
         else {
             resp.status(200);
             resp.header("content-type", "application/json");
-            console.log(r);
             if (r.draft == null) {
                 if (r.state == null) {
                     resp.send({
@@ -108,11 +107,11 @@
                     });
                 }
                 else {
-                    resp.send(JSON.parse(r.state.toString()));
+                    resp.send(JSON.parse(Buffer.from(r.state).toString("utf8")));
                 }
             }
             else {
-                resp.send(JSON.parse(Buffer.from(r.state).toString("utf8")));
+                resp.send(JSON.parse(Buffer.from(r.draft).toString("utf8")));
             }
         }
     }
@@ -126,30 +125,70 @@
 });
 const handleDeploy = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
     try {
-        console.log(req.params);
+        const projectId = Number(req.params["projectId"]);
         const state = Buffer.from(JSON.stringify(req.body.state));
+        const p = yield db.project.findUnique({
+            where: {
+                id: projectId,
+            },
+            select: {
+                instanceId: true,
+            }
+        });
+        if (p === null) {
+            resp.status(404);
+            return;
+        }
         yield db.project.update({
             where: {
-                id: Number(req.params["projectId"]),
+                id: projectId,
             },
             data: {
                 draft: state,
             },
         });
-        const r = yield axios_1.default.post("http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app", { config: req.body.config });
-        if (r.status === 200) {
-            const d = r.data;
-            yield db.project.update({
-                where: {
-                    id: Number(req.params["projectId"]),
-                },
+        let r;
+        if (p.instanceId == null) {
+            r = yield axios_1.default.request({
+                url: "http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app",
+                method: "post",
                 data: {
-                    state,
-                    draft: null,
-                    instanceId: d.id,
-                    deployKey: d.deployKey,
-                },
+                    config: req.body.config,
+                }
             });
+            if (r.status === 200) {
+                yield db.project.update({
+                    where: {
+                        id: projectId,
+                    },
+                    data: {
+                        state,
+                        draft: null,
+                        instanceId: r.data.id,
+                        deployKey: r.data.deployKey,
+                    },
+                });
+            }
+        }
+        else {
+            r = yield axios_1.default.request({
+                url: `http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app/${p.instanceId}`,
+                method: "put",
+                data: {
+                    config: req.body.config,
+                }
+            });
+            if (r.status === 200) {
+                yield db.project.update({
+                    where: {
+                        id: projectId,
+                    },
+                    data: {
+                        state,
+                        draft: null,
+                    },
+                });
+            }
         }
     }
     catch (e) {
diff --git a/apps/canvas/back/index.ts b/apps/canvas/back/index.ts
index b103756..6193a90 100644
--- a/apps/canvas/back/index.ts
+++ b/apps/canvas/back/index.ts
@@ -82,19 +82,18 @@
         } else {
             resp.status(200);
             resp.header("content-type", "application/json");
-            console.log(r);
             if (r.draft == null) {
                 if (r.state == null) {
                     resp.send({
-                        nodes: [], 
+                        nodes: [],
                         edges: [],
-                        viewport: { x: 0, y: 0, zoom: 1},
-                    });    
+                        viewport: { x: 0, y: 0, zoom: 1 },
+                    });
                 } else {
-                    resp.send(JSON.parse(r.state.toString()));
+                    resp.send(JSON.parse(Buffer.from(r.state).toString("utf8")));
                 }
             } else {
-                resp.send(JSON.parse(Buffer.from(r.state!).toString("utf8")));
+                resp.send(JSON.parse(Buffer.from(r.draft).toString("utf8")));
             }
         }
     } catch (e) {
@@ -107,30 +106,69 @@
 
 const handleDeploy: express.Handler = async (req, resp) => {
     try {
-        console.log(req.params);
+        const projectId = Number(req.params["projectId"]);
         const state = Buffer.from(JSON.stringify(req.body.state));
+        const p = await db.project.findUnique({
+            where: {
+                id: projectId,
+            },
+            select: {
+                instanceId: true,
+            }
+        });
+        if (p === null) {
+            resp.status(404);
+            return;
+        }
         await db.project.update({
             where: {
-                id: Number(req.params["projectId"]),
+                id: projectId,
             },
             data: {
                 draft: state,
             },
         });
-        const r = await axios.post("http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app", { config: req.body.config });
-        if (r.status === 200) {
-            const d = r.data as { id: string, deployKey: string };
-            await db.project.update({
-                where: {
-                    id: Number(req.params["projectId"]),
-                },
+        let r: { status: number, data: { id: string, deployKey: string } };
+        if (p.instanceId == null) {
+            r = await axios.request({
+                url: "http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app",
+                method: "post",
                 data: {
-                    state,
-                    draft: null,
-                    instanceId: d.id,
-                    deployKey: d.deployKey,
-                },
+                    config: req.body.config,
+                }
             });
+            if (r.status === 200) {
+                await db.project.update({
+                    where: {
+                        id: projectId,
+                    },
+                    data: {
+                        state,
+                        draft: null,
+                        instanceId: r.data.id,
+                        deployKey: r.data.deployKey,
+                    },
+                });
+            }
+        } else {
+            r = await axios.request({
+                url: `http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app/${p.instanceId}`,
+                method: "put",
+                data: {
+                    config: req.body.config,
+                }
+            });
+            if (r.status === 200) {
+                await db.project.update({
+                    where: {
+                        id: projectId,
+                    },
+                    data: {
+                        state,
+                        draft: null,
+                    },
+                });
+            }
         }
     } catch (e) {
         console.log(e);
diff --git a/apps/canvas/back/prisma/dodo.db b/apps/canvas/back/prisma/dodo.db
index 452bd48..3bd29ba 100644
--- a/apps/canvas/back/prisma/dodo.db
+++ b/apps/canvas/back/prisma/dodo.db
Binary files differ