Notion APIで遊ぼう

## はじめに
2023年10月から社内ITとしてお仕事している山下です。早いもので、もうすっかり年の瀬になってしまいました。
新しい部署に異動し、議事録の作成を自動化できないかな :eyes: と思いやってみた内容です。

少々、Notion APIのPOSTは概念の理解が必要なため、まとめを記載しています。手段だけ知りたい方は実装から読み始めてみてください👼
## 作るもの
- Google Calendarからスケジュールを週次で取得する
- 任意のフォーマットの議事録を作成する⬅️今回はココ
- スケジュール実施1日前に議事録をチャンネルでメンションする
## 概念
今回Notion APIを扱ううえで、代表的なオブジェクトを3つ紹介します。

### Pages
- 名前通り、Notionの1ページ分の内容を指します。Databasesとは明確な差分があり、各々の要素を内包しているトップレベルの概念です。
![Screenshot 2023-11-20 at 18.50.39 copy 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278459/d9520e0e-f210-8d8e-204e-64eacd7e154a.png)


### Databases
- リスト状もしくはサムネイルで表すことのできるデータの集合体です。
- Pagesと同様に1つで1エンドポイントを持つことができますが、下位概念であるBlocksを持たない場合、存在できません。
![databases.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278459/95d6a21f-7979-3a00-1da2-3683054f8270.png)

### Blocks
- Pagesを構成する、部分的なデータです。
- headings, toggles, paragraphs, lists, mediaなどのtypeを持ちます。

![blocks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278459/398723dc-464a-e74a-d63d-ff6dc289dbcf.png)


## 実装の前にIntegration作成
- https://developers.notion.com/docs/create-a-notion-integration#give-your-integration-page-permissions
- ページ単位でのIntegration設定ができていないと、`Could not find database with ID: hogehoge` と返ってくる可能性があります。

```mermaid
graph LR
  Start([Start])-->B{if integration.present?}
  B-->|True| Update
  B-->|False| Create["Integration.create(at: :developer_console)"]
  Create--> Update["Integration.find_by(type: :page).update(at: :developer_console)"]
  Update-->End([End])
```

## 実装
### curlでお試し

それではNotionの概念たちを操作して議事録を作っていきます。
まずは作りたい姿を想像してみましょう。

今回は新規の議事録をただ作るのではなく、そのリンクをPageの子要素にあたるDatabasesにならべます。
![Screenshot 2023-11-20 at 19.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278459/cf6a7a85-8f35-3d81-a958-f4e20cafe154.png)


結果だけ言うと下記のcurlを実行するとやりたいことができます

```
curl 'https://api.notion.com/v1/pages' \
  -H 'Authorization: Bearer "'$YOUR_TOKEN'"' \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2022-06-28" \
  --data '{
	"parent": { "database_id": "'$TARGET_LIST_ID'" },
  "icon": {
  	"emoji": "🕰️"
  },
	"cover": {
		"external": {
			"url": "https://hogehoge/img_dayo/minnna.png"
		}
	},
	"properties": {
        "title": [{ "type": "text", "text": { "content": "Minutes1" }]
	},
	"children": [
		{
			"object": "block",
			"type": "heading_2",
			"heading_2": {
				"rich_text": [{ "type": "text", "text": { "content": "Minutes1" } }]
			}
		},
		{
			"object": "block",
			"type": "paragraph",
			"paragraph": {
				"rich_text": [
					{
						"type": "text",
						"text": {
							"content": "Nanikano Link",
							"link": { "url": "https://x-bit.co.jp/" }
						}
					}
				]
			}
		}
	]
}'
```
![Screenshot 2023-11-20 at 19.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278459/28e1b643-f348-5cf5-195e-fe025719a8a7.png)
いえーい👏

## ポイント
1. Pageには下位概念がある
1. どの位置の、どのプロパティを更新するか、具体をイメージする必要がある
1. イメージできたら、細かくJSONでAPIに教えてあげる

## 最後に
株式会社クロスビットでは、デスクレスワーカーのためのHR管理プラットフォームを開発しています。
一緒に開発を行ってくれる各ポジションのエンジニアを募集中です。

---

クリスマスも仕事でしょ…？どうせなら私たちと楽しく仕事しませんか…🎅

---

https://herp.careers/v1/xbit
https://note.com/xbit_recruit
https://xbit.notion.site/Xbit-Entrance-book-115f8879d36d42b2ae544fbf2fb4eb85
https://speakerdeck.com/xbit/5fen-tewakarukurosuhitutonohurotakutokai-fa-timu