diff --git a/migrations/Migration20241229234130.ts b/migrations/Migration20250101194316.ts similarity index 93% rename from migrations/Migration20241229234130.ts rename to migrations/Migration20250101194316.ts index 5e9a33d..0bdbc54 100644 --- a/migrations/Migration20241229234130.ts +++ b/migrations/Migration20250101194316.ts @@ -1,6 +1,6 @@ import { Migration } from '@mikro-orm/migrations'; -export class Migration20241229234130 extends Migration { +export class Migration20250101194316 extends Migration { override async up(): Promise { this.addSql(`create table \`map_object\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`tags\` json null, \`origin_x\` int not null default 0, \`origin_y\` int not null default 0, \`is_animated\` tinyint(1) not null default false, \`frame_rate\` int not null default 0, \`frame_width\` int not null default 0, \`frame_height\` int not null default 0, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); @@ -72,33 +72,33 @@ export class Migration20241229234130 extends Migration { this.addSql(`alter table \`character_hair\` add constraint \`character_hair_sprite_id_foreign\` foreign key (\`sprite_id\`) references \`sprite\` (\`id\`) on update cascade on delete set null;`); - this.addSql(`alter table \`sprite_action\` add constraint \`sprite_action_sprite_id_foreign\` foreign key (\`sprite_id\`) references \`sprite\` (\`id\`) on update cascade;`); + this.addSql(`alter table \`sprite_action\` add constraint \`sprite_action_sprite_id_foreign\` foreign key (\`sprite_id\`) references \`sprite\` (\`id\`) on update cascade on delete cascade;`); - this.addSql(`alter table \`password_reset_token\` add constraint \`password_reset_token_user_id_foreign\` foreign key (\`user_id\`) references \`user\` (\`id\`) on update cascade;`); + this.addSql(`alter table \`password_reset_token\` add constraint \`password_reset_token_user_id_foreign\` foreign key (\`user_id\`) references \`user\` (\`id\`) on update cascade on delete cascade;`); this.addSql(`alter table \`character\` add constraint \`character_user_id_foreign\` foreign key (\`user_id\`) references \`user\` (\`id\`) on update cascade;`); this.addSql(`alter table \`character\` add constraint \`character_zone_id_foreign\` foreign key (\`zone_id\`) references \`zone\` (\`id\`) on update cascade;`); this.addSql(`alter table \`character\` add constraint \`character_character_type_id_foreign\` foreign key (\`character_type_id\`) references \`character_type\` (\`id\`) on update cascade on delete set null;`); this.addSql(`alter table \`character\` add constraint \`character_character_hair_id_foreign\` foreign key (\`character_hair_id\`) references \`character_hair\` (\`id\`) on update cascade on delete set null;`); - this.addSql(`alter table \`chat\` add constraint \`chat_character_id_foreign\` foreign key (\`character_id\`) references \`character\` (\`id\`) on update cascade;`); - this.addSql(`alter table \`chat\` add constraint \`chat_zone_id_foreign\` foreign key (\`zone_id\`) references \`zone\` (\`id\`) on update cascade;`); + this.addSql(`alter table \`chat\` add constraint \`chat_character_id_foreign\` foreign key (\`character_id\`) references \`character\` (\`id\`) on update cascade on delete cascade;`); + this.addSql(`alter table \`chat\` add constraint \`chat_zone_id_foreign\` foreign key (\`zone_id\`) references \`zone\` (\`id\`) on update cascade on delete cascade;`); - this.addSql(`alter table \`character_item\` add constraint \`character_item_character_id_foreign\` foreign key (\`character_id\`) references \`character\` (\`id\`) on update cascade;`); - this.addSql(`alter table \`character_item\` add constraint \`character_item_item_id_foreign\` foreign key (\`item_id\`) references \`item\` (\`id\`) on update cascade;`); + this.addSql(`alter table \`character_item\` add constraint \`character_item_character_id_foreign\` foreign key (\`character_id\`) references \`character\` (\`id\`) on update cascade on delete cascade;`); + this.addSql(`alter table \`character_item\` add constraint \`character_item_item_id_foreign\` foreign key (\`item_id\`) references \`item\` (\`id\`) on update cascade on delete cascade;`); - this.addSql(`alter table \`character_equipment\` add constraint \`character_equipment_character_id_foreign\` foreign key (\`character_id\`) references \`character\` (\`id\`) on update cascade;`); - this.addSql(`alter table \`character_equipment\` add constraint \`character_equipment_character_item_id_foreign\` foreign key (\`character_item_id\`) references \`character_item\` (\`id\`) on update cascade;`); + this.addSql(`alter table \`character_equipment\` add constraint \`character_equipment_character_id_foreign\` foreign key (\`character_id\`) references \`character\` (\`id\`) on update cascade on delete cascade;`); + this.addSql(`alter table \`character_equipment\` add constraint \`character_equipment_character_item_id_foreign\` foreign key (\`character_item_id\`) references \`character_item\` (\`id\`) on update cascade on delete cascade;`); - this.addSql(`alter table \`zone_effect\` add constraint \`zone_effect_zone_id_foreign\` foreign key (\`zone_id\`) references \`zone\` (\`id\`) on update cascade;`); + this.addSql(`alter table \`zone_effect\` add constraint \`zone_effect_zone_id_foreign\` foreign key (\`zone_id\`) references \`zone\` (\`id\`) on update cascade on delete cascade;`); - this.addSql(`alter table \`zone_event_tile\` add constraint \`zone_event_tile_zone_id_foreign\` foreign key (\`zone_id\`) references \`zone\` (\`id\`) on update cascade;`); + this.addSql(`alter table \`zone_event_tile\` add constraint \`zone_event_tile_zone_id_foreign\` foreign key (\`zone_id\`) references \`zone\` (\`id\`) on update cascade on delete cascade;`); - this.addSql(`alter table \`zone_event_tile_teleport\` add constraint \`zone_event_tile_teleport_zone_event_tile_id_foreign\` foreign key (\`zone_event_tile_id\`) references \`zone_event_tile\` (\`id\`) on update cascade;`); - this.addSql(`alter table \`zone_event_tile_teleport\` add constraint \`zone_event_tile_teleport_to_zone_id_foreign\` foreign key (\`to_zone_id\`) references \`zone\` (\`id\`) on update cascade;`); + this.addSql(`alter table \`zone_event_tile_teleport\` add constraint \`zone_event_tile_teleport_zone_event_tile_id_foreign\` foreign key (\`zone_event_tile_id\`) references \`zone_event_tile\` (\`id\`) on update cascade on delete cascade;`); + this.addSql(`alter table \`zone_event_tile_teleport\` add constraint \`zone_event_tile_teleport_to_zone_id_foreign\` foreign key (\`to_zone_id\`) references \`zone\` (\`id\`) on update cascade on delete cascade;`); - this.addSql(`alter table \`zone_object\` add constraint \`zone_object_zone_id_foreign\` foreign key (\`zone_id\`) references \`zone\` (\`id\`) on update cascade;`); - this.addSql(`alter table \`zone_object\` add constraint \`zone_object_map_object_id_foreign\` foreign key (\`map_object_id\`) references \`map_object\` (\`id\`) on update cascade;`); + this.addSql(`alter table \`zone_object\` add constraint \`zone_object_zone_id_foreign\` foreign key (\`zone_id\`) references \`zone\` (\`id\`) on update cascade on delete cascade;`); + this.addSql(`alter table \`zone_object\` add constraint \`zone_object_map_object_id_foreign\` foreign key (\`map_object_id\`) references \`map_object\` (\`id\`) on update cascade on delete cascade;`); } } diff --git a/package-lock.json b/package-lock.json index 057411e..8ab468a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1784,9 +1784,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.17.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", - "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "version": "20.17.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.11.tgz", + "integrity": "sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg==", "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -2457,9 +2457,9 @@ "license": "BSD-3-Clause" }, "node_modules/bullmq": { - "version": "5.34.5", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.34.5.tgz", - "integrity": "sha512-MHho9EOhLCTY3ZF+dd0wHv0VlY2FtpBcopMRsvj0kPra4TAwBFh2pik/s4WbX56cIfCE+VzfHIHy4xvqp3g1+Q==", + "version": "5.34.6", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.34.6.tgz", + "integrity": "sha512-pRCYyO9RlkQWxdmKlrNnUthyFwurYXRYLVXD1YIx+nCCdhAOiHatD8FDHbsT/w2I31c0NWoMcfZiIGuipiF7Lg==", "license": "MIT", "dependencies": { "cron-parser": "^4.9.0", @@ -5214,9 +5214,9 @@ } }, "node_modules/mariadb/node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "version": "22.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.3.tgz", + "integrity": "sha512-DifAyw4BkrufCILvD3ucnuN8eydUfc/C1GlyrnI+LK6543w5/L3VeVgf05o3B4fqSXP1dKYLOZsKfutpxPzZrw==", "license": "MIT", "dependencies": { "undici-types": "~6.20.0" diff --git a/src/entities/character.ts b/src/entities/character.ts index 66946ab..cc09ce5 100644 --- a/src/entities/character.ts +++ b/src/entities/character.ts @@ -32,7 +32,7 @@ export class Character extends BaseEntity { // Position @ManyToOne() - zone!: Zone + zone!: Zone // @TODO: Update to spawn point when current zone is not found @Property() positionX = 0 @@ -44,10 +44,10 @@ export class Character extends BaseEntity { rotation = 0 // Customization - @ManyToOne() + @ManyToOne({ deleteRule: 'set null' }) characterType?: CharacterType | null | undefined - @ManyToOne() + @ManyToOne({ deleteRule: 'set null' }) characterHair?: CharacterHair | null | undefined // Inventory diff --git a/src/entities/characterEquipment.ts b/src/entities/characterEquipment.ts index 772a2e4..8a8c50b 100644 --- a/src/entities/characterEquipment.ts +++ b/src/entities/characterEquipment.ts @@ -14,10 +14,10 @@ export class CharacterEquipment extends BaseEntity { @Enum(() => CharacterEquipmentSlotType) slot!: CharacterEquipmentSlotType - @ManyToOne(() => Character) + @ManyToOne({ deleteRule: 'cascade' }) character!: Character - @ManyToOne(() => CharacterItem) + @ManyToOne({ deleteRule: 'cascade' }) characterItem!: CharacterItem setId(id: number) { diff --git a/src/entities/characterHair.ts b/src/entities/characterHair.ts index 21c7615..2ae0000 100644 --- a/src/entities/characterHair.ts +++ b/src/entities/characterHair.ts @@ -20,12 +20,9 @@ export class CharacterHair extends BaseEntity { @Property() isSelectable = false - @ManyToOne(() => Sprite, { nullable: true }) + @ManyToOne({ nullable: true }) sprite?: Sprite - @OneToMany(() => Character, (character) => character.characterHair) - characters = new Collection(this) - setId(id: number) { this.id = id return this @@ -70,13 +67,4 @@ export class CharacterHair extends BaseEntity { getSprite() { return this.sprite } - - setCharacters(characters: Collection) { - this.characters = characters - return this - } - - getCharacters() { - return this.characters - } } diff --git a/src/entities/characterItem.ts b/src/entities/characterItem.ts index 281b4bf..3cc059c 100644 --- a/src/entities/characterItem.ts +++ b/src/entities/characterItem.ts @@ -11,18 +11,15 @@ export class CharacterItem extends BaseEntity { @PrimaryKey() id!: number - @ManyToOne(() => Character) + @ManyToOne({ deleteRule: 'cascade' }) character!: Character - @ManyToOne(() => Item) + @ManyToOne({ deleteRule: 'cascade' }) item!: Item @Property() quantity!: number - @OneToMany(() => CharacterEquipment, (equipment) => equipment.characterItem) - characterEquipment = new Collection(this) - setId(id: number) { this.id = id return this @@ -58,13 +55,4 @@ export class CharacterItem extends BaseEntity { getQuantity() { return this.quantity } - - setCharacterEquipment(characterEquipment: Collection) { - this.characterEquipment = characterEquipment - return this - } - - getCharacterEquipment() { - return this.characterEquipment - } } diff --git a/src/entities/chat.ts b/src/entities/chat.ts index a33120e..cf795fc 100644 --- a/src/entities/chat.ts +++ b/src/entities/chat.ts @@ -10,10 +10,10 @@ export class Chat extends BaseEntity { @PrimaryKey() id!: number - @ManyToOne(() => Character) + @ManyToOne({ deleteRule: 'cascade' }) character!: Character - @ManyToOne(() => Zone) + @ManyToOne({ deleteRule: 'cascade' }) zone!: Zone @Property() diff --git a/src/entities/item.ts b/src/entities/item.ts index 20c2214..cca277b 100644 --- a/src/entities/item.ts +++ b/src/entities/item.ts @@ -38,9 +38,6 @@ export class Item extends BaseEntity { @Property() updatedAt = new Date() - @OneToMany(() => CharacterItem, (characterItem) => characterItem.item) - characters = new Collection(this) - setId(id: UUID) { this.id = id return this @@ -121,13 +118,4 @@ export class Item extends BaseEntity { getUpdatedAt() { return this.updatedAt } - - setCharacters(characters: Collection) { - this.characters = characters - return this - } - - getCharacters() { - return this.characters - } } diff --git a/src/entities/mapObject.ts b/src/entities/mapObject.ts index fe0bf24..385bbd0 100644 --- a/src/entities/mapObject.ts +++ b/src/entities/mapObject.ts @@ -42,9 +42,6 @@ export class MapObject extends BaseEntity { @Property() updatedAt = new Date() - @OneToMany(() => ZoneObject, (zoneObject) => zoneObject.mapObject) - zoneObjects = new Collection(this) - setId(id: UUID) { this.id = id return this @@ -143,13 +140,4 @@ export class MapObject extends BaseEntity { getUpdatedAt() { return this.updatedAt } - - setZoneObjects(zoneObjects: Collection) { - this.zoneObjects = zoneObjects - return this - } - - getZoneObjects() { - return this.zoneObjects - } } diff --git a/src/entities/passwordResetToken.ts b/src/entities/passwordResetToken.ts index b7424af..a92784f 100644 --- a/src/entities/passwordResetToken.ts +++ b/src/entities/passwordResetToken.ts @@ -9,7 +9,7 @@ export class PasswordResetToken extends BaseEntity { @PrimaryKey() id!: number - @ManyToOne(() => User) + @ManyToOne({ deleteRule: 'cascade' }) user!: User @Property({ unique: true }) diff --git a/src/entities/spriteAction.ts b/src/entities/spriteAction.ts index ac3cb33..cd7c7fb 100644 --- a/src/entities/spriteAction.ts +++ b/src/entities/spriteAction.ts @@ -12,7 +12,7 @@ export class SpriteAction extends BaseEntity { @PrimaryKey() id = randomUUID() - @ManyToOne(() => Sprite) + @ManyToOne({ deleteRule: 'cascade' }) sprite!: Sprite @Property() diff --git a/src/entities/zone.ts b/src/entities/zone.ts index 160494c..5f7d372 100644 --- a/src/entities/zone.ts +++ b/src/entities/zone.ts @@ -29,6 +29,12 @@ export class Zone extends BaseEntity { @Property() pvp = false + @Property() + createdAt = new Date() + + @Property() + updatedAt = new Date() + @OneToMany(() => ZoneEffect, (effect) => effect.zone) zoneEffects = new Collection(this) @@ -47,12 +53,6 @@ export class Zone extends BaseEntity { @OneToMany(() => Chat, (chat) => chat.zone) chats = new Collection(this) - @Property() - createdAt = new Date() - - @Property() - updatedAt = new Date() - setId(id: number) { this.id = id return this @@ -107,6 +107,24 @@ export class Zone extends BaseEntity { return this.pvp } + setCreatedAt(createdAt: Date) { + this.createdAt = createdAt + return this + } + + getCreatedAt() { + return this.createdAt + } + + setUpdatedAt(updatedAt: Date) { + this.updatedAt = updatedAt + return this + } + + getUpdatedAt() { + return this.updatedAt + } + setZoneEffects(zoneEffects: Collection) { this.zoneEffects = zoneEffects return this @@ -160,22 +178,4 @@ export class Zone extends BaseEntity { getChats() { return this.chats } - - setCreatedAt(createdAt: Date) { - this.createdAt = createdAt - return this - } - - getCreatedAt() { - return this.createdAt - } - - setUpdatedAt(updatedAt: Date) { - this.updatedAt = updatedAt - return this - } - - getUpdatedAt() { - return this.updatedAt - } } diff --git a/src/entities/zoneEffect.ts b/src/entities/zoneEffect.ts index 737a0e9..ff3ff64 100644 --- a/src/entities/zoneEffect.ts +++ b/src/entities/zoneEffect.ts @@ -12,7 +12,7 @@ export class ZoneEffect extends BaseEntity { @PrimaryKey() id = randomUUID() - @ManyToOne(() => Zone) + @ManyToOne({ deleteRule: 'cascade' }) zone!: Zone @Property() diff --git a/src/entities/zoneEventTile.ts b/src/entities/zoneEventTile.ts index 61f1419..13951c5 100644 --- a/src/entities/zoneEventTile.ts +++ b/src/entities/zoneEventTile.ts @@ -14,7 +14,7 @@ export class ZoneEventTile extends BaseEntity { @PrimaryKey() id = randomUUID() - @ManyToOne(() => Zone) + @ManyToOne({ deleteRule: 'cascade' }) zone!: Zone @Enum(() => ZoneEventTileType) diff --git a/src/entities/zoneEventTileTeleport.ts b/src/entities/zoneEventTileTeleport.ts index 8dceb71..d87f375 100644 --- a/src/entities/zoneEventTileTeleport.ts +++ b/src/entities/zoneEventTileTeleport.ts @@ -13,10 +13,10 @@ export class ZoneEventTileTeleport extends BaseEntity { @PrimaryKey() id = randomUUID() - @OneToOne(() => ZoneEventTile) + @OneToOne({ deleteRule: 'cascade' }) zoneEventTile!: ZoneEventTile - @ManyToOne(() => Zone) + @ManyToOne({ deleteRule: 'cascade' }) toZone!: Zone @Property() diff --git a/src/entities/zoneObject.ts b/src/entities/zoneObject.ts index a623956..f71854a 100644 --- a/src/entities/zoneObject.ts +++ b/src/entities/zoneObject.ts @@ -14,10 +14,10 @@ export class ZoneObject extends BaseEntity { @PrimaryKey() id = randomUUID() - @ManyToOne(() => Zone) + @ManyToOne({ deleteRule: 'cascade' }) zone!: Zone - @ManyToOne(() => MapObject) + @ManyToOne({ deleteRule: 'cascade' }) mapObject!: MapObject @Property()