diff --git a/api/bulk_import.yml b/api/bulk_import.yml new file mode 100644 index 00000000..121dffe3 --- /dev/null +++ b/api/bulk_import.yml @@ -0,0 +1,299 @@ +openapi: 3.0.3 +info: + title: 一括インポートタスク登録API + version: "1.0" +tags: + - name: 一括インポートタスク登録 +paths: + /api/items/import-task: + post: + tags: + - bulk_import + summary: 一括インポートタスク登録機能 + description: |- + メタデータ(tsv/csv)を含むzipファイルを受け取り、非同期で一括インポートタスク(インポート可否の事前チェック、およびアイテムの登録・更新)を実行する。 + |ロール |動作 | + | ---------------- | ------ | + |システム管理者 |使用可能| + |リポジトリ管理者 |使用可能| + |コミュニティ管理者|使用不可| + |登録ユーザー |使用不可| + |一般ユーザー |使用不可| + |ゲストユーザー |使用不可| + parameters: + - name: Authorization + in: header + required: true + description: Bearer アクセストークン + schema: + type: string + - name: mode + in: query + required: false + description: モード指定。
importの場合、非同期でインポートタスクを登録する。
checkの場合、インポート可否の確認のためのチェックタスクを登録する。 + schema: + type: string + enum: + - import + - check + default: import + - name: is_change_identifier + in: query + required: false + description: 識別子変更モード可否。
trueの場合、識別子変更を行う。
falseの場合、識別子の変更を行わない。 + schema: + type: boolean + default: false + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + description: メタデータ(tsv/csv)を含むzipファイル + responses: + "200": + description: タスクの登録に成功した場合/タスクの登録可否の確認に成功した場合 + content: + application/json: + examples: + インポートモード タスク登録成功: + value: + can_import: true + check_status: "SUCCESS" + expire: "YYYY-MM-DD HH:mm:ss" + summary: { + total: <総件数>, + new_item: <新規件数>, + update_item: <更新件数>, + check_error: <エラー件数>, + warning: <警告件数> + } + tasks: [ + { + item_task_id: <アイテムタスクID>, + task_status: "PENDING", + task_result: {} + } + ] + task_id: <タスクID> + チェックモード タスク登録可否確認成功: + value: + can_import: true + check_status: "SUCCESS" + expire: "YYYY-MM-DD HH:mm:ss" + summary: { + total: <総件数>, + new_item: <新規件数>, + update_item: <更新件数>, + check_error: <エラー件数>, + warning: <警告件数> + } + task_id: <タスクID> + "400": + description: リクエスト内容に不備がある場合、 + またはzipファイル形式でない場合 + content: + application/json: + examples: + リクエスト内容不備: + value: + can_import: false + check_status: "ERROR" + expire: "YYYY-MM-DD HH:mm:ss" + error_details: ["エラーメッセージ"] + summary: { + total: <総件数>, + new_item: <新規件数>, + update_item: <更新件数>, + check_error: <エラー件数>, + warning: <警告件数> + } + tasks: [] + task_id: "" + リクエストヘッダー不備: + value: + result: "NG" + error: "Cannot get filename by Content-Disposition." + 指定ファイルが存在しない場合: + value: + result: "NG" + error: "Not found {filename} in request body." + ZIPファイル形式でない場合: + value: + result: "NG" + error: "Uploaded file is not a valid ZIP file." + チェックタスクが失敗、強制終了した場合: + value: + can_import: false + check_status: "ERROR" + error_details: ["Check task failed."] + summary: {} + tasks: [] + task_id: "" + チェックタスクがタイムアウトした場合: + value: + can_import: false + check_status: "TIMEOUT" + error_details: ["Check task timeout."] + summary: {} + tasks: [] + task_id: "" + アイテムにエラーがある場合: + value: + can_import: false + check_status: "ERROR" + error_details: ["<エラーメッセージ>"] + summary: {} + tasks: [] + task_id: "" + "401": + description: リクエストでAuthorizationヘッダーが提供されていない、または無効なアクセストークンが提供された場合 + content: + application/json: + schema: + $ref: "#/components/schemas/401ErrorResponse" + "403": + description: 認証に失敗した場合、認証したOAuthトークンが必須スコープを持っていない場合 + content: + application/json: + schema: + $ref: "#/components/schemas/403ErrorResponse" + "500": + description: 例外が発生した場合 + content: + application/json: + example: + result: "NG" + error: "Internal Server Error" + + /api/items/import-task/get_bulk_import_task_status/{task_id}: + get: + tags: + - bulk_import + summary: 一括インポートステータス取得機能 + description: |- + タスクIDを指定し、インポートタスクの登録状況や実行結果を取得する + |ロール |動作 | + | ---------------- | ------ | + |システム管理者 |使用可能| + |リポジトリ管理者 |使用可能| + |コミュニティ管理者|使用不可| + |登録ユーザー |使用不可| + |一般ユーザー |使用不可| + |ゲストユーザー |使用不可| + parameters: + - name: Authorization + in: header + required: true + description: Bearer アクセストークン + schema: + type: string + - name: task_id + in: path + required: true + description: タスクID + schema: + type: string + responses: + "200": + description: タスクの登録状況の取得に成功した場合 + content: + application/json: + schema: + type: object + properties: + can_import: + type: boolean + example: true + check_status: + type: string + example: "SUCCESS" + expire: + type: string + example: "YYYY-MM-DD HH:mm:ss" + tasks: + type: array + items: + type: object + properties: + item_task_id: + type: string + task_status: + type: string + task_result: + type: object + properties: + recid: + type: string + start_date: + type: string + example: "YYYY-MM-DD HH:mm:ss" + success: + type: boolean + + task_id: + type: string + "400": + description: デコード失敗や、エラーが発生した場合 + content: + application/json: + examples: + デコード失敗: + value: + result: "NG" + error: "Task data decode error." + チェック失敗: + value: + result: "NG" + error: "Task check failed.: {error_message}" + "401": + description: リクエストでAuthorizationヘッダーが提供されていない、または無効なアクセストークンが提供された場合 + content: + application/json: + schema: + $ref: "#/components/schemas/401ErrorResponse" + "403": + description: 認証に失敗した場合、認証したOAuthトークンが必須スコープを持っていない場合、別ユーザーがタスクを参照しようとした場合 + content: + application/json: + schema: + $ref: "#/components/schemas/403ErrorResponse" + "404": + description: タスクが見つからない場合 + content: + application/json: + example: + result: "NG" + error: "Task not found." + + +components: + schemas: + 401ErrorResponse: + type: object + properties: + result: + type: string + default: "NG" + error: + type: array + items: + type: string + default: "Authentication is required." + 403ErrorResponse: + type: object + properties: + result: + type: string + default: "NG" + error: + type: array + items: + type: string + default: "Permission required." + diff --git a/docs/spec/base/admin/ADMIN_2_4.md b/docs/spec/base/admin/ADMIN_2_4.md index 8088bbb3..f8db5af8 100644 --- a/docs/spec/base/admin/ADMIN_2_4.md +++ b/docs/spec/base/admin/ADMIN_2_4.md @@ -320,6 +320,7 @@ | .publish_status | .PUBLISH_STATUS | アイテムの公開/非公開を指定する。public/privateのいずれかを設定する。必須項目。 | | .feedback_mail[0] | .FEEDBACK_MAIL[0] | フィードバックメールの送信先メールアドレスを指定する。複数指定可。 | | .request_mail[0] | .REQUEST_MAIL[0] | リクエストメールの送信先メールアドレスを指定する。複数指定可。 | +| .researchmap_linkage | .RESEAECHMAP_LINKAGE | Researchmapへの連携フラグ | | .item_application.workflow | .ITEM_APPLICATION
.WORKFLOW | コンテンツファイルがない場合の利用申請のワークフローIDを指定する。 | | .item_application.terms | .ITEM_APPLICATION.TERMS |コンテンツファイルがない場合の利用規約IDを指定する。この列のデータ行にterm_freeが入力された場合、利用規約を自由入力として.item_application.terms_descriptionが表示される。 | | .item_application
.terms_description | .ITEM_APPLICATION
.TERMS_DESCRIPTION | コンテンツファイルがない場合の利用規約(自由入力)を指定する。 | diff --git a/docs/spec/base/api/API_20_bulk_import_api.md b/docs/spec/base/api/API_20_bulk_import_api.md new file mode 100644 index 00000000..e95e5097 --- /dev/null +++ b/docs/spec/base/api/API_20_bulk_import_api.md @@ -0,0 +1,224 @@ +# 一括インポートタスク登録・ステータスチェックAPI + +## 目的・用途 + +クライアントからメタデータ(tsv/csv)を含むzipファイルを受け取り、非同期で一括インポートタスク(インポート可否の事前チェック、およびアイテムの登録・更新)を実行する。
+実際の処理状況やインポート結果はタスク登録時に発行されるタスクIDを用いてステータス確認APIから取得する。 + +## 利用方法 + +APIの認証にはOAuth2を利用する。
+アクセストークンの発行は[API-1:OAuth2](./API_01_Oauth2.md#oauth2)を参照。 + +### Scope: +一括インポートタスクの登録、およびステータス確認を行うためには以下のスコープが必要となる。 + +- item:bulkprocess + +#### 利用可能なロール + +| ロール | システム
管理者 | リポジトリ
管理者 | コミュニティ
管理者 | 登録
ユーザー | 一般
ユーザー | ゲスト
(未ログイン) | +|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:| +| 利用可否 | 〇 | 〇 | × | × | × | × | + +### エンドポイント: + +| 項番 | HTTP request | 内容 | +|------|--------------------------------------------------|----------------------------------------------------------------------| +| 1 | POST /api/items/import-task | メタデータ(tsv/csv)を含むzipファイルをアップロードし、一括インポートタスクを登録する。 | +| 2 | GET /api/items/import-task/get_bulk_import_task_status/ | task_idを指定して、インポートタスクの処理状況や実行結果を取得する。 | + +### POST /api/items/import-task + +#### リクエスト + +```shell +curl -X POST {hostname}/api/items/import-task?mode=&is_change_identifier= \ + -F "file=@;type=application/zip" \ + -H "Authorization: Bearer " \ + -H "Content-Disposition:attachment; filename=" +``` + +- **クエリパラメータ** + - `mode`:モード指定("import" または "check") 指定しなかった場合は"import"として扱われる。 + - `is_change_identifier`:識別子変更モード可否(true/false)指定しなかった場合はfalseとして扱われる。 + +- **フォームデータ** + - `file`:アップロードするZIPファイル(MIMEタイプ: application/zip)
+ ※ ZIPファイルは[ADMIN_2_4.md](../admin/ADMIN_2_4.md)で使用するファイルと同様のものを使用する。
+ ※ TSVファイルの「.bulk_doi」に指定したDOI値 + で[DOIを使用したメタデータ補完機能](../user/USER_4_6.md#3-web-apiによるdoiを使用したメタデータ補完機能)を行うことが出来る。 + +- **HTTPヘッダー** + - `Authorization`: Bearer <アクセストークン> + - `Content-Disposition`: attachment; filename=〇〇.zip(添付ファイル名指定) + +#### レスポンス + +- インポートチェック処理のタイムアウト時間はデフォルトで60秒が設定されている。
+ この値は設定ファイルのWEKO_ITEMS_UI_BULK_IMPORT_TIMEOUTから変更可能。
+ ※ タイムアウト時間60秒で処理できるインポートファイル数は約250件。(実行環境による) +- タスク結果はexpire(有効期限)まで確認することが出来、デフォルトはタスク登録から24時間後に設定されている。
+ 有効期限は設定ファイルのWEKO_ITEMS_UI_EXPIRE_TIMEから変更可能。 + +- **成功レスポンス インポートモード** + ```json + { + "can_import": true, + "check_status": "SUCCESS", + "expire": "YYYY-MM-DD HH:mm:ss", + "summary": { + "total": <総件数>, + "new_item": <新規登録数>, + "update_item": <更新数>, + "check_error": <エラー数>, + "warning": <警告数> + }, + "tasks": [ + { + "item_task_id": <インポートタスクID>, + "task_status": "PENDING", + "task_result": {} + }, + ... + ], + "task_id": <タスクID>, + } + ``` + +- **成功レスポンス チェックモード** + ```json + { + "can_import": true, + "check_status": "SUCCESS", + "expire": "YYYY-MM-DD HH:mm:ss", + "summary": { + "total": <総件数>, + "new_item": <新規登録数>, + "update_item": <更新数>, + "check_error": <エラー数>, + "warning": <警告数> + }, + "task_id": <タスクID>, + } + ``` + +- **エラーレスポンス** + ```json + { + "result": "NG", + "error": [<エラーメッセージ>] + } + ``` + + ```json + { + "can_import": false, + "check_status": "ERROR", + "expire": "YYYY-MM-DD HH:mm:ss", + "error_details": [ + <エラーメッセージ> + ], + "summary": {}, + "tasks": [], + "task_id": <タスクID> + } + ``` + +#### レスポンスコード + +| コード | 内容 | +|--------------|--------------| +| 200 | 正常レスポンス | +| 400 | Content-Dispositionヘッダが不正、またはファイル名が取得できない場合 | +| 400 | リクエストボディに指定されたファイル名のファイルが存在しない場合 | +| 400 | アップロードされたファイルがZIP形式でない場合 | +| 400 | Celeryによるチェックタスクが失敗または強制終了した場合 | +| 400 | チェックタスクがタイムアウトした場合 | +| 401 | アクセストークンが無効 | +| 403 | ロールがシステム管理者、もしくはリポジトリ管理者ではない場合 | +| 500 | その他例外発生時 | + +--- + +### GET /api/items/import-task/get_bulk_import_task_status/ + +#### リクエスト + +```shell +curl -X GET {hostname}/api/items/import-task/get_bulk_import_task_status/ \ + -H "Authorization: Bearer " +``` + +- **パスパラメータ** + - `task_id`:タスクID + +- **HTTPヘッダー** + - `Authorization`: Bearer <アクセストークン> + +#### レスポンス + +- **成功レスポンス** + ```json + { + "can_import": true, + "check_status": "SUCCESS", + "expire": "YYYY-MM-DD HH:mm:ss", + "tasks": [ + { + "item_task_id": <インポートタスクID>, + "task_status": <状態>, + "task_result": { + "recid": <レコードID>, + "start_date": <インポート開始時間>, + "success": true + } + }, + ... + ], + "task_id": <タスクID> + } + ``` + +- **エラーレスポンス** + ```json + { + "can_import": false, + "check_status": "ERROR", + "expire": "YYYY-MM-DD HH:mm:ss", + "error_details": <エラー内容>, + "tasks": [], + "task_id": <タスクID> + } + ``` + + ```json + { + "result": "NG", + "error": [<エラーメッセージ>] + } + ``` + +#### レスポンスコード + +| レスポンス | 内容 | +|--------------|--------------| +| 200 | 正常レスポンス | +| 400 | タスク情報のデコード失敗 | +| 400 | 上記以外のエラー発生時 | +| 401 | アクセストークンが無効 | +| 403 | ユーザーID不一致(登録ユーザー以外によるアクセス) | +| 404 | タスク情報が存在しない | + + +### 関連モジュール + +> weko\_items\_ui + +### 更新履歴 + +| 日付 | GitHubコミットID | 更新内容 | +|--------------|--------------|--------------| +| 3/31 | | 新規作成 | + + diff --git a/docs/spec/base/other/RESEARCHMAP_LINKAGE.md b/docs/spec/base/other/RESEARCHMAP_LINKAGE.md new file mode 100644 index 00000000..614d2c97 --- /dev/null +++ b/docs/spec/base/other/RESEARCHMAP_LINKAGE.md @@ -0,0 +1,435 @@ +# API連携によるレコード追加機能 + +## 目的・用途 + +本機能は、WEKO3のシステム内で登録した公開状態のアイテムのレコードを、researchmapで提供されているAPIを利用してresearchmapの業績情報に追加するための機能である。この機能により、事前に利用機関毎にJSTが発行したAPIキーを使用して、API キーに紐づいた機関に所属する一般会員の業績情報の更新を行うことが出来る。 + +## 利用方法 +celeryのタスクとして、researchmapへの業績情報の登録処理が実行される。 +定期的に(例:一日一回)、バッチ処理により実行される。 + +## 利用可能なロール + + +++++++++ + + + + + + + + + + + + + + + + + + + + + + +
ロールシステム
+管理者
リポジトリ
+管理者
コミュニティ
+管理者
登録ユーザー一般ユーザーゲスト
+(未ログイン)
利用可否××××××
+ +※バッチ処理により定期的に実行される。 + +## 機能内容 + +- タスクをscripts/instance.cfgのCELERY_BEAT_SCHEDULEに記載し、参照する。 + +- 処理キューにレコードIDが入っているアイテムに対して、連携を行う。処理キューに処理を予約するには、「ItemRegistrationにてCRIS連携の機関チェックボックスをONにして登録し、アイテム登録が完了したとき」「連携フラグをTRUEにしてインポートし、登録完了したとき」([インポート](../admin/ADMIN_2_4.md)を参照)のいずれかのタイミングで行える。 + +- Celeryによりバッチ処理として、連携機能がONの場合、WEKOに登録されているアイテムのデータをresearchmapへ業績情報として追加する。 + + - 機能のON/OFFは設定ファイルに定義する。 + + - ResearchmapがCRIS連携に指定されているアイテムがキューに入っている場合、そのアイテムをresearchmapへの業績情報登録を行う。ただし、そのアイテムが公開状態であること、「著者」「コントリビュータ」欄(attribute_nameがcreator, contributor)に著者が登録されており、その著者の著者DBにresearchmapへのparmalinkが登録されている必要がある。また、researchmap側の設定としても、対象機関の下にある著者であり、公開状態にあることなど、連携を許可される設定下にある必要がある。(researchmap側の設定については、researchmapの連携API仕様書「3.10 研究者情報、代理人情報における取得・更新範囲」を参照のこと) + + - 登録対象アイテムの公開状態を確認する。 + + - 対象レコードのrecord_metadataのpublish_status, publish_dateを既存のメソッドを用いて確認する。(返り値True: public, False: private) + + - 対象レコードが登録されているインデックスの公開状態を既存のメソッドを用いて確認する。(返り値True: public, False: private) + + - ファイルが添付されている場合は、ファイル情報の公開状態を既存のメソッドを用いて確認する。(返り値True: ダウンロード可能, False: ダウンロード不可) + + - 確認結果が公開状態であれば、著者情報を確認する。 + アイテムのrecord_metadataを確認し、researchmapへ業績情報として登録できる入力データを作成する。 + + - 確認結果が非公開状態であれば、researchmapへの業績情報のレコード追加処理は行わない。 + + - 登録対象アイテムのrecord_metadataのjsonに、nameIdentifiersを持つ著者情報のデータがあるか確認する。 + + - attribute_nameがcreator, contributorの項目にnameIdentifiersを持つ著者情報がある場合、 CRISシステムの種別によって登録する著者情報の確認を行う。 + + - CRISシステムの種別がresearchmapの場合、nameIdentifierSchemeとしてresearchmapの会員ID(user_id)が設定されているかどうか確認する。 + + - researchmapの会員ID(user_id)が設定されている場合、該当のアイテムをデータ連携対象とする。 + + - 特定の作成者識別子Scheme (CRISシステムの種別がresearchmapの場合はresearchmap Member ID)と対応する作成者識別子の著者の業績情報として、連携用データの作成を行う。 + + - researchmapの会員ID(user_id) を持つ複数の著者情報が連携対象のアイテムに登録されている場合、それぞれの著者の業績情報として連携用データの作成を行う。 + + - 連携対象著者のresearchmap会員IDをそれぞれuser_idとして指定し、複数の業績情報を登録する。 + + - authorsのフィールドがある業績種別(論文: published_papers, MISC: misc, 書籍等出版物: books_etc)の業績として登録する場合、著者(authors)のフィールドの項目に、登録対象の会員ID以外の著者情報も含むデータを登録する。 + + - 業績種別が受賞:awardsの業績として登録する場合、受賞者(winners) のフィールドの項目に、登録対象の会員ID以外の著者情報も含むデータを登録する。 + + - 業績種別が講演・口頭発表等:presentationの業績として登録する場合、講演者(presenters) のフィールドの項目に、登録対象の会員ID以外の著者情報も含むデータを登録する。 + + - 業績種別がWorks:worksの業績として登録する場合、発表者(creators) のフィールドの項目に、登録対象の会員ID以外の著者情報も含むデータを登録する。 + + - 業績種別が共同研究・競争的資金等の研究課題:research_projectsの業績として登録する場合、担当研究者(investigators) のフィールドの項目に、登録対象の会員ID以外の著者情報も含むデータを登録する。 + + - 業績種別が産業財産権: industrial_property_rightsの業績として登録する場合、 発明者/考案者/創作者(inventors) のフィールドの項目に、登録対象の会員ID以外の著者情報も含むデータを登録する。 + + - nameIdentifiersを持つ著者情報がない場合、データの連携処理は行わない。 + + - アイテムの登録データから業績情報として登録できる入力データを作成する。 + + - 登録対象のアイテムのメタデータをjpcoarmappingスキーマに対応した状態で既存のメソッドを用いて取得する。 + + - 対象レコードのファイルのメタデータは既存のメソッドを用いて、公開、または公開日が過去日のメタデータのみ取得する。 + + - CRISシステムの種別がresearchmapの場合、登録項目(必須、任意)は、researchmapの業績種別と登録対象アイテムの資源タイプのデータの対応付けを定義したJSONを参照し、対応する項目の登録されている値を登録する。 + + - 資源タイプと researchmapの業績種別の対応表は別に添付する。 + + - WEKOの登録アイテムのメタデータとresearchmapへの登録の際のメタデータを、 JPCOARスキーママッピングを利用して対応付ける。 + + - 登録アイテムのWEKOの資源タイプと対応するresearchmap業績種別のフィールドに、 JPCOARのスキーママッピングと対応付けてマッピングを行い、対応するメタデータを登録する。 + + - マッピング情報のうち、jpcoar_mappingの指定する設定値を持つ項目をデータ連携対象とする。 + + - 連携対象アイテムのrecords_metadataを取得する。 + + - researchmapの対象の業績種別のフィールドの値に、jpcoar_mappingスキーマ形式で取得したアイテムのメタデータの対応する項目の値を、設定ファイルを利用して対応付け、登録するメタデータのJSONを作成する。 + + - 一つのJSONを作成する際に含まれる業績情報のデータの件数は、1アイテム分とする。 + + - 最大件数を越えた場合、次のJSONデータを作成する。 + + - JSONの例 + ```json + {"insert": {"type": "published_papers", "user_id": "xx"}, "merge": + {"paper_title":{"ja": "XXXXX", "en": "XXXXX"},"publication_date":"2011-10-10","publication_name":{"ja": "XXXXX", "en": "XXXXX"}}} + ``` + + - ※ 1 リクエストあたりの JSON の最大サイズは、10MB。 + + - ※ 1 行に1 業績、あるいは1 研究者のデータを記載する。不要な改行を含んでいる場合、エラーが発生する。プロフィール等でデータに改行を含む場合、¥n で記載する必要がある。 + + - ※ 以下の文字をデータ中に含める場合は、「\」でエスケープする。「"」であれば「\\"」と記載する。 + + | エスケープ表記 | 説明 | + | -------------- | ------------------------------------- | + | \\" | ダブルクォーテーション | + | \\\\ | バックスラッシュ | + | \n | 改行 | + | \uXXXX | 4 桁の16 進数で表記されたUnicode 文字 | + + - researchmapへの成果物登録の際の業績種別とJPCOARスキーマの資源タイプの対応表は、設定ファイルで変更可能とする。 + + - メタデータにJPCOARスキーマとの対応関係がない場合、該当のメタデータは登録しない。 + + - 登録するアイテムのメタデータの取得が出来なかった場合は、該当のメタデータを登録しない。 + + - 新たにアクセストークンを取得する。アクセストークンの取得処理の流れは以下。 + + - JWTを作成する。 + + - JWTを用いてトークンAPI リクエストを送信し、アクセストークンを取得する。 + + - アクセストークンの取得に失敗し場合、リトライする。 + + - リトライにX回失敗した場合、エラーメッセージをログに記録し業績情報登録処理を終了する。(Xは設定ファイルより取得する。デフォルトは5とする) + + - JWTを作成する。 + + - 既存のJWT作成ライブラリを利用する。(jpadilla/pyjwt) + + - 有効期限は2分とする。(推奨値)設定ファイルで値を管理する。 + + - 利用機関で機関毎に事前に取得しているAPIキーのクライアントIDを保持する。 + + - APIキーのクライアントIDの変数および、JWTの署名に用いる秘密鍵はAdminSettingsから取得する。 + + - APIキーのクライアントIDを使用してJSON Web トークン(JWT)を作成する。 + + - 各 header、claim の内容についてはresearchmapの連携API仕様書を参照のこと + + - JWTを用いてトークンAPI リクエストを送信し、アクセストークンを取得する。 + + - APIのリクエストは設定ファイルに定義し、CRISシステムの種別毎に該当する形式を利用できるようにする。 + + - APIリクエスト時にエラーレスポンスが返ってきた場合、そのエラー内容によって処理を行う。 + + - APIリクエスト時に再送信によって解消する可能性があるエラーレスポンスが返ってきた場合、トークンAPI リクエストを再度送信する。 + + - リトライ回数は設定ファイルで定義し、変更可能とする。(デフォルト値:5回) + + - 最後の再実行時にエラーが返ってきた場合は、失敗をCRIS連携結果テーブルに書き戻し、ステータスコードとエラーログを出力し、業績情報の登録処理を終了する。 + + - APIリクエスト時にJWTの再作成によって解消する可能性があるエラーレスポンスが返ってきた場合、 JWTの再作成後、トークンAPI リクエストを再度送信する。 + + - リトライ回数は設定ファイルで定義し、変更可能とする。(デフォルト値:5回) + + - 最後の再実行時にエラーレスポンスが返ってきた場合は、失敗をCRIS連携結果テーブルに書き戻し、ステータスコードとエラーログを出力し、業績情報の登録処理を終了する。 + + - 再送信により解消しないエラーレスポンスが返ってきた場合は、失敗をCRIS連携結果テーブルに書き戻し、ステータスコードとエラーログを出力し、業績情報の登録処理を終了する。 + + - エラー表に記載のないその他のエラーレスポンスが返ってきた場合は、ステータスコードとエラーログを出力し、業績情報の登録処理を終了する。 + + - エラー時レスポンス表 + アクセス時に返すエラー理由と内容 + + - アクセストークンを利用して、WEKOの登録アイテムに関するメタデータをresearchmapの業績情報に登録する前の整合性チェックのリクエストAPIを呼び出す。 + + - リクエスト + GET + + - パラメータ + + + + + + + + + + + + + + + + + + + + + + + + + + +
パラメーター名項目名説明
check整合性チェックのみ行うかどうかパラメーター(GET)に「check」(または、check=1)を記載すると、入力チェックのみ実行され、その結果を確認できます。その場合、「一括更新結果確認」の API より確認します。check を指定しなくても入力チェックを行い、1 件でもエラーがあった場合、更新処理は行いません。
id一括更新 ID

「check」パラメーターをつけ、入力チェックのみ行ったデータは、本 API のレスポンスより取得される

+

bulk_url を用いてインポートを実行できます。対象は、 check の API を実行し、その結果が確認できる状態であれば、実行できます。

+ + - 入力チェックの結果、エラーが発生したデータについては登録対象外として、登録時のリクエストの入力データから除外する。 + + - 該当のアイテムのresearchmap連携フラグは-2(連携エラー)とする。 + + + - アクセストークンを利用して、WEKOの登録アイテムに関するメタデータをresearchmapの業績情報に登録するリクエストAPIを呼び出す。 + + - リクエスト + POST or PUT https://api.researchmap.jp/\_bulk + + - パラメータ (POST BODY(JSON))例 + ```json + {"insert": {"type": "published_papers", "user_id": "xx"}, "merge": + {"paper_title":{"ja": "XXXXX", "en": "XXXXX"},"publication_date":"2011-10-10","publication_name":{"ja": "XXXXX", "en": "XXXXX"}}} + ``` + + - ※ 1 リクエストあたりの JSON の最大サイズは、10MB。 + + - ※ 1 行に1 業績、あるいは1 研究者のデータを記載する。不要な改行を含んでいる場合、エラーが発生する。プロフィール等でデータに改行を含む場合、¥n で記載する必要がある。 + + - ※ 以下の文字をデータ中に含める場合は、「\」でエスケープする。「"」であれば「\\"」と記載する。 + + | エスケープ表記 | 説明 | + | -------------- | ------------------------------------- | + | \\" | ダブルクォーテーション | + | \\\\ | バックスラッシュ | + | \n | 改行 | + | \uXXXX | 4 桁の16 進数で表記されたUnicode 文字 | + + - 情報が更新可能な範囲は、API キーに紐づいた機関に所属する一般会員。(researchmapのAPI設計書記載の仕様) + + - 各研究者の権限設定、機関の権限設定によって利用可否が決定される。(researchmapのAPI設計書記載の仕様) + + - 登録処理の際に、 researchmap側の設定や登録情報の状態によりエラーとなったアイテムについては、 researchmapへの連携フラグを-2(連携エラー)として設定する。 + + - 登録対象アイテムのrecord_metadataに登録されている、研究者のresearchmapの会員ID(user_id)を指定して業績情報の登録を行う。 + + - researchmapへの業績情報登録時の類似性チェックについては、デフォルト設定はメタデータ補完とする。 + + - 類似データのマージに関するアクションの設定値は、パラメータ化して機関毎に変更可能とする。(設定値の種類については「アクションの種類」参照) + scripts/instance.cfgに保持し、リクエスト時に送信するJSONデータを作成する際に利用する。 + + - 類似データのマージに関するアクションの設定値がない場合は、類似データマージ(類似データ優先)のアクションを指定する。 + + - アクションの種類 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
項目名アクション名説明

insert

+

(merge 指定)

マージ

+

(追加・更新)

指定ドキュメントがない場合、新規登録。追加・更新を行おうとしている会員の業績リスト中に類似ドキュメントがあればエラーとなります。

insert

+

(similar_merge指定)

+

priority=input_data

類似データマージ(入力データ優先)

「マージ」と基本的には同じですが、追加・更新を行おうとしている会員の業績リスト中に類似ドキュメントがあった場合、入力データ(または、入力データを指定ドキュメントとマージしたもの)を優先させ、類似ドキュメントをマージします。

+

※ 業績情報のみ指定可能。

+

※ 入力データの項目に存在しない項目のみ、類似ドキュメントの値を補完することになります。

+

※ 類似業績とマージした際は、本人による登録であっても承認状態を「承認済-自動」とします(「却下」可能にするため)。

+

※ 研究者、代理人ではsimilar_merge 指定はできません。

insert

+

(similar_merge指定)

+

priority=similar_data

類似データマージ(類似データ優先)

「マージ」と基本的には同じですが、追加・更新を行おうとしている会員の業績リスト中に類似ドキュメントがあった場合、類似ドキュメントを優先させ、入力データ(または、入力データを指定ドキュメントとマージしたもの)をマージします。

+

※ 業績情報のみ指定可能。

+

※ 類似ドキュメントの項目に存在しない項目のみ、入力データの値を補完することになります。

+

※ 類似業績とマージした際は、本人による登録であっても承認状態を「承認済-自動」とします(「却下」可能にするため)。

insert(force 指定)

入力データ強制追加

「マージ」と基本的には同じですが、類似ドキュメントがあった場合でも、別業績として扱い強制的に新規登録を行います。ただし、類似ドキュメントが機関以外(本人相当)によって登録/更新されている場合は、追加することができません。

+

※ 業績情報のみ指定可能。

+

※ 多用すると、同じ会員リスト中に類似業績が増え続けます。通常の「merge」指定でエラーになり、類似業績と分けてどうしても登録したい場合のみご利用ください。

+ + - APIリクエスト時にエラーレスポンスが返ってきた場合、そのエラー内容によって処理を行う。 + + - APIリクエスト時に再送信によって解消する可能性があるエラーレスポンス(通信エラー・アクセストークン期限切れ等)が返ってきた場合、業績情報登録リクエストを再度送信する。(アクセストークンを再取得する) + + - リトライ回数は設定ファイルで定義し、変更可能とする。(デフォルト値:5回) + + - 最後の再実行時にエラーが返ってきた場合は、ステータスコードとエラーログを出力し、業績情報の登録処理を終了する。 + + - 業績情報の登録処理を終了する場合、アイテムのresearchmap連携フラグは、0(未連携)のままとする。 + + - APIリクエスト時にアクセストークンの再作成によって解消する可能性があるエラーレスポンスが返ってきた場合、 アクセストークンの再作成後、業績情報登録リクエストを再度送信する。 + + - リトライ回数は設定ファイルで定義し、変更可能とする。(デフォルト値:5回) + + - 最後の再実行時にエラーレスポンスが返ってきた場合は、ステータスコードとエラーログを出力し、業績情報の登録処理を終了する。 + + - 業績情報の登録処理を終了する場合、アイテムのresearchmap連携フラグは、0(未連携)のままとする。 + + - 再送信により解消しないエラーレスポンスが返ってきた場合は、ステータスコードとエラーログを出力し、業績情報の登録処理を終了する。 + + - 業績情報の登録処理を終了する際に、該当アイテムのresearchmap連携フラグは、0(未連携)のままとする。 + + - JSONのサイズエラーなど、エラー表に記載のないその他のエラーレスポンスが返ってきた場合は、ステータスコードとエラーログを出力し、業績情報の登録処理を終了する。 + + - 登録処理中に一部のアイテムで登録エラーが発生した場合、該当アイテムの業績情報登録処理を行わず、次の対象アイテムの業績情報登録処理に進む。(researchmapAPI仕様) + + - 登録処理中に再実行により解消しないエラーが発生したアイテムのresearchmap連携フラグは、-2(連携失敗)とする。 + + - 登録処理中にエラーが発生したアイテムのresearchmap連携フラグは、0(未連携)のままとする。 + + - エラー時レスポンス表 + アクセス時に返すエラー理由と内容について説明します。 + + - 共通バリデーションエラー レスポンス表 + ※ 一括更新で返却するレスポンスコードはバリデーションエラーの場合、200 を返します(各行のエラーが全体のレスポンスコードに影響を及ぼさない)。 + + - 一括更新時バリデーションエラーは304は成功として扱い、それ以外は失敗として扱う。(researchmapの連携API仕様書「3.1.4一括更新時バリデーションエラー レスポンス表」を参照のこと) + + - 業績情報の一括更新結果の確認を行う。 + + - リクエスト + GET https://api.researchmap.jp/\_bulk_results + + - パラメーター(GET) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
パラメーター名項目名説明
id

一括更新ID(必須)

「研究者情報、代理人情報一括更新」のレスポンスにて取得したID。
display_type

成功 or 失敗のどちらのリストを表示するか

success: 正常に登録されたリストを表示(or 正常にチェック終了になったもの)

+

error: エラーリストを表示

+

デフォルト: error

next

次ページを表示するかどうか

「next=xxx」指定。

+

<インポート結果>

+

json の最終行の"no", "line"を「_」区切りで指定するとxxx 以降のデータが出力されます。例えば「next=1_30」であれば、1 ファイル目の 31 行目からの結果が表示されます。

+

<API の更新結果>

+

行数: 指定した行数の続きからデータを取得します。

+

"true": 前回取得した続きからデータを取得します。(next パラメーターを指定し、値を指定しない場合も、前回取得した続きからデータ取得します。)

+

前のページを取得したい場合は、再度、next を指定せず取得する必要があります(1 ページから再取得)。

+

ただし、next パラメーターを利用せずに、ある一定期間過ぎますと、有効期限切れとなりエラーとなります。

limit

ページあたりの一括更新結果件数

デフォルト: 1000 件。最大:3000 件。

+

※ 最大値をこえた指定をした場合、3000 として出力されます。

+ + - 失敗が1件以上あった場合は、そのアイテムへの送信は失敗として扱う。 + + - 業績情報の一括更新結果を基に、データ連携済みのアイテムおよび、登録時にエラーが発生したアイテムのresearchmap連携フラグ(CRIS連携結果テーブルのsucceedカラム)を変更する。 + + - statusが completion「完了」の場合、該当行のアイテムのresearchmap連携フラグを「成功」にする。 + + - statusが error「エラー」の場合、response項目のerrorを参照し、発生したエラーが再実行で解消しない類のエラーである場合、該当行のアイテムのresearchmap連携フラグを「失敗」とする。 diff --git a/docs/spec/base/user/USER_4_6.md b/docs/spec/base/user/USER_4_6.md index a02a2c56..dca3eacd 100644 --- a/docs/spec/base/user/USER_4_6.md +++ b/docs/spec/base/user/USER_4_6.md @@ -32,6 +32,11 @@ Item Registrationの一部として、画面上の入力欄でメタデータを - 公開日(PubDate) - フィードバックメール送信先(Feedback Mail Destination) +- researchmap連携フラグ + - アイテム登録を行う際に、「researchmapデータ連携フラグ」の設定エリアを表示する。 + - researchmapデータ連携フラグの登録データを、temp_metadataに登録して管理する。 + - チェックボックスによりフラグを表示する。 + - 日付のフォーマットで定義されるプロパティまたは属性に対して、3つのフォーマット(YYYY-MM-DD、YYYY-MM、YYYY)が入力できる - 入力方法はカレンダー入力、または手入力である - デフォルト値はサーバ日付(/api/admin/get_server_date)を利用する @@ -47,6 +52,7 @@ Item Registrationの一部として、画面上の入力欄でメタデータを - 「検索」ボタンを押すと、【Administration > 著者DB管理(Author Management) > 編集(Edit)】で登録された著者DB一覧を表示する - [入力(import)] ボタンを押すと、選択した著者情報をメタデータの各エリアに入力する - 「Add Author」ボタンを押すと、著者登録画面が表示され著者情報を登録することができる(登録すると著者DB管理画面にも反映される) + - 作成者識別子の選択肢にresearchmapを追加し、会員と1対1のID(parmalink)のデータを管理する。 - コミュニティ管理者、登録ユーザーの場合は著者登録画面のコミュニティ選択欄の選択肢にアクティビティを作成したコミュニティを加える。 - アイテム作成時、作成者識別子は編集不可となる。 - アイテム編集時、作成者識別子"WEKO"のデータ部分はユーザーでの編集は不可とする(作成者識別子Scheme, 作成者識別子URI, 作成者識別子はグレーアウトする)。それ以外の識別子は変更可能となる。 @@ -250,4 +256,3 @@ Item Registrationの一部として、画面上の入力欄でメタデータを |2025/01/01|09c6391d2ed1bae053fee9f8dfc98e95e1e1b87f|v1.0.7a2| |2024/04/14|cd0183f59a16928be2511e33e4495a3376f143c9|v1.0.6 | |2023/08/31|353ba1deb094af5056a58bb40f07596b8e95a562|初版作成| -