33일차 - Node.js 숙련(9) 아이템 시뮬레이션 만들기

이상민·2024년 9월 23일

TIL

목록 보기
33/50

로그인 후 캐릭터 생성,조회,삭제

저번에 구현한 회원가입, 로그인으로 미들웨어와 jwt 인증을 통해 캐릭터를 생성해보자.

캐릭터 생성 API (JWT 인증 필요)

  • 캐릭터 명을 request에서 전달하기 & 캐릭터 ID를 response로 돌려받기
    • 이 때, 이미 존재하는 캐릭터 명으로 캐릭터 생성을 하려고 하면 생성을 못하게 하기
  • 캐릭터에는 다음과 같은 스탯이 있습니다.
    • health: 500
    • power: 100
  • 또한, 캐릭터 생성을 할 때마다 캐릭터에 기본 게임 머니를 1만원을 제공합니다.
    • money: 10000
    • 해당 게임 머니로 아이템을 살 수 있으며 각각의 캐릭터는 고유 게임 머니가 있습니다.

그럼 로그인 상태에서 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가 기본으로 설정된다.

캐릭터 상세 조회 API (JWT 인증 필요)

  • 조회할 캐릭터의 ID는 URI의 parameter로 전달하기 (저는 body로 전달해봤습니다)
  • 캐릭터 이름, HP, 힘 스탯을 전달해주세요!
    - 다만, 내 캐릭터를 상세 조회시에는 현재 캐릭터가 갖고있는 게임 머니까지 조회가 되어야 합니다.

    상세 조회도 마찬가지로 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를 입력해주면,

방금 생성했던 토끼공듀의 기본 정보가 나오게 된다.

캐릭터를 삭제 API (JWT 인증 필요)

캐릭터 상세 조회와 마찬가지로 해당 캐릭터의 계정 주인인지 확인 할 수있는 토큰을 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하게 되도록 신경써야겠다.

0개의 댓글