Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions EATSSU/App/Resources/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
// MARK: - Common

/// "숭실대에서 먹자"
"common.logoSubTitle" = "Eat at Soongsil";
/// "확인"
"common.confirm" = "Confirm";
/// "취소"
Expand Down Expand Up @@ -175,7 +174,7 @@
// MARK: - Map

/// MainMapVC - "제휴 지도"
"map.map" = "Partner Map";
"map.map" = "Map";
/// MainMapView - "전체"
"map.all" = "All";
/// MainMapView - "내 제휴"
Expand All @@ -201,6 +200,22 @@
/// MainMapVC+Location - "지도에서 내 위치를 바로 확인하고, 현재 위치 주변의 제휴점들을 손쉽게 찾아볼 수 있도록 위치 권한을 허용해 주세요."
"map.locationAuthDescription" = "Please allow location permission so you can check your location on the map and easily find nearby partners.";

"map.goodPriceMapTitle" = "Good Price Stores Map";
"map.schoolPartnershipTab" = "Campus Partners";
"map.goodPriceTab" = "Good Price";
"map.korean" = "Korean";
"map.japanese" = "Japanese";
"map.western" = "Western";
"map.chinese" = "Chinese";
"map.bakery" = "Bakery";
"map.etc" = "Others";
"map.storeLoadFailed" = "Couldn't load store information.";
"map.priceWon" = "%@ KRW";
"auth.loginSubTitle" = "From Soongsil to all of Seoul";
"auth.loginSubTitleHighlight" = "to all of Seoul";
"auth.goodPriceEntryTitle" = "Explore Good Price Stores";
"auth.goodPriceEntrySubTitle" = "Find an affordable meal near you";


// MARK: - MyPage

Expand Down
19 changes: 17 additions & 2 deletions EATSSU/App/Resources/ja.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
// MARK: - Common

/// "숭실대에서 먹자"
"common.logoSubTitle" = "崇実大で食べよう";
/// "확인"
"common.confirm" = "確認";
/// "취소"
Expand Down Expand Up @@ -176,7 +175,7 @@
// MARK: - Map

/// MainMapVC - "제휴 지도"
"map.map" = "提携マップ";
"map.map" = "マップ";
/// MainMapView - "전체"
"map.all" = "すべて";
/// MainMapView - "내 제휴"
Expand All @@ -202,6 +201,22 @@
/// MainMapVC+Location - "지도에서 내 위치를 바로 확인하고, 현재 위치 주변의 제휴점들을 손쉽게 찾아볼 수 있도록 위치 권한을 허용해 주세요."
"map.locationAuthDescription" = "現在地をすぐに確認し、近くの提携レストランを探せるように、位置情報へのアクセスを許可してください。";

"map.goodPriceMapTitle" = "良心価格店マップ";
"map.schoolPartnershipTab" = "学校提携";
"map.goodPriceTab" = "良心価格";
"map.korean" = "韓食";
"map.japanese" = "和食";
"map.western" = "洋食";
"map.chinese" = "中華";
"map.bakery" = "ベーカリー";
"map.etc" = "その他";
"map.storeLoadFailed" = "店舗情報を読み込めませんでした。";
"map.priceWon" = "%@ウォン";
"auth.loginSubTitle" = "崇実大からソウル各地まで";
"auth.loginSubTitleHighlight" = "ソウル各地まで";
"auth.goodPriceEntryTitle" = "良心価格店を見る";
"auth.goodPriceEntrySubTitle" = "近くのお手頃な一食を探そう";


// MARK: - MyPage

Expand Down
19 changes: 17 additions & 2 deletions EATSSU/App/Resources/ko.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
// MARK: - Common

/// "숭실대에서 먹자"
"common.logoSubTitle" = "숭실대에서 먹자";
/// "확인"
"common.confirm" = "확인";
/// "취소"
Expand Down Expand Up @@ -176,7 +175,7 @@
// MARK: - Map

