enter.tsx, model Token,

김종민·2022년 8월 2일
0

apple-market

목록 보기
13/37


들어가기
pages/api/users/enter.tsx
를 만들어본다.
client에서 phone, email을 보내면, DB에서
user를 찾아 그 user에 token을 보내주거나
혹은 User를 새로 만들고 tokne을 리턴해줌.
prisma.schema에서 model token을 만들어 주어야함.
그리고 token은 전화번호(twilio)로 보내줄 건데, 이거는 다음 포스터에
!!참고로 모든 API는 pages/api 아래에 기록됨.

//표시는 참고만 하라는 부분임.
전 POST에서 보여줬듯이 모든 API는 withHandler를 거치게 되어있음.
함수이름은 모두 handler로 통일시켜야 함.
그리고 async function으로 작성해서
마지막에 export default 해줘야함.

1.pages/api/users/enter.tsx

import withHandler, { ResponseType } from '@libs/server/withHandler'
import { NextApiRequest, NextApiResponse } from 'next'
import client from '../../../libs/server/client'
import twilio from 'twilio'

const twilioClient = twilio(process.env.TWILIO_SID, process.env.TWILIO_TOKEN)

async function handler(
  req: NextApiRequest,
  res: NextApiResponse<ResponseType>
) {
  const { phone, email } = req.body ///front부분에서 보내준 data(phone, email)받음
                                    ///받을 떄는 req.body로 받음.
                                    
  const user = phone ? { phone } : email ? { email } : null
                                      ///들어온 data의 종류에 따라 user를 정해줌.
  if (!user) return res.status(400).json({ ok: false })
                                    ///user가 없으면, ok:false리턴해줌.
  const payload = Math.floor(100000 + Math.random() * 900000) + ''
                           ///token을 만들어줌. 6자리 숫자 랜덤으로 만들어주는 로직
  
  ----참고 로직, upsert를 이용해서 user를 찾거나, 찾아서 없으면, 만들어주는 login.
  // const user = await client.user.upsert({
  //   where: {
  //     ...payload,
  //   },
  //   create: {
  //     name: 'kikiki',
  //     ...payload,
  //   },
  //   update: {},
  // })
  // console.log(user)
  
  
  const token = await client.token.create({ ///위에서 찾은 user에 connectOrCreate                                      ///를 사용해서, 기존 user가 있으면, 그 유저에 
                                     ///token을 만들고 없으면, user를 create해서
                                     ///token을 만들어줌
    data: {
      payload,
      user: {
        connectOrCreate: {
          where: {
            ...user,
          },
          create: {
            name: 'kikiki',
            ...user,
          },
        },
      },
    },
  })
  ///twilio를 이용해서 전화번호에 token을 보내주는 로직
  if (phone) {
    const message = await twilioClient.messages.create({
      messagingServiceSid: process.env.TWILIO_MSID,
      to: process.env.MY_PHONE!,
      body: `Your login token is ${payload}`,
    })
    console.log(message)
  }

  console.log(token)
  
  --------------------user 만드는 참고 로직-----------
  //   if (email) {
  //     user = await client.user.findUnique({
  //       where: {
  //         email,
  //       },
  //     })
  //     if (user) console.log('found it')
  //     if (!user) {
  //       console.log('Did not found. i Will create')
  //       await client.user.create({
  //         data: {
  //           name: 'AAAAAA',
  //           email,
  //         },
  //       })
  //     }
  //     console.log(user)
  //   }
  //   if (phone) {
  //     user = await client.user.findUnique({
  //       where: {
  //         phone: +phone,
  //       },
  //     })
  //     if (user) console.log('found it')
  //     if (!user) {
  //       console.log('Did not found. i Will create')
  //       await client.user.create({
  //         data: {
  //           name: 'AAAAAA',
  //           phone: +phone,
  //         },
  //       })
  //     }
  //     console.log(user)
  //   }

  return res.json({ ok: true, payload })  ///ok:true와 paylord를 리턴해줌.
}

export default withHandler({ method: 'POST', handler, isPrivate: false })
///가장 중요!! 모든 API들은 위외같이 전 POST에서 만든 withHandler를 감싸서 return해줌.

2.schema.prisma

User와 Token이 connect되는 부분 확인 할 것!!!

model User {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  phone     String?  @unique
  email     String?  @unique
  name      String
  avatar    String?
  tokens    Token[]
}

model Token {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  payload   String   @unique
  user      User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  userId    Int
}

onDelete:Cascade는 user가 지워지면 관련된 token도 지워지게 설정함.
schema를 수정하면 npx prisma db push

profile
코딩하는초딩쌤

0개의 댓글