add grid operations utility
- getCollectionKey: map grid type to party collection - getGridMethodName: map operation + type to service method - executeGridOperation: consolidate move/swap operations - removeGridItem: generic grid item removal - updateGridItem: generic grid item updates
This commit is contained in:
parent
048cbeb1ad
commit
5919548bc1
1 changed files with 207 additions and 0 deletions
207
src/lib/utils/gridOperations.ts
Normal file
207
src/lib/utils/gridOperations.ts
Normal file
|
|
@ -0,0 +1,207 @@
|
|||
/**
|
||||
* Grid operation utilities
|
||||
* Consolidates duplicated grid CRUD logic
|
||||
*/
|
||||
|
||||
import type { Party } from '$lib/types/api/party'
|
||||
import type { GridService } from '$lib/services/grid.service'
|
||||
import type { PartyService } from '$lib/services/party.service'
|
||||
|
||||
export type GridItemType = 'character' | 'weapon' | 'summon'
|
||||
export type GridCollection = 'characters' | 'weapons' | 'summons'
|
||||
|
||||
/**
|
||||
* Maps grid item type to collection key in Party object
|
||||
*
|
||||
* @param type - Grid item type (character, weapon, or summon)
|
||||
* @returns Collection key name
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const key = getCollectionKey('weapon') // Returns: 'weapons'
|
||||
* const items = party[key] // Access party.weapons
|
||||
* ```
|
||||
*/
|
||||
export function getCollectionKey(type: GridItemType): GridCollection {
|
||||
const map: Record<GridItemType, GridCollection> = {
|
||||
character: 'characters',
|
||||
weapon: 'weapons',
|
||||
summon: 'summons'
|
||||
}
|
||||
return map[type]
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps operation and grid type to service method name
|
||||
*
|
||||
* @param operation - CRUD operation type
|
||||
* @param type - Grid item type
|
||||
* @returns Method name on GridService
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const methodName = getGridMethodName('add', 'weapon') // Returns: 'addWeapon'
|
||||
* const methodName = getGridMethodName('remove', 'character') // Returns: 'removeCharacter'
|
||||
* ```
|
||||
*/
|
||||
export function getGridMethodName(
|
||||
operation: 'add' | 'move' | 'remove' | 'update',
|
||||
type: GridItemType
|
||||
): string {
|
||||
const typeCapitalized = type.charAt(0).toUpperCase() + type.slice(1)
|
||||
return `${operation}${typeCapitalized}`
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute grid move/swap operation
|
||||
* Consolidates handleSwap and handleMove logic
|
||||
*
|
||||
* @param operationType - Type of operation (move or swap)
|
||||
* @param source - Source item information
|
||||
* @param target - Target position information
|
||||
* @param context - Party context (ID, shortcode, edit key)
|
||||
* @param gridService - Grid service instance
|
||||
* @param partyService - Party service instance
|
||||
* @returns Updated party data
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const updated = await executeGridOperation(
|
||||
* 'swap',
|
||||
* { type: 'weapon', itemId: 'abc123', position: 0 },
|
||||
* { type: 'weapon', position: 1, itemId: 'def456' },
|
||||
* { partyId: party.id, shortcode: party.shortcode, editKey },
|
||||
* gridService,
|
||||
* partyService
|
||||
* )
|
||||
* ```
|
||||
*/
|
||||
export async function executeGridOperation(
|
||||
operationType: 'move' | 'swap',
|
||||
source: { type: GridItemType; itemId: string; position: number },
|
||||
target: { type: GridItemType; position: number; itemId?: string },
|
||||
context: { partyId: string; shortcode: string; editKey?: string },
|
||||
gridService: GridService,
|
||||
partyService: PartyService
|
||||
): Promise<Party> {
|
||||
// Validation
|
||||
if (operationType === 'swap' && !target.itemId) {
|
||||
throw new Error('Swap operation requires target item')
|
||||
}
|
||||
if (operationType === 'move' && target.itemId) {
|
||||
throw new Error('Move operation requires empty target')
|
||||
}
|
||||
|
||||
// Call appropriate grid service method
|
||||
const methodName = getGridMethodName('move', source.type)
|
||||
const method = (gridService as any)[methodName]
|
||||
|
||||
if (!method) {
|
||||
throw new Error(`Unknown grid method: ${methodName}`)
|
||||
}
|
||||
|
||||
await method.call(
|
||||
gridService,
|
||||
context.partyId,
|
||||
source.itemId,
|
||||
target.position,
|
||||
context.editKey,
|
||||
{ shortcode: context.shortcode }
|
||||
)
|
||||
|
||||
// Clear cache and refresh party
|
||||
partyService.clearPartyCache(context.shortcode)
|
||||
return await partyService.getByShortcode(context.shortcode)
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic grid item remover
|
||||
* Replaces three similar remove{Type} methods in clientGridService
|
||||
*
|
||||
* @param type - Grid item type to remove
|
||||
* @param partyId - Party UUID
|
||||
* @param gridItemId - Grid item UUID to remove
|
||||
* @param party - Current party state
|
||||
* @param shortcode - Party shortcode for cache clearing
|
||||
* @param editKey - Optional edit key for authorization
|
||||
* @param gridService - Grid service instance
|
||||
* @returns Updated party with item removed
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const updated = await removeGridItem(
|
||||
* 'weapon',
|
||||
* party.id,
|
||||
* gridWeaponId,
|
||||
* party,
|
||||
* party.shortcode,
|
||||
* editKey,
|
||||
* gridService
|
||||
* )
|
||||
* ```
|
||||
*/
|
||||
export async function removeGridItem(
|
||||
type: GridItemType,
|
||||
partyId: string,
|
||||
gridItemId: string,
|
||||
party: Party,
|
||||
shortcode: string,
|
||||
editKey: string | undefined,
|
||||
gridService: GridService
|
||||
): Promise<Party> {
|
||||
// Call appropriate remove method
|
||||
const methodName = getGridMethodName('remove', type)
|
||||
const method = (gridService as any)[methodName]
|
||||
|
||||
await method.call(gridService, partyId, gridItemId, editKey, { shortcode })
|
||||
|
||||
// Update local state by removing item
|
||||
const collection = getCollectionKey(type)
|
||||
const updatedParty = { ...party }
|
||||
|
||||
if (updatedParty[collection]) {
|
||||
updatedParty[collection] = updatedParty[collection].filter(
|
||||
(item: any) => item.id !== gridItemId
|
||||
)
|
||||
}
|
||||
|
||||
return updatedParty
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic grid item updater
|
||||
* Replaces three similar update{Type} methods
|
||||
*
|
||||
* @param type - Grid item type to update
|
||||
* @param partyId - Party UUID
|
||||
* @param gridItemId - Grid item UUID to update
|
||||
* @param updates - Object containing fields to update
|
||||
* @param editKey - Optional edit key for authorization
|
||||
* @param gridService - Grid service instance
|
||||
* @returns Updated grid item data
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const updated = await updateGridItem(
|
||||
* 'weapon',
|
||||
* party.id,
|
||||
* gridWeaponId,
|
||||
* { ax1: 10, ax2: 5 },
|
||||
* editKey,
|
||||
* gridService
|
||||
* )
|
||||
* ```
|
||||
*/
|
||||
export async function updateGridItem(
|
||||
type: GridItemType,
|
||||
partyId: string,
|
||||
gridItemId: string,
|
||||
updates: any,
|
||||
editKey: string | undefined,
|
||||
gridService: GridService
|
||||
): Promise<any> {
|
||||
const methodName = getGridMethodName('update', type)
|
||||
const method = (gridService as any)[methodName]
|
||||
|
||||
return await method.call(gridService, partyId, gridItemId, updates, editKey)
|
||||
}
|
||||
Loading…
Reference in a new issue