const { onValueUpdated, onValueDeleted } = require("firebase-functions/v2/database");
const admin = require("firebase-admin");
const { google } = require("googleapis");
const nodemailer = require("nodemailer");
admin.initializeApp();
// ✅ Gmail 설정 (앱 비밀번호 사용)
const GMAIL_EMAIL = "indextrown@gmail.com";
const GMAIL_PASSWORD = "";
// ✅ Nodemailer 설정
const transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 465,
secure: true,
auth: {
user: GMAIL_EMAIL,
pass: GMAIL_PASSWORD
},
tls: {
rejectUnauthorized: false
}
});
// ✅ Google Sheets API 설정
const SHEET_ID = "";
const SCOPES = ["https://www.googleapis.com/auth/spreadsheets"];
const keyFilePath = "/workspace/codeloungeusers-a47a950f7b06.json";
async function getGoogleSheetsClient() {
const auth = new google.auth.GoogleAuth({
keyFile: keyFilePath,
scopes: SCOPES
});
return google.sheets({ version: "v4", auth });
}
// ✅ 유저 정보를 구글 시트에 업데이트 (닉네임 변경 시 이메일 전송 X)
async function updateUserInGoogleSheet(userData) {
try {
const sheets = await getGoogleSheetsClient();
const readRes = await sheets.spreadsheets.values.get({
spreadsheetId: SHEET_ID,
range: "Users!A:G"
});
let values = readRes.data.values || [];
let userRowIndex = values.findIndex(row => row[1] === userData.id);
if (userRowIndex !== -1) {
// ✅ 기존 행 업데이트
values[userRowIndex] = [
userData.nickname,
userData.id,
userData.loginPlatform,
userData.gender,
userData.birthdayDate,
userData.registerDate,
"" // 탈퇴 여부 비움
];
await sheets.spreadsheets.values.update({
spreadsheetId: SHEET_ID,
range: `Users!A${userRowIndex + 1}:G${userRowIndex + 1}`,
valueInputOption: "RAW",
resource: { values: [values[userRowIndex]] }
});
console.log(`✅ 구글 시트 업데이트 완료: ${userData.id}`);
} else {
console.log(`⚠️ 업데이트할 유저를 찾을 수 없음: ${userData.id}`);
}
} catch (error) {
console.error("❌ 구글 시트 업데이트 오류:", error);
}
}
// ✅ 유저가 처음 닉네임을 설정할 때 이메일 전송 & 시트에 추가
async function addUserToGoogleSheet(userData) {
try {
const sheets = await getGoogleSheetsClient();
await sheets.spreadsheets.values.append({
spreadsheetId: SHEET_ID,
range: "Users!A:G",
valueInputOption: "RAW",
resource: { values: [[
userData.nickname,
userData.id,
userData.loginPlatform,
userData.gender,
userData.birthdayDate,
userData.registerDate,
"" // 신규 가입이므로 탈퇴 X
]] }
});
console.log(`✅ 새로운 유저 추가: ${userData.id}`);
// ✅ 관리자에게 이메일 전송
const mailOptions = {
from: GMAIL_EMAIL,
to: "indextrown@gmail.com",
subject: "[코드라운지] 새 사용자가 가입했습니다.",
text: `📢 새 사용자 정보:
닉네임: ${userData.nickname}
ID: ${userData.id}
플랫폼: ${userData.loginPlatform}
성별: ${userData.gender}
생일: ${userData.birthdayDate}
가입 날짜: ${userData.registerDate}`
};
await transporter.sendMail(mailOptions);
console.log("✅ 관리자에게 메일 전송 성공!");
} catch (error) {
console.error("❌ 유저 추가 오류:", error);
}
}
// ✅ 유저 삭제 감지 → 구글 시트에서 "탈퇴"로 표시
async function markUserAsDeleted(userId) {
try {
const sheets = await getGoogleSheetsClient();
const readRes = await sheets.spreadsheets.values.get({
spreadsheetId: SHEET_ID,
range: "Users!A:G"
});
let values = readRes.data.values || [];
let userRowIndex = values.findIndex(row => row[1] === userId);
if (userRowIndex !== -1) {
values[userRowIndex][6] = "탈퇴";
await sheets.spreadsheets.values.update({
spreadsheetId: SHEET_ID,
range: `Users!A${userRowIndex + 1}:G${userRowIndex + 1}`,
valueInputOption: "RAW",
resource: { values: [values[userRowIndex]] }
});
console.log(`🚨 유저 삭제 감지 - 탈퇴 처리 완료: ${userId}`);
} else {
console.log(`⚠️ 삭제된 유저를 찾을 수 없음: ${userId}`);
}
} catch (error) {
console.error("❌ 구글 시트 탈퇴 처리 오류:", error);
}
}
// ✅ 닉네임이 처음 생성될 때만 이메일 전송 & 시트 추가
exports.addNewUser = onValueUpdated("/Users/{userId}", async (event) => {
const beforeData = event.data.before.val();
const afterData = event.data.after.val();
if (!afterData) return console.error("❌ 오류: 데이터 없음");
// ✅ 닉네임이 처음 설정될 때만 이메일 발송
if ((!beforeData || !beforeData.nickname) && afterData.nickname) {
console.log(`📢 새로운 닉네임 생성 감지: ${afterData.nickname}`);
await addUserToGoogleSheet(afterData);
} else {
console.log(`ℹ️ 기존 유저 정보 업데이트 감지: ${afterData.id}`);
await updateUserInGoogleSheet(afterData);
}
});
// ✅ 유저 삭제 감지 (삭제되면 "탈퇴"로 업데이트)
exports.markUserDeletedInSheet = onValueDeleted("/Users/{userId}", async (event) => {
const userId = event.params.userId;
console.log(`🚨 유저 삭제 감지: ${userId}`);
await markUserAsDeleted(userId);
});
Leave a comment