in src/main/kotlin/notion/NotionIssuesLoader.kt [22:79]
override suspend fun load(params: IssuesLoader.Params): IssuesLoadResult {
if (params !is IssuesLoader.Params.Notion)
return IssuesLoadResult.Failed.wrongParams(NotionIssuesLoader::class)
return try {
val notionCards = getAllNotionCards(databaseId = params.databaseId, query = params.query.orEmpty())
IssuesLoadResult.Success(
notionCards.mapIndexed { cardIndex, card ->
val externalIssue = ExternalIssue(
summary = card.getTitle()
?: return IssuesLoadResult.Failed("No property found in Notion database for title"),
description = card.getDescriptionAsMarkdown(),
status = params.statusProperty?.let { card.findProperty(it)?.value?.getTextValue(params.statusPropertyMappingType) }
.orEmpty(),
assignee = params.assigneeProperty?.let { card.findProperty(it)?.value?.getTextValue(params.assigneePropertyMappingType) },
externalId = card.id,
externalName = "Notion",
externalUrl = "https://notion.so/${card.id.replace("-", "")}",
)
.also { logger.info(it, cardIndex, notionCards.size) }
val tags = when (val property = params.tagProperty?.let { card.findProperty(it)?.value }) {
is NotionDatabaseProperty.Title -> when (params.tagPropertyMappingType) {
ProjectPropertyType.Id -> setOf(property.id)
ProjectPropertyType.Name -> setOf(property.text)
ProjectPropertyType.Email -> null
}
is NotionDatabaseProperty.Text -> when (params.tagPropertyMappingType) {
ProjectPropertyType.Id -> setOf(property.id)
ProjectPropertyType.Name -> setOf(property.text)
ProjectPropertyType.Email -> null
}
is NotionDatabaseProperty.Select -> when (params.tagPropertyMappingType) {
ProjectPropertyType.Id -> setOf(property.id)
ProjectPropertyType.Name -> property.selected?.name?.let(::setOf)
ProjectPropertyType.Email -> null
}
is NotionDatabaseProperty.MultiSelect -> when (params.tagPropertyMappingType) {
ProjectPropertyType.Id -> property.selected.map(NotionDatabaseProperty.Select.Option::id)
ProjectPropertyType.Name -> property.selected.map(NotionDatabaseProperty.Select.Option::name)
ProjectPropertyType.Email -> null
}?.toSet()?.takeIf(Set<String>::isNotEmpty)
else -> null
} ?: emptySet()
IssueTemplate(externalIssue, tags)
}
)
} catch (e: Exception) {
logger.externalServiceClientError(e, "failed to retrieve issues from Notion")
IssuesLoadResult.Failed.messageOrUnknownException(e)
}
}