diff --git a/.env b/.env index b44961fa91b24da648c93a1500aacf06d237f6e2..329b1011cb05fc8855757b47cc941249d9c58f19 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 ff8c524bee203fea635e75fa81ce413a412475ca..1f2a6979a9f51dc0096e2db92198a186fea7af07 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 023c6ea3ab96ca15cdc2ae6284d162b3b6d074d0..2dd18a3b5b331a271b8a51fa3344fde71b36ce73 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 14e2031170ebc329a6f4d379022188dae9fff317..1c09602b8b3b5bc6f76768b22efb0966c97ab92a 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 2862ea2a75255fe2db1420869260aabae0c15e47..e8a9fd8a1821c39ddd2ef316baf14b6da94932a5 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({