저번에 구현한 회원가입, 로그인으로 미들웨어와 jwt 인증을 통해 캐릭터를 생성해보자.
그럼 로그인 상태에서 jwt 인증을 통해 캐릭터를 생성하는 api 를 구현해보자.
// 캐릭터 생성하기
router.post('/character/Newcharacter', authMiddleware, async (req, res) => {
const { name } = req.body; // body 에 json 형태로 전달
const { accountId } = req.accountInfo; // authMiddleware에서 accountId를 가져옴
try {
// 같은 이름의 캐릭터가 있는지 확인
const existingCharacter = await prisma.character.findUnique({
where: { name },
});
if (existingCharacter) {
return res.status(400).json({ error: '이미 존재하는 캐릭터 이름입니다.' });
}
// 새로운 캐릭터 생성
const newCharacter = await prisma.character.create({
data: {
name, // 캐릭터 이름 저장
health: 500,
power: 100,
money: 10000,
account: { connect: { accountId } }, // 계정에 연결
},
});
res.status(200).json({ message: '캐릭터가 생성되었습니다.', character_Info: newCharacter });
} catch (error) {
console.error('캐릭터 생성 오류:', error);
res.status(500).json({ error: '캐릭터 생성 중 오류가 발생했습니다.' });
}
});
그 다음 Headers에 로그인후 받은 토큰을 입력해준뒤,
Body에 json 형태로 name을 정해주면
디폴트값으로 넣어둔 health와 power 그리고 money가 기본으로 설정된다.
상세 조회도 마찬가지로 jwt인증을 통해 id 검색 후 조회 할 수있다.
//캐릭터 상세 조회하기
router.get('/character/detail', authMiddleware, async (req, res) => {
const { characterId } = req.body; // params로 받아도 되지만 한번 body로 해봤다.
const { accountId } = req.accountInfo;
try {
// 캐릭터 정보 조회
const character = await prisma.character.findUnique({
where: { id: characterId },
include: { account: true },
});
if (!character) {
return res.status(404).json({ error: '캐릭터를 찾을 수 없습니다.' });
}
// 해당 캐릭터의 소유자인지 확인
const Owner = character.account.accountId === accountId;
const characterData = {
name: character.name,
health: character.health,
power: character.power,
};
// 소유자라면 money 정보도 포함
if (Owner) {
characterData.money = character.money;
}
return res.status(200).json(characterData);
} catch (error) {
console.error('캐릭터 조회 중 에러가 발생하였습니다.', error);
return res.status(500).json({ message: '캐릭터 조회 중 오류가 발생하였습니다.' });
}
});
캐릭터 생성과 마찬가지로 Headers에 토큰을 입력해주고 body에 json 형태로 조회할 characterId를 입력해주면,
방금 생성했던 토끼공듀의 기본 정보가 나오게 된다.
캐릭터 상세 조회와 마찬가지로 해당 캐릭터의 계정 주인인지 확인 할 수있는 토큰을 auth 안에 넣고 body에 json형태로 characterId를 입력해 삭제해보자.
// 캐릭터 삭제하기
router.delete('/character/delete', authMiddleware, async (req, res) => {
const { characterId } = req.body;
const { accountId } = req.accountInfo;
try {
// 캐릭터가 해당 계정에 속해 있는지 확인
const character = await prisma.character.findUnique({
where: { id: characterId },
include: { account: true },
});
if (!character || character.account.accountId !== accountId) {
return res
.status(403)
.json({ message: '해당 캐릭터를 찾을 수 없거나 삭제할 권한이 없습니다.' });
}
// 캐릭터 삭제
await prisma.character.delete({
where: { id: characterId },
});
res.status(200).json({ message: '캐릭터가 삭제되었습니다.' });
} catch (error) {
console.error('캐릭터 삭제 중 에러 발생', error);
return res.status(500).json({ message: '캐릭터 삭제 중 오류가 발생했습니다.' });
}
});
URL의 내용과 HTTP 메서드의 쓰임이 RESTful 설계원칙에서 많이 벗어난것 같다..
다음부턴 RESTful하게 되도록 신경써야겠다.