override suspend fun load()

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)
        }
    }