
    Ui$                         d dl Zd dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	  ej
        e          ZdZd Zdeded	efd
ZdefdZg dZdefdZdeded	efdZded	edz  fdZded	efdZddedededed	ef
dZdS )    N)datetime)get_db_config)create_result_rowGoalskill_loginc                  V    t          t                    } t          j        j        di | S )u   Goalskill_login DB 연결 )r   LOGIN_DBmysql	connectorconnect)configs    /app/app/models/auth_module.py_get_login_dbr      s(    8$$F?",,V,,,    user_idpasswordreturnc                    t                      }|                    d          }	 |                    d| f           |                                r.dddd|                                 |                                 S t          j        |                    d          t          j                              	                    d          }d	t          j                    j        dd
          t          t          j                                                               }|                    d| ||f           |                                 t$                              d|  d|            t)          |           t+          |d           t-          |           d|dd|                                 |                                 S # t.          $ ry}|                                 t$                              d|            dddt5          |           dcY d}~|                                 |                                 S d}~ww xY w# |                                 |                                 w xY w)uo   
    새 유저를 등록합니다.
    Returns: {"success": bool, "session_id": str|None, "message": str}
    T
dictionaryz'SELECT id FROM login WHERE user_id = %sFNu    すでに存在するIDです。success
session_idmessageutf-8sess_   z
            INSERT INTO login (user_id, password_hash, session_id, created_at)
            VALUES (%s, %s, %s, NOW())
            z[Auth] User registered: z, session:    u   会員登録成功！z[Auth] Registration error: u   会員登録失敗: )r   cursorexecutefetchoneclosebcrypthashpwencodegensaltdecodeuuiduuid4hexintr   now	timestampcommitloggerinfo_create_user_curriculumr   _init_category_progress	Exceptionrollbackerrorstr)r   r   connr   password_hashr   es          r   create_userr:      sc   
 ??D[[D[))F'@7*MMM?? 	i$DEghhD 	

A hoog&>&>@P@PQQXXY`aa VTZ\\-crc2UC8P8P8R8R4S4SUU
 	 mZ0	
 	
 	
 	OwOO:OOPPP 	 
+++*a(((
+++zF]^^ 	

  b b b6166777 A`X[\]X^X^A`A`aaaaaaa

b
 	

s7   0G	 ?D!G	 	
IAIII II *I9r   c                 Z   t          d          }t          j        j        di |}|                                }	 |                    d| f           |                                 |j        }t          	                    d|  d|            nH# t          $ r;}|                                 t                              d|            Y d}~nd}~ww xY w|                                 |                                 dS # |                                 |                                 w xY w)uI   master_items(C_DB)의 커리큘럼을 user_curriculum에 복사합니다.C_DBa*  
            INSERT INTO user_curriculum (session_id, item_id, block_id, sort_order, status, category, weight_pct)
            SELECT %s, item_id, block_id, sort_order, 'NOT_STARTED', category, weight_pct
            FROM master_items
            ORDER BY block_id, sort_order, item_id
            z#[Auth] Curriculum created: session=z, items=z"[Auth] Curriculum creation error: Nr   )r   r
   r   r   r   r    r.   rowcountr/   r0   r3   r4   r5   r"   )r   r   r7   r   countr9   s         r   r1   r1   L   s/   6""F?",,V,,D[[]]F M	
 	
 	
 	U*UUeUUVVVV ? ? ?=!==>>>>>>>>? 	

 	

s0   AB D  
C1C	D  CD   *D*)!u   CERT_第1章u   CERT_第2章u   CERT_第3章u   CERT_第4章u   CERT_第5章u   CERT_第6章u   CERT_第7章u   CERT_第8章u   CERT_第9章u   CERT_第10章u   CERT_第11章u   CERT_第12章u   CERT_第13章u   CERT_第14章u   CERT_第15章u   CERT_第16章u   CERT_第17章u   CERT_第18章u   CERT_第19章u   CERT_第20章u   CERT_第21章u   CERT_第22章Python
JavaScriptMySQLFastAPIu   外部API連携AWSMCPu	   PJT企画u	   PJT設計u	   PJT開発u	   テストc                     t          d          }t          j        j        di |}|                                }	 d} fdt
          D             }|                    ||           |                                 t          	                    d  dt          |                      nH# t          $ r;}|                                 t                              d|            Y d}~nd}~ww xY w|                                 |                                 dS # |                                 |                                 w xY w)	ua   회원 가입 시 카테고리별 진행 상황의 초기 행(12행, total%).을 생성합니다.Goalskill_DBz
            INSERT INTO user_category_progress (session_id, category, total_pct)
            VALUES (%s, %s, 0.0)
            ON DUPLICATE KEY UPDATE total_pct = total_pct
        c                     g | ]}|fS r   r   ).0catr   s     r   
