//* src/store/index.js - Store 스토어 (완전한 버전) import { defineStore } from 'pinia' export const useStoreStore = defineStore('store', { state: () => ({ storeInfo: null, menus: [], // 메뉴 목록 추가 loading: false, error: null }), getters: { hasStoreInfo: (state) => !!state.storeInfo, isLoading: (state) => state.loading, hasMenus: (state) => state.menus && state.menus.length > 0 }, actions: { /** * 매장 정보 조회 */ async fetchStoreInfo() { console.log('=== Store 스토어: 매장 정보 조회 시작 ===') this.loading = true this.error = null try { // 스토어 서비스 임포트 const { storeService } = await import('@/services/store') console.log('매장 정보 API 호출') const result = await storeService.getStore() console.log('=== Store 스토어: API 응답 분석 ===') console.log('Result:', result) console.log('Result.success:', result.success) console.log('Result.data:', result.data) console.log('Result.message:', result.message) if (result.success && result.data) { // 매장 정보가 있는 경우 console.log('✅ 매장 정보 설정:', result.data) this.storeInfo = result.data return { success: true, data: result.data } } else { // 매장이 없거나 조회 실패한 경우 console.log('⚠️ 매장 정보 없음 또는 조회 실패') this.storeInfo = null if (result.message === '등록된 매장이 없습니다') { return { success: false, message: '등록된 매장이 없습니다' } } else { return { success: false, message: result.message || '매장 정보 조회에 실패했습니다' } } } } catch (error) { console.error('=== Store 스토어: 매장 정보 조회 실패 ===') console.error('Error:', error) this.error = error.message this.storeInfo = null // HTTP 상태 코드별 처리 if (error.response?.status === 404) { return { success: false, message: '등록된 매장이 없습니다' } } if (error.response?.status >= 500) { return { success: false, message: '서버 오류가 발생했습니다. 잠시 후 다시 시도해주세요.' } } if (error.response?.status === 401) { return { success: false, message: '로그인이 필요합니다' } } return { success: false, message: error.message || '매장 정보 조회에 실패했습니다' } } finally { this.loading = false } }, // src/store/index.js에서 fetchMenus 부분만 수정 /** * 메뉴 목록 조회 - 실제 API 연동 (매장 ID 필요) - ✅ 이미지 필드 매핑 수정 */ async fetchMenus() { console.log('=== Store 스토어: 메뉴 목록 조회 시작 ===') try { // 매장 정보에서 storeId 가져오기 const storeId = this.storeInfo?.storeId if (!storeId) { console.warn('매장 ID가 없습니다. 매장 정보를 먼저 조회해주세요.') return { success: false, message: '매장 정보가 필요합니다', data: [] } } // 메뉴 서비스 임포트 const { menuService } = await import('@/services/menu') console.log('메뉴 목록 API 호출, 매장 ID:', storeId) const result = await menuService.getMenus(storeId) console.log('=== Store 스토어: 메뉴 API 응답 분석 ===') console.log('Result:', result) console.log('Result.success:', result.success) console.log('Result.data:', result.data) console.log('Result.message:', result.message) if (result.success && result.data) { // ✅ 백엔드 MenuResponse의 필드명에 맞게 매핑 수정 const menusWithId = (result.data || []).map(menu => { // ID 필드가 확실히 있도록 보장 const menuId = menu.menuId || menu.id if (!menuId) { console.warn('⚠️ 메뉴 ID가 없는 항목 발견:', menu) } console.log('메뉴 원본 데이터:', menu) // 디버깅용 return { ...menu, id: menuId, // ✅ id 필드 확실히 설정 menuId: menuId, // ✅ menuId 필드도 설정 // 기타 필드들 보장 menuName: menu.menuName || menu.name || '이름 없음', category: menu.category || '기타', price: menu.price || 0, description: menu.description || '', available: menu.available !== undefined ? menu.available : true, recommended: menu.recommended !== undefined ? menu.recommended : false, // ✅ 이미지 필드 수정: 백엔드는 'image' 필드 사용 imageUrl: menu.image || menu.imageUrl || '/images/menu-placeholder.png', image: menu.image || menu.imageUrl, // 백엔드 호환성 createdAt: menu.createdAt, updatedAt: menu.updatedAt } }) // 메뉴 목록이 있는 경우 console.log('✅ 메뉴 목록 설정 (이미지 필드 매핑 완료):', menusWithId) this.menus = menusWithId return { success: true, data: menusWithId } } else { // 메뉴가 없거나 조회 실패한 경우 console.log('⚠️ 메뉴 목록 없음 또는 조회 실패') this.menus = [] if (result.message === '등록된 메뉴가 없습니다') { return { success: false, message: '등록된 메뉴가 없습니다', data: [] } } else { return { success: false, message: result.message || '메뉴 목록 조회에 실패했습니다', data: [] } } } } catch (error) { console.error('=== Store 스토어: 메뉴 목록 조회 실패 ===') console.error('Error:', error) this.menus = [] return { success: false, message: error.message || '메뉴 목록을 불러오는데 실패했습니다', data: [] } } }, /** * 매장 등록 */ async registerStore(storeData) { console.log('매장 등록 시작:', storeData) this.loading = true this.error = null try { const { storeService } = await import('@/services/store') const result = await storeService.registerStore(storeData) console.log('매장 등록 결과:', result) if (result.success) { // 등록 성공 후 매장 정보 다시 조회 await this.fetchStoreInfo() return result } else { this.error = result.message return result } } catch (error) { console.error('매장 등록 실패:', error) this.error = error.message return { success: false, message: error.message || '매장 등록에 실패했습니다' } } finally { this.loading = false } }, /** * 매장 정보 수정 */ async updateStore(storeId, storeData) { console.log('매장 정보 수정 시작:', { storeId, storeData }) this.loading = true this.error = null try { const { storeService } = await import('@/services/store') const result = await storeService.updateStore(storeId, storeData) console.log('매장 수정 결과:', result) if (result.success) { // 수정 성공 후 매장 정보 다시 조회 await this.fetchStoreInfo() return result } else { this.error = result.message return result } } catch (error) { console.error('매장 수정 실패:', error) this.error = error.message return { success: false, message: error.message || '매장 수정에 실패했습니다' } } finally { this.loading = false } }, /** * 매장 정보 초기화 */ clearStoreInfo() { this.storeInfo = null this.menus = [] this.error = null this.loading = false } } })