feat: expose health and demo character APIs
This commit is contained in:
12
apps/api/src/characters/characters.controller.ts
Normal file
12
apps/api/src/characters/characters.controller.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { Controller, Get } from '@nestjs/common';
|
||||
import { CharactersService } from './characters.service';
|
||||
|
||||
@Controller('characters')
|
||||
export class CharactersController {
|
||||
constructor(private readonly charactersService: CharactersService) {}
|
||||
|
||||
@Get('me')
|
||||
getDemoCharacter() {
|
||||
return this.charactersService.getDemoCharacter();
|
||||
}
|
||||
}
|
||||
12
apps/api/src/characters/characters.module.ts
Normal file
12
apps/api/src/characters/characters.module.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { CharactersController } from './characters.controller';
|
||||
import { CharactersService } from './characters.service';
|
||||
import { Character } from './entities/character.entity';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Character])],
|
||||
controllers: [CharactersController],
|
||||
providers: [CharactersService],
|
||||
})
|
||||
export class CharactersModule {}
|
||||
58
apps/api/src/characters/characters.service.spec.ts
Normal file
58
apps/api/src/characters/characters.service.spec.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import { NotFoundException } from '@nestjs/common';
|
||||
import { Repository } from 'typeorm';
|
||||
import { DEMO_CHARACTER_ID } from '../demo/demo-character.constants';
|
||||
import { SOUTH_GATE_ID } from '../database/seeds/vertical-slice.constants';
|
||||
import { Character } from './entities/character.entity';
|
||||
import { CharactersService } from './characters.service';
|
||||
|
||||
describe('CharactersService', () => {
|
||||
it('returns the demo character with its current location summary', async () => {
|
||||
const repository = {
|
||||
findOne: jest.fn().mockResolvedValue({
|
||||
id: DEMO_CHARACTER_ID,
|
||||
name: 'Aric Duskwalker',
|
||||
level: 1,
|
||||
experience: 0,
|
||||
currentHp: 100,
|
||||
baseHp: 100,
|
||||
baseAttack: 6,
|
||||
currentLocation: {
|
||||
id: SOUTH_GATE_ID,
|
||||
key: 'south-gate',
|
||||
name: 'S\u00fcdtor von Graufurt',
|
||||
},
|
||||
}),
|
||||
} as unknown as Repository<Character>;
|
||||
const service = new CharactersService(repository);
|
||||
|
||||
await expect(service.getDemoCharacter()).resolves.toEqual({
|
||||
id: DEMO_CHARACTER_ID,
|
||||
name: 'Aric Duskwalker',
|
||||
level: 1,
|
||||
experience: 0,
|
||||
currentHp: 100,
|
||||
maxHp: 100,
|
||||
attack: 6,
|
||||
currentLocation: {
|
||||
id: SOUTH_GATE_ID,
|
||||
key: 'south-gate',
|
||||
name: 'S\u00fcdtor von Graufurt',
|
||||
},
|
||||
});
|
||||
expect(repository.findOne).toHaveBeenCalledWith({
|
||||
where: { id: DEMO_CHARACTER_ID },
|
||||
relations: { currentLocation: true },
|
||||
});
|
||||
});
|
||||
|
||||
it('reports a missing demo seed as not found', async () => {
|
||||
const repository = {
|
||||
findOne: jest.fn().mockResolvedValue(null),
|
||||
} as unknown as Repository<Character>;
|
||||
const service = new CharactersService(repository);
|
||||
|
||||
await expect(service.getDemoCharacter()).rejects.toBeInstanceOf(
|
||||
NotFoundException,
|
||||
);
|
||||
});
|
||||
});
|
||||
39
apps/api/src/characters/characters.service.ts
Normal file
39
apps/api/src/characters/characters.service.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import { Injectable, NotFoundException } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { DEMO_CHARACTER_ID } from '../demo/demo-character.constants';
|
||||
import { Character } from './entities/character.entity';
|
||||
|
||||
@Injectable()
|
||||
export class CharactersService {
|
||||
constructor(
|
||||
@InjectRepository(Character)
|
||||
private readonly characters: Repository<Character>,
|
||||
) {}
|
||||
|
||||
async getDemoCharacter() {
|
||||
const character = await this.characters.findOne({
|
||||
where: { id: DEMO_CHARACTER_ID },
|
||||
relations: { currentLocation: true },
|
||||
});
|
||||
|
||||
if (!character) {
|
||||
throw new NotFoundException('Demo character has not been seeded');
|
||||
}
|
||||
|
||||
return {
|
||||
id: character.id,
|
||||
name: character.name,
|
||||
level: character.level,
|
||||
experience: character.experience,
|
||||
currentHp: character.currentHp,
|
||||
maxHp: character.baseHp,
|
||||
attack: character.baseAttack,
|
||||
currentLocation: {
|
||||
id: character.currentLocation.id,
|
||||
key: character.currentLocation.key,
|
||||
name: character.currentLocation.name,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user