/// MainMapVC - "제휴 지도"
"map.map" = "제휴 지도";
"map.map" = "지도";
/// MainMapView - "전체"
"map.all" = "전체";
/// MainMapView - "내 제휴"
Expand All @@ -202,6 +201,22 @@
/// MainMapVC+Location - "지도에서 내 위치를 바로 확인하고, 현재 위치 주변의 제휴점들을 손쉽게 찾아볼 수 있도록 위치 권한을 허용해 주세요."
"map.locationAuthDescription" = "지도에서 내 위치를 바로 확인하고, 현재 위치 주변의 제휴점들을 손쉽게 찾아볼 수 있도록 위치 권한을 허용해 주세요.";

"map.goodPriceMapTitle" = "착한가격업소 지도";
"map.schoolPartnershipTab" = "학교 제휴";
"map.goodPriceTab" = "착한 가격";
"map.korean" = "한식";
"map.japanese" = "일식";
"map.western" = "양식";
"map.chinese" = "중식";
"map.bakery" = "베이커리";
"map.etc" = "기타";
"map.storeLoadFailed" = "업소 정보를 불러오지 못했어요.";
"map.priceWon" = "%@원";
"auth.loginSubTitle" = "숭실대에서 서울 곳곳까지";
"auth.loginSubTitleHighlight" = "서울 곳곳까지";
"auth.goodPriceEntryTitle" = "착한가격업소 둘러보기";
"auth.goodPriceEntrySubTitle" = "내 주변 착한 한 끼를 찾아보세요";


// MARK: - MyPage

Expand Down
19 changes: 17 additions & 2 deletions EATSSU/App/Resources/vi.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
// MARK: - Common

/// "숭실대에서 먹자"
"common.logoSubTitle" = "Ăn ở Soongsil";
/// "확인"
"common.confirm" = "Xác nhận";
/// "취소"
Expand Down Expand Up @@ -176,7 +175,7 @@
// MARK: - Map

/// MainMapVC - "제휴 지도"
"map.map" = "Bản đồ đối tác";
"map.map" = "Bản đồ";
/// MainMapView - "전체"
"map.all" = "Tất cả";
/// MainMapView - "내 제휴"
Expand All @@ -202,6 +201,22 @@
/// MainMapVC+Location - "지도에서 내 위치를 바로 확인하고, 현재 위치 주변의 제휴점들을 손쉽게 찾아볼 수 있도록 위치 권한을 허용해 주세요."
"map.locationAuthDescription" = "Vui lòng cho phép truy cập vị trí để nhanh chóng xem vị trí của bạn và tìm các nhà hàng đối tác gần đó.";

"map.goodPriceMapTitle" = "Bản đồ quán giá tốt";
"map.schoolPartnershipTab" = "Đối tác trường";
"map.goodPriceTab" = "Giá tốt";
"map.korean" = "Món Hàn";
"map.japanese" = "Món Nhật";
"map.western" = "Món Âu";
"map.chinese" = "Món Trung";
"map.bakery" = "Tiệm bánh";
"map.etc" = "Khác";
"map.storeLoadFailed" = "Không thể tải thông tin cửa hàng.";
"map.priceWon" = "%@ won";
"auth.loginSubTitle" = "Từ Soongsil đến khắp Seoul";
"auth.loginSubTitleHighlight" = "đến khắp Seoul";
"auth.goodPriceEntryTitle" = "Khám phá quán giá tốt";
"auth.goodPriceEntrySubTitle" = "Tìm bữa ăn giá hợp lý gần bạn";


// MARK: - MyPage

Expand Down
35 changes: 35 additions & 0 deletions EATSSU/App/Sources/Data/Firebase/MapAnalyticsManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,18 @@ final class MapAnalyticsManager {
static let clickMapMine = "click_map_mine"
static let clickMapFestival = "click_map_festival"
static let clickPartnerRestaurant = "click_partner_restaurant"
static let clickMapGoodPrice = "click_map_good_price"
static let clickGoodPriceCategory = "click_good_price_category"
static let clickGoodPriceStore = "click_good_price_store"
}

private enum Parameter {
static let college = "college"
static let major = "major"
static let defaultType = "default_type"
static let partnerRestaurantId = "partner_restaurant_id"
static let category = "category"
static let goodPriceStoreId = "good_price_store_id"
}