<listcomp>z+_init_category_progress.<locals>.<listcomp>|   s    ===cS!===r   z.[Auth] Category progress initialized: session=z, categories=z%[Auth] Category progress init error: Nr   )r   r
   r   r   r   _ALL_CATEGORIESexecutemanyr.   r/   r0   lenr3   r4   r5   r"   )r   r   r7   r   sqlrowsr9   s   `      r   r2   r2   q   sK   >**F?",,V,,D[[]]F
 >===_===3%%%iZii^abf^g^giijjjj B B B@Q@@AAAAAAAAB 	

 	

s0   A,B) (D )
C.31C)$D )C..D *Ec                 "   t                      }|                    d          }	 |                    d| f           |                                }|s.dddd|                                 |                                 S t          j        |                    d          |d	                             d                    s.ddd
d|                                 |                                 S |                    d|d         f           |                                 t          
                    d|             d|d         dd|                                 |                                 S # t          $ re}t                              d|            dddt          |           dcY d}~|                                 |                                 S d}~ww xY w# |                                 |                                 w xY w)ur   
    유저 인증을 수행합니다.
    Returns: {"success": bool, "session_id": str|None, "message": str}
    Tr   zBSELECT id, password_hash, session_id FROM login WHERE user_id = %sFNu   存在しないIDです。r   r   r8   u'   パスワードが一致しません。z1UPDATE login SET last_login = NOW() WHERE id = %sidz[Auth] User logged in: r   u   ログイン成功！z[Auth] Login error: u   ログイン失敗: )r   r   r    r!   r"   r#   checkpwr%   r.   r/   r0   r3   r5   r6   )r   r   r7   r   userr9   s         r   authenticate_userrT      s   
 ??D[[D[))FPJ	
 	
 	
    	c$DEabb( 	

% ~hoog66_8M8T8TU\8]8]^^ 	p$DEnoo  	

 	?$ZM	
 	
 	
 	7g77888tL/ANeff 	

  b b b/A//000 A`X[\]X^X^A`A`aaaaaaa

b 	

s=   2E2 AE2 0AE2 2
G!<2G.G!/G$ G!!G$ $*Hc                    t                      }|                    d          }	 |                    d| f           |                                |                                 |                                 S # t
          $ rP}t                              d|            Y d}~|                                 |                                 dS d}~ww xY w# |                                 |                                 w xY w)u.   세션 ID로 유저 정보를 조회합니다.Tr   zWSELECT id, user_id, session_id, created_at, last_login FROM login WHERE session_id = %sz[Auth] Session lookup error: N)r   r   r    r!   r"   r3   r/   r5   r   r7   r   r9   s       r   get_user_by_sessionrW      s    ??D[[D[))FeM	
 	
 	
   
 	

    8Q88999ttt

 	

s)   *A9 9
CC C CC *D c                    t                      }|                    d          }	 |                    d| f           |                                |                                 |                                 S # t
          $ rQ}t                              d|            g cY d}~|                                 |                                 S d}~ww xY w# |                                 |                                 w xY w)u5   유저의 학습 진행도 목록을 조회합니다.Tr   z
            SELECT id, session_id, item_id, status, score, updated_at
            FROM user_study_progress
            WHERE session_id = %s
            ORDER BY item_id
            z[Auth] Progress fetch error: N)r   r   r    fetchallr"   r3   r/   r5   rV   s       r   get_study_progressrZ      s    ??D[[D[))F M	
 	
 	
   
 	

    8Q88999					

 	

s/   *A9 9
CC!C"C CC *Ditem_idstatusscorec                    t                      }|                    d          }	 |                    d| |||f           |                                 t                              d|  d| d|            ddd|                                 |                                 S # t          $ rx}|                                 t          	                    d	|            d
dt          |           dcY d}~|                                 |                                 S d}~ww xY w# |                                 |                                 w xY w)u3   학습 진행도를 업데이트합니다 (UPSERT).Tr   a  
            INSERT INTO user_study_progress (session_id, item_id, status, score)
            VALUES (%s, %s, %s, %s)
            ON DUPLICATE KEY UPDATE
                status = VALUES(status),
                score = VALUES(score),
                updated_at = NOW()
            z![Auth] Progress updated: session=z, item=z	, status=u   進捗更新完了)r   r   z[Auth] Progress update error: Fu   更新失敗: N)r   r   r    r.   r/   r0   r"   r3   r4   r5   r6   )r   r[   r\   r]   r7   r   r9   s          r   update_study_progressr_      se   ??D[[D[))F &%0
	
 
	
 
	
 	e
ee7ee]ceefff,@AA 	

  H H H9a99::: -Fc!ff-F-FGGGGGGG

H
 	

s1   AB$ $
D&.AD!3D&4D) !D&&D) )*E)r   )mysql.connectorr
   r#   r(   loggingr   app.core.configr   app.models.goalskill_moduler   	getLogger__name__r/   r	   r   r6   dictr:   r1   rK   r2   rT   rW   listrZ   r+   r_   r   r   r   <module>rh      s  
              ) ) ) ) ) ) 9 9 9 9 9 9		8	$	$- - -. . . . . . .b    6      4$s $c $d $ $ $ $TC D4K    *3 4    . c C  S Y]      r   