guardia-mall/backend/src/main/resources/mapper/UserMapper.xml
DESKTOP-TKLFCPR\ython 84c3000411 chore(deploy): Mall 클린 재동기화 + Claude provider 전환
- ai.provider flip 마이그레이션 추가(db/202_ai_provider_claude.sql, mall_setting UPSERT claude)
- application.yml schema-locations 에 202 등재(sql.init mode=always 멱등)
- workspace 정본 기준 클린 재동기화(부분 auto-sync 드리프트 해소)
- Claude 실패/키 미설정 시 AiTextRouter 가 Ollama 자동 폴백(무중단)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 11:12:04 +09:00

82 lines
3.7 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zioinfo.mall.auth.mapper.UserMapper">
<resultMap id="userMap" type="com.zioinfo.mall.auth.MallUser">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="passwordHash" column="password_hash"/>
<result property="role" column="role"/>
<result property="displayName" column="display_name"/>
<result property="active" column="is_active"/>
<result property="createdAt" column="created_at"/>
<!-- UIWS 2FA 이식 컬럼 (mall_account ALTER, db/91_uiws_port.sql) -->
<result property="email" column="email"/>
<result property="emailVerifyCode" column="email_verify_code"/>
<result property="emailVerifyExpire" column="email_verify_expire"/>
<result property="loginFailCount" column="login_fail_count"/>
<result property="locked" column="locked"/>
<result property="otpSecret" column="otp_secret"/>
<result property="otpEnabled" column="otp_enabled"/>
<!-- 로그인 보조 이식: 회원가입 승인 게이트 -->
<result property="approved" column="approved"/>
</resultMap>
<select id="findByUsername" resultMap="userMap">
SELECT id, username, password_hash, role, display_name, is_active, created_at,
email, email_verify_code, email_verify_expire, login_fail_count, locked, otp_secret, otp_enabled, approved
FROM mall_account
WHERE username = #{username}
</select>
<insert id="insert" parameterType="com.zioinfo.mall.auth.MallUser"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO mall_account (username, password_hash, role, display_name, is_active)
VALUES (#{username}, #{passwordHash}, #{role}, #{displayName}, #{active})
</insert>
<select id="countByUsername" resultType="int">
SELECT COUNT(*) FROM mall_account WHERE username = #{username}
</select>
<!-- ── 로그인 보조 이식: 회원가입 / 아이디찾기 / 비밀번호 초기화 ─────────────── -->
<select id="countByEmail" resultType="int">
SELECT COUNT(*) FROM mall_account WHERE email = #{email}
</select>
<!-- 회원가입(승인 대기): 운영자 신청 → role=MANAGER·is_active=true·approved=false·실패카운트0·미잠금 고정 -->
<insert id="signup" parameterType="com.zioinfo.mall.auth.MallUser"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO mall_account (username, password_hash, display_name, role, email,
is_active, approved, login_fail_count, locked)
VALUES (#{username}, #{passwordHash}, #{displayName}, 'MANAGER', #{email},
true, false, 0, false)
</insert>
<select id="findByDisplayNameAndEmail" resultMap="userMap">
SELECT id, username, password_hash, role, display_name, is_active, created_at,
email, email_verify_code, email_verify_expire, login_fail_count, locked, otp_secret, otp_enabled, approved
FROM mall_account
WHERE display_name = #{displayName} AND email = #{email}
ORDER BY id
LIMIT 1
</select>
<select id="findByUsernameAndEmail" resultMap="userMap">
SELECT id, username, password_hash, role, display_name, is_active, created_at,
email, email_verify_code, email_verify_expire, login_fail_count, locked, otp_secret, otp_enabled, approved
FROM mall_account
WHERE username = #{username} AND email = #{email}
</select>
<!-- 임시비번 적용 + 잠금/실패카운트 해제(초기화 시) -->
<update id="updatePasswordHash">
UPDATE mall_account
SET password_hash = #{passwordHash}, locked = false, login_fail_count = 0
WHERE username = #{username}
</update>
</mapper>