#245 : Enhanced asset CRUD logic
This commit is contained in:
parent
4c7751db55
commit
0efa9fb1d5
6
package-lock.json
generated
6
package-lock.json
generated
@ -3316,9 +3316,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/long": {
|
"node_modules/long": {
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/long/-/long-5.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz",
|
||||||
"integrity": "sha512-5vvY5yF1zF/kXk+L94FRiTDa1Znom46UjPCH6/XbSvS8zBKMFBHTJk8KDMqJ+2J6QezQFi7k1k8v21ClJYHPaw==",
|
"integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==",
|
||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/lru-cache": {
|
"node_modules/lru-cache": {
|
||||||
|
@ -45,7 +45,7 @@ export abstract class BaseEvent {
|
|||||||
return character?.getRole() === 'gm'
|
return character?.getRole() === 'gm'
|
||||||
}
|
}
|
||||||
|
|
||||||
protected emitError(message: string): void {
|
protected sendNotificationAndLog(message: string): void {
|
||||||
this.socket.emit(SocketEvent.NOTIFICATION, { title: 'Server message', message })
|
this.socket.emit(SocketEvent.NOTIFICATION, { title: 'Server message', message })
|
||||||
this.logger.error('Base event error', `Player ${this.socket.userId}: ${message}`)
|
this.logger.error('Base event error', `Player ${this.socket.userId}: ${message}`)
|
||||||
}
|
}
|
||||||
|
@ -16,11 +16,14 @@ export class BaseCharacterHair extends BaseEntity {
|
|||||||
@Property()
|
@Property()
|
||||||
gender: CharacterGender = CharacterGender.MALE
|
gender: CharacterGender = CharacterGender.MALE
|
||||||
|
|
||||||
|
@Property()
|
||||||
|
color: string = '#000000'
|
||||||
|
|
||||||
@Property()
|
@Property()
|
||||||
isSelectable = false
|
isSelectable = false
|
||||||
|
|
||||||
@ManyToOne()
|
@ManyToOne()
|
||||||
sprite?: Sprite
|
sprite!: Sprite
|
||||||
|
|
||||||
@Property()
|
@Property()
|
||||||
createdAt = new Date()
|
createdAt = new Date()
|
||||||
@ -55,6 +58,15 @@ export class BaseCharacterHair extends BaseEntity {
|
|||||||
return this.gender
|
return this.gender
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setColor(color: string) {
|
||||||
|
this.color = color
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
getColor() {
|
||||||
|
return this.color
|
||||||
|
}
|
||||||
|
|
||||||
setIsSelectable(isSelectable: boolean) {
|
setIsSelectable(isSelectable: boolean) {
|
||||||
this.isSelectable = isSelectable
|
this.isSelectable = isSelectable
|
||||||
return this
|
return this
|
||||||
|
@ -25,8 +25,8 @@ export class BaseItem extends BaseEntity {
|
|||||||
@Enum(() => ItemRarity)
|
@Enum(() => ItemRarity)
|
||||||
rarity: ItemRarity = ItemRarity.COMMON
|
rarity: ItemRarity = ItemRarity.COMMON
|
||||||
|
|
||||||
@ManyToOne(() => Sprite)
|
@ManyToOne()
|
||||||
sprite?: Sprite
|
sprite!: Sprite
|
||||||
|
|
||||||
@Property()
|
@Property()
|
||||||
createdAt = new Date()
|
createdAt = new Date()
|
||||||
|
@ -22,14 +22,14 @@ export default class CharacterConnectEvent extends BaseEvent {
|
|||||||
private async handleEvent(data: CharacterConnectPayload, callback: (response: any) => void): Promise<void> {
|
private async handleEvent(data: CharacterConnectPayload, callback: (response: any) => void): Promise<void> {
|
||||||
try {
|
try {
|
||||||
if (await this.checkForActiveCharacters()) {
|
if (await this.checkForActiveCharacters()) {
|
||||||
this.emitError('You are already connected to another character')
|
this.sendNotificationAndLog('You are already connected to another character')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const character = await this.characterRepository.getByUserAndId(this.socket.userId, data.characterId)
|
const character = await this.characterRepository.getByUserAndId(this.socket.userId, data.characterId)
|
||||||
|
|
||||||
if (!character) {
|
if (!character) {
|
||||||
this.emitError('Character not found or does not belong to this user')
|
this.sendNotificationAndLog('Character not found or does not belong to this user')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { BaseEvent } from '@/application/base/baseEvent'
|
import { BaseEvent } from '@/application/base/baseEvent'
|
||||||
import { SocketEvent } from '@/application/enums'
|
import { SocketEvent } from '@/application/enums'
|
||||||
import { CharacterHair } from '@/entities/characterHair'
|
import { CharacterHair } from '@/entities/characterHair'
|
||||||
|
import SpriteRepository from "@/repositories/spriteRepository";
|
||||||
|
|
||||||
export default class CharacterHairCreateEvent extends BaseEvent {
|
export default class CharacterHairCreateEvent extends BaseEvent {
|
||||||
public listen(): void {
|
public listen(): void {
|
||||||
@ -11,8 +12,17 @@ export default class CharacterHairCreateEvent extends BaseEvent {
|
|||||||
try {
|
try {
|
||||||
if (!(await this.isCharacterGM())) return
|
if (!(await this.isCharacterGM())) return
|
||||||
|
|
||||||
|
// Get first sprite
|
||||||
|
const spriteRepository = new SpriteRepository()
|
||||||
|
const firstSprite = await spriteRepository.getFirst()
|
||||||
|
|
||||||
|
if (!firstSprite) {
|
||||||
|
this.sendNotificationAndLog('No sprites found')
|
||||||
|
return callback(false)
|
||||||
|
}
|
||||||
|
|
||||||
const newCharacterHair = new CharacterHair()
|
const newCharacterHair = new CharacterHair()
|
||||||
await newCharacterHair.setName('New hair').save()
|
await newCharacterHair.setName('New hair').setSprite(firstSprite).save()
|
||||||
|
|
||||||
return callback(true)
|
return callback(true)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -14,7 +14,10 @@ export default class ItemCreateEvent extends BaseEvent {
|
|||||||
|
|
||||||
const spriteRepository = new SpriteRepository()
|
const spriteRepository = new SpriteRepository()
|
||||||
const sprite = await spriteRepository.getFirst()
|
const sprite = await spriteRepository.getFirst()
|
||||||
if (!sprite) return callback(false)
|
if (!sprite) {
|
||||||
|
this.sendNotificationAndLog('No sprites found')
|
||||||
|
return callback(false)
|
||||||
|
}
|
||||||
|
|
||||||
const newItem = new Item()
|
const newItem = new Item()
|
||||||
await newItem.setName('New Item').setItemType(ItemType.WEAPON).setStackable(false).setRarity(ItemRarity.COMMON).setSprite(sprite).save()
|
await newItem.setName('New Item').setItemType(ItemType.WEAPON).setStackable(false).setRarity(ItemRarity.COMMON).setSprite(sprite).save()
|
||||||
|
@ -130,7 +130,7 @@ export default class MapUpdateEvent extends BaseEvent {
|
|||||||
|
|
||||||
return callback(await map.mapEditorObject())
|
return callback(await map.mapEditorObject())
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
this.emitError(`gm:map:update error: ${error instanceof Error ? error.message + error.stack : String(error)}`)
|
this.sendNotificationAndLog(`gm:map:update error: ${error instanceof Error ? error.message + error.stack : String(error)}`)
|
||||||
return callback(null)
|
return callback(null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -863,7 +863,7 @@
|
|||||||
"unsigned": false,
|
"unsigned": false,
|
||||||
"autoincrement": false,
|
"autoincrement": false,
|
||||||
"primary": false,
|
"primary": false,
|
||||||
"nullable": true,
|
"nullable": false,
|
||||||
"length": 255,
|
"length": 255,
|
||||||
"mappedType": "string"
|
"mappedType": "string"
|
||||||
},
|
},
|
||||||
@ -923,7 +923,6 @@
|
|||||||
"id"
|
"id"
|
||||||
],
|
],
|
||||||
"referencedTableName": "sprite",
|
"referencedTableName": "sprite",
|
||||||
"deleteRule": "set null",
|
|
||||||
"updateRule": "cascade"
|
"updateRule": "cascade"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1096,6 +1095,17 @@
|
|||||||
"default": "'MALE'",
|
"default": "'MALE'",
|
||||||
"mappedType": "string"
|
"mappedType": "string"
|
||||||
},
|
},
|
||||||
|
"color": {
|
||||||
|
"name": "color",
|
||||||
|
"type": "varchar(255)",
|
||||||
|
"unsigned": false,
|
||||||
|
"autoincrement": false,
|
||||||
|
"primary": false,
|
||||||
|
"nullable": false,
|
||||||
|
"length": 255,
|
||||||
|
"default": "'#000000'",
|
||||||
|
"mappedType": "string"
|
||||||
|
},
|
||||||
"is_selectable": {
|
"is_selectable": {
|
||||||
"name": "is_selectable",
|
"name": "is_selectable",
|
||||||
"type": "tinyint(1)",
|
"type": "tinyint(1)",
|
||||||
@ -1113,7 +1123,7 @@
|
|||||||
"unsigned": false,
|
"unsigned": false,
|
||||||
"autoincrement": false,
|
"autoincrement": false,
|
||||||
"primary": false,
|
"primary": false,
|
||||||
"nullable": true,
|
"nullable": false,
|
||||||
"length": 255,
|
"length": 255,
|
||||||
"mappedType": "string"
|
"mappedType": "string"
|
||||||
},
|
},
|
||||||
@ -1173,7 +1183,6 @@
|
|||||||
"id"
|
"id"
|
||||||
],
|
],
|
||||||
"referencedTableName": "sprite",
|
"referencedTableName": "sprite",
|
||||||
"deleteRule": "set null",
|
|
||||||
"updateRule": "cascade"
|
"updateRule": "cascade"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Migration } from '@mikro-orm/migrations';
|
import { Migration } from '@mikro-orm/migrations';
|
||||||
|
|
||||||
export class Migration20250217134639 extends Migration {
|
export class Migration20250218160822 extends Migration {
|
||||||
|
|
||||||
override async up(): Promise<void> {
|
override async up(): Promise<void> {
|
||||||
this.addSql(`create table \`map\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null default '', \`width\` int not null default 10, \`height\` int not null default 10, \`tiles\` json not null, \`pvp\` tinyint(1) not null default false, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
this.addSql(`create table \`map\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null default '', \`width\` int not null default 10, \`height\` int not null default 10, \`tiles\` json not null, \`pvp\` tinyint(1) not null default false, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
||||||
@ -24,13 +24,13 @@ export class Migration20250217134639 extends Migration {
|
|||||||
|
|
||||||
this.addSql(`create table \`sprite\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
this.addSql(`create table \`sprite\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
||||||
|
|
||||||
this.addSql(`create table \`item\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`description\` varchar(255) not null default '', \`item_type\` enum('WEAPON', 'HELMET', 'CHEST', 'LEGS', 'BOOTS', 'GLOVES', 'RING', 'NECKLACE') not null, \`stackable\` tinyint(1) not null default false, \`rarity\` enum('COMMON', 'UNCOMMON', 'RARE', 'EPIC', 'LEGENDARY') not null default 'COMMON', \`sprite_id\` varchar(255) null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
this.addSql(`create table \`item\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`description\` varchar(255) not null default '', \`item_type\` enum('WEAPON', 'HELMET', 'CHEST', 'LEGS', 'BOOTS', 'GLOVES', 'RING', 'NECKLACE') not null, \`stackable\` tinyint(1) not null default false, \`rarity\` enum('COMMON', 'UNCOMMON', 'RARE', 'EPIC', 'LEGENDARY') not null default 'COMMON', \`sprite_id\` varchar(255) not null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
||||||
this.addSql(`alter table \`item\` add index \`item_sprite_id_index\`(\`sprite_id\`);`);
|
this.addSql(`alter table \`item\` add index \`item_sprite_id_index\`(\`sprite_id\`);`);
|
||||||
|
|
||||||
this.addSql(`create table \`character_type\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`gender\` enum('MALE', 'FEMALE') not null, \`race\` enum('HUMAN', 'ELF', 'DWARF', 'ORC', 'GOBLIN') not null, \`is_selectable\` tinyint(1) not null default false, \`sprite_id\` varchar(255) null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
this.addSql(`create table \`character_type\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`gender\` enum('MALE', 'FEMALE') not null, \`race\` enum('HUMAN', 'ELF', 'DWARF', 'ORC', 'GOBLIN') not null, \`is_selectable\` tinyint(1) not null default false, \`sprite_id\` varchar(255) null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
||||||
this.addSql(`alter table \`character_type\` add index \`character_type_sprite_id_index\`(\`sprite_id\`);`);
|
this.addSql(`alter table \`character_type\` add index \`character_type_sprite_id_index\`(\`sprite_id\`);`);
|
||||||
|
|
||||||
this.addSql(`create table \`character_hair\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`gender\` varchar(255) not null default 'MALE', \`is_selectable\` tinyint(1) not null default false, \`sprite_id\` varchar(255) null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
this.addSql(`create table \`character_hair\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`gender\` varchar(255) not null default 'MALE', \`color\` varchar(255) not null default '#000000', \`is_selectable\` tinyint(1) not null default false, \`sprite_id\` varchar(255) not null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
||||||
this.addSql(`alter table \`character_hair\` add index \`character_hair_sprite_id_index\`(\`sprite_id\`);`);
|
this.addSql(`alter table \`character_hair\` add index \`character_hair_sprite_id_index\`(\`sprite_id\`);`);
|
||||||
|
|
||||||
this.addSql(`create table \`sprite_action\` (\`id\` varchar(255) not null, \`sprite_id\` varchar(255) not null, \`action\` varchar(255) not null, \`sprites\` json null, \`origin_x\` numeric(5,2) not null default 0, \`origin_y\` numeric(5,2) not null default 0, \`frame_width\` int not null default 0, \`frame_height\` int not null default 0, \`frame_rate\` int not null default 0, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
this.addSql(`create table \`sprite_action\` (\`id\` varchar(255) not null, \`sprite_id\` varchar(255) not null, \`action\` varchar(255) not null, \`sprites\` json null, \`origin_x\` numeric(5,2) not null default 0, \`origin_y\` numeric(5,2) not null default 0, \`frame_width\` int not null default 0, \`frame_height\` int not null default 0, \`frame_rate\` int not null default 0, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
|
||||||
@ -78,11 +78,11 @@ export class Migration20250217134639 extends Migration {
|
|||||||
this.addSql(`alter table \`placed_map_object\` add constraint \`placed_map_object_map_id_foreign\` foreign key (\`map_id\`) references \`map\` (\`id\`) on update cascade on delete cascade;`);
|
this.addSql(`alter table \`placed_map_object\` add constraint \`placed_map_object_map_id_foreign\` foreign key (\`map_id\`) references \`map\` (\`id\`) on update cascade on delete cascade;`);
|
||||||
this.addSql(`alter table \`placed_map_object\` add constraint \`placed_map_object_map_object_id_foreign\` foreign key (\`map_object_id\`) references \`map_object\` (\`id\`) on update cascade on delete cascade;`);
|
this.addSql(`alter table \`placed_map_object\` add constraint \`placed_map_object_map_object_id_foreign\` foreign key (\`map_object_id\`) references \`map_object\` (\`id\`) on update cascade on delete cascade;`);
|
||||||
|
|
||||||
this.addSql(`alter table \`item\` add constraint \`item_sprite_id_foreign\` foreign key (\`sprite_id\`) references \`sprite\` (\`id\`) on update cascade on delete set null;`);
|
this.addSql(`alter table \`item\` add constraint \`item_sprite_id_foreign\` foreign key (\`sprite_id\`) references \`sprite\` (\`id\`) on update cascade;`);
|
||||||
|
|
||||||
this.addSql(`alter table \`character_type\` add constraint \`character_type_sprite_id_foreign\` foreign key (\`sprite_id\`) references \`sprite\` (\`id\`) on update cascade on delete set null;`);
|
this.addSql(`alter table \`character_type\` add constraint \`character_type_sprite_id_foreign\` foreign key (\`sprite_id\`) references \`sprite\` (\`id\`) on update cascade on delete set null;`);
|
||||||
|
|
||||||
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 \`character_hair\` add constraint \`character_hair_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 \`sprite_action\` add constraint \`sprite_action_sprite_id_foreign\` foreign key (\`sprite_id\`) references \`sprite\` (\`id\`) on update cascade on delete cascade;`);
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user