firestore에 특정 데이터가 등록될 시, slack으로 메시지가 전송되도록 자동화해보자
기숙사생만 이용하는 커뮤니티 특성상, 기숙사생임을 인증하는 절차가 존재한다. 수많은 가입 인증 처리를 관리하기 위한 프로세스가 필요했다. 프로세스는 다음과 같다.
먼저 slack webhook을 등록하고, webhook url을 복사한다 (참고)
slack url이 외부로 노출되는 걸 방지하기 위해, firebase functions:config:set
을 통해 firebase에 url을 등록한다.
firebase functions:config:set slack.url="https://hooks.slack.com/services/[YOUR_ID]"
@slack/client npm 패키지를 설치한다.
npm install @slack/client
설치한 패키지를 불러오고, SlackWebhook을 선언한다.
// functions/src/index.ts
import SlackWebhook = require('@slack/client');
const IncomingWebhook = SlackWebhook.IncomingWebhook;
const config = functions.config();
const slackUrl = config.slack.url;
const Slack = new IncomingWebhook(slackUrl);
...
users
컬렉션에 새로운 user 데이터가 생성될 때, firestore-functions
의 onCreate
내부에 있는 동작이 트리거된다. Slack.send
를 통해 원하는 메시지를 전송하도록 하였다.
// functions/src/index.ts
...
export const userCreated = functions
.region('asia-northeast3')
.firestore.document('users/{userId}')
.onCreate((snapshot) => {
const { email, name, resident_auth_image, uid } = snapshot.data();
Slack.send({
blocks: [
{
type: 'section',
text: {
type: 'mrkdwn',
text: '새로운 사용자가 등록되었습니다.',
},
},
{
type: 'section',
text: {
type: 'mrkdwn',
text: `*이름:*\n${name}\n*아이디:*\n${uid} ... 사진*:${resident_auth_image}\n`,
},
...
}
]
});
});
터미널에 다음 코드를 실행하여, 작성한 코드를 firebase에 배포한다.
firebase deploy --only "functions:userCreated"