京都のkintone用javascript
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

112 行
2.4KB

  1. import { AppID } from "@/common/appids";
  2. import { Field } from "@/common/rest-api-client";
  3. import { KintoneRestAPIClient } from "@kintone/rest-api-client";
  4. import { chunk } from "lodash";
  5. const UPDATE_PARAM = {
  6. method: "PUT",
  7. api: "/k/v1/record.json",
  8. } as const;
  9. const CREATE_PARAM = {
  10. method: "POST",
  11. api: "/k/v1/record.json",
  12. } as const;
  13. type Payload = {
  14. app: AppID;
  15. id?: string | number;
  16. query?: string;
  17. record: Field;
  18. };
  19. export type BulkRequestResponse = { id?: string; revision?: string };
  20. export type RequestParam = {
  21. method: "POST" | "PUT";
  22. api: string;
  23. payload: Payload;
  24. };
  25. type Callback = (result: BulkRequestResponse) => Promise<void>;
  26. export type BulkRequestCallback = Callback;
  27. export class BulkRequest {
  28. private client: KintoneRestAPIClient;
  29. private requests: Array<RequestParam> = [];
  30. private callbacks: {
  31. [index: number]: Callback;
  32. } = {};
  33. constructor() {
  34. this.client = new KintoneRestAPIClient({
  35. baseUrl: location.origin,
  36. });
  37. }
  38. update(payload: Payload, callback?: Callback) {
  39. const request: RequestParam = {
  40. ...UPDATE_PARAM,
  41. payload,
  42. };
  43. this.requests.push(request);
  44. if (callback) {
  45. this.callbacks[this.requests.length - 1] = callback;
  46. }
  47. }
  48. create(payload: Payload, callback?: Callback) {
  49. const request: RequestParam = {
  50. ...CREATE_PARAM,
  51. payload,
  52. };
  53. this.requests.push(request);
  54. if (callback) {
  55. this.callbacks[this.requests.length - 1] = callback;
  56. }
  57. }
  58. isSaved() {
  59. return this.requests.length === 0;
  60. }
  61. async save() {
  62. this.debug();
  63. let results: BulkRequestResponse[] = [];
  64. for (const requests of chunk(this.requests, 20)) {
  65. const res = await this.client.bulkRequest({ requests });
  66. results = [...results, ...res.results];
  67. }
  68. await this.execCallback(results);
  69. this.clear();
  70. return results;
  71. }
  72. private async execCallback(results: BulkRequestResponse[]) {
  73. for (const [index, result] of results.entries()) {
  74. if (index in this.callbacks) {
  75. console.log("exec callback", this.requests.at(index));
  76. const callback = this.callbacks[index];
  77. await callback(result);
  78. }
  79. }
  80. }
  81. clear() {
  82. this.requests = [];
  83. this.callbacks = [];
  84. }
  85. debug() {
  86. console.log("BulkRequest debug", this, this.requests);
  87. }
  88. }
  89. const bulkRequest = new BulkRequest();
  90. export default bulkRequest;