diff --git a/.env b/.env index 329b1011cb05fc8855757b47cc941249d9c58f19..8133a82ec7849eb5ce07b74dc917ebec30dd74a4 100644 --- a/.env +++ b/.env @@ -7,8 +7,8 @@ DB_HOST=localhost DB_PORT=5432 # prisma db push # при запуÑке Ñ Ñ€Ð¾Ð´Ð½Ð¾Ð³Ð¾ ноутбука -# DATABASE_URL="postgresql://postgres:xoxo2002!@localhost:5432/Shelf_note" + 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" +# 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/.gitignore b/.gitignore index 9d78a2b8be2f6beac79d4fa4c2ad357b5d73500d..5288bc4f98889b969751cb944f86a4dac89afa9c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ yarn-error.log* pnpm-debug.log* lerna-debug.log* +public node_modules .DS_Store dist diff --git a/controllers/homeController.js b/controllers/homeController.js index 1f2a6979a9f51dc0096e2db92198a186fea7af07..0250e88fc76cf3318cb547d783a96b32f6fd4891 100644 --- a/controllers/homeController.js +++ b/controllers/homeController.js @@ -1,17 +1,31 @@ import HomeService from '../services/homeService.js'; class HomeController { - async getEntities() { + async getHomeBackground() { try { - return await HomeService.getEntities(); + return await HomeService.getHomeBackground(); } catch (error) { console.log(error); return error; } } - async getHomeBackgroundUrl() { + async changeHomeBackground(req) { + try { + return await HomeService.changeHomeBackground(req.body); + } catch (error) { + console.log(error); + } + } + async removeHomeBackground() { + try { + await HomeService.removeHomeBackground(); + } catch (error) { + console.log(error); + } + } + async getEntities() { try { - return await HomeService.getHomeBackgroundUrl(); + return await HomeService.getEntities(); } catch (error) { console.log(error); return error; @@ -24,9 +38,9 @@ class HomeController { console.log(error); } } - async createImageEntity(req) { + async createImage(req) { try { - return await HomeService.createImageEntity(req); + return await HomeService.createImage(req); } catch (error) { console.log(error); } @@ -38,23 +52,23 @@ class HomeController { console.log(error); } } - async deleteEntity(req) { + async cropImage(req) { try { - return await HomeService.deleteEntity(req.body); + return await HomeService.cropImage(req.body); } catch (error) { console.log(error); } } - async changeOrderEntity(req) { + async deleteEntity(req) { try { - return await HomeService.changeOrderEntity(req.body); + return await HomeService.deleteEntity(req.body); } catch (error) { console.log(error); } } - async changeHomeBackgroundUrl(req) { + async changeOrderEntity(req) { try { - return await HomeService.changeHomeBackgroundUrl(req.body); + return await HomeService.changeOrderEntity(req.body); } catch (error) { console.log(error); } diff --git a/index.js b/index.js index 2dd18a3b5b331a271b8a51fa3344fde71b36ce73..3b9e5bacd075f8f81e5ec59c6aa4256a74510402 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,8 @@ import 'dotenv/config'; import { WebSocketServer } from 'ws'; import HomeController from './controllers/homeController.js'; +import path from 'node:path'; +import fs from 'node:fs'; const PORT = process.env.PORT || 5000; const FILES_PORT = process.env.FILES_PORT || 5001; @@ -26,27 +28,40 @@ wss.on('connection', (ws) => { ws.id = Date.now(); ws.on('message', async (req) => { req = JSON.parse(req); - console.log('req: ', req); + // console.log('req: ', req); switch (req.event) { + case 'getHomeBackground': + const homeBackground = await HomeController.getHomeBackground(); + submitFilesToUsers(homeBackground); + break; + case 'changeHomeBackground': + await HomeController.changeHomeBackground(req); + submitToUsers('changeHomeBackground', { ...req.body }); + break; + case 'removeHomeBackground': + await HomeController.removeHomeBackground(); + break; case 'getHomeEntities': const getHomeEntitiesData = await HomeController.getEntities(); - getHomeEntitiesData.entitiesImages.forEach((entityBlob) => { - submitFilesToUsers(entityBlob); + getHomeEntitiesData.entitiesImages.forEach((entityBuffer) => { + submitFilesToUsers(entityBuffer); }); submitToUsers('getHomeEntities', getHomeEntitiesData.entities); break; - case 'getHomeBackgroundUrl': - const homeBackgroundUrl = await HomeController.getHomeBackgroundUrl(); - submitToUsers('getHomeBackgroundUrl', homeBackgroundUrl); - break; case 'createHomeEntity': const createdHomeEntity = await HomeController.createEntity(req); submitToUsers('createHomeEntity', createdHomeEntity); break; - case 'editHomeEntity': + case 'editHomeEntity': { const editedHomeEntity = await HomeController.editEntity(req); submitToUsers('editHomeEntity', editedHomeEntity); break; + } + case 'cropImage': { + const editedHomeEntity = await HomeController.cropImage(req); + submitToUsers('editHomeEntity', editedHomeEntity); + break; + } case 'deleteHomeEntity': const deletedHomeEntity = await HomeController.deleteEntity(req); submitToUsers('deleteHomeEntity', deletedHomeEntity); @@ -55,10 +70,6 @@ wss.on('connection', (ws) => { await HomeController.changeOrderEntity(req); submitToUsers('changeOrderHomeEntity', { ...req.body }); break; - case 'changeHomeBackgroundUrl': - await HomeController.changeHomeBackgroundUrl(req); - submitToUsers('changeHomeBackgroundUrl', { ...req.body }); - break; } }); }); @@ -67,14 +78,14 @@ 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'); + console.log('req: ', req); + await HomeController.createImage(req); + submitToUsers('createImageHomeEntity', ''); }); }); function submitToUsers(event, data) { - console.log('data in submitToUsers:', data); + // console.log('data in submitToUsers:', data); wss.clients.forEach((client) => { client.send( JSON.stringify({ @@ -86,7 +97,6 @@ function submitToUsers(event, 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 1c09602b8b3b5bc6f76768b22efb0966c97ab92a..5d5d2017f469ebc071bb1f808200c3ef9155c5c1 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -12,7 +12,7 @@ datasource db { provider = "postgresql" url = env("DATABASE_URL") // при запуÑке Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ ноутбука - directUrl = env("DIRECT_URL") + // directUrl = env("DIRECT_URL") } model User { @@ -24,13 +24,11 @@ model User { email String? phone_number String? settings Json? - home_entities Home_entity[] + home_entities Json? } model Home_entity { entity_uuid String @id @default(uuid()) - entity_user User? @relation(fields: [user_nick_name], references: [nick_name]) - user_nick_name String? @unique entity_order Int @default(autoincrement()) entity_type String title String? @@ -49,6 +47,7 @@ model Home_entity { } model Setting { + setting_uuid String @id @default(uuid()) setting_name String @unique setting_value String } diff --git a/services/homeService.js b/services/homeService.js index e8a9fd8a1821c39ddd2ef316baf14b6da94932a5..e66810c35256b3e36831ce149d73e0eb9467965d 100644 --- a/services/homeService.js +++ b/services/homeService.js @@ -5,6 +5,55 @@ import path from 'node:path'; const prisma = new PrismaClient(); class HomeService { + async getHomeBackground() { + const backgroundInfo = await prisma.setting.findFirst({ + where: { + setting_name: 'homeBackground' + } + }); + if (backgroundInfo?.setting_value) { + const file = fs.readFileSync(backgroundInfo.setting_value); + return Buffer.from(file, 'base64'); + } + } + async changeHomeBackground(body) { + console.log('body in changeHomeBackground: ', body); + const response = await fetch(body.setting_value); + const blob = await response.blob(); + const arrayBuffer = await blob.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + const extension = body.extension.split('/')[1]; + const imagePath = path.join(path.resolve(), `/public/images/backgrounds/homeBackground.jpg`); + fs.writeFileSync(imagePath, buffer); + + delete body.extension; + body.setting_value = imagePath; + const homeBackground = await prisma.setting.findFirst({ + where: { + setting_name: 'homeBackground' + } + }); + if (homeBackground) { + return prisma.setting.update({ + where: { + setting_name: 'homeBackground' + }, + data: { ...body } + }); + } + return prisma.setting.create({ data: { ...body } }); + } + async removeHomeBackground() { + const imagePath = path.join(path.resolve(), `/public/images/backgrounds/homeBackground.jpg`); + fs.unlink(imagePath, (err) => { + if (err) throw err; + }); + await prisma.setting.delete({ + where: { + setting_name: 'homeBackground' + } + }); + } async getEntities() { const entitiesDB = await prisma.home_entity.findMany({ orderBy: [{ entity_order: 'asc' }] @@ -14,12 +63,12 @@ class HomeService { 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); + // 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); + // console.log('entitiesImages', entitiesImages); return entity; }); return { @@ -27,36 +76,45 @@ class HomeService { entitiesImages: entitiesImages }; } - async getHomeBackgroundUrl() { - return prisma.setting.findFirst({ - where: { - setting_name: 'homeBackgroundUrl' - } - }); - } async createEntity(body) { - if (body.image_blob) { + if (body.image_buffer) { const imagePath = path.join(path.resolve(), `/public/images/image.jpg`); - let newImagePath = imagePath.split('\\'); + 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); + newImagePath = newImagePath.join('/'); + console.log('imagePath', imagePath); + console.log('newImagePath', newImagePath); fs.rename(imagePath, newImagePath, function (err) { if (err) console.log('ERROR in fs.rename: ' + err); }); - delete body.image_blob; + delete body.image_buffer; body.image_path = newImagePath; console.log('body image: ', body); } return prisma.home_entity.create({ data: { ...body } }); } - async createImageEntity(body) { + // единÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ð¿Ð¾ Ñокету Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² + async createImage(body) { const imagePath = path.join(path.resolve(), `/public/images/image.jpg`); fs.writeFileSync(imagePath, body); } + async cropImage(body) { + const imagePath = path.join(path.resolve(), `/public/images/image.jpg`); + fs.unlink(body.image_path, (err) => { + if (err) throw err; + }); + fs.rename(imagePath, body.image_path, function (err) { + if (err) throw err; + }); + delete body.imageUrl; + return prisma.home_entity.update({ + where: { + entity_uuid: body.entity_uuid + }, + data: { ...body } + }); + } async editEntity(body) { return prisma.home_entity.update({ where: { @@ -76,6 +134,10 @@ class HomeService { entity_uuid: body.entity_uuid } }); + if (body.image_width) + fs.unlink(body.image_path, (err) => { + if (err) throw err; + }); return deletedEntity; } async changeOrderEntity(body) { @@ -105,22 +167,6 @@ class HomeService { }); return body; } - async changeHomeBackgroundUrl(body) { - const homeBackgroundUrl = await prisma.setting.findFirst({ - where: { - setting_name: 'homeBackgroundUrl' - } - }); - if (homeBackgroundUrl) { - return prisma.setting.update({ - where: { - setting_name: 'homeBackgroundUrl' - }, - data: { ...body } - }); - } - return prisma.setting.create({ data: { ...body } }); - } } export default new HomeService(); diff --git a/yarn.lock b/yarn.lock index 334659924f203e1acdf181bad9ded275f7cfa34d..41a4664401d7da79ee2c8c1dfb413823f8384a79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,31 @@ # yarn lockfile v1 +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@prisma/client@^5.18.0": version "5.18.0" resolved "https://registry.npmjs.org/@prisma/client/-/client-5.18.0.tgz" @@ -43,6 +68,103 @@ dependencies: "@prisma/debug" "5.18.0" +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/node@^22.3.0": + version "22.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.0.tgz#10f01fe9465166b4cab72e75f60d8b99d019f958" + integrity sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg== + dependencies: + undici-types "~6.19.2" + +acorn-walk@^8.1.1: + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +chokidar@^3.5.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + cors@^2.8.5: version "2.8.5" resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" @@ -51,11 +173,119 @@ cors@^2.8.5: object-assign "^4" vary "^1" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +debug@^4: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dotenv@^16.4.5: version "16.4.5" resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nodemon@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.4.tgz#c34dcd8eb46a05723ccde60cbdd25addcc8725e4" + integrity sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ== + dependencies: + chokidar "^3.5.2" + debug "^4" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + object-assign@^4: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -104,7 +334,7 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^8.12.0, pg@>=8.0: +pg@^8.12.0: version "8.12.0" resolved "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz" integrity sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ== @@ -124,6 +354,11 @@ pgpass@1.x: dependencies: split2 "^4.1.0" +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" @@ -146,23 +381,110 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -prisma@*, prisma@^5.18.0: +prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + +prisma@^5.18.0: version "5.18.0" resolved "https://registry.npmjs.org/prisma/-/prisma-5.18.0.tgz" integrity sha512-+TrSIxZsh64OPOmaSgVPH7ALL9dfU0jceYaMJXsNrTkFHO7/3RANi5K2ZiPB1De9+KDxCWn7jvRq8y8pvk+o9g== dependencies: "@prisma/engines" "5.18.0" +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +semver@^7.5.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + split2@^4.1.0: version "4.2.0" resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== +supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +touch@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" + integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +typescript@^5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + underscore@^1.13.1: version "1.13.7" resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz" integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + vary@^1: version "1.1.2" resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" @@ -177,3 +499,8 @@ xtend@^4.0.0: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==