api-rule.mdc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. ---
  2. alwaysApply: true
  3. ---
  4. # 최우선 규칙: 한글 응답 필수
  5. **모든 응답은 한글로만 작성해야 함. 이 규칙은 다른 모든 규칙보다 우선한다.**
  6. # companyId 사용 금지 규칙
  7. **companyId는 사용하지 않는 값이므로 모든 코드에서 제거해야 함. 프론트엔드, 백엔드 모두 해당.**
  8. - 대신 COMPANY_NUMBER를 직접 사용
  9. - companyId 관련 변수, 필드, 파라미터 모두 제거
  10. - API 요청/응답에서 companyId 사용 금지
  11. # 벤더-인플루언서 처리자 SEQ 인증 규칙
  12. **백엔드에서 processedBy, approvedBy, terminatedBy 등 처리자 SEQ를 받을 때는 반드시 다음 로직을 적용해야 함:**
  13. ## 처리자 SEQ 변환 표준 로직
  14. ```php
  15. // 처리자 확인 (벤더사 SEQ인지 사용자 SEQ인지 확인)
  16. $processingUser = null;
  17. // 1. 먼저 USER_LIST에서 확인
  18. $processingUser = $this->userModel
  19. ->where('SEQ', $processedBy)
  20. ->where('IS_ACT', 'Y')
  21. ->first();
  22. if ($processingUser) {
  23. // 사용자 SEQ인 경우 바로 사용
  24. $approvedByUserSeq = $processedBy;
  25. } else {
  26. // 2. processedBy가 벤더사 SEQ인 경우, 해당 벤더사의 담당자 사용자를 찾기
  27. $vendorInfo = $this->vendorModel
  28. ->where('SEQ', $processedBy)
  29. ->where('IS_ACT', 'Y')
  30. ->first();
  31. if ($vendorInfo && !empty($vendorInfo['COMPANY_NUMBER'])) {
  32. // 벤더사의 COMPANY_NUMBER로 해당 담당자 USER 찾기
  33. $vendorUser = $this->userModel
  34. ->where('COMPANY_NUMBER', $vendorInfo['COMPANY_NUMBER'])
  35. ->where('IS_ACT', 'Y')
  36. ->first();
  37. if ($vendorUser) {
  38. $approvedByUserSeq = $vendorUser['SEQ'];
  39. $processingUser = $vendorUser;
  40. } else {
  41. return $this->response->setStatusCode(400)->setJSON([
  42. 'success' => false,
  43. 'message' => "벤더사 SEQ {$processedBy}에 해당하는 담당자를 USER_LIST에서 찾을 수 없습니다."
  44. ]);
  45. }
  46. } else {
  47. return $this->response->setStatusCode(400)->setJSON([
  48. 'success' => false,
  49. 'message' => "처리자 SEQ {$processedBy}는 USER_LIST나 VENDOR_LIST에서 찾을 수 없습니다."
  50. ]);
  51. }
  52. }
  53. // 최종적으로 $approvedByUserSeq를 데이터베이스에 저장
  54. ```
  55. ## 규칙 적용 필수 상황
  56. - **승인/거부 처리**: approveRequest() 함수
  57. - **해지 처리**: terminate() 함수
  58. - **취소 처리**: cancelRequest() 함수
  59. - **기타 모든 사용자 인증이 필요한 벤더-인플루언서 관련 API**
  60. ## 이유
  61. - 프론트엔드에서 벤더사 SEQ를 전달할 수 있음
  62. - 데이터베이스 외래키는 USER_LIST.SEQ를 참조함
  63. - 벤더사 SEQ → 해당 벤더사 담당자 USER SEQ 변환 필요
  64. # API & Store Rules
  65. ## Pinia Store Rules
  66. ### 1. Setup Syntax Store Reset 구현
  67. - Setup 문법(`defineStore(() => {...})`)으로 작성된 store는 자동 `$reset()`이 제공되지 않음
  68. - 반드시 수동으로 `reset()` 함수를 구현해야 함
  69. ```typescript
  70. // Good
  71. export const useMyStore = defineStore('myStore', () => {
  72. const data = ref([])
  73. const loading = ref(false)
  74. // 수동으로 reset 함수 구현
  75. function reset() {
  76. data.value = []
  77. loading.value = false
  78. }
  79. return {
  80. data,
  81. loading,
  82. reset // reset 함수 반환 필수
  83. }
  84. })
  85. // Bad - reset 함수 없음
  86. export const useMyStore = defineStore('myStore', () => {
  87. const data = ref([])
  88. return { data }
  89. })
  90. ```
  91. ### 2. Reset 함수 구현 가이드
  92. - 모든 state를 초기값으로 되돌리는 로직 포함
  93. - 중첩된 객체의 경우 깊은 복사 고려
  94. - persist 옵션이 있는 경우 저장소 데이터도 정리
  95. ```typescript
  96. function reset() {
  97. // 단순 값 초기화
  98. simpleValue.value = null
  99. // 객체 초기화
  100. objectValue.value = {
  101. prop1: '',
  102. prop2: 0
  103. }
  104. // 배열 초기화
  105. arrayValue.value = []
  106. // 중첩 객체 초기화
  107. complexValue.value = JSON.parse(JSON.stringify(DEFAULT_STATE))
  108. }
  109. ```
  110. ### 3. Store 초기화 호출 방식
  111. - Setup 문법 store: `store.reset()`
  112. - Options 문법 store: `store.$reset()`
  113. ```typescript
  114. // Setup store
  115. const setupStore = useSetupStore()
  116. setupStore.reset() // O
  117. setupStore.$reset() // X - 에러 발생
  118. // Options store
  119. const optionsStore = useOptionsStore()
  120. optionsStore.$reset() // O
  121. ```
  122. ### 4. Store 초기화 시점
  123. - 로그아웃
  124. - 사용자 전환
  125. - 주요 상태 변경
  126. - 에러 복구
  127. ```typescript
  128. async function logout() {
  129. // 모든 store 초기화
  130. authStore.setLogout()
  131. setupStore.reset() // Setup syntax
  132. optionsStore.$reset() // Options syntax
  133. // 로컬 스토리지 정리
  134. localStorage.clear()
  135. }
  136. ```
  137. ## API Rules
  138. - api 서버는 코드이그나이터4 베이스의 벡엔드 기술로 구현되어있으며
  139. 기존 문서에사용되는 양식을 지키며 구현
  140. - 프론트에서 api신규 생성시 백엔드 코드이그나4 기반의 기술로 구현하는 예제를 함께 제공
  141. - 항상 페이지 구성이 완료되고 나면 제작에 필요한 쿼리를 DDL형태로 구성해서 ddl폴더에 만들어줘
  142. - api구성후 백엔드 예제를 backend-examples에 코드이그나이터4 형태로 구성해줘
  143. - MD파일을 생성해서 백엔드 구성과 DB생성을 하는 과정을 순서대로 작성해줘
  144. - 프론트화면 및 UI / API 구성시에는 항상 composition api 형태로 작성 css는 항상 scss형태로 분리해서 구성
  145. ## 프론트엔드 API 호출 규칙
  146. - **Nuxt.js server/api 사용 금지**: 프론트엔드에서 직접 백엔드 API 호출
  147. - **useAxios() 패턴 강제**: 기존 코드베이스와 일관성 유지
  148. - 반드시 다음 형태로 구성:
  149. ```javascript
  150. const loadData = async () => {
  151. try {
  152. const params = {
  153. // 파라미터들...
  154. }
  155. useAxios()
  156. .post('/api/endpoint', params)
  157. .then((res) => {
  158. if (res.data.success) {
  159. // 성공 처리
  160. data.value = res.data.data
  161. } else {
  162. // 실패 처리
  163. error.value = res.data.message
  164. }
  165. })
  166. .catch((err) => {
  167. // 에러 처리
  168. error.value = err.message
  169. })
  170. .finally(() => {
  171. // 완료 처리
  172. loading.value = false
  173. })
  174. } catch (err) {
  175. error.value = err.message
  176. }
  177. }
  178. ```
  179. ## API 구조 금지사항
  180. - **server/api 디렉토리 생성 금지**: Nuxt.js 서버 API 사용하지 않음
  181. - **mysql2, 데이터베이스 라이브러리 사용 금지**: 프론트엔드에서 직접 DB 연결 금지
  182. - **$fetch 사용 금지**: useAxios() 패턴만 사용
  183. - **async/await 패턴 지양**: .then().catch().finally() 체인 사용
  184. ## 백엔드 연동 방식
  185. - 프론트엔드 → CodeIgniter4 백엔드 직접 호출
  186. - useAxios()를 통한 HTTP 통신만 사용
  187. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  188. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어
  189. - useAxios()를 통한 HTTP 통신만 사용
  190. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  191. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어# 최우선 규칙: 한글 응답 필수
  192. **모든 응답은 한글로만 작성해야 함. 이 규칙은 다른 모든 규칙보다 우선한다.**
  193. # companyId 사용 금지 규칙
  194. **companyId는 사용하지 않는 값이므로 모든 코드에서 제거해야 함. 프론트엔드, 백엔드 모두 해당.**
  195. - 대신 COMPANY_NUMBER를 직접 사용
  196. - companyId 관련 변수, 필드, 파라미터 모두 제거
  197. - API 요청/응답에서 companyId 사용 금지
  198. # 벤더-인플루언서 처리자 SEQ 인증 규칙
  199. **백엔드에서 processedBy, approvedBy, terminatedBy 등 처리자 SEQ를 받을 때는 반드시 다음 로직을 적용해야 함:**
  200. ## 처리자 SEQ 변환 표준 로직
  201. ```php
  202. // 처리자 확인 (벤더사 SEQ인지 사용자 SEQ인지 확인)
  203. $processingUser = null;
  204. // 1. 먼저 USER_LIST에서 확인
  205. $processingUser = $this->userModel
  206. ->where('SEQ', $processedBy)
  207. ->where('IS_ACT', 'Y')
  208. ->first();
  209. if ($processingUser) {
  210. // 사용자 SEQ인 경우 바로 사용
  211. $approvedByUserSeq = $processedBy;
  212. } else {
  213. // 2. processedBy가 벤더사 SEQ인 경우, 해당 벤더사의 담당자 사용자를 찾기
  214. $vendorInfo = $this->vendorModel
  215. ->where('SEQ', $processedBy)
  216. ->where('IS_ACT', 'Y')
  217. ->first();
  218. if ($vendorInfo && !empty($vendorInfo['COMPANY_NUMBER'])) {
  219. // 벤더사의 COMPANY_NUMBER로 해당 담당자 USER 찾기
  220. $vendorUser = $this->userModel
  221. ->where('COMPANY_NUMBER', $vendorInfo['COMPANY_NUMBER'])
  222. ->where('IS_ACT', 'Y')
  223. ->first();
  224. if ($vendorUser) {
  225. $approvedByUserSeq = $vendorUser['SEQ'];
  226. $processingUser = $vendorUser;
  227. } else {
  228. return $this->response->setStatusCode(400)->setJSON([
  229. 'success' => false,
  230. 'message' => "벤더사 SEQ {$processedBy}에 해당하는 담당자를 USER_LIST에서 찾을 수 없습니다."
  231. ]);
  232. }
  233. } else {
  234. return $this->response->setStatusCode(400)->setJSON([
  235. 'success' => false,
  236. 'message' => "처리자 SEQ {$processedBy}는 USER_LIST나 VENDOR_LIST에서 찾을 수 없습니다."
  237. ]);
  238. }
  239. }
  240. // 최종적으로 $approvedByUserSeq를 데이터베이스에 저장
  241. ```
  242. ## 규칙 적용 필수 상황
  243. - **승인/거부 처리**: approveRequest() 함수
  244. - **해지 처리**: terminate() 함수
  245. - **취소 처리**: cancelRequest() 함수
  246. - **기타 모든 사용자 인증이 필요한 벤더-인플루언서 관련 API**
  247. ## 이유
  248. - 프론트엔드에서 벤더사 SEQ를 전달할 수 있음
  249. - 데이터베이스 외래키는 USER_LIST.SEQ를 참조함
  250. - 벤더사 SEQ → 해당 벤더사 담당자 USER SEQ 변환 필요
  251. # API & Store Rules
  252. ## Pinia Store Rules
  253. ### 1. Setup Syntax Store Reset 구현
  254. - Setup 문법(`defineStore(() => {...})`)으로 작성된 store는 자동 `$reset()`이 제공되지 않음
  255. - 반드시 수동으로 `reset()` 함수를 구현해야 함
  256. ```typescript
  257. // Good
  258. export const useMyStore = defineStore('myStore', () => {
  259. const data = ref([])
  260. const loading = ref(false)
  261. // 수동으로 reset 함수 구현
  262. function reset() {
  263. data.value = []
  264. loading.value = false
  265. }
  266. return {
  267. data,
  268. loading,
  269. reset // reset 함수 반환 필수
  270. }
  271. })
  272. // Bad - reset 함수 없음
  273. export const useMyStore = defineStore('myStore', () => {
  274. const data = ref([])
  275. return { data }
  276. })
  277. ```
  278. ### 2. Reset 함수 구현 가이드
  279. - 모든 state를 초기값으로 되돌리는 로직 포함
  280. - 중첩된 객체의 경우 깊은 복사 고려
  281. - persist 옵션이 있는 경우 저장소 데이터도 정리
  282. ```typescript
  283. function reset() {
  284. // 단순 값 초기화
  285. simpleValue.value = null
  286. // 객체 초기화
  287. objectValue.value = {
  288. prop1: '',
  289. prop2: 0
  290. }
  291. // 배열 초기화
  292. arrayValue.value = []
  293. // 중첩 객체 초기화
  294. complexValue.value = JSON.parse(JSON.stringify(DEFAULT_STATE))
  295. }
  296. ```
  297. ### 3. Store 초기화 호출 방식
  298. - Setup 문법 store: `store.reset()`
  299. - Options 문법 store: `store.$reset()`
  300. ```typescript
  301. // Setup store
  302. const setupStore = useSetupStore()
  303. setupStore.reset() // O
  304. setupStore.$reset() // X - 에러 발생
  305. // Options store
  306. const optionsStore = useOptionsStore()
  307. optionsStore.$reset() // O
  308. ```
  309. ### 4. Store 초기화 시점
  310. - 로그아웃
  311. - 사용자 전환
  312. - 주요 상태 변경
  313. - 에러 복구
  314. ```typescript
  315. async function logout() {
  316. // 모든 store 초기화
  317. authStore.setLogout()
  318. setupStore.reset() // Setup syntax
  319. optionsStore.$reset() // Options syntax
  320. // 로컬 스토리지 정리
  321. localStorage.clear()
  322. }
  323. ```
  324. ## API Rules
  325. - api 서버는 코드이그나이터4 베이스의 벡엔드 기술로 구현되어있으며
  326. 기존 문서에사용되는 양식을 지키며 구현
  327. - 프론트에서 api신규 생성시 백엔드 코드이그나4 기반의 기술로 구현하는 예제를 함께 제공
  328. - 항상 페이지 구성이 완료되고 나면 제작에 필요한 쿼리를 DDL형태로 구성해서 ddl폴더에 만들어줘
  329. - api구성후 백엔드 예제를 backend-examples에 코드이그나이터4 형태로 구성해줘
  330. - MD파일을 생성해서 백엔드 구성과 DB생성을 하는 과정을 순서대로 작성해줘
  331. - 프론트화면 및 UI / API 구성시에는 항상 composition api 형태로 작성 css는 항상 scss형태로 분리해서 구성
  332. ## 프론트엔드 API 호출 규칙
  333. - **Nuxt.js server/api 사용 금지**: 프론트엔드에서 직접 백엔드 API 호출
  334. - **useAxios() 패턴 강제**: 기존 코드베이스와 일관성 유지
  335. - 반드시 다음 형태로 구성:
  336. ```javascript
  337. const loadData = async () => {
  338. try {
  339. const params = {
  340. // 파라미터들...
  341. }
  342. useAxios()
  343. .post('/api/endpoint', params)
  344. .then((res) => {
  345. if (res.data.success) {
  346. // 성공 처리
  347. data.value = res.data.data
  348. } else {
  349. // 실패 처리
  350. error.value = res.data.message
  351. }
  352. })
  353. .catch((err) => {
  354. // 에러 처리
  355. error.value = err.message
  356. })
  357. .finally(() => {
  358. // 완료 처리
  359. loading.value = false
  360. })
  361. } catch (err) {
  362. error.value = err.message
  363. }
  364. }
  365. ```
  366. ## API 구조 금지사항
  367. - **server/api 디렉토리 생성 금지**: Nuxt.js 서버 API 사용하지 않음
  368. - **mysql2, 데이터베이스 라이브러리 사용 금지**: 프론트엔드에서 직접 DB 연결 금지
  369. - **$fetch 사용 금지**: useAxios() 패턴만 사용
  370. - **async/await 패턴 지양**: .then().catch().finally() 체인 사용
  371. ## 백엔드 연동 방식
  372. - 프론트엔드 → CodeIgniter4 백엔드 직접 호출
  373. - useAxios()를 통한 HTTP 통신만 사용
  374. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  375. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어
  376. - useAxios()를 통한 HTTP 통신만 사용
  377. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  378. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어