bootstrap bulkhealth moodwell state-of-mind importer mvp
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
import Foundation
|
||||
import HealthKit
|
||||
|
||||
struct TemplateField: Identifiable, Hashable {
|
||||
enum FieldType: String {
|
||||
case string
|
||||
case number
|
||||
case date
|
||||
case stringArray
|
||||
}
|
||||
|
||||
let id: String
|
||||
let title: String
|
||||
let description: String
|
||||
let type: FieldType
|
||||
let isRequired: Bool
|
||||
}
|
||||
|
||||
struct HealthTemplate {
|
||||
let id: String
|
||||
let title: String
|
||||
let localizedHealthTypeName: String
|
||||
let fields: [TemplateField]
|
||||
}
|
||||
|
||||
struct ImportMapping: Equatable {
|
||||
var sourceKeyByFieldID: [String: String]
|
||||
|
||||
func sourceKey(for fieldID: String) -> String {
|
||||
sourceKeyByFieldID[fieldID, default: ""]
|
||||
}
|
||||
}
|
||||
|
||||
struct MoodwellPayload: Decodable {
|
||||
let mymoods: [MoodwellEntry]
|
||||
}
|
||||
|
||||
struct MoodwellEntry: Decodable, Identifiable {
|
||||
let arrayOfPhotos: [String]
|
||||
let moodType: Int
|
||||
let moodUniqueIdentifier: String
|
||||
let arrayOfBadEmotions: [String]
|
||||
let notesString: String?
|
||||
let arrayOfWeathers: [String]
|
||||
let createdAt: String
|
||||
let arrayOfActivities: [String]
|
||||
let arrayOfGoodEmotions: [String]
|
||||
|
||||
var id: String { moodUniqueIdentifier }
|
||||
|
||||
var sourceDictionary: [String: ImportValue] {
|
||||
[
|
||||
"moodType": .number(Double(moodType)),
|
||||
"moodUniqueIdentifier": .string(moodUniqueIdentifier),
|
||||
"arrayOfBadEmotions": .stringArray(arrayOfBadEmotions),
|
||||
"notesString": notesString.map(ImportValue.string) ?? .null,
|
||||
"arrayOfWeathers": .stringArray(arrayOfWeathers),
|
||||
"createdAt": .string(createdAt),
|
||||
"arrayOfActivities": .stringArray(arrayOfActivities),
|
||||
"arrayOfGoodEmotions": .stringArray(arrayOfGoodEmotions)
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
enum ImportValue: Hashable {
|
||||
case string(String)
|
||||
case number(Double)
|
||||
case stringArray([String])
|
||||
case null
|
||||
|
||||
func asString() -> String? {
|
||||
if case let .string(value) = self {
|
||||
return value
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func asNumber() -> Double? {
|
||||
if case let .number(value) = self {
|
||||
return value
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func asStringArray() -> [String]? {
|
||||
if case let .stringArray(value) = self {
|
||||
return value
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
struct StateOfMindDraft: Identifiable, Hashable {
|
||||
let id: String
|
||||
let date: Date
|
||||
let kind: HKStateOfMind.Kind
|
||||
let valence: Double
|
||||
let labels: [HKStateOfMind.Label]
|
||||
let associations: [HKStateOfMind.Association]
|
||||
let metadata: [String: String]
|
||||
|
||||
var summaryText: String {
|
||||
"\(date.formatted(date: .abbreviated, time: .shortened)) • \(kind == .dailyMood ? "Daily mood" : "Momentary emotion") • valence \(String(format: "%.2f", valence))"
|
||||
}
|
||||
}
|
||||
|
||||
struct DryRunResult {
|
||||
let drafts: [StateOfMindDraft]
|
||||
let warnings: [String]
|
||||
let errors: [String]
|
||||
}
|
||||
Reference in New Issue
Block a user