APIでkintoneのレコード操作(Node.js環境)

kintoneを初めて触ってみたのでメモです。

## kintoneのアプリを作成する
**1. kintoneアプリが必要なので作成**
サイボウズの開発者アカウントを取得し、右下のアプリの"+"から作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/1499d374-b86d-26cf-6ddf-9c17866be6c2.png)

**2. 「はじめから作成」を選択**
今回は簡単なアプリなので「はじめから作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/07c52ab8-386c-e7a3-bbfe-dc2dd4d0996c.png)

**3. 「数値」と「日付」を選択**
左のカテゴリから選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/7aa76695-9750-d108-c757-b1a9bb27c26c.png)

**4. フィールドコートを「数値」と「日付」にする**
それぞれの設定からフィールドコートも「数値」と「日付」にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/e4c67044-690c-a947-a781-901e8866da81.png)

これでアプリ側は完成です。

## APIでの操作
APIで操作するために「kintone REST API Client」を使用します。kintone SDKより新しいバージョンとしてリリースされた？っぽいのでこちらを使用します。
詳しくはこちらから
[目指せ！JavaScriptカスタマイズ中級者（４） 〜kintone REST API Client編〜
](https://cybozudev.zendesk.com/hc/ja/articles/900000566086-%E7%9B%AE%E6%8C%87%E3%81%9B-JavaScript%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E4%B8%AD%E7%B4%9A%E8%80%85-%EF%BC%94-kintone-REST-API-Client%E7%B7%A8-)

**1. kintone/rest-api-clientのインストール**
```
npm install @kintone/rest-api-client
```

**2. API tokenの取得**
API tokenを取得します。kintoneのtokenはアプリ毎に設定されています。

歯車マークを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/13491a91-1ec6-a6f5-e2d5-8b78e1b956b6.png)

設定→API トークンを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/3df019f5-28a9-9be1-f25d-6838cc8c6ac2.png)

生成するを選択
アクセス権を指定することで操作の可否を指定することをできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/32e2cba5-a154-6699-8ffb-d4a75a66f158.png)

**3. コードの記述**
```
node index.js POST
```
で実行できます。
GETしたいときは下の様にすれば大丈夫です。
```
node index.js GET
```

サブドメインはアプリを開いて、青四角で塗りつぶされているところです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/f987efe0-0f15-1231-2f31-9a92c0950757.png)

アプリIDは/k/3/の'3'の部分です。アプリを新しく作成すると、この部分が変わります。


```javascript
const { KintoneRestAPIClient } = require("@kintone/rest-api-client");

const client = new KintoneRestAPIClient({
  baseUrl: "https://t2l5kxnlowux.cybozu.com",
  auth: { apiToken: "CkmlakwKXGGVFhS1SSfVqzdB5NtFIOlrtuaL1QSs" },
});

const appId = "3";

const getRecord = async () => {
  try {
    const getData = {
      app: appId,
    };
    const resp = await client.record.getRecords(getData);
    console.log(resp.records);
  } catch (err) {
    console.log(err);
  }
};

const postRecord = async () => {
  try {
    const postData = {
      app: appId,
      record: {
        日付: { value: "2023-12-30" },
        数値: { value: "11" },
      },
    };
    const resp = await client.record.addRecord(postData);
    console.log(resp);
  } catch (err) {
    console.log(err);
  }
};

const putRecord = async () => {
  try {
    const putData = {
      app: appId,
      id: 77,
      record: {
        日付: { value: "1111-11-11" },
        数値: { value: "999999" },
      },
    };

    const resp = await client.record.updateRecord(putData);
    console.log(resp);
  } catch (err) {
    console.log(err);
  }
};

const deleteRecord = async () => {
  try {
    const deleteData = {
      app: appId,
      ids: 77,
    };

    const resp = await client.record.deleteRecords(deleteData);
    console.log(resp);
  } catch (err) {
    console.log(err);
  }
};

const main = (method) => {
  switch (method) {
    case "POST":
      postRecord();
      break;

    case "GET":
      getRecord();
      break;

    case "PUT":
      putRecord();
      break;

    case "DELETE":
      deleteRecord();
      break;

    default:
      console.log("default");
      break;
  }
};

main(process.argv[2]);


```

## 実行した結果
実行前の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/fb86d1be-977a-1dd3-c662-55b501e96504.png)

POSTをしてみます。
`node index.js POST`を実行すると、登録されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/f7152a2b-b3c4-f3fd-7ea4-39d770421ed6.png)

`node index.js GET`を実行すると、レスポンスが返ってきます。
```json
  {
    'レコード番号': { type: 'RECORD_NUMBER', value: '77' },
    '更新者': { type: 'MODIFIER', value: [Object] },
    '作成者': { type: 'CREATOR', value: [Object] },
    '数値': { type: 'NUMBER', value: '11' },
    '$revision': { type: '__REVISION__', value: '1' },
    '更新日時': { type: 'UPDATED_TIME', value: '2023-12-04T06:30:00Z' },
    '作成日時': { type: 'CREATED_TIME', value: '2023-12-04T06:30:00Z' },
    '日付': { type: 'DATE', value: '2023-12-30' },
    '$id': { type: '__ID__', value: '77' }
  }
```

`node index.js PUT`を実行すると、レコードが更新されます。
日付を'1111-11-11'、数値を'999999'としてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/23b87d38-935b-7903-fa33-19b873f87916.png)

`node index.js DELETE`を実行すると、レコードが削除されます。元の状態に戻ります。

## ファイルの添付
最後にファイルの添付をしてみたいと思います。
日付、数値と同様にレコードに添付ファイルを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/633062a0-c9c1-4901-de57-2d5e2f573313.png)

**APIから実行**
postRecordメソッドを以下の様に変更します。
同じフォルダ内に「audio.mp3」という音声ファイルを準備したのでレコードに登録したいと思います。
'fs.createReadStream'でファイルを読み込み、アップロードします。
kintoneにアップロードすると、fileKeyというキーが与えられるのでそちらを使用して登録をします。

詳しくはこちら
[ファイルをアップロードする](https://cybozu.dev/ja/kintone/docs/rest-api/files/upload-file/)


```javascript
const postRecord = async () => {
  try {
    const file = await fs.createReadStream("./audio.mp3");
    const { fileKey } = await client.file.uploadFile({ file });

    const postData = {
      app: appId,
      record: {
        日付: { value: "2023-12-30" },
        数値: { value: "11" },
        添付ファイル: {
          value: [{ fileKey: fileKey }],
        },
      },
    };
    // KintoneにPOSTリクエストを送信;
    const resp = await client.record.addRecord(postData);
    console.log(resp);
  } catch (err) {
    console.log(err);
    console.log(err.errors);
  }
};
```