From 34d6aa3d1b8ea27c120ff45552d9c654cd692dd9 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Mon, 22 Jul 2024 02:16:35 +0200 Subject: [PATCH] DB updates, removed all CRUD func's from repositories as prisma's func's are sufficient and reduces boilerplate. --- .../migration.sql | 5 ++ .../migration.sql | 12 +++ prisma/schema.prisma | 22 +++--- src/events/character/CharacterCreate.ts | 9 ++- src/events/character/CharacterMove.ts | 13 +++- src/events/gm/object/GmObjectUpdate.ts | 12 ++- src/events/gm/object/GmObjectUpload.ts | 3 +- src/events/gm/sprite/Remove.ts | 16 ++-- src/events/gm/sprite/Update.ts | 18 +++-- src/events/gm/sprite/Upload.ts | 8 +- src/events/gm/tile/GmTileRemove.ts | 16 ++-- src/events/gm/tile/GmTileUpdate.ts | 16 +++- src/events/gm/tile/GmTileUpload.ts | 8 +- src/events/gm/zone/GmZoneEditorZoneCreate.ts | 22 +++--- src/events/gm/zone/GmZoneEditorZoneDelete.ts | 13 ++-- src/events/gm/zone/GmZoneEditorZoneUpdate.ts | 39 +++++++++- src/repositories/SpriteRepository.ts | 27 ------- src/repositories/TileRepository.ts | 31 -------- src/repositories/UserRepository.ts | 13 ---- src/repositories/ZoneRepository.ts | 73 +------------------ src/services/UserService.ts | 13 +++- src/services/ZoneService.ts | 17 ++++- src/utilities/Http.ts | 7 +- 23 files changed, 196 insertions(+), 217 deletions(-) create mode 100644 prisma/migrations/20240721235820_field_updates/migration.sql create mode 100644 prisma/migrations/20240722001138_field_updates/migration.sql diff --git a/prisma/migrations/20240721235820_field_updates/migration.sql b/prisma/migrations/20240721235820_field_updates/migration.sql new file mode 100644 index 0000000..3b6e9a0 --- /dev/null +++ b/prisma/migrations/20240721235820_field_updates/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE `Character` MODIFY `position_x` INTEGER NOT NULL DEFAULT 0, + MODIFY `position_y` INTEGER NOT NULL DEFAULT 0, + MODIFY `rotation` INTEGER NOT NULL DEFAULT 0, + MODIFY `zoneId` INTEGER NOT NULL DEFAULT 1; diff --git a/prisma/migrations/20240722001138_field_updates/migration.sql b/prisma/migrations/20240722001138_field_updates/migration.sql new file mode 100644 index 0000000..a2356f5 --- /dev/null +++ b/prisma/migrations/20240722001138_field_updates/migration.sql @@ -0,0 +1,12 @@ +-- AlterTable +ALTER TABLE `Item` MODIFY `description` VARCHAR(191) NULL; + +-- AlterTable +ALTER TABLE `Zone` MODIFY `width` INTEGER NOT NULL DEFAULT 10, + MODIFY `height` INTEGER NOT NULL DEFAULT 10, + MODIFY `tiles` JSON NULL; + +-- AlterTable +ALTER TABLE `ZoneObject` MODIFY `depth` INTEGER NOT NULL DEFAULT 0, + MODIFY `position_x` INTEGER NOT NULL DEFAULT 0, + MODIFY `position_y` INTEGER NOT NULL DEFAULT 0; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 91b3313..8c8bde3 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -59,7 +59,7 @@ model Object { model Item { id String @id @default(uuid()) name String - description String + description String? stackable Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -83,10 +83,10 @@ model Character { level Int @default(1) experience Int @default(0) role String @default("player") - position_x Int - position_y Int - rotation Int - zoneId Int + position_x Int @default(0) + position_y Int @default(0) + rotation Int @default(0) + zoneId Int @default(1) zone Zone @relation(fields: [zoneId], references: [id], onDelete: Cascade) chats Chat[] items CharacterItem[] @@ -104,9 +104,9 @@ model CharacterItem { model Zone { id Int @id @default(autoincrement()) name String - width Int - height Int - tiles Json + width Int @default(10) + height Int @default(10) + tiles Json? pvp Boolean @default(false) zoneEventTiles ZoneEventTile[] zoneObjects ZoneObject[] @@ -122,9 +122,9 @@ model ZoneObject { zone Zone @relation(fields: [zoneId], references: [id], onDelete: Cascade) objectId String object Object @relation(fields: [objectId], references: [id], onDelete: Cascade) - depth Int - position_x Int - position_y Int + depth Int @default(0) + position_x Int @default(0) + position_y Int @default(0) } enum ZoneEventTileType { diff --git a/src/events/character/CharacterCreate.ts b/src/events/character/CharacterCreate.ts index a55ae46..3d83667 100644 --- a/src/events/character/CharacterCreate.ts +++ b/src/events/character/CharacterCreate.ts @@ -3,6 +3,7 @@ import { TSocket } from '../../utilities/Types' import { Character } from '@prisma/client' import CharacterRepository from '../../repositories/CharacterRepository' import { ZCharacterCreate } from '../../utilities/ZodTypes' +import prisma from '../../utilities/Prisma' export default function (socket: TSocket, io: Server) { socket.on('character:create', async (data: any) => { @@ -25,7 +26,13 @@ export default function (socket: TSocket, io: Server) { return socket.emit('notification', { message: 'You can only have 4 characters' }) } - const character: Character = (await CharacterRepository.create(user_id, data.name, 'player')) as Character + const character: Character = await prisma.character.create({ + data: { + name: data.name, + userId: user_id + } + }) + characters = [...characters, character] socket.emit('character:create:success') diff --git a/src/events/character/CharacterMove.ts b/src/events/character/CharacterMove.ts index c44a7f7..cb8aba1 100644 --- a/src/events/character/CharacterMove.ts +++ b/src/events/character/CharacterMove.ts @@ -1,7 +1,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../utilities/Types' -import CharacterRepository from '../../repositories/CharacterRepository' import ZoneManager from '../../managers/ZoneManager' +import prisma from '../../utilities/Prisma' type SocketResponseT = { position_x: number @@ -21,7 +21,16 @@ export default function (socket: TSocket, io: Server) { socket.character.position_x = data.position_x socket.character.position_y = data.position_y - await CharacterRepository.updatePosition(socket.character.id as number, data.position_x, data.position_y) + await prisma.character.update({ + where: { + id: socket.character.id + }, + data: { + position_x: data.position_x, + position_y: data.position_y + } + }) + ZoneManager.updateCharacterInZone(socket.character.zoneId, socket.character) console.log(socket.character) diff --git a/src/events/gm/object/GmObjectUpdate.ts b/src/events/gm/object/GmObjectUpdate.ts index 73171d8..e32defd 100644 --- a/src/events/gm/object/GmObjectUpdate.ts +++ b/src/events/gm/object/GmObjectUpdate.ts @@ -2,13 +2,16 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/Types' import prisma from '../../../utilities/Prisma' -interface IPayload { +type Payload = { id: string name: string tags: string[] origin_x: number origin_y: number isAnimated: boolean + frameSpeed: number + frameWidth: number + frameHeight: number } /** @@ -17,7 +20,7 @@ interface IPayload { * @param io */ export default function (socket: TSocket, io: Server) { - socket.on('gm:object:update', async (data: IPayload, callback: (success: boolean) => void) => { + socket.on('gm:object:update', async (data: Payload, callback: (success: boolean) => void) => { if (socket.character?.role !== 'gm') { return } @@ -32,7 +35,10 @@ export default function (socket: TSocket, io: Server) { tags: data.tags, origin_x: data.origin_x, origin_y: data.origin_y, - isAnimated: data.isAnimated + isAnimated: data.isAnimated, + frameSpeed: data.frameSpeed, + frameWidth: data.frameWidth, + frameHeight: data.frameHeight } }) callback(true) diff --git a/src/events/gm/object/GmObjectUpload.ts b/src/events/gm/object/GmObjectUpload.ts index 05e4302..d9725c8 100644 --- a/src/events/gm/object/GmObjectUpload.ts +++ b/src/events/gm/object/GmObjectUpload.ts @@ -33,8 +33,7 @@ export default function (socket: TSocket, io: Server) { name: key, tags: [], origin_x: 0, - origin_y: 0, - isAnimated: false + origin_y: 0 } }) diff --git a/src/events/gm/sprite/Remove.ts b/src/events/gm/sprite/Remove.ts index b26c7fb..54f62e2 100644 --- a/src/events/gm/sprite/Remove.ts +++ b/src/events/gm/sprite/Remove.ts @@ -2,10 +2,10 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/Types' import path from 'path' import fs from 'fs' -import SpriteRepository from '../../../repositories/SpriteRepository' +import prisma from '../../../utilities/Prisma' -interface IPayload { - sprite: string +type Payload = { + id: string } /** @@ -14,19 +14,23 @@ interface IPayload { * @param io */ export default function (socket: TSocket, io: Server) { - socket.on('gm:sprite:remove', async (data: IPayload, callback: (response: boolean) => void) => { + socket.on('gm:sprite:remove', async (data: Payload, callback: (response: boolean) => void) => { if (socket.character?.role !== 'gm') { return } try { - await SpriteRepository.delete(data.sprite) + await prisma.sprite.delete({ + where: { + id: data.id + } + }) // get root path const public_folder = path.join(process.cwd(), 'public', 'sprites') // remove the tile from the disk - const finalFilePath = path.join(public_folder, data.sprite + '.png') + const finalFilePath = path.join(public_folder, data.id + '.png') fs.unlink(finalFilePath, (err) => { if (err) { console.log(err) diff --git a/src/events/gm/sprite/Update.ts b/src/events/gm/sprite/Update.ts index 7bcf9d7..add8467 100644 --- a/src/events/gm/sprite/Update.ts +++ b/src/events/gm/sprite/Update.ts @@ -1,9 +1,8 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/Types' -import SpriteRepository from '../../../repositories/SpriteRepository' -import { Sprite } from '@prisma/client' +import prisma from '../../../utilities/Prisma' -interface IPayload { +type Payload = { id: string name: string origin_x: number @@ -16,13 +15,22 @@ interface IPayload { * @param io */ export default function (socket: TSocket, io: Server) { - socket.on('gm:sprite:update', async (data: IPayload, callback: (success: boolean) => void) => { + socket.on('gm:sprite:update', async (data: Payload, callback: (success: boolean) => void) => { if (socket.character?.role !== 'gm') { return } try { - const sprite = await SpriteRepository.update(data.id, data.name, data.origin_x, data.origin_y) + const sprite = await prisma.sprite.update({ + where: { + id: data.id + }, + data: { + name: data.name, + origin_x: data.origin_x, + origin_y: data.origin_y + } + }) callback(true) } catch (error) { diff --git a/src/events/gm/sprite/Upload.ts b/src/events/gm/sprite/Upload.ts index 2b244d4..3a0fd36 100644 --- a/src/events/gm/sprite/Upload.ts +++ b/src/events/gm/sprite/Upload.ts @@ -3,7 +3,7 @@ import { TSocket } from '../../../utilities/Types' import { writeFile } from 'node:fs/promises' import path from 'path' import fs from 'fs/promises' -import spriteRepository from '../../../repositories/SpriteRepository' +import prisma from '../../../utilities/Prisma' interface ISpriteData { [key: string]: Buffer @@ -28,7 +28,11 @@ export default function (socket: TSocket, io: Server) { await fs.mkdir(public_folder, { recursive: true }) const uploadPromises = Object.entries(data).map(async ([key, spriteData]) => { - const sprite = await spriteRepository.create('New sprite', 0, 0) + const sprite = await prisma.sprite.create({ + data: { + name: 'New sprite' + } + }) const uuid = sprite.id const filename = `${uuid}.png` const finalFilePath = path.join(public_folder, filename) diff --git a/src/events/gm/tile/GmTileRemove.ts b/src/events/gm/tile/GmTileRemove.ts index 822fdcd..a784a56 100644 --- a/src/events/gm/tile/GmTileRemove.ts +++ b/src/events/gm/tile/GmTileRemove.ts @@ -2,10 +2,10 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/Types' import path from 'path' import fs from 'fs' -import TileRepository from '../../../repositories/TileRepository' +import prisma from '../../../utilities/Prisma' -interface IPayload { - tile: string +type Payload = { + id: string } /** @@ -14,19 +14,23 @@ interface IPayload { * @param io */ export default function (socket: TSocket, io: Server) { - socket.on('gm:tile:remove', async (data: IPayload, callback: (response: boolean) => void) => { + socket.on('gm:tile:remove', async (data: Payload, callback: (response: boolean) => void) => { if (socket.character?.role !== 'gm') { return } try { - await TileRepository.delete(data.tile) + await prisma.tile.delete({ + where: { + id: data.id + } + }) // get root path const public_folder = path.join(process.cwd(), 'public', 'tiles') // remove the tile from the disk - const finalFilePath = path.join(public_folder, data.tile + '.png') + const finalFilePath = path.join(public_folder, data.id + '.png') fs.unlink(finalFilePath, (err) => { if (err) { console.log(err) diff --git a/src/events/gm/tile/GmTileUpdate.ts b/src/events/gm/tile/GmTileUpdate.ts index ccf934a..a276401 100644 --- a/src/events/gm/tile/GmTileUpdate.ts +++ b/src/events/gm/tile/GmTileUpdate.ts @@ -1,8 +1,8 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/Types' -import TileRepository from '../../../repositories/TileRepository' +import prisma from '../../../utilities/Prisma' -interface IPayload { +type Payload = { id: string name: string tags: string[] @@ -14,13 +14,21 @@ interface IPayload { * @param io */ export default function (socket: TSocket, io: Server) { - socket.on('gm:tile:update', async (data: IPayload, callback: (success: boolean) => void) => { + socket.on('gm:tile:update', async (data: Payload, callback: (success: boolean) => void) => { if (socket.character?.role !== 'gm') { return } try { - const Tile = await TileRepository.update(data.id, data.name, data.tags) + const Tile = await prisma.tile.update({ + where: { + id: data.id + }, + data: { + name: data.name, + tags: data.tags + } + }) callback(true) } catch (error) { diff --git a/src/events/gm/tile/GmTileUpload.ts b/src/events/gm/tile/GmTileUpload.ts index 1929eb7..a115bb5 100644 --- a/src/events/gm/tile/GmTileUpload.ts +++ b/src/events/gm/tile/GmTileUpload.ts @@ -3,7 +3,7 @@ import { TSocket } from '../../../utilities/Types' import { writeFile } from 'node:fs/promises' import path from 'path' import fs from 'fs/promises' -import tileRepository from '../../../repositories/TileRepository' +import prisma from '../../../utilities/Prisma' interface ITileData { [key: string]: Buffer @@ -28,7 +28,11 @@ export default function (socket: TSocket, io: Server) { await fs.mkdir(public_folder, { recursive: true }) const uploadPromises = Object.entries(data).map(async ([key, tileData]) => { - const tile = await tileRepository.create('New tile') + const tile = await prisma.tile.create({ + data: { + name: 'New tile' + } + }) const uuid = tile.id const filename = `${uuid}.png` const finalFilePath = path.join(public_folder, filename) diff --git a/src/events/gm/zone/GmZoneEditorZoneCreate.ts b/src/events/gm/zone/GmZoneEditorZoneCreate.ts index 281b91f..984e0e2 100644 --- a/src/events/gm/zone/GmZoneEditorZoneCreate.ts +++ b/src/events/gm/zone/GmZoneEditorZoneCreate.ts @@ -1,10 +1,10 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/Types' import ZoneRepository from '../../../repositories/ZoneRepository' -import ZoneManager from '../../../managers/ZoneManager' -import { Character, Zone } from '@prisma/client' +import { Zone } from '@prisma/client' +import prisma from '../../../utilities/Prisma' -interface IPayload { +type Payload = { name: string width: number height: number @@ -16,7 +16,7 @@ interface IPayload { * @param io */ export default function (socket: TSocket, io: Server) { - socket.on('gm:zone_editor:zone:create', async (data: IPayload, callback: (response: Zone[]) => void) => { + socket.on('gm:zone_editor:zone:create', async (data: Payload, callback: (response: Zone[]) => void) => { if (socket.character?.role !== 'gm') { console.log(`---Character #${socket.character?.id} is not a game master.`) return @@ -25,12 +25,14 @@ export default function (socket: TSocket, io: Server) { console.log(`---GM ${socket.character?.id} has created a new zone via zone editor.`) let zoneList: Zone[] = [] try { - const zone = await ZoneRepository.create( - data.name, - data.width, - data.height, - Array.from({ length: data.height }, () => Array.from({ length: data.width }, () => 'blank_tile')) - ) + const zone = await prisma.zone.create({ + data: { + name: data.name, + width: data.width, + height: data.height, + tiles: Array.from({ length: data.height }, () => Array.from({ length: data.width }, () => 'blank_tile')) + } + }) zoneList = await ZoneRepository.getAll() callback(zoneList) diff --git a/src/events/gm/zone/GmZoneEditorZoneDelete.ts b/src/events/gm/zone/GmZoneEditorZoneDelete.ts index 61a1bb9..830e67b 100644 --- a/src/events/gm/zone/GmZoneEditorZoneDelete.ts +++ b/src/events/gm/zone/GmZoneEditorZoneDelete.ts @@ -1,10 +1,9 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/Types' import ZoneRepository from '../../../repositories/ZoneRepository' -import ZoneManager from '../../../managers/ZoneManager' -import { Character, Zone } from '@prisma/client' +import prisma from '../../../utilities/Prisma' -interface IPayload { +type Payload = { zoneId: number } @@ -14,7 +13,7 @@ interface IPayload { * @param io */ export default function (socket: TSocket, io: Server) { - socket.on('gm:zone_editor:zone:delete', async (data: IPayload, callback: (response: boolean) => void) => { + socket.on('gm:zone_editor:zone:delete', async (data: Payload, callback: (response: boolean) => void) => { if (socket.character?.role !== 'gm') { console.log(`---Character #${socket.character?.id} is not a game master.`) return @@ -30,7 +29,11 @@ export default function (socket: TSocket, io: Server) { return } - await ZoneRepository.delete(data.zoneId) + await prisma.zone.delete({ + where: { + id: data.zoneId + } + }) callback(true) } catch (e) { diff --git a/src/events/gm/zone/GmZoneEditorZoneUpdate.ts b/src/events/gm/zone/GmZoneEditorZoneUpdate.ts index 660973d..819f084 100644 --- a/src/events/gm/zone/GmZoneEditorZoneUpdate.ts +++ b/src/events/gm/zone/GmZoneEditorZoneUpdate.ts @@ -1,8 +1,8 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/Types' import ZoneRepository from '../../../repositories/ZoneRepository' -import ZoneManager from '../../../managers/ZoneManager' -import { Character, Zone, ZoneEventTile, ZoneObject } from '@prisma/client' +import { ZoneEventTile, ZoneObject } from '@prisma/client' +import prisma from '../../../utilities/Prisma' interface IPayload { zoneId: number @@ -41,7 +41,40 @@ export default function (socket: TSocket, io: Server) { return } - await ZoneRepository.update(data.zoneId, data.name, data.width, data.height, data.tiles, data.zoneEventTiles, data.zoneObjects) + await prisma.zone.update({ + where: { + id: data.zoneId + }, + data: { + name: data.name, + width: data.width, + height: data.height, + tiles: data.tiles, + zoneEventTiles: { + deleteMany: { + zoneId: data.zoneId // Ensure only event tiles related to the zone are deleted + }, + // Save new zone event tiles + create: data.zoneEventTiles.map((zoneEventTile) => ({ + type: zoneEventTile.type, + position_x: zoneEventTile.position_x, + position_y: zoneEventTile.position_y + })) + }, + zoneObjects: { + deleteMany: { + zoneId: data.zoneId // Ensure only objects related to the zone are deleted + }, + // Save new zone objects + create: data.zoneObjects.map((zoneObject) => ({ + objectId: zoneObject.objectId, + depth: zoneObject.depth, + position_x: zoneObject.position_x, + position_y: zoneObject.position_y + })) + } + } + }) zone = await ZoneRepository.getById(data.zoneId) diff --git a/src/repositories/SpriteRepository.ts b/src/repositories/SpriteRepository.ts index 2a31ff1..b377bfc 100644 --- a/src/repositories/SpriteRepository.ts +++ b/src/repositories/SpriteRepository.ts @@ -11,33 +11,6 @@ class SpriteRepository { async getAll(): Promise { return prisma.sprite.findMany() } - - async create(name: string, origin_x: number, origin_y: number): Promise { - return prisma.sprite.create({ - data: { - name, - origin_x, - origin_y - } - }) - } - - async update(id: string, name: string, origin_x: number, origin_y: number): Promise { - return prisma.sprite.update({ - where: { id }, - data: { - name, - origin_x, - origin_y - } - }) - } - - async delete(id: string): Promise { - return prisma.sprite.delete({ - where: { id } - }) - } } export default new SpriteRepository() diff --git a/src/repositories/TileRepository.ts b/src/repositories/TileRepository.ts index cf093c6..19476d4 100644 --- a/src/repositories/TileRepository.ts +++ b/src/repositories/TileRepository.ts @@ -11,37 +11,6 @@ class TileRepository { async getAll(): Promise { return prisma.tile.findMany() } - - async create(name: string): Promise { - return prisma.tile.create({ - data: { - name, - tags: [] - } - }) - } - - async update(id: string, name: string, tags: string[]): Promise { - return prisma.tile.update({ - where: { id }, - data: { - name, - tags - } - }) - } - - async delete(id: string): Promise { - try { - await prisma.tile.delete({ - where: { id } - }) - return true - } catch (error) { - console.log('Error deleting tile:', error) - return false - } - } } export default new TileRepository() diff --git a/src/repositories/UserRepository.ts b/src/repositories/UserRepository.ts index 8d9f1ef..93f2b69 100644 --- a/src/repositories/UserRepository.ts +++ b/src/repositories/UserRepository.ts @@ -26,19 +26,6 @@ class UserRepository { throw new Error(`Failed to get user by username: ${error.message}`) } } - async create(username: string, password: string): Promise { - try { - return await prisma.user.create({ - data: { - username, - password - } - }) - } catch (error: any) { - // Handle error - throw new Error(`Failed to create user: ${error.message}`) - } - } } export default new UserRepository() diff --git a/src/repositories/ZoneRepository.ts b/src/repositories/ZoneRepository.ts index 4516831..f715a90 100644 --- a/src/repositories/ZoneRepository.ts +++ b/src/repositories/ZoneRepository.ts @@ -1,4 +1,4 @@ -import { Zone, ZoneEventTile, ZoneObject } from '@prisma/client' +import { Zone } from '@prisma/client' import prisma from '../utilities/Prisma' // Import the global Prisma instance class ZoneRepository { @@ -44,77 +44,6 @@ class ZoneRepository { throw new Error(`Failed to get zone by id: ${error.message}`) } } - - async create(name: string, width: number, height: number, tiles: string[][]): Promise { - try { - return await prisma.zone.create({ - data: { - name: name, - width: width, - height: height, - tiles: tiles - } - }) - } catch (error: any) { - // Handle error - throw new Error(`Failed to create zone: ${error.message}`) - } - } - - async update(id: number, name: string, width: number, height: number, tiles: string[][], zoneEventTiles: ZoneEventTile[], zoneObjects: ZoneObject[]): Promise { - try { - return await prisma.zone.update({ - where: { - id: id - }, - data: { - name, - width, - height, - tiles, - zoneEventTiles: { - deleteMany: { - zoneId: id // Ensure only event tiles related to the zone are deleted - }, - // Save new zone event tiles - create: zoneEventTiles.map((zoneEventTile) => ({ - type: zoneEventTile.type, - position_x: zoneEventTile.position_x, - position_y: zoneEventTile.position_y - })) - }, - zoneObjects: { - deleteMany: { - zoneId: id // Ensure only objects related to the zone are deleted - }, - // Save new zone objects - create: zoneObjects.map((zoneObject) => ({ - objectId: zoneObject.objectId, - depth: zoneObject.depth, - position_x: zoneObject.position_x, - position_y: zoneObject.position_y - })) - } - } - }) - } catch (error: any) { - // Handle error - throw new Error(`Failed to update zone: ${error.message}`) - } - } - - async delete(id: number): Promise { - try { - return await prisma.zone.delete({ - where: { - id: id - } - }) - } catch (error: any) { - // Handle error - throw new Error(`Failed to delete zone: ${error.message}`) - } - } } export default new ZoneRepository() diff --git a/src/services/UserService.ts b/src/services/UserService.ts index 26b65fa..69e75d6 100644 --- a/src/services/UserService.ts +++ b/src/services/UserService.ts @@ -1,8 +1,10 @@ import bcrypt from 'bcryptjs' import UserRepository from '../repositories/UserRepository' +import prisma from '../utilities/Prisma' +import { User } from '@prisma/client' class UserService { - async login(username: string, password: string): Promise { + async login(username: string, password: string): Promise { const user = await UserRepository.getByUsername(username) if (!user) { return false @@ -16,14 +18,19 @@ class UserService { return user } - async register(username: string, password: string): Promise { + async register(username: string, password: string): Promise { const user = await UserRepository.getByUsername(username) if (user) { return false } const hashedPassword = await bcrypt.hash(password, 10) - return await UserRepository.create(username, hashedPassword) + return prisma.user.create({ + data: { + username, + password: hashedPassword + } + }) } } diff --git a/src/services/ZoneService.ts b/src/services/ZoneService.ts index 641e67c..8955cc5 100644 --- a/src/services/ZoneService.ts +++ b/src/services/ZoneService.ts @@ -1,9 +1,8 @@ -import { Zone } from '@prisma/client' -import ZoneRepository from '../repositories/ZoneRepository' +import prisma from '../utilities/Prisma' class ZoneService { async createDemoZone(): Promise { - await ZoneRepository.create('Demo Zone', 10, 10, [ + const tiles = [ ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], @@ -14,7 +13,17 @@ class ZoneService { ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'], ['blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile', 'blank_tile'] - ]) + ] + + await prisma.zone.create({ + data: { + name: 'Demo Zone', + width: 10, + height: 10, + tiles + } + }) + console.log('Demo zone created.') return true } diff --git a/src/utilities/Http.ts b/src/utilities/Http.ts index ece09d5..26033fb 100644 --- a/src/utilities/Http.ts +++ b/src/utilities/Http.ts @@ -11,7 +11,6 @@ import path from 'path' import { TAsset } from './Types' import tileRepository from '../repositories/TileRepository' import objectRepository from '../repositories/ObjectRepository' -import spriteRepository from '../repositories/SpriteRepository' async function addHttpRoutes(app: Application) { app.get('/assets', async (req: Request, res: Response) => { @@ -69,8 +68,7 @@ async function addHttpRoutes(app: Application) { const userService = new UserService() const user = await userService.login(username, password) - if (user) { - //test + if (user && typeof user !== 'boolean') { const token = jwt.sign({ id: user.id }, config.JWT_SECRET, { expiresIn: '4h' }) return res.status(200).json({ token }) } @@ -91,8 +89,7 @@ async function addHttpRoutes(app: Application) { const user = await userService.register(username, password) if (user) { - const token = jwt.sign({ id: user.id }, config.JWT_SECRET, { expiresIn: '4h' }) - return res.status(200).json({ token }) + return res.status(200) } return res.status(400).json({ message: 'Failed to register user' })