본문 바로가기
내일배움 과제/CH3 풋살온라인게임

cash API 만들기(조회, 선물, 구매)

by GREEN나무 2024. 12. 3.
728x90

 

오류가 발생한 코드

 

더보기
// routes/cash.router.js
import express from 'express';
import { prisma } from '../utils/prisma/index.js';

const router = express.Router();

// 선물캐시 email
router.post('/cash/gift', async (req, res, next) => {
    const { email } = req.body;
    try {
        // email이 있는지 확인
        const isEmail = await prisma.manager.findFirst({
            where: { email: email },
            select: {
                email: true,
            },
        });
        // 있으면
        if (!isEmail) {
            return res
                .status(404)
                .json({ message: '존재하지 않는 Email 입니다.' });
        }
        const giftCash = Math.floor(Math.random() * 200) + 20;
        // 원래 캐시
        const originalCache = await prisma.manager.findFirst({
            where: { email: email },
            select: {
                cash: true,
            },
        });

        await prisma.manager.update({
            data: { cash: originalCache + giftCash },
            where: { email },
        });

        return res
            .status(200)
            .json({ message: `${giftCash}캐시를 선물받았습니다.` });
    } catch (error) {
        console.error('Error gifting cash:', error);
        return res.status(500).json({ message: 'Internal server error' });
    }
});

// 캐시 구매 email, 캐시, pw
router.post('/cash/payment', async (req, res, next) => {
    const { email, buyCash, password } = req.body;
    if (!buyCash || buyCash <= 0) {
        return res.status(404).json({
            message: '구매하련느 캐시는 0 이상의 정수를 입력해주세요.',
        });
    }

    // email이 있는지 확인
    const isEmail = await prisma.manager.findFirst({
        where: { email: email },
        select: {
            email: true,
            password: true,
        },
    });
    // 없으면
    if (!isEmail) {
        return res.status(404).json({ message: '존재하지 않는 Email 입니다.' });
    }
    // 비번틀리면
    if (isEmail[1] != password) {
        return res.status(404).json({ message: '틀린 비밀번호 입니다.' });
    }

    const originalCache = await prisma.manager.findFirst({
        where: { email: email },
        select: {
            cash: true,
        },
    });

    await prisma.manager.update({
        data: { cash: originalCache + buyCash },
        where: { email },
    });

    return res
        .status(200)
        .json({ message: `${buyCash}캐시를 결제하셧습니다.` });
});

// 캐시 조회  email
router.get('/cash/:email', async (req, res, next) => {
    const { email } = req.params;
    try {
        const myCash = await prisma.manager.findFirst({
            where: { email: email },
            select: {
                nickname: true,
                cash: true,
            },
        });

        if (!myCash) {
            return res.status(404).json({ message: 'User not found' });
        }

        return res.status(200).json({ data: myCash });
    } catch (error) {
        console.error('Error fetching cash data:', error);
        return res.status(500).json({ message: 'Internal server error' });
    }
});

export default router;

오타 수정

 

객체변수인데 정수변수처럼 잘못 썼음

        // originalCache는 객체 형태. originalCache -> originalCache.cash
        await prisma.manager.update({
            data: { cash: originalCache.cash + giftCash },
            where: { email },
        });

 

객체변수인데 문자열변수처럼 썻음... 왜 key값도 줬으면서 헛갈리냐....

    if (isEmail.password!= password) {
        return res.status(404).json({ message: '틀린 비밀번호 입니다.' });
    }

 

랜덤캐시선물은 잘 돌아감

 

 

캐시구매에서 뭐가 문제인지 보자...

더보기
// 캐시 구매 email, 캐시, pw
router.post('/cash/payment', async (req, res, next) => {
    const { email, buyCash, password } = req.body;
    if (!buyCash || buyCash <= 0) {
        return res.status(404).json({
            message: '구매하려는 캐시는 0 이상의 정수를 입력해주세요.',
        });
    }

    // email이 있는지 확인
    const isEmail = await prisma.manager.findFirst({
        where: { email: email },
        select: {
            email: true,
            password: true,
        },
    });
    // 없으면
    if (!isEmail) {
        return res.status(404).json({ message: '존재하지 않는 Email 입니다.' });
    }
    // 비번틀리면
    if (isEmail.password != password) {
        return res.status(404).json({ message: '틀린 비밀번호 입니다.' });
    }

    const originalCache = await prisma.manager.findFirst({
        where: { email: email },
        select: {
            cash: true,
        },
    });

    await prisma.manager.update({
        data: { cash: originalCache + buyCash },
        where: { email },
    });

    return res
        .status(200)
        .json({ message: `${buyCash}캐시를 결제하셧습니다.` });
});

