backend/fastapi/app/process/firebase/firebase_process.py

319 lines
12 KiB
Python

from fastapi import Request
import json
from process.logger import logger
import jwt
import datetime
import time
from firebase_admin import db as frd_db
KST = datetime.timezone(datetime.timedelta(hours=9))
# 파이어베이스 방 설정 업데이트
async def update_room_setting_info(room_seq, data):
try:
ref = frd_db.reference("rooms").child(f"korea-{room_seq}").child("roomInfo")
ref.update({
"room_title": data['room_title'],
"room_intro": data['room_intro'],
"open_yn": data['open_yn'],
"running_time": data['running_time'],
"number_of_people": data['number_of_people'],
"score_open_range": data['score_open_range'],
})
return {
"result": "OK",
"msg": "업데이트 성공"
}
except Exception as e:
logger.error(f"request error. URL: /room/score/update/score\nerror message: {e}")
return {
"result": "FAIL",
"msg": "업데이트 실패"
}
# 파이어베이스 업데이트
async def update_firebase_score(room_seq, user_seq, newScore):
try:
ref = frd_db.reference("rooms").child(f"korea-{room_seq}").child("userInfo").child(user_seq)
ref.update({"score": newScore})
return {
"result": "OK",
"msg": "업데이트 성공"
}
except Exception as e:
logger.error(f"request error. URL: /room/score/update/score\nerror message: {e}")
return {
"result": "FAIL",
"msg": "업데이트 실패"
}
# 파이어베이스 방 생성
async def create_firebase_room(data):
try:
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}")
# datetime 객체를 문자열로 변환
initialData = {
"roomInfo": {
"room_type": data["room_type"],
"master_user_seq": data["user_seq"],
"room_title": data["room_title"],
"room_intro": data["room_intro"],
"open_yn": data["open_yn"],
"running_time": data["running_time"],
"number_of_people": data["number_of_people"],
"room_status": "WAIT",
"number_of_teams": data["number_of_teams"],
"team_name_list": [],
"score_open_range": data["score_open_range"],
"create_dt": f"'{data['create_dt']}'",
"update_dt": f"'{data['update_dt']}'",
"start_dt": f"'{data['start_dt']}'",
"end_dt": f"'{data['end_dt']}'",
"delete_yn": "N",
"delete_dt": f"'{data['delete_dt']}'",
"team_name_list": data['team_name_list']
},
"userInfo": {
data['user_seq']: {
"participant_type": data['user_info']['participant_type'],
"nickname": data['user_info']['nickname'],
"team_name": data['user_info']['team_name'],
"score": 0,
"profile_img": data['user_info']['profile_img'],
"department": data['user_info']['department'],
"introduce_myself": data['user_info']['introduce_myself'],
"ready_yn": "N",
}
},
"userList": {
data['user_seq']: True
}
}
ref.set(initialData)
return {
"result": "OK",
"msg": "방 생성 성공"
}
except Exception as e:
logger.error(f"request error. URL: /room/score/create/firebase/room\nerror message: {e}")
return {
"result": "FAIL",
"msg": "방 생성 실패"
}
# 파이어베이스 방 설정정보 업데이트 초기 데이터 세팅
def set_room_setting_info(body):
try:
body = {
"room_seq": body['room_seq'],
"create_dt": body['create_dt'] if 'create_dt' in body else '',
"delete_dt": body['delete_dt'] if 'delete_dt' in body else 'null',
"delete_yn": body['delete_yn'] if 'delete_yn' in body else 'N',
"end_dt": body['end_dt'] if 'end_dt' in body else 'null',
"master_user_seq": body['master_user_seq'] if 'master_user_seq' in body else '',
"number_of_people": body['number_of_people'] if 'number_of_people' in body else '',
"number_of_teams": body['number_of_teams'] if 'number_of_teams' in body else '',
"open_yn": body['open_yn'] if 'open_yn' in body else '',
"room_intro": body['room_intro'] if 'room_intro' in body else '',
"room_status": body['room_status'] if 'room_status' in body else '',
"room_title": body['room_title'] if 'room_title' in body else '',
"room_type": body['room_type'] if 'room_type' in body else '',
"running_time": body['running_time'] if 'running_time' in body else '',
"score_open_range": body['score_open_range'] if 'score_open_range' in body else '',
"start_dt": body['start_dt'] if 'start_dt' in body else 'null',
"update_dt": body['update_dt'] if 'update_dt' in body else f"{datetime.datetime.now(KST)}",
"room_pw": body['room_pw'] if 'room_pw' in body else '',
}
return {
"result": "OK",
"data": body
}
except Exception as e:
logger.error(f"request error. URL: /room/score/update/room/setting/info\nerror message: {e}")
return {
"result": "FAIL",
"msg": "파이어베이스 업데이트 실패"
}
# 파이어베이스 참가자 역할&팀 수정하기
async def update_participant_role(data):
try:
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}").child("userInfo").child(data['target_user_seq'])
ref.update({
"participant_type": data['participant_type'],
"team_name": data['team_name'] if data['room_type_name'] == 'team' or data['room_type_name'] == 'TEAM' else 'PRIVATE'
})
return {
"result": "OK",
"msg": "업데이트 성공"
}
except Exception as e:
logger.error(f"request error. URL: /room/score/update/user/role\nerror message: {e}")
return {
"result": "FAIL",
"msg": "업데이트 실패"
}
# 파이어베이스 팀명 수정하기
async def update_team_name(data):
try:
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}").child("roomInfo").child("team_name_list")
# 기존 team_name_list 가져오기
current_team_names = ref.get()
if current_team_names:
# 팀 이름을 쉼표로 분리
team_names = current_team_names.split(',')
# before_team_name을 after_team_name으로 대체
team_names = [data['after_team_name'] if name == data['before_team_name'] else name for name in team_names]
# 다시 쉼표로 조인
updated_team_names = ','.join(team_names)
else:
return {
"result": "FAIL",
"msg": "업데이트 실패"
}
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}").child("roomInfo")
# 업데이트
ref.update({
"team_name_list": updated_team_names
})
return {
"result": "OK",
"msg": "업데이트 성공"
}
except Exception as e:
logger.error(f"request error. URL: /room/score/update/team/name\nerror message: {e}")
return {
"result": "FAIL",
"msg": "업데이트 실패"
}
# 파이어베이스 방 상태 업데이트
async def update_room_status(data):
try:
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}").child("roomInfo")
ref.update({"room_status": data['room_status']})
return {
"result": "OK",
"msg": "업데이트 성공"
}
except Exception as e:
logger.error(f"request error. URL: /room/score/update/room/status\nerror message: {e}")
return {
"result": "FAIL",
"msg": "업데이트 실패"
}
# 파이어베이스 방 삭제
async def delete_room_score_frd(room_seq):
try:
ref = frd_db.reference("rooms").child(f"korea-{room_seq}")
ref.delete()
return {
"result": "OK",
"msg": "삭제 성공"
}
except Exception as e:
logger.error(f"request error. URL: /room/score/delete/room/frd\nerror message: {e}")
return {
"result": "FAIL",
"msg": "삭제 실패"
}
# 파이어베이스 참여자 업데이트
async def update_participant(data):
try:
user_seq = str(data['user_seq']) # user_seq를 문자열로 변환
if not user_seq: # user_seq가 비어 있는지 확인
logger.error("user_seq is empty or invalid.")
return {
"result": "FAIL",
"msg": "user_seq is empty or invalid."
}
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}").child("userInfo")
ref.child(user_seq).delete() # user_seq가 올바른지 확인 후 삭제
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}").child("userList")
ref.child(user_seq).delete() # user_seq가 올바른지 확인 후 삭제
return {
"result": "OK",
"msg": "업데이트 성공"
}
except Exception as e:
logger.error(f"request error. URL: /room/score/update/participant\nerror message: {e}")
return {
"result": "FAIL",
"msg": "업데이트 실패"
}
# 파이어베이스 방 입장하기
async def enter_room_user(room_seq, user_info):
try:
ref_list = frd_db.reference("rooms").child(f"korea-{room_seq}").child("userList")
ref_list.child(str(user_info['user_seq'])).set(True)
ref_info = frd_db.reference("rooms").child(f"korea-{room_seq}").child("userInfo").child(str(user_info['user_seq']))
ref_info.set(user_info)
return {
"result": "OK",
"msg": "업데이트 성공"
}
except Exception as e:
logger.error(f"request error. URL: /room/score/enter/room/user\nerror message: {e}")
return {
"result": "FAIL",
"msg": "업데이트 실패"
}
# 파이어베이스 참여자 강퇴하기
async def kick_participant(data):
try:
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}").child("userList")
ref.update({f"{data['target_user_seq']}": False})
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}").child("userInfo")
ref.child(data['target_user_seq']).delete()
return {
"result": "OK",
"msg": "강퇴 성공"
}
except Exception as e:
logger.error(f"request error. URL: /room/score/kick/participant\nerror message: {e}")
return {
"result": "FAIL",
"msg": "강퇴 실패"
}
# 파이어베이스 강퇴된 유저인지 확인
async def check_kick_user(user_seq, room_seq):
try:
ref = frd_db.reference("rooms").child(f"korea-{room_seq}").child("userList").child(user_seq)
return ref.get()
except Exception as e:
logger.error(f"request error. URL: /room/score/check/kick/user\nerror message: {e}")
return False