들어가기
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 해줘야함.
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해줌.
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