From db04abb922cd2dfebd2da4cff76880598cf7a4a9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9C=D0=B0?=
 =?UTF-8?q?=D0=BB=D1=8E=D0=B3=D0=B8=D0=BD?= <d.malygin@iqdev.digital>
Date: Sun, 25 Aug 2024 19:50:34 +0500
Subject: [PATCH] trying and trying...

---
 .env                          |   9 +--
 controllers/homeController.js |   7 +++
 index.js                      | 104 ++++++++++++++++------------------
 prisma/schema.prisma          |   2 +-
 services/homeService.js       |  51 ++++++++++++-----
 5 files changed, 99 insertions(+), 74 deletions(-)

diff --git a/.env b/.env
index b44961f..329b101 100644
--- a/.env
+++ b/.env
@@ -1,13 +1,14 @@
 PORT=5000
+FILES_PORT=5001
 DB_NAME=Shelf_note
 DB_USER=postgres
 DB_PASSWORD=xoxo2002!
 DB_HOST=localhost
 DB_PORT=5432
-// prisma db push
-; при запуске с родного ноутбука
-; DATABASE_URL="postgresql://postgres:xoxo2002!@localhost:5432/Shelf_note"
+# prisma db push
+# при запуске с родного ноутбука
+# DATABASE_URL="postgresql://postgres:xoxo2002!@localhost:5432/Shelf_note"
 
-; при запуске с рабочего ноутбука
+# при запуске с рабочего ноутбука
 DATABASE_URL="postgresql://postgres.wrwwvdgppriodcdoyohp:Xoxo2002!qwe@aws-0-eu-central-1.pooler.supabase.com:6543/postgres?pgbouncer=true"
 DIRECT_URL="postgresql://postgres.wrwwvdgppriodcdoyohp:Xoxo2002!qwe@aws-0-eu-central-1.pooler.supabase.com:5432/postgres"
diff --git a/controllers/homeController.js b/controllers/homeController.js
index ff8c524..1f2a697 100644
--- a/controllers/homeController.js
+++ b/controllers/homeController.js
@@ -24,6 +24,13 @@ class HomeController {
       console.log(error);
     }
   }
