From 53c2fcee0c27d7b3de1c25a607b6a131a9821440 Mon Sep 17 00:00:00 2001 From: Jonathan Bernard Date: Thu, 10 Feb 2022 11:23:30 -0600 Subject: [PATCH] Add common HFF data models. --- notion_utils.nimble | 2 +- src/notion_utils/hff_models.nim | 160 ++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 src/notion_utils/hff_models.nim diff --git a/notion_utils.nimble b/notion_utils.nimble index a1e78ac..e0de6ef 100644 --- a/notion_utils.nimble +++ b/notion_utils.nimble @@ -1,6 +1,6 @@ # Package -version = "0.1.0" +version = "0.2.0" author = "Jonathan Bernard" description = "Utilities and bindings for the Notion API." license = "GPL-3.0-or-later" diff --git a/src/notion_utils/hff_models.nim b/src/notion_utils/hff_models.nim new file mode 100644 index 0000000..733db16 --- /dev/null +++ b/src/notion_utils/hff_models.nim @@ -0,0 +1,160 @@ +import std/json, std/options, std/tables, std/times + +import timeutils + +import ../notion_utils + +type + NAddressObj* = object + id*: string + city*: string + state*: string + street*: string + zipCode*: string + createdAt*: Option[DateTime] + lastUpdatedAt*: Option[DateTime] + + + NFamilyObj* = object + id*: string + name*: string + headOfHouseholdIds*: seq[string] + primaryAddressId*: seq[string] + memberIds*: seq[string] + createdAt*: Option[DateTime] + lastUpdatedAt*: Option[DateTime] + + NPersonObj* = object + id*: string + preferredName*: string + firstName*: string + middleNames*: string + lastName*: string + birthDate*: Option[DateTime] + gender*: string + primaryPhoneNumber*: string + primaryEmailAddress*: string + addressIds*: seq[string] + marriedToId*: seq[string] + anniversary*: Option[DateTime] + parentIds*: seq[string] + childIds*: seq[string] + relationshipToHff*: seq[string] + createdAt*: Option[DateTime] + lastUpdatedAt*: Option[DateTime] + + NAddress* = ref NAddressObj + NFamily* = ref NFamilyObj + NPerson* = ref NPersonObj + +func sameContents[T](a: seq[T], b: seq[T]): bool = + let aCount = toCountTable(a) + let bCount = toCountTable(b) + + for k in aCount.keys: + if not bCount.hasKey(k) or aCount[k] != bCount[k]: return false + + return aCount.len == bCount.len + + +func `==`*(a, b: NFamily): bool = + return a.name == b.name and + sameContents(a.headOfHouseholdIds, b.headOfHouseholdIds) and + sameContents(a.primaryAddressId, b.primaryAddressId) and + sameContents(a.memberIds, b.memberIds) + +func `==`*(a, b: NPerson): bool = + return a.preferredName == b.preferredName and + a.firstName == b.firstName and + a.middleNames == b.middleNames and + a.lastName == b.lastName and + a.birthDate == b.birthDate and + a.gender == b.gender and + a.primaryPhoneNumber == b.primaryPhoneNumber and + a.primaryEmailAddress == b.primaryEmailAddress and + a.anniversary == b.anniversary and + sameContents(a.addressIds, b.addressIds) and + sameContents(a.marriedToId, b.marriedToId) and + sameContents(a.parentIds, b.parentIds) and + sameContents(a.childIds, b.childIds) and + sameContents(a.relationshipToHff, b.relationshipToHff) + +func toPage*(a: NAddress): JsonNode = + %*{ + "properties": { + "City": makeTextProp("rich_text", a.city), + "State": makeSelectProp(a.state), + "Street Address": makeTextProp("title", a.street), + "Zip Code": makeTextProp("rich_text", a.zipCode) + } + } + +func toPage*(f: NFamily): JsonNode = + %*{ + "properties": { + "Name": makeTextProp("title", f.name), + "Head(s) of Household": makeRelationProp(f.headOfHouseholdIds), + "Primary Address": makeRelationProp(f.primaryAddressId), + "Members": makeRelationProp(f.memberIds) + } + } + +func toPage*(p: NPerson): JsonNode = + %*{ + "properties": { + "Preferred Name": makeTextProp("title", p.preferredName), + "First Name": makeTextProp("rich_text", p.firstName), + "Middle Names": makeTextProp("rich_text", p.middleNames), + "Last Name": makeTextProp("rich_text", p.lastName), + "Birth Date": makeDateProp(p.birthDate), + "Gender": makeSelectProp(p.gender), + "Primary Phone Number": { "phone_number": p.primaryPhoneNumber }, + "Email Address": { "email": p.primaryEmailAddress }, + "Relationship to HFF": makeMultiSelectProp(p.relationshipToHff), + "Address": makeRelationProp(p.addressIds), + "Married To": makeRelationProp(p.marriedToId), + "Anniversary": makeDateProp(p.anniversary), + "Parents": makeRelationProp(p.parentIds), + "Children": makeRelationProp(p.childIds), + } + } + +proc parseNAddress*(page: JsonNode): NAddress = + result = NAddress( + id: page["id"].getStr, + city: page.getText("City"), + state: page.getSelect("State"), + street: page.getTitle("Street Address"), + zipCode: page.getText("Zip Code"), + createdAt: some(parseIso8601(page["created_time"].getStr)), + lastUpdatedAt: some(parseIso8601(page["last_edited_time"].getStr))) + +proc parseNFamily*(page: JsonNode): NFamily = + result = NFamily( + id: page["id"].getStr, + name: page.getTitle("Name"), + headOfHouseholdIds: page.getRelationIds("Head(s) of Household"), + primaryAddressId: page.getRelationIds("Primary Address"), + memberIds: page.getRelationIds("Members"), + createdAt: some(parseIso8601(page["created_time"].getStr)), + lastUpdatedAt: some(parseIso8601(page["last_edited_time"].getStr))) + +proc parseNPerson*(page: JsonNode): NPerson = + result = NPerson( + id: page["id"].getStr, + preferredName: page.getTitle("Preferred Name"), + firstName: page.getText("First Name"), + middleNames: page.getText("Middle Names"), + lastName: page.getText("Last Name"), + birthDate: page.getDateTime("Birth Date"), + gender: page.getSelect("Gender"), + primaryPhoneNumber: page.getPhone("Primary Phone Number"), + primaryEmailAddress: page.getEmail("Email Address"), + relationshipToHff: page.getMultiSelect("Relationship to HFF"), + addressIds: page.getRelationIds("Address"), + marriedToId: page.getRelationIds("Married To"), + anniversary: page.getDateTime("Anniversary"), + parentIds: page.getRelationIds("Parents"), + childIds: page.getRelationIds("Children"), + createdAt: some(parseIso8601(page["created_time"].getStr)), + lastUpdatedAt: some(parseIso8601(page["last_edited_time"].getStr)))