91 lines
2.5 KiB
Nim

import std/json, std/times
import notion_utils, timeutils
type
EventProposal* = object
name*: string
description*: string
purpose*: string
department*: string
owner*: string
location*: string
date*: DateTime
budgetInDollars*: int
MultiSelectOption = tuple[value: string, color: string]
EventProposalConfig* = object
departmentOptions*: seq[MultiSelectOption]
proc getOrFail(n: JsonNode, key: string): JsonNode =
## convenience method to get a key from a JObject or raise an exception
if not n.hasKey(key):
raise newException(ValueError, "missing key '" & key & "'")
return n[key]
proc parseIso8601(n: JsonNode, key: string): DateTime =
return parseIso8601(n.getOrFail(key).getStr)
proc parseEventProposal*(n: JsonNode): EventProposal {.raises: [JsonParsingError].} =
try:
result = EventProposal(
name: n.getOrFail("name").getStr,
description: n.getOrFail("description").getStr,
purpose: n.getOrFail("purpose").getStr,
department: n.getOrFail("department").getStr,
location: n.getOrFail("location").getStr,
owner: n.getOrFail("owner").getStr,
date: n.parseIso8601("date"),
budgetInDollars: n.getOrFail("budgetInDollars").getInt)
except:
raise newException(JsonParsingError, "Invalid EventProposal: " & getCurrentExceptionMsg())
proc asNotionPage*(ep: EventProposal): JsonNode =
result = %*{
"properties": {
"Event": makeTextProp("title", ep.name),
"Date": { "date": { "start": formatIso8601(ep.date) } },
"Department": { "multi_select": [ { "name": ep.department } ] },
"Location": makeTextProp("rich_text", ep.location),
"Owner": makeTextProp("rich_text", ep.owner),
"State": { "select": { "name": "Proposed" } },
"Visibility": { "select": { "name": "Public" } }
},
"children": [
{
"object": "block",
"type": "heading_2",
"heading_2": makeTextProp("text", "Purpose")
},
{
"object": "block",
"type": "paragraph",
"paragraph": makeTextProp("text", ep.purpose)
},
{
"object": "block",
"type": "heading_2",
"heading_2": makeTextProp("text", "Description")
},
{
"object": "block",
"type": "paragraph",
"paragraph": makeTextProp("text", ep.description)
}
]
}
proc `%`(mso: MultiSelectOption): JsonNode =
%*{
"value": mso.value,
"color": mso.color
}
proc `%`*(epc: EventProposalConfig): JsonNode =
%*{
"departments": epc.departmentOptions
}