Skip to content

Commit

Permalink
Add a update dive log use case (#45)
Browse files Browse the repository at this point in the history
DevYeom authored Dec 15, 2024
1 parent 42e7b0d commit 3b1063d
Showing 13 changed files with 244 additions and 63 deletions.
6 changes: 6 additions & 0 deletions Sources/BadaApp/AppReducer+Dependencies.swift
Original file line number Diff line number Diff line change
@@ -28,6 +28,12 @@ extension AppReducer {
return await repository.insert(request: request)
}
}
register {
PutDiveLogUseCase { request in
let repository = await DiveLogRepository(persistentStore: .main)
return await repository.update(request: request)
}
}
register {
GetLocalSearchCompletionsUseCase { searchText in
let repository = LocalSearchRepository()
1 change: 1 addition & 0 deletions Sources/BadaApp/Logbook/LogbookAddReducer.swift
Original file line number Diff line number Diff line change
@@ -196,6 +196,7 @@ struct LogbookAddReducer: Reducer {
logNumber: logNumber,
logDate: state.logDate,
diveSite: state.diveSite,
diveCenter: state.diveCenter,
diveStyle: state.diveStyle,
entryTime: state.entryTime,
exitTime: state.exitTime,
24 changes: 16 additions & 8 deletions Sources/BadaApp/Logbook/LogbookDetailReducer.swift
Original file line number Diff line number Diff line change
@@ -40,6 +40,7 @@ struct LogbookDetailReducer: Reducer {
}

struct State: Sendable, Equatable {
var origin: DiveLog?
var logNumber: Int?
var logDate: Date = Date(timeIntervalSince1970: 0)
var diveSite: DiveSite?
@@ -65,7 +66,7 @@ struct LogbookDetailReducer: Reducer {
}

@UseCase private var getDiveLogUseCase: GetDiveLogUseCase
@UseCase private var postDiveLogsUseCase: PostDiveLogUseCase
@UseCase private var putDiveLogUseCase: PutDiveLogUseCase

func reduce(state: inout State, action: Action) -> AnyEffect<Action> {
switch action {
@@ -75,11 +76,12 @@ struct LogbookDetailReducer: Reducer {
}
case .save:
return .single { [state] in
await executePostDiveLogUseCase(state: state)
await executePutDiveLogUseCase(state: state)
}
case .none:
return .none
case let .setDiveLog(diveLog):
state.origin = diveLog
return setDiveLog(diveLog)
case let .setLogNumber(logNumber):
state.logNumber = logNumber
@@ -240,8 +242,10 @@ struct LogbookDetailReducer: Reducer {
AnyEffect.just(.setFeeling(feeling))
}
if let notes = diveLog.notes {
AnyEffect.just(.setNotes(notes))
AnyEffect.just(.setNotesInitialized)
AnyEffect.concat {
AnyEffect.just(.setNotes(notes))
AnyEffect.just(.setNotesInitialized)
}
}
}
}
@@ -256,12 +260,15 @@ struct LogbookDetailReducer: Reducer {
}
}

private func executePostDiveLogUseCase(state: State) async -> Action {
private func executePutDiveLogUseCase(state: State) async -> Action {
guard let diveLog = state.origin else { return .none }
guard let logNumber = state.logNumber else { return .none }
let request = DiveLogInsertRequest(
let request = DiveLogUpdateRequest(
id: diveLog.id,
logNumber: logNumber,
logDate: state.logDate,
diveSite: state.diveSite,
diveCenter: state.diveCenter,
diveStyle: state.diveStyle,
entryTime: state.entryTime,
exitTime: state.exitTime,
@@ -281,9 +288,10 @@ struct LogbookDetailReducer: Reducer {
visibilityDistance: nil,
feeling: state.feeling,
companions: [],
notes: state.notes
notes: state.notes,
insertDate: diveLog.insertDate
)
let result = await postDiveLogsUseCase.execute(for: request)
let result = await putDiveLogUseCase.execute(for: request)
switch result {
case .success:
return .setShouldDismiss(true)
3 changes: 2 additions & 1 deletion Sources/BadaApp/Logbook/LogbookDetailView.swift
Original file line number Diff line number Diff line change
@@ -178,8 +178,9 @@ struct LogbookDetailView: View {
selection: store.binding(\.weather, send: { .setWeather($0) })
) {
ForEach(Weather.allCases, id: \.self) { weather in
let spacing = " "
Label(
weather.description,
spacing + weather.description,
systemImage: weather.icon.rawValue
)
.tag(weather)
2 changes: 1 addition & 1 deletion Sources/BadaApp/Logbook/LogbookListReducer.swift
Original file line number Diff line number Diff line change
@@ -69,7 +69,7 @@ struct LogbookListReducer: Reducer {
private func formattedTotalTime(_ entryTime: Date?, _ exitTime: Date?) -> String? {
guard let entryTime else { return nil }
guard let exitTime else { return nil }
let interval = exitTime.timeIntervalSince(entryTime)
let interval = exitTime.timeIntervalSince(entryTime) / 60.0
return "\(interval.formatted(.number.precision(.fractionLength(0))))min"
}

30 changes: 30 additions & 0 deletions Sources/BadaData/Models/Logbook/DiveLogEntity.swift
Original file line number Diff line number Diff line change
@@ -172,6 +172,7 @@ extension DiveLogEntity {
logNumber: insertRequest.logNumber,
logDate: insertRequest.logDate,
diveSite: insertRequest.diveSite.map { DiveSite(domain: $0) },
diveCenter: insertRequest.diveCenter,
diveStyle: insertRequest.diveStyle.map { DiveStyle(domain: $0) },
entryTime: insertRequest.entryTime,
exitTime: insertRequest.exitTime,
@@ -196,4 +197,33 @@ extension DiveLogEntity {
updateDate: Date.now
)
}

func update(with request: DiveLogUpdateRequest) {
logNumber = request.logNumber
logDate = request.logDate
diveSite = request.diveSite.map { DiveSite(domain: $0) }
diveCenter = request.diveCenter
diveStyle = request.diveStyle.map { DiveStyle(domain: $0) }
entryTime = request.entryTime
exitTime = request.exitTime
surfaceInterval = request.surfaceInterval
entryAir = request.entryAir
exitAir = request.exitAir
gasType = request.gasType.map { DiveGasType(domain: $0) }
equipment = request.equipment.map { Equipment(domain: $0) }
maximumDepth = request.maximumDepth
averageDepth = request.averageDepth
airTemperature = request.airTemperature
surfaceTemperature = request.surfaceTemperature
bottomTemperature = request.bottomTemperature
weather = request.weather.map { Weather(domain: $0) }
surge = request.surge.map { Surge(domain: $0) }
visibility = request.visibility.map { Visibility(domain: $0) }
visibilityDistance = request.visibilityDistance
feeling = request.feeling.map { Feeling(domain: $0) }
companions = request.companions.map { Companion(domain: $0) }
notes = request.notes
insertDate = request.insertDate
updateDate = Date.now
}
}
20 changes: 20 additions & 0 deletions Sources/BadaData/Repositories/DiveLogRepository.swift
Original file line number Diff line number Diff line change
@@ -27,6 +27,26 @@ package struct DiveLogRepository: DiveLogRepositoryType {
}
}

package func update(request: DiveLogUpdateRequest) -> Result<Void, DiveLogRepositoryError> {
var descriptor = FetchDescriptor<DiveLogEntity>()
let id = request.id
descriptor.predicate = #Predicate { diveLog in
diveLog.id == id
}
do {
let diveLogs = try context.fetch(descriptor)
if let diveLog = diveLogs.first {
diveLog.update(with: request)
try context.save()
return .success(())
} else {
return .failure(.noResult)
}
} catch {
return .failure(.updateFailed(error.localizedDescription))
}
}

package func diveLogs() -> Result<[DiveLog], DiveLogRepositoryError> {
let descriptor = FetchDescriptor<DiveLogEntity>()
do {
1 change: 1 addition & 0 deletions Sources/BadaDomain/Interfaces/DiveLogRepositoryType.swift
Original file line number Diff line number Diff line change
@@ -16,5 +16,6 @@ package protocol DiveLogRepositoryType {
package enum DiveLogRepositoryError: Error {
case insertFailed(String)
case fetchFailed(String)
case updateFailed(String)
case noResult
}
75 changes: 24 additions & 51 deletions Sources/BadaDomain/Models/Logbook/DiveLogInsertRequest.swift
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ package struct DiveLogInsertRequest: Equatable {
package let logNumber: Int
package let logDate: Date
package let diveSite: DiveSite?
package let diveCenter: String?
package let diveStyle: DiveStyle?
package let entryTime: Date?
package let exitTime: Date?
@@ -35,31 +36,33 @@ package struct DiveLogInsertRequest: Equatable {
package init(
logNumber: Int,
logDate: Date,
diveSite: DiveSite? = nil,
diveStyle: DiveStyle? = nil,
entryTime: Date? = nil,
exitTime: Date? = nil,
surfaceInterval: UnitValue.Time? = nil,
entryAir: UnitValue.Pressure? = nil,
exitAir: UnitValue.Pressure? = nil,
gasType: DiveGasType? = nil,
equipment: Equipment? = nil,
maximumDepth: UnitValue.Distance? = nil,
averageDepth: UnitValue.Distance? = nil,
airTemperature: UnitValue.Temperature? = nil,
surfaceTemperature: UnitValue.Temperature? = nil,
bottomTemperature: UnitValue.Temperature? = nil,
weather: Weather? = nil,
surge: Surge? = nil,
visibility: Visibility? = nil,
visibilityDistance: UnitValue.Distance? = nil,
feeling: Feeling? = nil,
companions: [Companion] = [],
notes: String? = nil
diveSite: DiveSite?,
diveCenter: String?,
diveStyle: DiveStyle?,
entryTime: Date?,
exitTime: Date?,
surfaceInterval: UnitValue.Time?,
entryAir: UnitValue.Pressure?,
exitAir: UnitValue.Pressure?,
gasType: DiveGasType?,
equipment: Equipment?,
maximumDepth: UnitValue.Distance?,
averageDepth: UnitValue.Distance?,
airTemperature: UnitValue.Temperature?,
surfaceTemperature: UnitValue.Temperature?,
bottomTemperature: UnitValue.Temperature?,
weather: Weather?,
surge: Surge?,
visibility: Visibility?,
visibilityDistance: UnitValue.Distance?,
feeling: Feeling?,
companions: [Companion],
notes: String?
) {
self.logNumber = logNumber
self.logDate = logDate
self.diveSite = diveSite
self.diveCenter = diveCenter
self.diveStyle = diveStyle
self.entryTime = entryTime
self.exitTime = exitTime
@@ -82,33 +85,3 @@ package struct DiveLogInsertRequest: Equatable {
self.notes = notes
}
}

extension DiveLogInsertRequest {
package init(diveLog: DiveLog) {
self.init(
logNumber: diveLog.logNumber,
logDate: diveLog.logDate,
diveSite: diveLog.diveSite,
diveStyle: diveLog.diveStyle,
entryTime: diveLog.entryTime,
exitTime: diveLog.exitTime,
surfaceInterval: diveLog.surfaceInterval,
entryAir: diveLog.entryAir,
exitAir: diveLog.exitAir,
gasType: diveLog.gasType,
equipment: diveLog.equipment,
maximumDepth: diveLog.maximumDepth,
averageDepth: diveLog.averageDepth,
airTemperature: diveLog.airTemperature,
surfaceTemperature: diveLog.surfaceTemperature,
bottomTemperature: diveLog.bottomTemperature,
weather: diveLog.weather,
surge: diveLog.surge,
visibility: diveLog.visibility,
visibilityDistance: diveLog.visibilityDistance,
feeling: diveLog.feeling,
companions: diveLog.companions,
notes: diveLog.notes
)
}
}
93 changes: 93 additions & 0 deletions Sources/BadaDomain/Models/Logbook/DiveLogUpdateRequest.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
//
// BadaBook
// Apache License, Version 2.0
//
// Copyright (c) 2024 Seungyeop Yeom ( https://github.com/OceanPositive ).
//

import BadaCore

package struct DiveLogUpdateRequest: Equatable {
package let id: DiveLogID
package let logNumber: Int
package let logDate: Date
package let diveSite: DiveSite?
package let diveCenter: String?
package let diveStyle: DiveStyle?
package let entryTime: Date?
package let exitTime: Date?
package let surfaceInterval: UnitValue.Time?
package let entryAir: UnitValue.Pressure?
package let exitAir: UnitValue.Pressure?
package let gasType: DiveGasType?
package let equipment: Equipment?
package let maximumDepth: UnitValue.Distance?
package let averageDepth: UnitValue.Distance?
package let airTemperature: UnitValue.Temperature?
package let surfaceTemperature: UnitValue.Temperature?
package let bottomTemperature: UnitValue.Temperature?
package let weather: Weather?
package let surge: Surge?
package let visibility: Visibility?
package let visibilityDistance: UnitValue.Distance?
package let feeling: Feeling?
package let companions: [Companion]
package let notes: String?
package let insertDate: Date

package init(
id: DiveLogID,
logNumber: Int,
logDate: Date,
diveSite: DiveSite?,
diveCenter: String?,
diveStyle: DiveStyle?,
entryTime: Date?,
exitTime: Date?,
surfaceInterval: UnitValue.Time?,
entryAir: UnitValue.Pressure?,
exitAir: UnitValue.Pressure?,
gasType: DiveGasType?,
equipment: Equipment?,
maximumDepth: UnitValue.Distance?,
averageDepth: UnitValue.Distance?,
airTemperature: UnitValue.Temperature?,
surfaceTemperature: UnitValue.Temperature?,
bottomTemperature: UnitValue.Temperature?,
weather: Weather?,
surge: Surge?,
visibility: Visibility?,
visibilityDistance: UnitValue.Distance?,
feeling: Feeling?,
companions: [Companion],
notes: String?,
insertDate: Date
) {
self.id = id
self.logNumber = logNumber
self.logDate = logDate
self.diveSite = diveSite
self.diveCenter = diveCenter
self.diveStyle = diveStyle
self.entryTime = entryTime
self.exitTime = exitTime
self.surfaceInterval = surfaceInterval
self.entryAir = entryAir
self.exitAir = exitAir
self.gasType = gasType
self.equipment = equipment
self.maximumDepth = maximumDepth
self.averageDepth = averageDepth
self.airTemperature = airTemperature
self.surfaceTemperature = surfaceTemperature
self.bottomTemperature = bottomTemperature
self.weather = weather
self.surge = surge
self.visibility = visibility
self.visibilityDistance = visibilityDistance
self.feeling = feeling
self.companions = companions
self.notes = notes
self.insertDate = insertDate
}
}
Loading
Oops, something went wrong.

0 comments on commit 3b1063d

Please sign in to comment.