diff --git a/apps/api/src/combat/combat.errors.ts b/apps/api/src/combat/combat.errors.ts new file mode 100644 index 0000000..bc125ba --- /dev/null +++ b/apps/api/src/combat/combat.errors.ts @@ -0,0 +1,87 @@ +import { HttpException, HttpStatus } from '@nestjs/common'; + +export type CombatErrorCode = + | 'HUNT_ENCOUNTER_NOT_FOUND' + | 'HUNT_ENCOUNTER_ALREADY_CONSUMED' + | 'INVALID_HUNT_ENCOUNTER' + | 'CHARACTER_TRAVELLING' + | 'COMBAT_ALREADY_ACTIVE' + | 'COMBAT_NOT_FOUND' + | 'COMBAT_ALREADY_FINISHED' + | 'COMBAT_STATE_INVALID'; + +export class CombatDomainError extends HttpException { + constructor( + public readonly code: CombatErrorCode, + status: HttpStatus, + message: string, + ) { + super({ statusCode: status, code, message }, status); + } +} + +export function huntEncounterNotFound(): CombatDomainError { + return new CombatDomainError( + 'HUNT_ENCOUNTER_NOT_FOUND', + HttpStatus.NOT_FOUND, + 'This encounter could not be found.', + ); +} + +export function huntEncounterAlreadyConsumed(): CombatDomainError { + return new CombatDomainError( + 'HUNT_ENCOUNTER_ALREADY_CONSUMED', + HttpStatus.CONFLICT, + 'This encounter has already been used to start a combat.', + ); +} + +export function invalidHuntEncounter(): CombatDomainError { + return new CombatDomainError( + 'INVALID_HUNT_ENCOUNTER', + HttpStatus.BAD_REQUEST, + 'This encounter is not valid for the current character.', + ); +} + +export function characterTravelling(): CombatDomainError { + return new CombatDomainError( + 'CHARACTER_TRAVELLING', + HttpStatus.CONFLICT, + 'The character cannot fight while travelling.', + ); +} + +export function combatAlreadyActive(): CombatDomainError { + return new CombatDomainError( + 'COMBAT_ALREADY_ACTIVE', + HttpStatus.CONFLICT, + 'The character already has an active combat.', + ); +} + +export function combatNotFound(): CombatDomainError { + return new CombatDomainError( + 'COMBAT_NOT_FOUND', + HttpStatus.NOT_FOUND, + 'This combat could not be found.', + ); +} + +export function combatAlreadyFinished(): CombatDomainError { + return new CombatDomainError( + 'COMBAT_ALREADY_FINISHED', + HttpStatus.CONFLICT, + 'This combat has already finished.', + ); +} + +export function combatStateInvalid(): CombatDomainError { + return new CombatDomainError( + 'COMBAT_STATE_INVALID', + HttpStatus.INTERNAL_SERVER_ERROR, + 'The persisted combat references unavailable data.', + ); +} + +export { characterNotFound } from '../travel/travel.errors';