From 2783dd56d003f317e066fa09995b369641dbc84f Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Wed, 12 Apr 2023 21:15:13 +0200 Subject: [PATCH] Implemented the SaveLocalLocationUseCase use case. --- .../Sources/Remote/Models/Location.swift | 2 +- .../LoadRemoteLocationsUseCase.swift | 2 + .../Use Cases/SaveLocalLocationUseCase.swift | 54 +++++++++++++++++++ DeepLinking.xcodeproj/project.pbxproj | 4 ++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 Apps/Locations/Sources/Use Cases/SaveLocalLocationUseCase.swift diff --git a/Apps/Locations/Libraries/Sources/Remote/Models/Location.swift b/Apps/Locations/Libraries/Sources/Remote/Models/Location.swift index 0342f96..363e50f 100644 --- a/Apps/Locations/Libraries/Sources/Remote/Models/Location.swift +++ b/Apps/Locations/Libraries/Sources/Remote/Models/Location.swift @@ -16,7 +16,7 @@ public struct Location: Equatable { // MARK: Initialisers - public init( + init( name: String? = nil, latitude: Float, longitude: Float diff --git a/Apps/Locations/Sources/Use Cases/LoadRemoteLocationsUseCase.swift b/Apps/Locations/Sources/Use Cases/LoadRemoteLocationsUseCase.swift index e64bd01..50c3cc1 100644 --- a/Apps/Locations/Sources/Use Cases/LoadRemoteLocationsUseCase.swift +++ b/Apps/Locations/Sources/Use Cases/LoadRemoteLocationsUseCase.swift @@ -28,6 +28,8 @@ struct LoadRemoteLocationsUseCase { self.remoteService = remoteService } + // MARK: Functions + func callAsFunction() async throws { let context = persistence.makeTaskContext() let fetchRequest = NSFetchRequest.allLocations() diff --git a/Apps/Locations/Sources/Use Cases/SaveLocalLocationUseCase.swift b/Apps/Locations/Sources/Use Cases/SaveLocalLocationUseCase.swift new file mode 100644 index 0000000..0d2d074 --- /dev/null +++ b/Apps/Locations/Sources/Use Cases/SaveLocalLocationUseCase.swift @@ -0,0 +1,54 @@ +// +// SaveLocalLocationUseCase.swift +// Locations +// +// Created by Javier Cicchelli on 12/04/2023. +// Copyright © 2023 Röck+Cöde. All rights reserved. +// + +import Dependency +import Persistence + +struct SaveLocalLocationUseCase { + + // MARK: Properties + + private let persistence: PersistenceService + + // MARK: Initialisers + + init(persistence: PersistenceService) { + self.persistence = persistence + } + + // MARK: Functions + + func callAsFunction( + name: String? = nil, + latitude: Float, + longitude: Float + ) { + let context = persistence.makeTaskContext() + let entity = Location(context: context) + + entity.createdAt = .now + entity.name = name + entity.latitude = latitude + entity.longitude = longitude + entity.source = .local + + persistence.save(context: context) + } + +} + +// MARK: - LoadRemoteLocationsUseCase+Initialisers + +extension SaveLocalLocationUseCase { + init() { + @Dependency(\.persistence) var persistence + + self.init(persistence: persistence) + } +} + diff --git a/DeepLinking.xcodeproj/project.pbxproj b/DeepLinking.xcodeproj/project.pbxproj index 6d192f6..00cc327 100644 --- a/DeepLinking.xcodeproj/project.pbxproj +++ b/DeepLinking.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 02031EEA29E6B495003C108C /* ErrorMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02031EE929E6B495003C108C /* ErrorMessageView.swift */; }; 4656CBC229E6D33C00600EE6 /* LoadRemoteLocationsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4656CBC129E6D33C00600EE6 /* LoadRemoteLocationsUseCase.swift */; }; 4656CBC829E6F2E400600EE6 /* LocationViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4656CBC729E6F2E400600EE6 /* LocationViewCell.swift */; }; + 4656CBE629E7360B00600EE6 /* SaveLocalLocationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4656CBE529E7360B00600EE6 /* SaveLocalLocationUseCase.swift */; }; 46C3B7C629E5BF1500F8F57C /* LocationsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */; }; 46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */; }; 46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */; }; @@ -132,6 +133,7 @@ 02031EE929E6B495003C108C /* ErrorMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorMessageView.swift; sourceTree = ""; }; 4656CBC129E6D33C00600EE6 /* LoadRemoteLocationsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadRemoteLocationsUseCase.swift; sourceTree = ""; }; 4656CBC729E6F2E400600EE6 /* LocationViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationViewCell.swift; sourceTree = ""; }; + 4656CBE529E7360B00600EE6 /* SaveLocalLocationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveLocalLocationUseCase.swift; sourceTree = ""; }; 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordinator.swift; sourceTree = ""; }; 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListViewModel.swift; sourceTree = ""; }; 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewModel.swift; sourceTree = ""; }; @@ -223,6 +225,7 @@ isa = PBXGroup; children = ( 4656CBC129E6D33C00600EE6 /* LoadRemoteLocationsUseCase.swift */, + 4656CBE529E7360B00600EE6 /* SaveLocalLocationUseCase.swift */, ); path = "Use Cases"; sourceTree = ""; @@ -544,6 +547,7 @@ 02031EBF29E5F949003C108C /* LocationsAddViewModeling.swift in Sources */, 4656CBC829E6F2E400600EE6 /* LocationViewCell.swift in Sources */, 46C3B7DE29E5ED2E00F8F57C /* LocationsAddCoordinator.swift in Sources */, + 4656CBE629E7360B00600EE6 /* SaveLocalLocationUseCase.swift in Sources */, 02031EEA29E6B495003C108C /* ErrorMessageView.swift in Sources */, 46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordination.swift in Sources */, 46C3B7D829E5E55000F8F57C /* LocationsListCoordination.swift in Sources */,