ㅋㅋㅋㅋㅋ 비번이 계정테이블에 있는데 메니저 테이불에서 찾고있었네 

중첩 select로 계정에서 비번 찾음

    const isEmail = await prisma.manager.findFirst({
        where: { email: email },
        select: {
            email: true,
            account: {
                select: {
                    password: true, // Account.password
                },
            },
        },
    });

 

비번일치문제 발생

{
	"message": "틀린 비밀번호 입니다."
}

중첩 select를 사용하면서 isEmail.password가 아니라 isEmail.account.password를 사용해야 함.

    // 비번틀리면
    if (isEmail.account.password != password) {
        return res.status(404).json({ message: '틀린 비밀번호 입니다.' });
    }

 

됬다!!!

 

더보기
// routes/cash.router.js
import express from 'express';
import { prisma } from '../utils/prisma/index.js';

const router = express.Router();

// 선물캐시 email
router.post('/cash/gift', async (req, res, next) => {
    const { email } = req.body;
    try {
        // email이 있는지 확인
        const isEmail = await prisma.manager.findFirst({
            where: { email: email },
            select: {
                email: true,
                cash: true,
            },
        });
        // 있으면
        if (!isEmail) {
            return res
                .status(404)
                .json({ message: '존재하지 않는 Email 입니다.' });
        }
        const giftCash = Math.floor(Math.random() * 200) + 20;

        // originalCache는 객체 형태. originalCache -> originalCache.cash
        await prisma.manager.update({
            data: { cash: isEmail.cash + giftCash },
            where: { email },
        });

        return res
            .status(200)
            .json({ message: `${giftCash}캐시를 선물받았습니다.` });
    } catch (error) {
        console.error('Error gifting cash:', error);
        return res.status(500).json({ message: 'Internal server error' });
    }
});

///////////////////////////////////////////////////////////////////////////
// 캐시 구매 email, 캐시, pw
router.post('/cash/payment', async (req, res, next) => {
    const { email, buyCash, password } = req.body;
    if (!buyCash || buyCash <= 0) {
        return res.status(404).json({
            message: '구매하려는 캐시는 0 이상의 정수를 입력해주세요.',
        });
    }

    const isEmail = await prisma.manager.findFirst({
        where: { email: email },
        select: {
            email: true,
            cash: true,
            account: {
                select: {
                    password: true, // Account.password
                },
            },
        },
    });

    // 없으면
    if (!isEmail) {
        return res.status(404).json({ message: '존재하지 않는 Email 입니다.' });
    }
    // 비번틀리면
    if (isEmail.account.password != password) {
        return res.status(404).json({ message: '틀린 비밀번호 입니다.' });
    }

    await prisma.manager.update({
        data: { cash: isEmail.cash + buyCash },
        where: { email },
    });

    return res
        .status(200)
        .json({ message: `${buyCash}캐시를 결제하셧습니다.` });
});

/////////////////////////////////////////////
// 캐시 조회  email
router.get('/cash/:email', async (req, res, next) => {
    const { email } = req.params;
    try {
        const myCash = await prisma.manager.findFirst({
            where: { email: email },
            select: {
                nickname: true,
                cash: true,
            },
        });

        if (!myCash) {
            return res.status(404).json({ message: 'User not found' });
        }

        return res.status(200).json({ data: myCash });
    } catch (error) {
        console.error('Error fetching cash data:', error);
        return res.status(500).json({ message: 'Internal server error' });
    }
});

export default router;

 

'내일배움 과제 > CH3 풋살온라인게임' 카테고리의 다른 글

회의 24.12.04  (0) 2024.12.04
회의 241203  (2) 2024.12.03
오류노트  (1) 2024.12.02
회의 1202 _ 와이어프레임, DB테이블  (0) 2024.12.02
발제  (2) 2024.11.29