카테고리 없음

6주차 (4)

jaeoun0238 2024. 12. 5. 21:07

function solution(seoul) {
    var x = seoul.indexOf("Kim"); // "Kim"의 위치를 찾기
    var answer = "김서방은 " + x + "에 있다"; // 위치를 포함한 문자열 생성
    return answer; // 결과 반환
}

SoccerOnline 추가사항

import express, { request } from 'express';
import { prisma } from '../uts/prisma/index.js';
import errModel from '../middlewares/error.middleware.js';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';
import authMiddleware from '../middlewares/auth.middleware.js';

const router = express.Router();
// 회원가입api
/** 사용자 회원가입 API **/
router.post('/sign-up', async (req, res, next) => {
  const { userID, userName, userPassword } = req.body;

  try {
    // 동일한 회원정보 확인하기
    const sameUser = await prisma.userData.findUnique({
      where: {
        userID,
      },
    });

    // 사용자 정보가 이미 존재하는 경우
    if (sameUser) {
      return res.status(409).json({ message: '이미 존재하는 유저입니다.' });
    }

    // 비밀번호 해시화 (변경된 부분)
    const bcryptPassword = await bcrypt.hash(userPassword, 10); // salt rounds 추가
    const players = await prisma.playerData.findMany({
      take: 3,
    });

    const result = await prisma.$transaction(async (tx) => {
      // 트랜잭션 내에서 사용자를 생성합니다.
      const user = await tx.userData.create({
        data: {
          userID,
          userName,
          userPassword: bcryptPassword,
          userScore: 1000,
          userCash: 5000,
        },
      });
      //스쿼드 만들기
      const squard = await tx.playerSquadsData.create({
        data: {
          userPID: user.userPID,
        },
      });

      for (let i = 0; i < players.length; i++) {
        const player = players[i];
        const defaultPlayer = await tx.playerRostersData.create({
          data: {
            userPID: user.userPID,
            playerPID: player.playerPID,
            playerEnchant: 0,
          },
        });
        //playerPID를 이용해서 장착되게
        const equipRoster = await tx.playerEquipRostersData.create({
          data: {
            playerSquadsPID: squard.playerSquadsPID,
            playerRostersPID: defaultPlayer.playerRostersPID,
            position: i,
          },
        });
        console.log(equipRoster);
      }

      // 에러가 발생하여, 트랜잭션 내에서 실행된 모든 쿼리가 롤백됩니다.
      return user;
    });
    // userData 테이블에 사용자를 추가

    return res.status(201).json({ message: '회원가입이 완료되었습니다.' });
  } catch (err) {
    next(err);
    // 오류 처리 시작 (변경된 부분)
    // console.error(error); // 오류 로그 출력 (변경된 부분)
    // return res.status(500).json({ message: '서버 오류가 발생했습니다.' }); // 오류 응답 반환 (변경된 부분)
  }
});

// 로그인api

/** 로그인 API **/
router.post('/sign-in', async (req, res, next) => {
  const { userID, userPassword } = req.body;
  const user = await prisma.userData.findUnique({ where: { userID } });

  if (!user)
    return res.status(401).json({ message: '존재하지 않는 유저입니다.' });
  // 입력받은 사용자의 비밀번호와 데이터베이스에 저장된 비밀번호를 비교합니다.
  else if (!(await bcrypt.compare(userPassword, user.userPassword)))
    return res.status(401).json({ message: '비밀번호가 일치하지 않습니다.' });

  // 로그인에 성공하면, 사용자의 userId를 바탕으로 토큰을 생성합니다.
  console.log(process.env.JWT_KEY);

  const token = jwt.sign(
    {
      userPID: user.userPID,
    },
    process.env.JWT_KEY, // 비밀 키를 환경 변수에서 가져옴
    { expiresIn: '1h' }, // 토큰의 만료 시간을 설정 (1시간)
  );

  // 헤더로 주고받게 바꾸기
  res.setHeader('authorization', `Bearer ${token}`);
  return res.status(200).json({
    message: '로그인 성공',
    user: {
      userID: user.userID,
    },
  });
});

// 캐시 구매
router.patch('/buyCash', authMiddleware, async (req, res, next) => {
  try {
    const { userPID } = req.user;
    const { cash } = req.body;

    // 현재 보유량 + 추가 캐시 하기위해 현재 user정보 가져옴
    const user = await prisma.userData.findUnique({
      where: { userPID: +userPID },
    });

    // cash가 존재하지 않으면 에러, middleware로 따로 빼도 됨
    if (!cash) {
      return res.status(400).json({ error: '캐시를 입력해 주세요.' });
    }

    // cash가 유효한 값인지 검사, middleware로 따로 빼도 됨
    if (typeof cash !== 'number' || cash < 0) {
      return res.status(400).json({ error: '유효한 캐시 값을 입력해 주세요.' });
    }

    // 캐시 추가해서 업데이트
    const updateCash = await prisma.userData.update({
      where: { userPID: +userPID },
      data: { userCash: user.userCash + cash },
    });

    return res.status(200).json({ currentCash: updateCash.userCash });
  } catch (err) {
    next(err);
  }
});

export default router;

  회원가입부분에 튜토리얼처럼 자동으로 팀이 주어지게 수정하고 트랜젝션 추가!

 

확실한건.. create를 사용하면 data{}객체를 가져온다 라는것!

prisma를 확인하면서 계속 연결시켜줘야한다는게 중요한것 같다!