enum MapDefaultType: String {
Expand Down Expand Up @@ -106,6 +111,36 @@ final class MapAnalyticsManager {
AnalyticsService.logEvent(Event.clickPartnerRestaurant, parameters: parameters)
}

/**
#6 지도 화면에서 '착한 가격' 탭을 클릭했을 때 호출
*/
func logClickMapGoodPrice(collegeId: Int?, majorId: Int?) {
AnalyticsService.logEvent(
Event.clickMapGoodPrice,
parameters: makeParameters(collegeId: collegeId, majorId: majorId)
)
}

/**
#7 착한가격 탭에서 업종 필터를 클릭했을 때 호출
- Parameter category: 선택한 업종 (전체는 "ALL")
*/
func logClickGoodPriceCategory(category: GoodPriceCategory) {
AnalyticsService.logEvent(Event.clickGoodPriceCategory, parameters: [
Parameter.category: category.serverValue ?? "ALL"
])
}

/**
#8 지도에서 착한가격업소 마커를 클릭했을 때 호출
- Parameter storeId: 클릭된 업소 ID
*/
func logClickGoodPriceStore(storeId: Int) {
AnalyticsService.logEvent(Event.clickGoodPriceStore, parameters: [
Parameter.goodPriceStoreId: storeId
])
}

// MARK: - Helpers

/// college/major가 nil이면 해당 키를 제외하고 파라미터 dict 구성
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
//
// GoodPriceCategory.swift
// EATSSU
//
// Created by 황상환 on 8/23/26.
//

import Foundation

/// 착한가격업소 업종 필터. 순서 = 화면 필터 노출 순서
enum GoodPriceCategory: CaseIterable {
case all
case korean
case japanese
case western
case chinese
case bakery
case etc

/// 서버 category 파라미터 값. 전체는 nil
var serverValue: String? {
switch self {
case .all: return nil
case .korean: return "KOREAN"
case .japanese: return "JAPANESE"
case .western: return "WESTERN"
case .chinese: return "CHINESE"
case .bakery: return "BAKERY"
case .etc: return "ETC"
}
}

var title: String {
switch self {
case .all: return TextLiteral.Map.all
case .korean: return TextLiteral.Map.korean
case .japanese: return TextLiteral.Map.japanese
case .western: return TextLiteral.Map.western
case .chinese: return TextLiteral.Map.chinese
case .bakery: return TextLiteral.Map.bakery
case .etc: return TextLiteral.Map.etc
}
}

/// 서버 category 문자열 → enum (전체는 매칭 대상 아님)
init?(serverValue: String) {
guard let matched = Self.allCases.first(where: { $0.serverValue == serverValue }) else {
return nil
}
self = matched
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// GoodPriceStoreDTO.swift
// EATSSU
//
// Created by 황상환 on 8/23/26.
//

import Foundation

/// 착한가격업소 목록 항목 (GET /good-price-stores)
struct GoodPriceStoreDTO: Codable {
let id: Int
let storeName: String
let category: String
let latitude: Double
let longitude: Double
}

/// 착한가격업소 상세 (GET /good-price-stores/{id})
struct GoodPriceStoreDetailDTO: Codable {
let id: Int
let storeName: String
let category: String
let mainMenu: String?
let price: Int?
let roadAddress: String?
let imageUrl: String?
}
44 changes: 44 additions & 0 deletions EATSSU/App/Sources/Data/Network/Router/GoodPriceStoreRouter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//
// GoodPriceStoreRouter.swift
// EATSSU
//
// Created by 황상환 on 8/23/26.
//

import Foundation

import Moya

enum GoodPriceStoreRouter {
/// 전체 목록 조회 (업종 필터는 클라이언트에서 처리)
case getStores
/// 상세 조회
case getStoreDetail(id: Int)
}

extension GoodPriceStoreRouter: TargetType {
var baseURL: URL {
URL(string: Config.baseURL)!
}

var path: String {
switch self {
case .getStores:
return "/good-price-stores"
case .getStoreDetail(let id):
return "/good-price-stores/\(id)"
}
}

var method: Moya.Method {
return .get
}

var task: Task {
return .requestPlain
}

var headers: [String: String]? {
return ["Content-Type": "application/json"]
}
}
Loading