pubsub schedule 을 사용한 cloud function으로 firebase자동 업데이트 하기 💻
현재 회사에서는 firebase를 사용하여 데이터를 관리하고 있고, 각 무인카페 키오스크 별 판매량 및 인기메뉴를 보여주는 화면이 있는데, 해당 내용을 각각 키오스크마다 정해진 시간에 업데이트 해주기 위해 pubsub function을 만들어서 자동 업데이트가 되게끔 만들었다.
현재 각 기기마다 아래와 같은 데이터가 매주 일요일 저녁 11시 59분에 업데이트 되게끔 만들었다.
이 함수를 만들면서 알게된 내용을 정리해보고자 한다. (dev 버전이라 나 99번 주문 실화소니?ㅎㅎㅎ)
schedule은 pubsub emulator로 작동시킬수 없다. (아직 기능 지원x)
cron time을 써서 schedule함수에 입력할때는 cron time 자체가 기준이 UTC여도, timeZone(기준시간대 in string)으로 명시를 해주어야 한다.(아닐수도 있으나, 적어도 해당 함수에서는 계속 작동을 안하다가 timeZone을 명시해주니 정상적으로 작동하였다)
exports.scheduledFunctionCrontab = functions.pubsub.schedule('5 11 * * *')
.timeZone('America/New_York') // Users can choose timezone - default is America/Los_Angeles
.onRun((context) => {
console.log('This will be run every day at 11:05 AM Eastern!');
return null;
});
iterable한 array는 Promise.all(array)
을 통해 작동시킨다.
exports.updateVmHistory = functions.pubsub
// 한국 시간 기준 일요일 밤 11시 59분 이다.
.schedule('59 14 * * 0')
.timeZone('UTC')
.onRun(async (context) => {
const snapShot = await DB.collection(VM_PATH).get();
// 적용시킬 키오스크만 배열에 담기위해 아래와 같이 filter 해 주었다
const allVms = snapShot.docs
.map((doc) => doc.data().id)
.filter(
(vm) => vm === 'BETA0007' || vm === 'BETA0010' || vm === 'BETA0008' || vm === 'BETA0012' || vm === 'TEST0000',
);
..중략
const mappingVm = allVms.map(async (vm) => {
...중략
// 각 vm에 firebase를 업데이트 해주고
await DB.doc(`${VM_PATH}/${vm}`).update({
summary: {
history: {
startDate: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
endDate: new Date(),
weeklySales: weeklySalesResult,
weeklyUsersRanking: topThreeUsers,
},
},
});
});
// 위에 선언한 mappingvm을 promise.all 처리 하면 된다.
await Promise.all(mappingVm);
return null;
});
emulator에서 스케쥴 동작을 아무리 걸어도 안되서 헤매고 있었는데.. 지원을 안하던거였군요 ...ㅠㅠ