+  async createImageEntity(req) {
+    try {
+      return await HomeService.createImageEntity(req);
+    } catch (error) {
+      console.log(error);
+    }
+  }
   async editEntity(req) {
     try {
       return await HomeService.editEntity(req.body);
diff --git a/index.js b/index.js
index 023c6ea..2dd18a3 100644
--- a/index.js
+++ b/index.js
@@ -2,7 +2,8 @@ import 'dotenv/config';
 import { WebSocketServer } from 'ws';
 import HomeController from './controllers/homeController.js';
 
-const PORT = process.env.PORT || 5432;
+const PORT = process.env.PORT || 5000;
+const FILES_PORT = process.env.FILES_PORT || 5001;
 
 const users = new Set();
 
@@ -13,89 +14,80 @@ const wss = new WebSocketServer(
   () => console.log(`Started listen on port ${PORT}`)
 );
 
+const filesWss = new WebSocketServer(
+  {
+    port: FILES_PORT
+  },
+  () => console.log(`Started listen on port ${FILES_PORT}`)
+);
+
 wss.on('connection', (ws) => {
   users.add(ws);
   ws.id = Date.now();
   ws.on('message', async (req) => {
     req = JSON.parse(req);
+    console.log('req: ', req);
     switch (req.event) {
       case 'getHomeEntities':
         const getHomeEntitiesData = await HomeController.getEntities();
-        wss.clients.forEach((client) => {
-          client.send(
-            JSON.stringify({
-              event: 'getHomeEntities',
-              data: getHomeEntitiesData
-            })
-          );
+        getHomeEntitiesData.entitiesImages.forEach((entityBlob) => {
+          submitFilesToUsers(entityBlob);
         });
+        submitToUsers('getHomeEntities', getHomeEntitiesData.entities);
         break;
       case 'getHomeBackgroundUrl':
         const homeBackgroundUrl = await HomeController.getHomeBackgroundUrl();
-        wss.clients.forEach((client) => {
-          client.send(
-            JSON.stringify({
-              event: 'getHomeBackgroundUrl',
-              data: homeBackgroundUrl
-            })
-          );
-        });
+        submitToUsers('getHomeBackgroundUrl', homeBackgroundUrl);
         break;
       case 'createHomeEntity':
         const createdHomeEntity = await HomeController.createEntity(req);
-        wss.clients.forEach((client) => {
-          client.send(
-            JSON.stringify({
-              event: 'createHomeEntity',
-              data: createdHomeEntity
-            })
-          );
-        });
+        submitToUsers('createHomeEntity', createdHomeEntity);
         break;
       case 'editHomeEntity':
         const editedHomeEntity = await HomeController.editEntity(req);
-        wss.clients.forEach((client) => {
-          client.send(
-            JSON.stringify({
-              event: 'editHomeEntity',
-              data: editedHomeEntity
-            })
-          );
-        });
+        submitToUsers('editHomeEntity', editedHomeEntity);
         break;
       case 'deleteHomeEntity':
         const deletedHomeEntity = await HomeController.deleteEntity(req);
-        wss.clients.forEach((client) => {
-          client.send(
-            JSON.stringify({
-              event: 'deleteHomeEntity',
-              data: deletedHomeEntity
-            })
-          );
-        });
+        submitToUsers('deleteHomeEntity', deletedHomeEntity);
         break;
       case 'changeOrderHomeEntity':
         await HomeController.changeOrderEntity(req);
-        wss.clients.forEach((client) => {
-          client.send(
-            JSON.stringify({
-              event: 'changeOrderHomeEntity',
-              data: { ...req.body }
-            })
-          );
-        });
+        submitToUsers('changeOrderHomeEntity', { ...req.body });
         break;
       case 'changeHomeBackgroundUrl':
         await HomeController.changeHomeBackgroundUrl(req);
-        wss.clients.forEach((client) => {
-          client.send(
-            JSON.stringify({
-              event: 'changeHomeBackgroundUrl',
-              data: { ...req.body }
-            })
-          );
-        });
+        submitToUsers('changeHomeBackgroundUrl', { ...req.body });
         break;
     }
   });
 });
+
+filesWss.on('connection', (ws) => {
+  users.add(ws);
+  console.log('users: ', users.size);
+  ws.on('message', async (req) => {
+    console.log('req', req);
+    await HomeController.createImageEntity(req);
+    submitToUsers('createImageHomeEntity', 'Post data of image, please');
+  });
+});
+
+function submitToUsers(event, data) {
+  console.log('data in submitToUsers:', data);
+  wss.clients.forEach((client) => {
+    client.send(
+      JSON.stringify({
+        event: event,
+        data: data
+      })
+    );
+  });
+}
+
+function submitFilesToUsers(data) {
+  console.log('submitFilesToUsers', data);
+  filesWss.clients.forEach((client) => {
+    client.send(data);
+  });
+}
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 14e2031..1c09602 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -38,7 +38,7 @@ model Home_entity {
   font_size      String?
   paragraph_size String?
   text_position  String?
-  image_url     String? @db.Text
+  image_path     String? @db.Text
   image_width    Int?
   image_height   Int?
   entity_position String?
diff --git a/services/homeService.js b/services/homeService.js
index 2862ea2..e8a9fd8 100644
--- a/services/homeService.js
+++ b/services/homeService.js
@@ -6,9 +6,26 @@ const prisma = new PrismaClient();
 
 class HomeService {
   async getEntities() {
-    return prisma.home_entity.findMany({
+    const entitiesDB = await prisma.home_entity.findMany({
       orderBy: [{ entity_order: 'asc' }]
     });
+    const entitiesImages = [];
+    const entitiesToReturn = entitiesDB.map((entity) => {
+      if (!entity.image_width) return entity;
+      const imagePath = path.join(path.resolve(), `/public/images/${entity.entity_uuid}.jpg`);
+      const file = fs.readFileSync(imagePath);
+      console.log('file in readFile: ', file);
+      // const blob = new Blob([file], { type: 'image/jpeg' });
+      // console.log('blob: ', blob);
+      const buffer = Buffer.from(file, 'base64');
+      entitiesImages.push(buffer);
+      console.log('entitiesImages', entitiesImages);
+      return entity;
+    });
+    return {
+      entities: entitiesToReturn,
+      entitiesImages: entitiesImages
+    };
   }
   async getHomeBackgroundUrl() {
     return prisma.setting.findFirst({
@@ -18,19 +35,27 @@ class HomeService {
     });
   }
   async createEntity(body) {
-    let pathOfImage = '';
-    if (body.image_url) {
-      console.log('body.image_url', body.image_url);
-      // const response = await fetch(body.image_url);
-      // const blob = await body.image_url.blob();
-      const arrayBuffer = new ArrayBuffer(body.image_url);
-      // const arrayBuffer = await body.image_url.arrayBuffer();
-      const buffer = Buffer.from(arrayBuffer);
-      pathOfImage = path.join(path.resolve(), `/public/images/${body.entity_uuid}`);
-      console.log('pathOfImage', pathOfImage);
-      fs.writeFile(pathOfImage, buffer, () => console.log('Written!'));
+    if (body.image_blob) {
+      const imagePath = path.join(path.resolve(), `/public/images/image.jpg`);
+      let newImagePath = imagePath.split('\\');
+      newImagePath.splice(-1);
+      console.log('1 newImagePath', newImagePath);
+      newImagePath.push(`${body.entity_uuid}.jpg`);
+      console.log('2 newImagePath', newImagePath);
+      newImagePath = newImagePath.join('\\');
+      console.log('3 newImagePath', newImagePath);
+      fs.rename(imagePath, newImagePath, function (err) {
+        if (err) console.log('ERROR in fs.rename: ' + err);
+      });
+      delete body.image_blob;
+      body.image_path = newImagePath;
+      console.log('body image: ', body);
     }
-    return prisma.home_entity.create({ data: { ...body, image_url: pathOfImage } });
+    return prisma.home_entity.create({ data: { ...body } });
+  }
+  async createImageEntity(body) {
+    const imagePath = path.join(path.resolve(), `/public/images/image.jpg`);
+    fs.writeFileSync(imagePath, body);
   }
   async editEntity(body) {
     return prisma.home_entity.update({
-- 
GitLab