428 lines
15 KiB
Python
428 lines
15 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(f"_{user_seq}")
|
|
ref.update({"score": int(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": str(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": {
|
|
f"_{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",
|
|
"user_seq": str(data['user_seq']),
|
|
"connect_yn": "Y"
|
|
}
|
|
},
|
|
"userList": {
|
|
f"_{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": str(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(f"_{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 check_granted_team_name(room_seq):
|
|
try:
|
|
ref = frd_db.reference("rooms").child(f"korea-{room_seq}").child("userInfo")
|
|
user_list = ref.get()
|
|
for user_seq, user_info in user_list.items():
|
|
if user_info['team_name'] == 'WAIT':
|
|
return {
|
|
"result": "FAIL",
|
|
"msg": "대기중인 참가자가 있습니다."
|
|
}
|
|
return {
|
|
"result": "OK",
|
|
"msg": "대기중인 참가자가 없습니다."
|
|
}
|
|
except Exception as e:
|
|
logger.error(f"request error. URL: /room/score/check/granted/team/name\nerror message: {e}")
|
|
return {
|
|
"result": "FAIL",
|
|
"msg": "팀명 확인 실패"
|
|
}
|
|
|
|
# 파이어베이스 방 상태 및 시작시간 업데이트
|
|
async def update_room_status_start_dt(data):
|
|
try:
|
|
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}").child("roomInfo")
|
|
ref.update({
|
|
"room_status": data['room_status'],
|
|
"start_dt": data['start_dt']
|
|
})
|
|
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 update_room_status_end_dt(data):
|
|
try:
|
|
ref = frd_db.reference("rooms").child(f"korea-{data['room_seq']}").child("roomInfo")
|
|
ref.update({
|
|
"room_status": data['room_status'],
|
|
"end_dt": data['end_dt']
|
|
})
|
|
return {
|
|
"result": "OK",
|
|
"msg": "업데이트 성공"
|
|
}
|
|
except Exception as e:
|
|
logger.error(f"request error. URL: /room/score/update/room/status/end/dt\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_exit_participant(data):
|
|
try:
|
|
user_seq = f"_{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(f"_{user_info['user_seq']}").set(True)
|
|
|
|
# 재입장인지 확인
|
|
ref_list = frd_db.reference("rooms").child(f"korea-{room_seq}").child("userInfo")
|
|
if ref_list.child(f"_{user_info['user_seq']}").get() is not None:
|
|
return {
|
|
"result": "OK",
|
|
"msg": "재입장 성공"
|
|
}
|
|
|
|
ref_info = frd_db.reference("rooms").child(f"korea-{room_seq}").child("userInfo").child(f"_{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(f"_{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:
|
|
user_seq = f"_{str(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-{room_seq}").child("userList").child(user_seq)
|
|
user_info = ref.get()
|
|
logger.info(f"user_info: {user_info}")
|
|
|
|
if user_info is None:
|
|
return {
|
|
"result": "FAIL",
|
|
"msg": "강퇴된 유저가 아님"
|
|
}
|
|
|
|
if not user_info:
|
|
return {
|
|
"result": "OK",
|
|
"msg": "강퇴된 유저"
|
|
}
|
|
else:
|
|
return {
|
|
"result": "FAIL",
|
|
"msg": "강퇴된 유저가 아님"
|
|
}
|
|
except Exception as e:
|
|
logger.error(f"request error. URL: /room/score/check/kick/user\nerror message: {e}")
|
|
return {
|
|
"result": "FAIL",
|
|
"msg": "강퇴된 유저 확인 실패"
|
|
}
|
|
|
|
|
|
# 파이어베이스 진행중 강제종료 된 유저인지 확인
|
|
async def check_force_exit_yn(user_seq, data):
|
|
try:
|
|
for room_seq, room_type_name, room_title in data:
|
|
ref = frd_db.reference("rooms").child(f"korea-{room_seq}").child("userList").child(f"_{user_seq}")
|
|
# True이면 강제종료 된 유저
|
|
if ref.get() is True:
|
|
return {
|
|
"result": "OK",
|
|
"msg": "강제종료 된 유저",
|
|
"room_seq": room_seq,
|
|
"room_type_name": room_type_name,
|
|
"room_title": room_title
|
|
}
|
|
return {
|
|
"result": "FAIL",
|
|
"msg": "강제종료 된 유저가 아님"
|
|
}
|
|
except Exception as e:
|
|
logger.error(f"request error. URL: /room/score/check/force/exit/yn\nerror message: {e}")
|
|
return {
|
|
"result": "FAIL",
|
|
"msg": "업데이트 실패"
|
|
}
|
|
|