fix: 누적포인트 검색을 백엔드 규약(searchCondition·searchBno)에 맞춘다
매퍼 includeWhere가 요구하는 searchCondition(1=아이디, 2=이름)을 보내고, VO에서 개명된 searchBno로 번호를 싣는다. searchLoginId 특례는 중복이라 뺐다. 응답에 새로 생긴 bno로 번호 열도 채운다. 매퍼가 includeWhere를 아직 include하지 않는 것은 백엔드 몫으로 남는다. Co-Authored-By: Claude Fable 5
@baa27877284f3ad7000bdae7adefdab1679dd5a5
--- lib/data/repositories/point-account-repository.ts
+++ lib/data/repositories/point-account-repository.ts
... | ... | @@ -5,7 +5,10 @@ |
| 5 | 5 |
PointAccount, |
| 6 | 6 |
PointHistoryEntry, |
| 7 | 7 |
} from '@/lib/domain/point-account'; |
| 8 |
-import type { PointAccountQuery } from '@/lib/domain/point-account-query';
|
|
| 8 |
+import type {
|
|
| 9 |
+ PointAccountQuery, |
|
| 10 |
+ PointAccountSearchField, |
|
| 11 |
+} from '@/lib/domain/point-account-query'; |
|
| 9 | 12 |
|
| 10 | 13 |
/** |
| 11 | 14 |
* 누적포인트 관리 Repository. |
... | ... | @@ -18,18 +21,25 @@ |
| 18 | 21 |
* 조회 전용이다 — 백엔드에 쓰기 엔드포인트가 없다. |
| 19 | 22 |
* |
| 20 | 23 |
* ⚠️ 백엔드 이슈 — 화면이 기획대로 동작하지 못하는 부분 |
| 21 |
- * 1. 목록 검색이 전혀 걸리지 않는다. `MngrPointStatsSearchVo`에 `searchSchulNm`· |
|
| 22 |
- * `searchGradeCd`·`searchClsNo`·`searchNo`·`searchUserId`가 있지만 `MngrPointStatsMapper.xml` |
|
| 23 |
- * 의 `includeSql`에 WHERE 절이 없어 항상 전체가 나온다. 아래에서 파라미터는 규약대로 |
|
| 24 |
- * 보내 두었으니 매퍼에 조건만 추가되면 프론트 수정 없이 동작한다. |
|
| 25 |
- * 2. 번호(출석번호)·회원번호·구분(사이트) 열의 원본이 응답에 없다. 회원번호 자리는 |
|
| 26 |
- * 로그인 아이디로 대신 채우고 나머지는 빈 값이다. |
|
| 24 |
+ * 1. 목록 검색이 아직 걸리지 않는다. 매퍼에 검색 WHERE(`includeWhere` — `searchCondition` |
|
| 25 |
+ * 1=아이디·2=이름, `searchSchulNm`·`searchGradeCd`·`searchClsNo`·`searchBno`)는 생겼지만 |
|
| 26 |
+ * `selectPagination`·`selectPaginationCount`가 이 블록을 include하지 않아 항상 전체가 |
|
| 27 |
+ * 나온다. 아래 파라미터는 VO·매퍼 규약대로 보내 두었으니 백엔드가 연결만 하면 프론트 |
|
| 28 |
+ * 수정 없이 동작한다. |
|
| 29 |
+ * 2. 회원번호·구분(사이트) 열의 원본이 응답에 없다. 회원번호 자리는 로그인 아이디로 대신 |
|
| 30 |
+ * 채우고 구분은 빈 값이다. |
|
| 27 | 31 |
* 3. 현재포인트는 SQL에서 `p.current_point`를 뽑지만 VO에 필드가 없어 응답에서 사라진다. |
| 28 | 32 |
* `total_point = current_point + use_point` 정의를 역산해 채운다. |
| 29 | 33 |
* 4. 차감포인트는 개념 자체가 없다(`POINT_TYPE_CD`는 취득 `E`·사용 `S` 둘뿐). 0으로 둔다. |
| 30 | 34 |
*/ |
| 31 | 35 |
|
| 32 | 36 |
const STATS_PATH = '/api/v1/mngr/point/stats'; |
| 37 |
+ |
|
| 38 |
+/** 화면 검색 대상 → 백엔드 `searchCondition`(매퍼 규약: 1=아이디, 2=이름). */ |
|
| 39 |
+const SEARCH_CONDITION_BY_FIELD: Record<PointAccountSearchField, string> = {
|
|
| 40 |
+ loginId: '1', |
|
| 41 |
+ studentName: '2', |
|
| 42 |
+}; |
|
| 33 | 43 |
|
| 34 | 44 |
function isRecord(value: unknown): value is Record<string, unknown> {
|
| 35 | 45 |
return value !== null && typeof value === 'object'; |
... | ... | @@ -66,7 +76,7 @@ |
| 66 | 76 |
schoolName: readString(raw, 'schNm'), |
| 67 | 77 |
grade: readNumber(raw, 'grade'), |
| 68 | 78 |
classNo: readNumber(raw, 'clsNo'), |
| 69 |
- studentNo: 0, |
|
| 79 |
+ studentNo: readNumber(raw, 'bno'), |
|
| 70 | 80 |
totalPoint: total, |
| 71 | 81 |
deductedPoint: 0, |
| 72 | 82 |
usedPoint: used, |
... | ... | @@ -139,9 +149,8 @@ |
| 139 | 149 |
searchSchulNm: query.schoolName, |
| 140 | 150 |
searchGradeCd: query.grade === null ? '' : String(query.grade), |
| 141 | 151 |
searchClsNo: query.classNo === null ? '' : String(query.classNo), |
| 142 |
- searchNo: query.studentNo === null ? '' : String(query.studentNo), |
|
| 143 |
- // 검색 대상이 아이디일 때만 백엔드가 걸러 준다 — 이름 검색은 아래에서 건다. |
|
| 144 |
- searchLoginId: query.searchField === 'loginId' ? keyword : '', |
|
| 152 |
+ searchBno: query.studentNo === null ? '' : String(query.studentNo), |
|
| 153 |
+ searchCondition: SEARCH_CONDITION_BY_FIELD[query.searchField], |
|
| 145 | 154 |
searchKeyword: keyword, |
| 146 | 155 |
pageIndex: query.page, |
| 147 | 156 |
recordCountPerPage: query.pageSize, |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?