diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 36db60f2a5cb2f55d69aa17418f547f6a7d6284f..abc8eca0fb52a11aa935e12f49a65bf16988a28f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -24,17 +24,17 @@ model User { middle_name String? last_name String? settings Json? - pages_uuid Json? + sheets_uuid Json? } -model Page { +model Sheet { user_uuid String - page_uuid String @id @default(uuid()) - page_title String - page_icon String - page_navigation_order String + sheet_uuid String @id @default(uuid()) + sheet_title String + sheet_icon String + sheet_navigation_order String background_path String? @db.Text - page_entities Json? + sheet_entities Json? } model Entity { diff --git a/src/controllers/entitiesController.ts b/src/controllers/entitiesController.ts index 7efa4691fa176edfa3c58242d163e41272ef7d0a..a6415b7fd669936f5b50552dc1dff98f291506e0 100644 --- a/src/controllers/entitiesController.ts +++ b/src/controllers/entitiesController.ts @@ -1,5 +1,5 @@ import EntitiesService from '../services/entitiesService'; -import { IBodyPageUuid, IChangeEntitiesOrder, IWSRequest } from '../interface/requests'; +import { IBodySheetUuid, IChangeEntitiesOrder, IWSRequest } from '../interface/requests'; import { IEntity } from '../interface/database'; class EntitiesController { @@ -17,9 +17,9 @@ class EntitiesController { console.log(error); } } - async getEntities(req: IWSRequest<'getEntities', IBodyPageUuid>) { + async getEntities(req: IWSRequest<'getEntities', IBodySheetUuid>) { try { - return await EntitiesService.getEntities(req.body.page_uuid); + return await EntitiesService.getEntities(req.body.sheet_uuid); } catch (error) { console.log(error); return error; diff --git a/src/controllers/pagesController.ts b/src/controllers/pagesController.ts deleted file mode 100644 index 231e942a1f74ad7edeed7e680f509b969add6d04..0000000000000000000000000000000000000000 --- a/src/controllers/pagesController.ts +++ /dev/null @@ -1,60 +0,0 @@ -import PagesService from '../services/pagesService'; -import { IEditPageBackground, IBodyPageUuid, IWSRequest, IBodyPage } from '../interface/requests'; - -class PagesController { - async createPage(req: IWSRequest<'createPage', IBodyPage>) { - try { - return await PagesService.createPage(req.body); - } catch (error) { - console.log(error); - return error; - } - } - async getPage(req: IWSRequest<'getPage', IBodyPageUuid>) { - try { - return await PagesService.getPage(req.body); - } catch (error) { - console.log(error); - return error; - } - } - async getPageBackground(req: IWSRequest<'deletePageBackground', IBodyPageUuid>) { - try { - return await PagesService.getPageBackground(req.body.page_uuid); - } catch (error) { - console.log(error); - return error; - } - } - async editPage(req: IWSRequest<'editPage', IBodyPage>) { - try { - return await PagesService.editPage(req.body); - } catch (error) { - console.log(error); - return error; - } - } - async editPageBackground(req: IWSRequest<'editPageBackground', IEditPageBackground>) { - try { - return await PagesService.editPageBackground(req.body); - } catch (error) { - console.log(error); - } - } - async deletePage(req: IWSRequest<'deletePage', IBodyPage>) { - try { - return PagesService.deletePage(req.body); - } catch (error) { - console.log(error); - } - } - async deletePageBackground(req: IWSRequest<'deletePageBackground', IBodyPageUuid>) { - try { - await PagesService.deletePageBackground(req.body.page_uuid); - } catch (error) { - console.log(error); - } - } -} - -export default new PagesController(); diff --git a/src/controllers/sheetsController.ts b/src/controllers/sheetsController.ts new file mode 100644 index 0000000000000000000000000000000000000000..fef2932e533789eb150a10da5be8b8c22f2efae9 --- /dev/null +++ b/src/controllers/sheetsController.ts @@ -0,0 +1,65 @@ +import SheetsService from '../services/sheetsService'; +import { + IEditSheetBackground, + IBodySheetUuid, + IWSRequest, + IBodySheet +} from '../interface/requests'; + +class SheetsController { + async createSheet(req: IWSRequest<'createSheet', IBodySheet>) { + try { + return await SheetsService.createSheet(req.body); + } catch (error) { + console.log(error); + return error; + } + } + async getSheet(req: IWSRequest<'getSheet', IBodySheetUuid>) { + try { + return await SheetsService.getSheet(req.body); + } catch (error) { + console.log(error); + return error; + } + } + async getSheetBackground(req: IWSRequest<'deleteSheetBackground', IBodySheetUuid>) { + try { + return await SheetsService.getSheetBackground(req.body.sheet_uuid); + } catch (error) { + console.log(error); + return error; + } + } + async editSheet(req: IWSRequest<'editSheet', IBodySheet>) { + try { + return await SheetsService.editSheet(req.body); + } catch (error) { + console.log(error); + return error; + } + } + async editSheetBackground(req: IWSRequest<'editSheetBackground', IEditSheetBackground>) { + try { + return await SheetsService.editSheetBackground(req.body); + } catch (error) { + console.log(error); + } + } + async deleteSheet(req: IWSRequest<'deleteSheet', IBodySheet>) { + try { + return SheetsService.deleteSheet(req.body); + } catch (error) { + console.log(error); + } + } + async deleteSheetBackground(req: IWSRequest<'deleteSheetBackground', IBodySheetUuid>) { + try { + await SheetsService.deleteSheetBackground(req.body.sheet_uuid); + } catch (error) { + console.log(error); + } + } +} + +export default new SheetsController(); diff --git a/src/interface/database.ts b/src/interface/database.ts index 8ed34e7a60b7a8a52bb03ecd367b090745d5cdfc..dc7a56430e192327056dc41ce1ace6e8139d4fa2 100644 --- a/src/interface/database.ts +++ b/src/interface/database.ts @@ -1,9 +1,9 @@ -export interface IPageEntity { +export interface ISheetEntity { entity_uuid: string; entity_type: 'divider' | 'paragraph' | 'image' | 'table'; } export interface IEntity { - page_uuid?: string; + sheet_uuid?: string; entity_uuid: string; entity_type: 'divider' | 'paragraph' | 'image' | 'table'; entity_order?: number; diff --git a/src/interface/requests.ts b/src/interface/requests.ts index 127cffa0a20b87717365692a3823fb60e1e2ff01..21940f90b7818ea671d7b8369448e353eeeda4a9 100644 --- a/src/interface/requests.ts +++ b/src/interface/requests.ts @@ -2,13 +2,13 @@ export interface IWSRequest<T, B> { event: T; body: B; } -export interface IBodyPage { +export interface IBodySheet { user_uuid: string; - page_title: string; - page_navigation_order?: string; - page_icon?: string; - page_uuid?: string; - page_entities?: string; + sheet_title: string; + sheet_navigation_order?: string; + sheet_icon?: string; + sheet_uuid?: string; + sheet_entities?: string; } export interface IBodyUser { nick_name: string; @@ -19,11 +19,11 @@ export interface IBodyUser { last_name?: string; user_uuid?: string; } -export interface IBodyPageUuid { - page_uuid: string; +export interface IBodySheetUuid { + sheet_uuid: string; } -export interface IEditPageBackground { - page_uuid: string; +export interface IEditSheetBackground { + sheet_uuid: string; background_url: string; } interface IEntityUuidAndOrder { diff --git a/src/routes/websocket.ts b/src/routes/websocket.ts index c2fba9b01206786ea2da5c4200bf7446c8dd1367..a6ea71ff03c9e5a0e2bf8d720d94c06c2ed2aa2e 100644 --- a/src/routes/websocket.ts +++ b/src/routes/websocket.ts @@ -1,6 +1,6 @@ import EntitiesController from '../controllers/entitiesController'; import { submitFilesToUsers, submitToUsers } from '../index'; -import PagesController from '../controllers/pagesController'; +import SheetsController from '../controllers/sheetsController'; import UsersController from '../controllers/usersController'; export const websocketRoute = async (req: any) => { @@ -9,12 +9,12 @@ export const websocketRoute = async (req: any) => { case 'createUser': const createdUserData = await UsersController.createUser(req); submitToUsers('createEntity', createdUserData.startEntity); - submitToUsers('createPage', createdUserData.homePage); + submitToUsers('createSheet', createdUserData.homeSheet); submitToUsers('createUser', createdUserData.createdUser); break; - case 'createPage': - const createdPage = await PagesController.createPage(req); - submitToUsers('createPage', createdPage); + case 'createSheet': + const createdSheet = await SheetsController.createSheet(req); + submitToUsers('createSheet', createdSheet); break; case 'createEntity': const createdEntity = await EntitiesController.createEntity(req); @@ -25,33 +25,33 @@ export const websocketRoute = async (req: any) => { const userInfo = await UsersController.getUser(req); submitToUsers('getUser', userInfo); break; - case 'getPage': - const pageInfo = await PagesController.getPage(req); - submitToUsers('getPage', pageInfo); + case 'getSheet': + const sheetInfo = await SheetsController.getSheet(req); + submitToUsers('getSheet', sheetInfo); break; - case 'getPageBackground': - const homeBackground = await PagesController.getPageBackground(req); + case 'getSheetBackground': + const homeBackground = await SheetsController.getSheetBackground(req); submitFilesToUsers(homeBackground); break; - case 'getPageEntities': - const getPageEntitiesData = await EntitiesController.getEntities(req); - getPageEntitiesData.entitiesImages.forEach((entityBuffer: Buffer) => { + case 'getSheetEntities': + const getSheetEntitiesData = await EntitiesController.getEntities(req); + getSheetEntitiesData.entitiesImages.forEach((entityBuffer: Buffer) => { submitFilesToUsers(entityBuffer); }); - submitToUsers('getPageEntities', getPageEntitiesData.entities); + submitToUsers('getSheetEntities', getSheetEntitiesData.entities); break; // update case 'editUser': const editedUser = await UsersController.editUser(req); submitToUsers('editUser', editedUser); break; - case 'editPage': - const editedPage = await PagesController.editPage(req); - submitToUsers('editPage', editedPage); + case 'editSheet': + const editedSheet = await SheetsController.editSheet(req); + submitToUsers('editSheet', editedSheet); break; - case 'editPageBackground': - await PagesController.editPageBackground(req); - submitToUsers('editPageBackground', { ...req.body }); + case 'editSheetBackground': + await SheetsController.editSheetBackground(req); + submitToUsers('editSheetBackground', { ...req.body }); break; case 'editEntity': { const editedHomeEntity = await EntitiesController.editEntity(req); @@ -77,12 +77,12 @@ export const websocketRoute = async (req: any) => { const deletedUser = await UsersController.deleteUser(req); submitToUsers('deleteUser', deletedUser); break; - case 'deletePage': - const deletedPage = await PagesController.deletePage(req); - submitToUsers('deletePage', deletedPage); + case 'deleteSheet': + const deletedSheet = await SheetsController.deleteSheet(req); + submitToUsers('deleteSheet', deletedSheet); break; - case 'deletePageBackground': - await PagesController.deletePageBackground(req); + case 'deleteSheetBackground': + await SheetsController.deleteSheetBackground(req); break; case 'deleteEntity': const deletedEntity = await EntitiesController.deleteEntity(req); diff --git a/src/services/entitiesService.ts b/src/services/entitiesService.ts index 2f53357310b2c325a4e24262680cc6db5506994c..c406ccc6c9b229a0f6d1a6e0e92ecde670141b1e 100644 --- a/src/services/entitiesService.ts +++ b/src/services/entitiesService.ts @@ -10,7 +10,7 @@ import { getPrismaEntity, updatePrismaEntity } from '../helpers'; -import PagesService from './pagesService'; +import SheetsService from './sheetsService'; const prisma = new PrismaClient(); @@ -33,10 +33,10 @@ class EntitiesService { body.image_path = newImagePath; } - const page_uuid = body.page_uuid!; - delete body.page_uuid; + const sheet_uuid = body.sheet_uuid!; + delete body.sheet_uuid; const createdEntity = createPrismaEntity(body); - await PagesService.addPageEntity(body, page_uuid); + await SheetsService.addSheetEntity(body, sheet_uuid); return createdEntity; } // единÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ð¿Ð¾ Ñокету Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² @@ -48,17 +48,17 @@ class EntitiesService { const imagePath = path.join(path.resolve(), `/public/images/image.jpg`); fs.writeFileSync(imagePath, body); } - async getEntities(page_uuid: string) { - const pageInfo = await prisma.page.findFirst({ + async getEntities(sheet_uuid: string) { + const sheetInfo = await prisma.sheet.findFirst({ where: { - page_uuid: page_uuid + sheet_uuid: sheet_uuid } }); - const pageEntities = pageInfo.page_entities; - if (pageEntities) { + const sheetEntities = sheetInfo.sheet_entities; + if (sheetEntities) { const entitiesToReturn: IEntity[] = []; - for (const pageEntity of pageEntities) { - const entityToPush = await getPrismaEntity(pageEntity); + for (const sheetEntity of sheetEntities) { + const entityToPush = await getPrismaEntity(sheetEntity); entitiesToReturn.push(entityToPush); } const entitiesImages: Buffer[] = []; @@ -144,7 +144,7 @@ class EntitiesService { }); } } - await PagesService.deletePageEntity(body.page_uuid, body.entity_uuid); + await SheetsService.deleteSheetEntity(body.sheet_uuid, body.entity_uuid); return { entity_uuid: body.entity_uuid }; diff --git a/src/services/pagesService.ts b/src/services/pagesService.ts deleted file mode 100644 index 3a7071ac29561db7a498ba1f324bb6b7e4d2f687..0000000000000000000000000000000000000000 --- a/src/services/pagesService.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import * as fs from 'node:fs'; -import path from 'node:path'; -import { IBodyPage, IBodyPageUuid, IEditPageBackground } from '../interface/requests'; -import { randomUUID } from 'node:crypto'; -import UsersService from './usersService'; -import { IEntity } from '../interface/database'; - -const prisma = new PrismaClient(); - -class PagesService { - async createPage(body: IBodyPage) { - body.page_uuid = randomUUID(); - body.page_icon = 'page'; - await UsersService.addUserPage(body.page_uuid, body.user_uuid); - return prisma.page.create({ data: body }); - } - async getPage(body: IBodyPageUuid) { - return prisma.page.findFirst({ - where: { - page_uuid: body.page_uuid - } - }); - } - async getPageBackground(page_uuid: string) { - const backgroundInfo = await prisma.page.findFirst({ - where: { - page_uuid: page_uuid - } - }); - if (backgroundInfo?.background_path) { - const file = fs.readFileSync(backgroundInfo.background_path); - return Buffer.from(file); - } - } - async addPageEntity(body: IEntity, page_uuid: string) { - const page = await prisma.page.findFirst({ - where: { - page_uuid - } - }); - let pageEntities = page.page_entities; - const newEntity = { - entity_type: body.entity_type, - entity_uuid: body.entity_uuid - }; - if (pageEntities?.length) { - pageEntities.push(newEntity); - } else pageEntities = [newEntity]; - page.page_entities = pageEntities; - await prisma.page.update({ - data: page, - where: { - page_uuid - } - }); - } - async editPage(body: IBodyPageUuid) { - return prisma.page.update({ - where: { - page_uuid: body.page_uuid - }, - data: body - }); - } - async editPageBackground(body: IEditPageBackground) { - const response = await fetch(body.background_url); - const blob = await response.blob(); - const arrayBuffer = await blob.arrayBuffer(); - const buffer = Buffer.from(arrayBuffer); - const imagePath = path.join(path.resolve(), `/public/images/backgrounds/homeBackground.jpg`); - fs.writeFileSync(imagePath, buffer); - const currentPage = await prisma.page.findFirst({ - where: { - page_uuid: body.page_uuid - } - }); - if (currentPage) { - return prisma.page.update({ - where: { - page_uuid: body.page_uuid - }, - data: { ...currentPage, background_path: imagePath } - }); - } - } - async deletePage(page: IBodyPage) { - await UsersService.deleteUserPage(page.page_uuid!, page.user_uuid); - return prisma.page.delete({ - where: { - page_uuid: page.page_uuid - } - }); - } - async deletePageEntity(page_uuid: string, entity_uuid: string) { - const newState = await prisma.page.findFirst({ - where: { - page_uuid: page_uuid - } - }); - newState.page_entities = newState.page_entities.filter( - (entity) => entity.entity_uuid !== entity_uuid - ); - await prisma.page.update({ - data: { ...newState }, - where: { - page_uuid: page_uuid - } - }); - } - async deletePageBackground(page_uuid: string) { - const imagePath = path.join(path.resolve(), `/public/images/backgrounds/homeBackground.jpg`); - fs.unlink(imagePath, (err) => { - if (err) throw err; - }); - await prisma.page.delete({ - where: { - page_uuid: page_uuid - } - }); - } -} - -export default new PagesService(); diff --git a/src/services/sheetsService.ts b/src/services/sheetsService.ts new file mode 100644 index 0000000000000000000000000000000000000000..0ddb091af55bcfbc56824752684a4bc8e2e637ed --- /dev/null +++ b/src/services/sheetsService.ts @@ -0,0 +1,124 @@ +import { PrismaClient } from '@prisma/client'; +import * as fs from 'node:fs'; +import path from 'node:path'; +import { IBodySheet, IBodySheetUuid, IEditSheetBackground } from '../interface/requests'; +import { randomUUID } from 'node:crypto'; +import UsersService from './usersService'; +import { IEntity } from '../interface/database'; + +const prisma = new PrismaClient(); + +class SheetsService { + async createSheet(body: IBodySheet) { + body.sheet_uuid = randomUUID(); + body.sheet_icon = 'sheet'; + await UsersService.addUserSheet(body.sheet_uuid, body.user_uuid); + return prisma.sheet.create({ data: body }); + } + async getSheet(body: IBodySheetUuid) { + return prisma.sheet.findFirst({ + where: { + sheet_uuid: body.sheet_uuid + } + }); + } + async getSheetBackground(sheet_uuid: string) { + const backgroundInfo = await prisma.sheet.findFirst({ + where: { + sheet_uuid: sheet_uuid + } + }); + if (backgroundInfo?.background_path) { + const file = fs.readFileSync(backgroundInfo.background_path); + return Buffer.from(file); + } + } + async addSheetEntity(body: IEntity, sheet_uuid: string) { + const sheet = await prisma.sheet.findFirst({ + where: { + sheet_uuid + } + }); + let sheetEntities = sheet.sheet_entities; + const newEntity = { + entity_type: body.entity_type, + entity_uuid: body.entity_uuid + }; + if (sheetEntities?.length) { + sheetEntities.push(newEntity); + } else sheetEntities = [newEntity]; + sheet.sheet_entities = sheetEntities; + await prisma.sheet.update({ + data: sheet, + where: { + sheet_uuid + } + }); + } + async editSheet(body: IBodySheetUuid) { + return prisma.sheet.update({ + where: { + sheet_uuid: body.sheet_uuid + }, + data: body + }); + } + async editSheetBackground(body: IEditSheetBackground) { + const response = await fetch(body.background_url); + const blob = await response.blob(); + const arrayBuffer = await blob.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + const imagePath = path.join(path.resolve(), `/public/images/backgrounds/homeBackground.jpg`); + fs.writeFileSync(imagePath, buffer); + const currentSheet = await prisma.sheet.findFirst({ + where: { + sheet_uuid: body.sheet_uuid + } + }); + if (currentSheet) { + return prisma.sheet.update({ + where: { + sheet_uuid: body.sheet_uuid + }, + data: { ...currentSheet, background_path: imagePath } + }); + } + } + async deleteSheet(sheet: IBodySheet) { + await UsersService.deleteUserSheet(sheet.sheet_uuid!, sheet.user_uuid); + return prisma.sheet.delete({ + where: { + sheet_uuid: sheet.sheet_uuid + } + }); + } + async deleteSheetEntity(sheet_uuid: string, entity_uuid: string) { + const newState = await prisma.sheet.findFirst({ + where: { + sheet_uuid: sheet_uuid + } + }); + newState.sheet_entities = newState.sheet_entities.filter( + (entity) => entity.entity_uuid !== entity_uuid + ); + await prisma.sheet.update({ + data: { ...newState }, + where: { + sheet_uuid: sheet_uuid + } + }); + } + async deleteSheetBackground(sheet_uuid: string) { + const imagePath = path.join(path.resolve(), `/public/images/backgrounds/homeBackground.jpg`); + fs.unlink(imagePath, (err) => { + if (err) throw err; + }); + await prisma.sheet.delete({ + where: { + sheet_uuid: sheet_uuid + } + }); + } +} + +export default new SheetsService(); diff --git a/src/services/usersService.ts b/src/services/usersService.ts index dbbe2ee8715362bea4ce2ff06ae9c312edc175b4..aa6f08cebfe9cb5bc5602baf5c6d184ed90570de 100644 --- a/src/services/usersService.ts +++ b/src/services/usersService.ts @@ -1,7 +1,7 @@ import { PrismaClient } from '@prisma/client'; -import { IBodyPage, IBodyUser } from '../interface/requests'; +import { IBodySheet, IBodyUser } from '../interface/requests'; import { randomUUID } from 'node:crypto'; -import PagesService from './pagesService'; +import SheetsService from './sheetsService'; import EntitiesService from './entitiesService'; const prisma = new PrismaClient(); @@ -11,14 +11,14 @@ class UsersService { body.user_uuid = randomUUID(); const entityUuid = randomUUID(); await prisma.user.create({ data: body }); - const homePage = await PagesService.createPage({ + const homeSheet = await SheetsService.createSheet({ user_uuid: body.user_uuid, - page_title: 'Home page', - page_navigation_order: '-1' + sheet_title: 'Home sheet', + sheet_navigation_order: '-1' }); const startEntity = await EntitiesService.createEntity({ entity_uuid: entityUuid, - page_uuid: homePage.page_uuid, + sheet_uuid: homeSheet.sheet_uuid, entity_type: 'paragraph', title: 'Home, sweet home...', text: @@ -31,9 +31,9 @@ class UsersService { entity_title_position: 'center', entity_order: 1 }); - const editedHomePage = await prisma.page.findFirst({ + const editedHomeSheet = await prisma.sheet.findFirst({ where: { - page_uuid: homePage.page_uuid + sheet_uuid: homeSheet.sheet_uuid } }); const createdUser = await prisma.user.findFirst({ @@ -43,7 +43,7 @@ class UsersService { }); return { createdUser, - homePage: editedHomePage, + homeSheet: editedHomeSheet, startEntity }; } @@ -54,15 +54,15 @@ class UsersService { } }); } - async addUserPage(page_uuid: string, user_uuid: string) { + async addUserSheet(sheet_uuid: string, user_uuid: string) { const user = await prisma.user.findFirst({ where: { user_uuid: user_uuid } }); - if (user?.pages_uuid) { - user.pages_uuid.push(page_uuid); - } else user.pages_uuid = [page_uuid]; + if (user?.sheets_uuid) { + user.sheets_uuid.push(sheet_uuid); + } else user.sheets_uuid = [sheet_uuid]; return prisma.user.update({ data: user, where: { @@ -85,15 +85,15 @@ class UsersService { } }); } - async deleteUserPage(page_uuid: string, user_uuid: string) { + async deleteUserSheet(sheet_uuid: string, user_uuid: string) { const currentUser = await prisma.user.findFirst({ where: { user_uuid: user_uuid } }); - const pages = JSON.parse(currentUser.pages_uuid); - pages.filter((uuid: string) => uuid !== page_uuid); - currentUser.pages_uuid = JSON.stringify(pages); + const sheets = JSON.parse(currentUser.sheets_uuid); + sheets.filter((uuid: string) => uuid !== sheet_uuid); + currentUser.sheets_uuid = JSON.stringify(sheets); return prisma.user.update({ data: currentUser, where: {