Skip to content

Commit a5b5901

Browse files
committed
feat: 로컬DB 마이그레이션 로직 사용자 검증 로직 추가
1 parent 469d760 commit a5b5901

4 files changed

Lines changed: 36 additions & 6 deletions

File tree

SpaceWalker.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@
262262
"$(inherited)",
263263
"@executable_path/Frameworks",
264264
);
265-
MARKETING_VERSION = 1.2.1;
265+
MARKETING_VERSION = 1.3.0;
266266
OTHER_LDFLAGS = "-ObjC";
267267
PRODUCT_BUNDLE_IDENTIFIER = com.andev.SpaceWalker;
268268
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -311,7 +311,7 @@
311311
"$(inherited)",
312312
"@executable_path/Frameworks",
313313
);
314-
MARKETING_VERSION = 1.2.1;
314+
MARKETING_VERSION = 1.3.0;
315315
OTHER_LDFLAGS = "-ObjC";
316316
PRODUCT_BUNDLE_IDENTIFIER = com.andev.SpaceWalker;
317317
PRODUCT_NAME = "$(TARGET_NAME)";

SpaceWalker/Core/Data/Repository/LocationMetadataTransferRepository.swift

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import RealmSwift
1212
private enum LocationMetadataTransferError: LocalizedError {
1313
case emptyData
1414
case invalidFile
15+
case missingOwner
16+
case ownerMismatch
1517
case missingChecksum
1618
case checksumMismatch
1719

@@ -21,6 +23,10 @@ private enum LocationMetadataTransferError: LocalizedError {
2123
return "내보낼 위치 메타데이터가 없습니다."
2224
case .invalidFile:
2325
return "가져오기 파일 형식이 올바르지 않습니다."
26+
case .missingOwner:
27+
return "가져오기 파일의 사용자 정보가 없습니다."
28+
case .ownerMismatch:
29+
return "다른 계정에서 내보낸 위치 데이터 파일입니다."
2430
case .missingChecksum:
2531
return "가져오기 파일에 체크섬 정보가 없습니다."
2632
case .checksumMismatch:
@@ -36,10 +42,11 @@ final class LocationMetadataTransferRepository {
3642
let schemaVersion: Int
3743
let exportedAt: Date
3844
let appVersion: String
45+
let ownerUserId: Int64
3946
let items: [LocationMetadataTransferItem]
4047
}
4148

42-
func exportLocationMetadataPack() throws -> (fileURL: URL, itemCount: Int) {
49+
func exportLocationMetadataPack(ownerUserId: Int64) throws -> (fileURL: URL, itemCount: Int) {
4350
let realm = try Realm()
4451
let rows = realm.objects(PhotoMetadata.self).sorted(byKeyPath: "capturedAt", ascending: true)
4552

@@ -70,6 +77,7 @@ final class LocationMetadataTransferRepository {
7077
schemaVersion: schemaVersion,
7178
exportedAt: exportedAt,
7279
appVersion: appVersion,
80+
ownerUserId: ownerUserId,
7381
items: Array(items)
7482
)
7583
)
@@ -78,6 +86,7 @@ final class LocationMetadataTransferRepository {
7886
schemaVersion: schemaVersion,
7987
exportedAt: exportedAt,
8088
appVersion: appVersion,
89+
ownerUserId: ownerUserId,
8190
checksum: checksum,
8291
items: Array(items)
8392
)
@@ -93,13 +102,19 @@ final class LocationMetadataTransferRepository {
93102
return (destination, items.count)
94103
}
95104

96-
func importLocationMetadataPack(from fileURL: URL) throws -> LocationMetadataImportResult {
105+
func importLocationMetadataPack(from fileURL: URL, expectedOwnerUserId: Int64) throws -> LocationMetadataImportResult {
97106
let data = try Data(contentsOf: fileURL)
98107
let decoder = JSONDecoder()
99108
decoder.dateDecodingStrategy = .iso8601
100109
guard let pack = try? decoder.decode(LocationMetadataTransferPack.self, from: data) else {
101110
throw LocationMetadataTransferError.invalidFile
102111
}
112+
guard let ownerUserId = pack.ownerUserId else {
113+
throw LocationMetadataTransferError.missingOwner
114+
}
115+
guard ownerUserId == expectedOwnerUserId else {
116+
throw LocationMetadataTransferError.ownerMismatch
117+
}
103118
guard let checksum = pack.checksum, checksum.isEmpty == false else {
104119
throw LocationMetadataTransferError.missingChecksum
105120
}
@@ -108,6 +123,7 @@ final class LocationMetadataTransferRepository {
108123
schemaVersion: pack.schemaVersion,
109124
exportedAt: pack.exportedAt,
110125
appVersion: pack.appVersion,
126+
ownerUserId: ownerUserId,
111127
items: pack.items
112128
)
113129
)

SpaceWalker/Features/MyPage/Model/MyPageModels.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ struct LocationMetadataTransferPack: Codable {
4141
let schemaVersion: Int
4242
let exportedAt: Date
4343
let appVersion: String
44+
let ownerUserId: Int64?
4445
let checksum: String?
4546
let items: [LocationMetadataTransferItem]
4647
}

SpaceWalker/Features/MyPage/ViewModel/MyPageViewModel.swift

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ enum MyPageLocationTransferEvent {
5757
final class MyPageViewModel: BaseViewModel {
5858
private let repository = MyPageRepository()
5959
private let locationTransferRepository = LocationMetadataTransferRepository()
60+
private var currentUserId: Int64?
6061

6162
struct Input {
6263
let viewDidLoad: Observable<Void>
@@ -95,6 +96,7 @@ final class MyPageViewModel: BaseViewModel {
9596
guard let self else { return }
9697
switch event {
9798
case .next(let user):
99+
self.currentUserId = user.userId
98100
self.userRelay.accept(user)
99101
case .error(let error):
100102
self.toastRelay.accept("사용자 정보 조회 실패: \(error.localizedDescription)")
@@ -295,8 +297,12 @@ final class MyPageViewModel: BaseViewModel {
295297
single(.failure(MyPageViewModelError.message("알 수 없는 오류가 발생했습니다.")))
296298
return Disposables.create()
297299
}
300+
guard let currentUserId = self.currentUserId else {
301+
single(.failure(MyPageViewModelError.message("사용자 정보를 확인한 뒤 다시 시도해주세요.")))
302+
return Disposables.create()
303+
}
298304
do {
299-
let result = try self.locationTransferRepository.exportLocationMetadataPack()
305+
let result = try self.locationTransferRepository.exportLocationMetadataPack(ownerUserId: currentUserId)
300306
single(.success(result))
301307
} catch {
302308
single(.failure(MyPageViewModelError.message(error.localizedDescription)))
@@ -312,6 +318,10 @@ final class MyPageViewModel: BaseViewModel {
312318
single(.failure(MyPageViewModelError.message("알 수 없는 오류가 발생했습니다.")))
313319
return Disposables.create()
314320
}
321+
guard let currentUserId = self.currentUserId else {
322+
single(.failure(MyPageViewModelError.message("사용자 정보를 확인한 뒤 다시 시도해주세요.")))
323+
return Disposables.create()
324+
}
315325

316326
let needsSecureAccess = url.startAccessingSecurityScopedResource()
317327
defer {
@@ -321,7 +331,10 @@ final class MyPageViewModel: BaseViewModel {
321331
}
322332

323333
do {
324-
let result = try self.locationTransferRepository.importLocationMetadataPack(from: url)
334+
let result = try self.locationTransferRepository.importLocationMetadataPack(
335+
from: url,
336+
expectedOwnerUserId: currentUserId
337+
)
325338
single(.success(result))
326339
} catch {
327340
single(.failure(MyPageViewModelError.message(error.localizedDescription)))

0 commit comments

Comments
 (0)