1
0
forked from noxious/server

Renamed folder utilities > application, added baseEntity class, updated baseRepo class, removed prisma helper

This commit is contained in:
Dennis Postma 2024-12-25 16:50:01 +01:00
parent f5a7a348e0
commit f4746722af
120 changed files with 423 additions and 378 deletions

View File

@ -3,7 +3,7 @@ ENV=development
HOST="0.0.0.0" HOST="0.0.0.0"
PORT=4000 PORT=4000
JWT_SECRET="secret" JWT_SECRET="secret"
CLIENT_URL="http://192.168.3.4:5173" CLIENT_URL="http://192.168.2.34:5173"
# Database configuration # Database configuration
REDIS_URL="redis://@127.0.0.1:6379/4" REDIS_URL="redis://@127.0.0.1:6379/4"

View File

@ -2,7 +2,7 @@
import { defineConfig, MySqlDriver } from '@mikro-orm/mysql' import { defineConfig, MySqlDriver } from '@mikro-orm/mysql'
import { Migrator } from '@mikro-orm/migrations' import { Migrator } from '@mikro-orm/migrations'
import { TsMorphMetadataProvider } from '@mikro-orm/reflection' import { TsMorphMetadataProvider } from '@mikro-orm/reflection'
import serverConfig from './src/utilities/config' import serverConfig from './src/application/config'
export default defineConfig({ export default defineConfig({
extensions: [Migrator], extensions: [Migrator],

View File

@ -0,0 +1,67 @@
import { Database } from '#application/database'
import { appLogger } from '#application/logger'
export abstract class BaseEntity {
async save(): Promise<this> {
try {
const orm = await Database.getInstance()
const em = orm.em.fork()
await em.begin()
try {
em.persist(this)
await em.flush()
await em.commit()
return this
} catch (error) {
await em.rollback()
throw error
}
} catch (error) {
appLogger.error(`Failed to save entity: ${error instanceof Error ? error.message : String(error)}`)
throw error
}
}
async update(): Promise<this> {
try {
const orm = await Database.getInstance()
const em = orm.em.fork()
await em.begin()
try {
em.merge(this)
await em.flush()
await em.commit()
return this
} catch (error) {
await em.rollback()
throw error
}
} catch (error) {
appLogger.error(`Failed to update entity: ${error instanceof Error ? error.message : String(error)}`)
throw error
}
}
async delete(): Promise<this> {
try {
const orm = await Database.getInstance()
const em = orm.em.fork()
await em.begin()
try {
em.remove(this)
await em.flush()
await em.commit()
return this
} catch (error) {
await em.rollback()
throw error
}
} catch (error) {
appLogger.error(`Failed to remove entity: ${error instanceof Error ? error.message : String(error)}`)
throw error
}
}
}

View File

@ -1,5 +1,5 @@
import { appLogger } from '#utilities/logger' import { appLogger } from '../logger'
import { Database } from '#utilities/database' import { Database } from '../database'
import { EntityManager, MikroORM } from '@mikro-orm/core' import { EntityManager, MikroORM } from '@mikro-orm/core'
export abstract class BaseRepository { export abstract class BaseRepository {

View File

@ -0,0 +1,27 @@
import config from '../../mikro-orm.config'
// import { MikroORM } from '@mikro-orm/mariadb'
import { MikroORM } from '@mikro-orm/mysql'
import { appLogger } from './logger'
/**
* Singleton class for initializing and managing the database connection
*/
export class Database {
private static instance: MikroORM | undefined
private static async init(): Promise<MikroORM> {
try {
return await MikroORM.init(config)
} catch (error) {
appLogger.error(`MikroORM connection failed: ${error}`)
throw error
}
}
public static async getInstance(): Promise<MikroORM> {
if (!Database.instance) {
Database.instance = await Database.init()
}
return Database.instance
}
}

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import fs from 'fs' import fs from 'fs'
import { getPublicPath, getRootPath } from '#utilities/storage' import { getPublicPath, getRootPath } from '#application/storage'
import sharp from 'sharp' import sharp from 'sharp'
import { CharacterEquipmentSlotType, CharacterGender, CharacterRace } from '@prisma/client' import { CharacterEquipmentSlotType, CharacterGender, CharacterRace } from '@prisma/client'
import bcrypt from 'bcryptjs' import bcrypt from 'bcryptjs'

View File

@ -1,8 +1,8 @@
import fs from 'fs' import fs from 'fs'
import sharp from 'sharp' import sharp from 'sharp'
import { commandLogger } from '#utilities/logger' import { commandLogger } from '#application/logger'
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { getPublicPath } from '#utilities/storage' import { getPublicPath } from '#application/storage'
import path from 'path' import path from 'path'
export default class TilesCommand { export default class TilesCommand {

View File

@ -1,4 +1,5 @@
import { Collection, Entity, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core' import { Collection, Entity, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { User } from './user' import { User } from './user'
import { Zone } from './zone' import { Zone } from './zone'
import { CharacterType } from './characterType' import { CharacterType } from './characterType'
@ -8,7 +9,7 @@ import { CharacterEquipment } from './characterEquipment'
import { Chat } from './chat' import { Chat } from './chat'
@Entity() @Entity()
export class Character { export class Character extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: number id!: number

View File

@ -1,10 +1,11 @@
import { Entity, Enum, ManyToOne, PrimaryKey } from '@mikro-orm/core' import { Entity, Enum, ManyToOne, PrimaryKey } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Character } from './character' import { Character } from './character'
import { CharacterItem } from './characterItem' import { CharacterItem } from './characterItem'
import { CharacterEquipmentSlotType } from '#utilities/enums' import { CharacterEquipmentSlotType } from '#application/enums'
@Entity() @Entity()
export class CharacterEquipment { export class CharacterEquipment extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: number id!: number

View File

@ -1,10 +1,11 @@
import { Collection, Entity, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core' import { Collection, Entity, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Character } from './character' import { Character } from './character'
import { Sprite } from './sprite' import { Sprite } from './sprite'
import { CharacterGender } from '#utilities/enums' import { CharacterGender } from '#application/enums'
@Entity() @Entity()
export class CharacterHair { export class CharacterHair extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: number id!: number

View File

@ -1,10 +1,11 @@
import { Collection, Entity, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core' import { Collection, Entity, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Character } from './character' import { Character } from './character'
import { Item } from './item' import { Item } from './item'
import { CharacterEquipment } from './characterEquipment' import { CharacterEquipment } from './characterEquipment'
@Entity() @Entity()
export class CharacterItem { export class CharacterItem extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: number id!: number

View File

@ -1,10 +1,11 @@
import { Collection, Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core' import { Collection, Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Character } from './character' import { Character } from './character'
import { Sprite } from './sprite' import { Sprite } from './sprite'
import { CharacterGender, CharacterRace } from '#utilities/enums' import { CharacterGender, CharacterRace } from '#application/enums'
@Entity() @Entity()
export class CharacterType { export class CharacterType extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: number id!: number

View File

@ -1,9 +1,10 @@
import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core' import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Character } from './character' import { Character } from './character'
import { Zone } from './zone' import { Zone } from './zone'
@Entity() @Entity()
export class Chat { export class Chat extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: number id!: number

View File

@ -1,10 +1,11 @@
import { Collection, Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core' import { Collection, Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Sprite } from './sprite' import { Sprite } from './sprite'
import { CharacterItem } from './characterItem' import { CharacterItem } from './characterItem'
import { ItemType, ItemRarity } from '#utilities/enums' import { ItemType, ItemRarity } from '#application/enums'
@Entity() @Entity()
export class Item { export class Item extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: string id!: string

View File

@ -1,9 +1,10 @@
import { randomUUID } from 'node:crypto' import { randomUUID } from 'node:crypto'
import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core' import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { ZoneObject } from './zoneObject' import { ZoneObject } from './zoneObject'
@Entity() @Entity()
export class MapObject { export class MapObject extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id = randomUUID() id = randomUUID()

View File

@ -1,8 +1,9 @@
import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core' import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { User } from './user' import { User } from './user'
@Entity() @Entity()
export class PasswordResetToken { export class PasswordResetToken extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: number id!: number

View File

@ -1,12 +1,13 @@
import { randomUUID } from 'node:crypto' import { randomUUID } from 'node:crypto'
import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core' import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { SpriteAction } from './spriteAction' import { SpriteAction } from './spriteAction'
import { CharacterType } from './characterType' import { CharacterType } from './characterType'
import { CharacterHair } from './characterHair' import { CharacterHair } from './characterHair'
import { Item } from './item' import { Item } from './item'
@Entity() @Entity()
export class Sprite { export class Sprite extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id = randomUUID() id = randomUUID()

View File

@ -1,9 +1,10 @@
import { randomUUID } from 'node:crypto' import { randomUUID } from 'node:crypto'
import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core' import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Sprite } from './sprite' import { Sprite } from './sprite'
@Entity() @Entity()
export class SpriteAction { export class SpriteAction extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id = randomUUID() id = randomUUID()

View File

@ -1,8 +1,9 @@
import { randomUUID } from 'node:crypto' import { randomUUID } from 'node:crypto'
import { Entity, PrimaryKey, Property } from '@mikro-orm/core' import { Entity, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
@Entity() @Entity()
export class Tile { export class Tile extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id = randomUUID() id = randomUUID()

View File

@ -1,9 +1,10 @@
import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core' import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Character } from './character' import { Character } from './character'
import { PasswordResetToken } from './passwordResetToken' import { PasswordResetToken } from './passwordResetToken'
@Entity() @Entity()
export class User { export class User extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: number id!: number

View File

@ -1,7 +1,8 @@
import { Entity, PrimaryKey, Property } from '@mikro-orm/core' import { Entity, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
@Entity() @Entity()
export class World { export class World extends BaseEntity {
@PrimaryKey() @PrimaryKey()
date = new Date() date = new Date()

View File

@ -1,4 +1,5 @@
import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core' import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { ZoneEffect } from './zoneEffect' import { ZoneEffect } from './zoneEffect'
import { ZoneEventTile } from './zoneEventTile' import { ZoneEventTile } from './zoneEventTile'
import { ZoneEventTileTeleport } from './zoneEventTileTeleport' import { ZoneEventTileTeleport } from './zoneEventTileTeleport'
@ -7,7 +8,7 @@ import { Character } from './character'
import { Chat } from './chat' import { Chat } from './chat'
@Entity() @Entity()
export class Zone { export class Zone extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: number id!: number

View File

@ -1,8 +1,9 @@
import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core' import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Zone } from './zone' import { Zone } from './zone'
@Entity() @Entity()
export class ZoneEffect { export class ZoneEffect extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: string id!: string

View File

@ -1,10 +1,11 @@
import { Entity, Enum, ManyToOne, OneToOne, PrimaryKey, Property } from '@mikro-orm/core' import { Entity, Enum, ManyToOne, OneToOne, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Zone } from './zone' import { Zone } from './zone'
import { ZoneEventTileType } from '#utilities/enums' import { ZoneEventTileType } from '#application/enums'
import { ZoneEventTileTeleport } from './zoneEventTileTeleport' import { ZoneEventTileTeleport } from './zoneEventTileTeleport'
@Entity() @Entity()
export class ZoneEventTile { export class ZoneEventTile extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: string id!: string

View File

@ -1,10 +1,11 @@
import { randomUUID } from 'node:crypto' import { randomUUID } from 'node:crypto'
import { Entity, ManyToOne, OneToOne, PrimaryKey, Property } from '@mikro-orm/core' import { Entity, ManyToOne, OneToOne, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Zone } from './zone' import { Zone } from './zone'
import { ZoneEventTile } from './ZoneEventTile' import { ZoneEventTile } from './zoneEventTile'
@Entity() @Entity()
export class ZoneEventTileTeleport { export class ZoneEventTileTeleport extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id = randomUUID() id = randomUUID()

View File

@ -1,10 +1,11 @@
import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core' import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity'
import { Zone } from './zone' import { Zone } from './zone'
import { MapObject } from '#entities/mapObject' import { MapObject } from '#entities/mapObject'
//@TODO : Rename mapObject //@TODO : Rename mapObject
@Entity() @Entity()
export class ZoneObject { export class ZoneObject extends BaseEntity {
@PrimaryKey() @PrimaryKey()
id!: string id!: string

View File

@ -1,11 +1,11 @@
import { Router, Request, Response } from 'express' import { Router, Request, Response } from 'express'
import fs from 'fs' import fs from 'fs'
import { httpLogger } from '#utilities/logger' import { httpLogger } from '#application/logger'
import { getPublicPath } from '#utilities/storage' import { getPublicPath } from '#application/storage'
import TileRepository from '#repositories/tileRepository' import TileRepository from '#repositories/tileRepository'
import ZoneRepository from '#repositories/zoneRepository' import ZoneRepository from '#repositories/zoneRepository'
import SpriteRepository from '#repositories/spriteRepository' import SpriteRepository from '#repositories/spriteRepository'
import { AssetData } from '#utilities/types' import { AssetData } from '#application/types'
import { FilterValue } from '@mikro-orm/core' import { FilterValue } from '@mikro-orm/core'
const router = Router() const router = Router()

View File

@ -1,8 +1,8 @@
import { Router, Request, Response } from 'express' import { Router, Request, Response } from 'express'
import UserService from '#services/userService' import UserService from '#services/userService'
import jwt from 'jsonwebtoken' import jwt from 'jsonwebtoken'
import config from '#utilities/config' import config from '#application/config'
import { loginAccountSchema, registerAccountSchema, resetPasswordSchema, newPasswordSchema } from '#utilities/zodTypes' import { loginAccountSchema, registerAccountSchema, resetPasswordSchema, newPasswordSchema } from '#application/zodTypes'
const router = Router() const router = Router()

View File

@ -7,7 +7,7 @@ import fs from 'fs'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import CharacterHairRepository from '#repositories/characterHairRepository' import CharacterHairRepository from '#repositories/characterHairRepository'
import CharacterTypeRepository from '#repositories/characterTypeRepository' import CharacterTypeRepository from '#repositories/characterTypeRepository'
import { getPublicPath } from '#utilities/storage' import { getPublicPath } from '#application/storage'
const router = Router() const router = Router()

View File

@ -1,8 +1,8 @@
import { Application } from 'express' import { Application } from 'express'
import { httpLogger } from '#utilities/logger' import { httpLogger } from '#application/logger'
import fs from 'fs' import fs from 'fs'
import path from 'path' import path from 'path'
import { getAppPath } from '#utilities/storage' import { getAppPath } from '#application/storage'
async function addHttpRoutes(app: Application) { async function addHttpRoutes(app: Application) {
const routeFiles = fs.readdirSync(__dirname).filter((file) => { const routeFiles = fs.readdirSync(__dirname).filter((file) => {

View File

@ -1,4 +1,4 @@
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { Server as SocketServer } from 'socket.io' import { Server as SocketServer } from 'socket.io'
export default class SomeJob { export default class SomeJob {

View File

@ -2,8 +2,8 @@ import * as readline from 'readline'
import * as fs from 'fs' import * as fs from 'fs'
import * as path from 'path' import * as path from 'path'
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { commandLogger } from '#utilities/logger' import { commandLogger } from '#application/logger'
import { getAppPath } from '#utilities/storage' import { getAppPath } from '#application/storage'
class CommandManager { class CommandManager {
private commands: Map<string, any> = new Map() private commands: Map<string, any> = new Map()

View File

@ -1,5 +1,5 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import worldService from '#services/worldService' import worldService from '#services/worldService'
import worldRepository from '#repositories/worldRepository' import worldRepository from '#repositories/worldRepository'
@ -64,6 +64,9 @@ class DateManager {
} }
private advanceGameTime(): void { private advanceGameTime(): void {
if (!this.currentDate) {
this.currentDate = new Date()
}
const advanceMilliseconds = DateManager.GAME_SPEED * DateManager.UPDATE_INTERVAL const advanceMilliseconds = DateManager.GAME_SPEED * DateManager.UPDATE_INTERVAL
this.currentDate = new Date(this.currentDate.getTime() + advanceMilliseconds) this.currentDate = new Date(this.currentDate.getTime() + advanceMilliseconds)
} }

View File

@ -1,11 +1,11 @@
import IORedis from 'ioredis' import IORedis from 'ioredis'
import { Job, Queue, Worker } from 'bullmq' import { Job, Queue, Worker } from 'bullmq'
import config from '#utilities/config' import config from '#application/config'
import { Server as SocketServer } from 'socket.io' import { Server as SocketServer } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { queueLogger } from '#utilities/logger' import { queueLogger } from '#application/logger'
import fs from 'fs' import fs from 'fs'
import { getAppPath } from '#utilities/storage' import { getAppPath } from '#application/storage'
class QueueManager { class QueueManager {
private connection!: IORedis private connection!: IORedis

View File

@ -1,5 +1,5 @@
import { User } from '@prisma/client' import { User } from '@prisma/client'
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
type TLoggedInUsers = { type TLoggedInUsers = {
users: User[] users: User[]

View File

@ -1,5 +1,5 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import worldService from '#services/worldService' import worldService from '#services/worldService'
import worldRepository from '#repositories/worldRepository' import worldRepository from '#repositories/worldRepository'
@ -25,9 +25,9 @@ class WeatherManager {
} }
public async boot(io: Server): Promise<void> { public async boot(io: Server): Promise<void> {
this.io = io // this.io = io
await this.loadWeather() // await this.loadWeather()
this.startWeatherLoop() // this.startWeatherLoop()
appLogger.info('Weather manager loaded') appLogger.info('Weather manager loaded')
} }

View File

@ -2,7 +2,7 @@ import { Zone } from '@prisma/client'
import ZoneRepository from '#repositories/zoneRepository' import ZoneRepository from '#repositories/zoneRepository'
import ZoneService from '#services/zoneService' import ZoneService from '#services/zoneService'
import LoadedZone from '#models/loadedZone' import LoadedZone from '#models/loadedZone'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import ZoneCharacter from '#models/zoneCharacter' import ZoneCharacter from '#models/zoneCharacter'
class ZoneManager { class ZoneManager {

View File

@ -1,9 +1,9 @@
import { verify } from 'jsonwebtoken' import { verify } from 'jsonwebtoken'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import config from '#utilities/config' import config from '#application/config'
import UserRepository from '#repositories/userRepository' import UserRepository from '#repositories/userRepository'
import { User } from '@prisma/client' import { User } from '@prisma/client'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
/** /**
* Socket io jwt auth middleware * Socket io jwt auth middleware

View File

@ -1,5 +1,5 @@
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import { BaseRepository } from './baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { CharacterHair } from '#entities/characterHair' import { CharacterHair } from '#entities/characterHair'
class CharacterHairRepository extends BaseRepository { class CharacterHairRepository extends BaseRepository {

View File

@ -1,5 +1,5 @@
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import { BaseRepository } from '#repositories/baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { Character } from '#entities/character' import { Character } from '#entities/character'
class CharacterRepository extends BaseRepository { class CharacterRepository extends BaseRepository {

View File

@ -1,5 +1,5 @@
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import { BaseRepository } from '#repositories/baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { CharacterType } from '#entities/characterType' import { CharacterType } from '#entities/characterType'
class CharacterTypeRepository extends BaseRepository { class CharacterTypeRepository extends BaseRepository {

View File

@ -1,5 +1,5 @@
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import { BaseRepository } from '#repositories/baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { Chat } from '#entities/chat' import { Chat } from '#entities/chat'
class ChatRepository extends BaseRepository { class ChatRepository extends BaseRepository {

View File

@ -1,5 +1,5 @@
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import { BaseRepository } from '#repositories/baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { Item } from '#entities/item' import { Item } from '#entities/item'
class ItemRepository extends BaseRepository { class ItemRepository extends BaseRepository {

View File

@ -1,4 +1,4 @@
import { BaseRepository } from '#repositories/baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
class ObjectRepository extends BaseRepository { class ObjectRepository extends BaseRepository {
async getById(id: string): Promise<any> { async getById(id: string): Promise<any> {

View File

@ -1,5 +1,5 @@
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import { BaseRepository } from '#repositories/baseRepository' // Import the global Prisma instance import { BaseRepository } from '#application/bases/baseRepository' // Import the global Prisma instance
import { PasswordResetToken } from '#entities/passwordResetToken' import { PasswordResetToken } from '#entities/passwordResetToken'
class PasswordResetTokenRepository extends BaseRepository { class PasswordResetTokenRepository extends BaseRepository {

View File

@ -1,5 +1,5 @@
import { FilterValue } from '@mikro-orm/core' import { FilterValue } from '@mikro-orm/core'
import { BaseRepository } from '#repositories/baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { Sprite } from '#entities/sprite' import { Sprite } from '#entities/sprite'
class SpriteRepository extends BaseRepository { class SpriteRepository extends BaseRepository {

View File

@ -1,9 +1,9 @@
import { FilterValue } from '@mikro-orm/core' import { FilterValue } from '@mikro-orm/core'
import { BaseRepository } from '#repositories/baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { Tile } from '#entities/tile' import { Tile } from '#entities/tile'
import { Zone } from '#entities/zone' import { Zone } from '#entities/zone'
import { unduplicateArray } from '#utilities/utilities' import { unduplicateArray } from '#application/utilities'
import { FlattenZoneArray } from '#utilities/zone' import { FlattenZoneArray } from '#application/zone'
class TileRepository extends BaseRepository { class TileRepository extends BaseRepository {
async getById(id: FilterValue<`${string}-${string}-${string}-${string}-${string}`>): Promise<any> { async getById(id: FilterValue<`${string}-${string}-${string}-${string}-${string}`>): Promise<any> {

View File

@ -1,5 +1,5 @@
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import { BaseRepository } from './baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { User } from '#entities/user' import { User } from '#entities/user'
class UserRepository extends BaseRepository { class UserRepository extends BaseRepository {

View File

@ -1,12 +1,12 @@
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import { BaseRepository } from '#repositories/baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { World } from '#entities/world' import { World } from '#entities/world'
class WorldRepository extends BaseRepository { class WorldRepository extends BaseRepository {
async getFirst(): Promise<any> { async getFirst() {
try { try {
const repository = this.em.getRepository(World) const repository = this.em.getRepository(World)
return await repository.findOne({}) return await repository.findOne({ date: { $exists: true }})
} catch (error: any) { } catch (error: any) {
gameLogger.error(`Failed to get first world: ${error instanceof Error ? error.message : String(error)}`) gameLogger.error(`Failed to get first world: ${error instanceof Error ? error.message : String(error)}`)
} }

View File

@ -1,5 +1,5 @@
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import { BaseRepository } from '#repositories/baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { ZoneEventTile } from '#entities/zoneEventTile' import { ZoneEventTile } from '#entities/zoneEventTile'
class ZoneEventTileRepository extends BaseRepository { class ZoneEventTileRepository extends BaseRepository {

View File

@ -1,5 +1,5 @@
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
import { BaseRepository } from '#repositories/baseRepository' import { BaseRepository } from '#application/bases/baseRepository'
import { ZoneEventTile } from '#entities/zoneEventTile' import { ZoneEventTile } from '#entities/zoneEventTile'
import { ZoneObject } from '#entities/zoneObject' import { ZoneObject } from '#entities/zoneObject'
import { Zone } from '#entities/zone' import { Zone } from '#entities/zone'

View File

@ -1,16 +1,15 @@
import fs from 'fs' import fs from 'fs'
import express, { Application } from 'express' import express, { Application } from 'express'
import config from '#utilities/config' import config from '#application/config'
import { getAppPath } from '#utilities/storage' import { getAppPath } from '#application/storage'
import { createServer as httpServer, Server as HTTPServer } from 'http' import { createServer as httpServer, Server as HTTPServer } from 'http'
import { addHttpRoutes } from './http' import { addHttpRoutes } from './http'
import cors from 'cors' import cors from 'cors'
import { Server as SocketServer } from 'socket.io' import { Server as SocketServer } from 'socket.io'
import { Authentication } from '#middleware/authentication' import { Authentication } from '#middleware/authentication'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { Database } from '#utilities/database' import { Database } from '#application/database'
import prisma from '#utilities/prisma' // @TODO: Remove this import { appLogger, watchLogs } from '#application/logger'
import { appLogger, watchLogs } from '#utilities/logger'
import ZoneManager from '#managers/zoneManager' import ZoneManager from '#managers/zoneManager'
import UserManager from '#managers/userManager' import UserManager from '#managers/userManager'
import CommandManager from '#managers/commandManager' import CommandManager from '#managers/commandManager'
@ -50,19 +49,11 @@ export class Server {
// Read log file and print to console for debugging // Read log file and print to console for debugging
watchLogs() watchLogs()
// Check prisma connection // Connect to database
try {
await prisma.$connect()
appLogger.info('Database connected')
} catch (error: any) {
appLogger.error(`Database connection failed: ${error.message}`)
}
// MikroORM
try { try {
await Database.getInstance() await Database.getInstance()
} catch (error: any) { } catch (error: any) {
appLogger.error(`Database 2 connection failed: ${error.message}`) appLogger.error(`Database connection failed: ${error.message}`)
} }
// Start the server // Start the server

View File

@ -1,9 +1,14 @@
import { AStar } from '#utilities/character/aStar' import { AStar } from '#application/character/aStar'
import ZoneManager from '#managers/zoneManager' import ZoneManager from '#managers/zoneManager'
import prisma from '#utilities/prisma' import Rotation from '#application/character/rotation'
import Rotation from '#utilities/character/rotation' import { appLogger, gameLogger } from '#application/logger'
import { appLogger, gameLogger } from '#utilities/logger' import { Database } from '#application/database'
import { Character } from '@prisma/client' import { Character } from '#entities/character'
import UserRepository from '#repositories/userRepository'
import CharacterRepository from '#repositories/characterRepository'
import CharacterHairRepository from '#repositories/characterHairRepository'
import ZoneRepository from '#repositories/zoneRepository'
import { Zone } from '#entities/zone'
interface Position { interface Position {
x: number x: number
@ -14,32 +19,41 @@ export class CharacterService {
private readonly MOVEMENT_DELAY_MS = 250 private readonly MOVEMENT_DELAY_MS = 250
async create(name: string, userId: number) { async create(name: string, userId: number) {
return prisma.character.create({ const user = await UserRepository.getById(userId)
data: { if (!user) return null
name,
userId const character = new Character()
// characterTypeId: 1 // @TODO set to chosen character type character.name = name
} character.user = user
}) await Database.save(character)
return character
} }
async updateHair(characterId: number, characterHairId: number | null) { async updateHair(characterId: number, characterHairId: number | null) {
await prisma.character.update({ const character = await CharacterRepository.getById(characterId)
where: { id: characterId }, if (!character) return null
data: {
characterHairId if (characterHairId === null) {
} character.characterHair = undefined
}) await Database.save(character)
return character
}
const characterHair = await CharacterHairRepository.getById(characterHairId)
character.characterHair = characterHair ?? undefined
await Database.save(character)
return character
} }
async deleteByUserIdAndId(userId: number, characterId: number): Promise<Character | null> { async deleteByUserIdAndId(userId: number, characterId: number): Promise<Character | null> {
try { try {
return await prisma.character.delete({ const character = await CharacterRepository.getByUserAndId(userId, characterId)
where: { if (!character) return null
userId,
id: characterId await Database.delete(character)
} return character
})
} catch (error: any) { } catch (error: any) {
// Handle error // Handle error
appLogger.error(`Failed to delete character by user ID and character ID: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to delete character by user ID and character ID: ${error instanceof Error ? error.message : String(error)}`)
@ -48,15 +62,16 @@ export class CharacterService {
} }
async updateCharacterPosition(id: number, positionX: number, positionY: number, rotation: number, zoneId: number) { async updateCharacterPosition(id: number, positionX: number, positionY: number, rotation: number, zoneId: number) {
await prisma.character.update({ const character = await CharacterRepository.getById(id)
where: { id }, if (!character) return null
data: {
positionX, character.positionX = positionX
positionY, character.positionY = positionY
rotation, character.rotation = rotation
zoneId character.zone = await ZoneRepository.getById(zoneId) as Zone
}
}) await Database.save(character)
return character
} }
public updatePosition(character: Character, position: Position, newZoneId?: number): void { public updatePosition(character: Character, position: Position, newZoneId?: number): void {
@ -68,12 +83,12 @@ export class CharacterService {
positionX: position.x, positionX: position.x,
positionY: position.y, positionY: position.y,
rotation: Rotation.calculate(character.positionX, character.positionY, position.x, position.y), rotation: Rotation.calculate(character.positionX, character.positionY, position.x, position.y),
zoneId: newZoneId ?? character.zoneId zoneId: newZoneId ?? character.zone.id
}) })
} }
public async calculatePath(character: Character, targetX: number, targetY: number): Promise<Position[] | null> { public async calculatePath(character: Character, targetX: number, targetY: number): Promise<Position[] | null> {
const zone = ZoneManager.getZoneById(character.zoneId) const zone = ZoneManager.getZoneById(character.zone.id)
const grid = await zone?.getGrid() const grid = await zone?.getGrid()
if (!grid?.length) { if (!grid?.length) {

View File

@ -1,7 +1,7 @@
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import ChatRepository from '#repositories/chatRepository' import ChatRepository from '#repositories/chatRepository'
class ChatService { class ChatService {

View File

@ -1,6 +1,6 @@
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import passwordResetTokenRepository from '#repositories/passwordResetTokenRepository' import passwordResetTokenRepository from '#repositories/passwordResetTokenRepository'
import { appLogger } from '#utilities/logger' import { appLogger } from '#application/logger'
class PasswordResetTokenService { class PasswordResetTokenService {
/** /**

View File

@ -1,12 +1,12 @@
import bcrypt from 'bcryptjs' import bcrypt from 'bcryptjs'
import UserRepository from '#repositories/userRepository' import UserRepository from '#repositories/userRepository'
import PasswordResetTokenRepository from '#repositories/passwordResetTokenRepository' import PasswordResetTokenRepository from '#repositories/passwordResetTokenRepository'
import config from '#utilities/config' import config from '#application/config'
import NodeMailer from 'nodemailer' import NodeMailer from 'nodemailer'
import { httpLogger } from '#utilities/logger' import { httpLogger } from '#application/logger'
import PasswordResetTokenService from './passwordResetTokenService' // @TODO: Correctly implement this import PasswordResetTokenService from './passwordResetTokenService' // @TODO: Correctly implement this
import { User } from '#entities/user' import { User } from '#entities/user'
import { Database } from '#utilities/database' import { Database } from '#application/database'
import { PasswordResetToken } from '#entities/passwordResetToken' import { PasswordResetToken } from '#entities/passwordResetToken'
/** /**

View File

@ -1,30 +1,35 @@
import prisma from '#utilities/prisma' import { gameLogger } from '#application/logger'
import { gameLogger } from '#utilities/logger'
import { World } from '@prisma/client'
import WorldRepository from '#repositories/worldRepository' import WorldRepository from '#repositories/worldRepository'
import { World } from '#entities/world'
class WorldService { class WorldService {
async update(worldData: Partial<World>): Promise<boolean> { async update(worldData: Partial<World>): Promise<boolean> {
try { try {
const currentWorld = await WorldRepository.getFirst() let world = await WorldRepository.getFirst()
if (!currentWorld) { if (!world) {
// If no world exists, create first record world = new World()
await prisma.world.create({
data: { await world.save()
...worldData,
date: worldData.date || new Date()
}
})
return true
} }
// Update existing world using its date as unique identifier world.date = worldData.date || new Date()
await prisma.world.update({
where: { if (worldData.isRainEnabled) {
date: currentWorld.date world.isRainEnabled = worldData.isRainEnabled
}, }
data: worldData if (worldData.rainPercentage) {
}) world.rainPercentage = worldData.rainPercentage
}
if (worldData.isFogEnabled) {
world.isFogEnabled = worldData.isFogEnabled
}
if (worldData.fogDensity) {
world.fogDensity = worldData.fogDensity
}
console.log(world.date)
await world.update()
return true return true
} catch (error: any) { } catch (error: any) {

View File

@ -1,9 +1,9 @@
import { ExtendedCharacter, TSocket } from '#utilities/types' import { ExtendedCharacter, TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import { ZoneEventTileTeleport } from '@prisma/client' import { ZoneEventTileTeleport } from '@prisma/client'
import { Server } from 'socket.io' import { Server } from 'socket.io'
import ZoneManager from '#managers/zoneManager' import ZoneManager from '#managers/zoneManager'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
export class ZoneEventTileService { export class ZoneEventTileService {
public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise<void> { public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise<void> {

View File

@ -1,5 +1,5 @@
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
class ZoneService {} class ZoneService {}

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { CharacterHair } from '@prisma/client' import { TSocket } from '#application/types'
import { TSocket } from '#utilities/types'
import characterHairRepository from '#repositories/characterHairRepository' import characterHairRepository from '#repositories/characterHairRepository'
import { CharacterHair } from '#entities/characterHair'
interface IPayload {} interface IPayload {}
@ -15,7 +15,7 @@ export default class characterHairListEvent {
this.socket.on('character:hair:list', this.handleEvent.bind(this)) this.socket.on('character:hair:list', this.handleEvent.bind(this))
} }
private async handleEvent(data: IPayload, callback: (response: CharacterHair[]) => void): Promise<void> { private async handleEvent(data: IPayload, callback: (response: CharacterHair[] | null) => void): Promise<void> {
const items = await characterHairRepository.getAllSelectable() const items = await characterHairRepository.getAllSelectable()
callback(items) callback(items)
} }

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import ZoneManager from '#managers/zoneManager' import ZoneManager from '#managers/zoneManager'
import { CharacterService } from '#services/characterService' import { CharacterService } from '#services/characterService'

View File

@ -1,10 +1,10 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { Character } from '@prisma/client' import { Character } from '#entities/character'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import { CharacterService } from '#services/characterService' import { CharacterService } from '#services/characterService'
import { ZCharacterCreate } from '#utilities/zodTypes' import { ZCharacterCreate } from '#application/zodTypes'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import { ZodError } from 'zod' import { ZodError } from 'zod'
export default class CharacterCreateEvent { export default class CharacterCreateEvent {

View File

@ -1,8 +1,9 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { Character, Zone } from '@prisma/client'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import { CharacterService } from '#services/characterService' import { CharacterService } from '#services/characterService'
import { Character } from '#entities/character'
import { Zone } from '#entities/zone'
type TypePayload = { type TypePayload = {
characterId: number characterId: number

View File

@ -1,8 +1,8 @@
import { Socket, Server } from 'socket.io' import { Socket, Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { Character } from '@prisma/client'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import { Character } from '#entities/character'
export default class CharacterListEvent { export default class CharacterListEvent {
constructor( constructor(

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { getArgs, isCommand } from '#utilities/chat' import { getArgs, isCommand } from '#application/chat'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
type TypePayload = { type TypePayload = {
message: string message: string

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { getArgs, isCommand } from '#utilities/chat' import { getArgs, isCommand } from '#application/chat'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import DateManager from '#managers/dateManager' import DateManager from '#managers/dateManager'
type TypePayload = { type TypePayload = {

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { getArgs, isCommand } from '#utilities/chat' import { getArgs, isCommand } from '#application/chat'
import ZoneRepository from '#repositories/zoneRepository' import ZoneRepository from '#repositories/zoneRepository'
import { gameLogger, gameMasterLogger } from '#utilities/logger' import { gameLogger, gameMasterLogger } from '#application/logger'
import ZoneManager from '#managers/zoneManager' import ZoneManager from '#managers/zoneManager'
import ZoneCharacter from '#models/zoneCharacter' import ZoneCharacter from '#models/zoneCharacter'
import zoneManager from '#managers/zoneManager' import zoneManager from '#managers/zoneManager'

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { isCommand } from '#utilities/chat' import { isCommand } from '#application/chat'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import WeatherManager from '#managers/weatherManager' import WeatherManager from '#managers/weatherManager'
type TypePayload = { type TypePayload = {

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { isCommand } from '#utilities/chat' import { isCommand } from '#application/chat'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import WeatherManager from '#managers/weatherManager' import WeatherManager from '#managers/weatherManager'
type TypePayload = { type TypePayload = {

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import ZoneRepository from '#repositories/zoneRepository' import ZoneRepository from '#repositories/zoneRepository'
import { isCommand } from '#utilities/chat' import { isCommand } from '#application/chat'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import ZoneManager from '#managers/zoneManager' import ZoneManager from '#managers/zoneManager'
import ChatService from '#services/chatService' import ChatService from '#services/chatService'

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { gameLogger } from '#utilities/logger' import { gameLogger } from '#application/logger'
import ZoneManager from '#managers/zoneManager' import ZoneManager from '#managers/zoneManager'
export default class DisconnectEvent { export default class DisconnectEvent {

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
export default class CharacterHairCreateEvent { export default class CharacterHairCreateEvent {

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { gameMasterLogger } from '#utilities/logger' import { gameMasterLogger } from '#application/logger'
interface IPayload { interface IPayload {
id: number id: number

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { CharacterHair } from '@prisma/client' import { CharacterHair } from '@prisma/client'
import { gameMasterLogger } from '#utilities/logger' import { gameMasterLogger } from '#application/logger'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import characterHairRepository from '#repositories/characterHairRepository' import characterHairRepository from '#repositories/characterHairRepository'

View File

@ -1,9 +1,9 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { CharacterGender, CharacterRace } from '@prisma/client' import { CharacterGender, CharacterRace } from '@prisma/client'
import { gameMasterLogger } from '#utilities/logger' import { gameMasterLogger } from '#application/logger'
type Payload = { type Payload = {
id: number id: number

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { CharacterGender, CharacterRace } from '@prisma/client' import { CharacterGender, CharacterRace } from '@prisma/client'

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { gameMasterLogger } from '#utilities/logger' import { gameMasterLogger } from '#application/logger'
interface IPayload { interface IPayload {
id: number id: number

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { CharacterType } from '@prisma/client' import { CharacterType } from '@prisma/client'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { gameMasterLogger } from '#utilities/logger' import { gameMasterLogger } from '#application/logger'
import CharacterTypeRepository from '#repositories/characterTypeRepository' import CharacterTypeRepository from '#repositories/characterTypeRepository'
interface IPayload {} interface IPayload {}

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { CharacterGender, CharacterRace } from '@prisma/client' import { CharacterGender, CharacterRace } from '@prisma/client'

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
export default class ItemCreateEvent { export default class ItemCreateEvent {

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { gameMasterLogger } from '#utilities/logger' import { gameMasterLogger } from '#application/logger'
interface IPayload { interface IPayload {
id: string id: string

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { Item } from '@prisma/client' import { Item } from '@prisma/client'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { gameMasterLogger } from '#utilities/logger' import { gameMasterLogger } from '#application/logger'
import itemRepository from '#repositories/itemRepository' import itemRepository from '#repositories/itemRepository'
interface IPayload {} interface IPayload {}

View File

@ -1,9 +1,9 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { ItemType, ItemRarity } from '@prisma/client' import { ItemType, ItemRarity } from '@prisma/client'
import { gameMasterLogger } from '#utilities/logger' import { gameMasterLogger } from '#application/logger'
type Payload = { type Payload = {
id: string id: string

View File

@ -1,5 +1,5 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { Object } from '@prisma/client' import { Object } from '@prisma/client'
import ObjectRepository from '#repositories/objectRepository' import ObjectRepository from '#repositories/objectRepository'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'

View File

@ -1,10 +1,10 @@
import fs from 'fs' import fs from 'fs'
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { getPublicPath } from '#utilities/storage' import { getPublicPath } from '#application/storage'
import { gameLogger, gameMasterLogger } from '#utilities/logger' import { gameLogger, gameMasterLogger } from '#application/logger'
interface IPayload { interface IPayload {
object: string object: string

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
type Payload = { type Payload = {

View File

@ -1,12 +1,12 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import { writeFile } from 'node:fs/promises' import { writeFile } from 'node:fs/promises'
import fs from 'fs/promises' import fs from 'fs/promises'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import sharp from 'sharp' import sharp from 'sharp'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { gameMasterLogger } from '#utilities/logger' import { gameMasterLogger } from '#application/logger'
import { getPublicPath } from '#utilities/storage' import { getPublicPath } from '#application/storage'
interface IObjectData { interface IObjectData {
[key: string]: Buffer [key: string]: Buffer

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import { gameMasterLogger } from '#utilities/logger' import { gameMasterLogger } from '#application/logger'
import type { Prisma } from '@prisma/client' import type { Prisma } from '@prisma/client'
interface CopyPayload { interface CopyPayload {

View File

@ -1,9 +1,9 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#utilities/types' import { TSocket } from '#application/types'
import fs from 'fs/promises' import fs from 'fs/promises'
import prisma from '#utilities/prisma' import prisma from '#application/prisma'
import characterRepository from '#repositories/characterRepository' import characterRepository from '#repositories/characterRepository'
import { getPublicPath } from '#utilities/storage' import { getPublicPath } from '#application/storage'
export default class SpriteCreateEvent { export default class SpriteCreateEvent {
constructor( constructor(

Some files were not shown because too many files have changed in this diff Show More