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