319 lines
12 KiB
Python
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
|