backend/fastapi/app/db/crud_user.py

435 lines
12 KiB
Python
Raw Permalink Normal View History

2024-12-06 05:12:28 +00:00
from sqlalchemy.orm import Session
from sqlalchemy import text
from db import models, schemas
from process.logger import logger
from db.base import get_db
2025-01-20 05:46:25 +00:00
#==================================================================================================
# 구글 Oauth관련
#==================================================================================================
# DB에서 user 찾기
async def get_user_by_oauth_user_email(user_email, db):
query = text(f"""
select
user_seq
from manage_user
where
user_email = :user_email
""")
params = {
"user_email": user_email,
}
return db.execute(query, params).fetchall()
# 구글 유저 생성
async def create_oauth_user(oauth_uid, user_email, user_id, user_nickname, db):
query = text(f"""
insert into manage_user(user_id, oauth_type, oauth_uid, nickname, profile_img, user_email, department, introduce_myself, last_login_dt, create_dt, update_dt, mandatory_terms_yn, withdraw_yn)
values(:user_id, 'google', :oauth_uid, :user_nickname, '/user/temp_dir/profile_img/profile.png', :user_email, '', '', now(), now(), now(), 'Y', 'N')
""")
params = {
"user_id": user_id,
"oauth_uid": oauth_uid,
"user_nickname": user_nickname,
"user_email": user_email,
}
try:
db.execute(query, params)
db.commit()
return True
except Exception as e:
logger.error(f"sql error: {e}")
return False
2024-12-06 05:12:28 +00:00
# ================================================================
# 회원관리 함수
# ================================================================
# 로그인
2025-01-20 05:46:25 +00:00
async def do_login(user_id, user_pw, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
select
user_seq
from manage_user
where
2025-01-20 05:46:25 +00:00
user_id = :user_id
2024-12-06 05:12:28 +00:00
and user_pw = (select
encode(
digest(
2025-01-20 05:46:25 +00:00
:user_pw || (select user_pw_solt from manage_user where user_id = :user_id), 'sha256'
2024-12-06 05:12:28 +00:00
), 'hex'
))
and withdraw_yn = 'N'
""")
2025-01-20 05:46:25 +00:00
params = {
"user_id": user_id,
"user_pw": user_pw,
}
return db.execute(query, params).fetchall()
2024-12-06 05:12:28 +00:00
# 마지막 로그인 시간 업데이트
2025-01-20 05:46:25 +00:00
async def update_last_login_dt(user_seq, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
update manage_user
set last_login_dt = now()
2025-01-20 05:46:25 +00:00
where user_seq = :user_seq
2024-12-06 05:12:28 +00:00
and withdraw_yn = 'N'
""")
2025-01-20 05:46:25 +00:00
params = {
"user_seq": user_seq,
}
2024-12-06 05:12:28 +00:00
try:
2025-01-20 05:46:25 +00:00
db.execute(query, params)
2024-12-06 05:12:28 +00:00
db.commit()
return True
except Exception as e:
logger.error(f"sql error: {e}")
return False
2025-01-22 10:51:56 +00:00
# oauth 유저인지 확인
async def is_oauth_user(user_email, db):
query = text(f"""
select
user_seq
from manage_user
where user_email = :user_email
and oauth_type != 'idpw'
""")
params = {
"user_email": user_email,
}
return db.execute(query, params).fetchall()
2024-12-06 05:12:28 +00:00
# 아이디 찾기(닉네임, 이메일)
2025-01-20 05:46:25 +00:00
async def find_id_by_name_email(nickname, user_email, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
select
user_seq,
user_id
from manage_user
2025-01-20 05:46:25 +00:00
where nickname = :nickname
and user_email = :user_email
2024-12-06 05:12:28 +00:00
and withdraw_yn = 'N'
""")
2025-01-20 05:46:25 +00:00
params = {
"nickname": nickname,
"user_email": user_email,
}
return db.execute(query, params).fetchall()
2024-12-06 05:12:28 +00:00
# 아이디 찾기(user_seq)
2025-01-20 05:46:25 +00:00
async def find_id_by_user_seq(user_seq, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
select
user_id,
user_email
from manage_user
2025-01-20 05:46:25 +00:00
where user_seq = :user_seq
2024-12-06 05:12:28 +00:00
and withdraw_yn = 'N'
""")
2025-01-20 05:46:25 +00:00
params = {
"user_seq": user_seq,
}
return db.execute(query, params).fetchall()
2024-12-06 05:12:28 +00:00
# 이메일 발송 3회 이상 됐는지 확인
2025-01-20 05:46:25 +00:00
async def select_send_email_cnt(user_email, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
select
count(user_cert_seq)
from manage_user_cert
2025-01-20 05:46:25 +00:00
where user_info = :user_email
2024-12-06 05:12:28 +00:00
and cert_expired between current_date and current_date + interval '1 day'
""")
2025-01-20 05:46:25 +00:00
params = {
"user_email": user_email,
}
return db.execute(query, params).fetchall()
2024-12-06 05:12:28 +00:00
# 이메일 발송내역 기록(하루 3회만 발송가능하게 하기 위함)
2025-01-20 05:46:25 +00:00
async def insert_send_email_info(user_seq, cert_type, user_info, cert_code, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
insert into manage_user_cert(user_seq, cert_type, user_info, cert_code, cert_expired)
2025-01-20 05:46:25 +00:00
values(:user_seq, :cert_type, :user_info, :cert_code, now() + INTERVAL '5 minutes')
2024-12-06 05:12:28 +00:00
""")
2025-01-20 05:46:25 +00:00
params = {
"user_seq": user_seq,
"cert_type": cert_type,
"user_info": user_info,
"cert_code": cert_code,
}
2024-12-06 05:12:28 +00:00
try:
2025-01-20 05:46:25 +00:00
db.execute(query, params)
2024-12-06 05:12:28 +00:00
db.commit()
return True
except Exception as e:
logger.error(f"sql error: {e}")
return False
# 비밀번호 찾기
2025-01-20 05:46:25 +00:00
async def find_password_by_id_email(user_id, user_email, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
select
user_seq
from manage_user
2025-01-20 05:46:25 +00:00
where user_id = :user_id
and user_email = :user_email
2024-12-06 05:12:28 +00:00
and withdraw_yn = 'N'
""")
2025-01-20 05:46:25 +00:00
params = {
"user_id": user_id,
"user_email": user_email,
}
return db.execute(query, params).fetchall()
2024-12-06 05:12:28 +00:00
# 신규 비밀번호 업데이트
2025-01-20 05:46:25 +00:00
async def update_new_password(user_seq, new_pw, new_solt, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
update manage_user
set
2025-01-20 05:46:25 +00:00
user_pw = encode(digest(encode(digest(:new_pw, 'sha256'), 'hex') || :new_solt, 'sha256'), 'hex'),
user_pw_solt = :new_solt
2024-12-06 05:12:28 +00:00
where
2025-01-20 05:46:25 +00:00
user_seq = :user_seq
2024-12-06 05:12:28 +00:00
and withdraw_yn = 'N'
""")
2025-01-20 05:46:25 +00:00
params = {
"new_pw": new_pw,
"new_solt": new_solt,
"user_seq": user_seq,
}
2024-12-06 05:12:28 +00:00
try:
2025-01-20 05:46:25 +00:00
db.execute(query, params)
2024-12-06 05:12:28 +00:00
db.commit()
return True
except Exception as e:
logger.error(f"sql error: {e}")
return False
2025-01-20 05:46:25 +00:00
# 이메일 중복 확인
async def is_valid_user_email_by_user_email(user_email, db):
query = text(f"""
select
user_seq
from manage_user
where user_email = :user_email
""")
params = {
"user_email": user_email,
}
return db.execute(query, params).fetchall()
2024-12-06 05:12:28 +00:00
# 회원가입 최종 아이디 중복 재검사
2025-01-20 05:46:25 +00:00
async def is_valid_user_id_by_user_id(user_id, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
select
user_seq
from manage_user
2025-01-20 05:46:25 +00:00
where user_id = :user_id
2024-12-06 05:12:28 +00:00
""")
2025-01-20 05:46:25 +00:00
params = {
"user_id": user_id,
}
return db.execute(query, params).fetchall()
2024-12-06 05:12:28 +00:00
# 신규 유저 등록
2025-01-20 05:46:25 +00:00
async def insert_new_user(user_info, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
insert into
manage_user(
user_id,
user_pw,
user_pw_solt,
nickname,
profile_img,
user_email,
department,
introduce_myself,
last_login_dt,
create_dt,
update_dt,
mandatory_terms_yn,
withdraw_yn
)
values(
2025-01-20 05:46:25 +00:00
:user_id,
(select encode(digest(:user_pw || :user_pw_solt, 'sha256'), 'hex')),
:user_pw_solt,
:nickname,
'/user/temp_dir/profile_img/profile.png',
:user_email,
:department,
:introduce_myself,
2024-12-06 05:12:28 +00:00
now(),
now(),
now(),
2025-01-20 05:46:25 +00:00
:mandatory_terms_yn,
2024-12-06 05:12:28 +00:00
'N'
)
""")
2025-01-20 05:46:25 +00:00
params = {
"user_id": user_info['user_id'],
"user_pw": user_info['user_pw'],
"user_pw_solt": user_info['user_pw_solt'],
"nickname": user_info['nickname'],
"user_email": user_info['user_email'],
"department": user_info.get('department', ''),
"introduce_myself": user_info.get('introduce_myself', ''),
"mandatory_terms_yn": user_info.get('mandatory_terms_yn', 'N'),
}
2024-12-06 05:12:28 +00:00
try:
2025-01-20 05:46:25 +00:00
db.execute(query, params)
2024-12-06 05:12:28 +00:00
db.commit()
return True
except Exception as e:
logger.error(f"sql error: {e}")
return False
2025-01-07 06:59:18 +00:00
# 프로필 이미지 업데이트
2025-01-20 05:46:25 +00:00
async def update_profile_img(user_seq, profile_img, db):
2025-01-07 06:59:18 +00:00
query = text(f"""
update manage_user
set
2025-01-20 05:46:25 +00:00
profile_img = :profile_img
2025-01-07 06:59:18 +00:00
where
2025-01-20 05:46:25 +00:00
user_seq = :user_seq
2025-01-07 06:59:18 +00:00
and withdraw_yn = 'N'
""")
2025-01-20 05:46:25 +00:00
params = {
"profile_img": profile_img,
"user_seq": user_seq,
}
2025-01-07 06:59:18 +00:00
try:
2025-01-20 05:46:25 +00:00
db.execute(query, params)
2025-01-07 06:59:18 +00:00
db.commit()
return True
except Exception as e:
logger.error(f"sql error: {e}")
return False
2024-12-06 05:12:28 +00:00
# user_seq로 내정보 가져오기
2025-01-20 05:46:25 +00:00
async def get_my_info_by_user_seq(user_seq, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
select
nickname,
user_email,
department,
profile_img,
2025-01-22 10:51:56 +00:00
introduce_myself,
oauth_type
2024-12-06 05:12:28 +00:00
from manage_user
2025-01-20 05:46:25 +00:00
where user_seq = :user_seq
2024-12-06 05:12:28 +00:00
""")
2025-01-20 05:46:25 +00:00
params = {
"user_seq": user_seq,
}
return db.execute(query, params).fetchall()
2024-12-06 05:12:28 +00:00
# 현재 비밀번호 일치 확인
2025-01-20 05:46:25 +00:00
async def check_current_user_pw(user_seq, user_pw, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
select
count(user_seq)
from manage_user
2025-01-20 05:46:25 +00:00
where user_seq = :user_seq
2024-12-06 05:12:28 +00:00
and user_pw = (select
encode(
digest(
2025-01-20 05:46:25 +00:00
:user_pw || (select user_pw_solt from manage_user where user_seq = :user_seq), 'sha256'
2024-12-06 05:12:28 +00:00
), 'hex'
))
""")
2025-01-20 05:46:25 +00:00
params = {
"user_seq": user_seq,
"user_pw": user_pw,
}
return db.execute(query, params).fetchall()
2024-12-06 05:12:28 +00:00
# 신규 비밀번호 업데이트
2025-01-20 05:46:25 +00:00
async def update_user_info(user_info, db):
2024-12-06 05:12:28 +00:00
if user_info['user_pw_change_yn'] == 'Y':
query = text(f"""
update manage_user
set
2025-01-20 05:46:25 +00:00
user_pw = encode(digest(:new_user_pw || :user_pw_solt, 'sha256'), 'hex'),
user_pw_solt = :user_pw_solt,
nickname = :nickname,
user_email = :user_email,
department = :department,
profile_img = :profile_img,
introduce_myself = :introduce_myself
2024-12-06 05:12:28 +00:00
where
2025-01-20 05:46:25 +00:00
user_seq = :user_seq
2024-12-06 05:12:28 +00:00
and withdraw_yn = 'N'
""")
else:
query = text(f"""
update manage_user
set
2025-01-20 05:46:25 +00:00
nickname = :nickname,
user_email = :user_email,
department = :department,
profile_img = :profile_img,
introduce_myself = :introduce_myself
2024-12-06 05:12:28 +00:00
where
2025-01-20 05:46:25 +00:00
user_seq = :user_seq
2024-12-06 05:12:28 +00:00
and withdraw_yn = 'N'
""")
2025-01-20 05:46:25 +00:00
params = {
"user_seq": user_info['user_seq'],
2025-01-22 10:51:56 +00:00
"new_user_pw": user_info.get('new_user_pw', ''),
"user_pw_solt": user_info.get('user_pw_solt', ''),
2025-01-20 05:46:25 +00:00
"nickname": user_info['nickname'],
"user_email": user_info['user_email'],
2025-01-22 10:51:56 +00:00
"department": user_info['department'],
2025-01-20 05:46:25 +00:00
"profile_img": user_info['profile_img'],
2025-01-22 10:51:56 +00:00
"introduce_myself": user_info['introduce_myself'],
2025-01-20 05:46:25 +00:00
}
2024-12-06 05:12:28 +00:00
try:
2025-01-20 05:46:25 +00:00
db.execute(query, params)
2024-12-06 05:12:28 +00:00
db.commit()
return True
except Exception as e:
logger.error(f"sql error: {e}")
return False
# 회원 탈퇴 처리
2025-01-20 05:46:25 +00:00
async def user_withdraw(user_seq, db):
2024-12-06 05:12:28 +00:00
query = text(f"""
delete from manage_user
where
2025-01-20 05:46:25 +00:00
user_seq = :user_seq
2024-12-06 05:12:28 +00:00
and withdraw_yn = 'N'
""")
2025-01-20 05:46:25 +00:00
params = {
"user_seq": user_seq,
}
2024-12-06 05:12:28 +00:00
try:
2025-01-20 05:46:25 +00:00
db.execute(query, params)
2024-12-06 05:12:28 +00:00
db.commit()
return True
except Exception as e:
logger.error(f"sql error: {e}")
return False