Spike: MODCFIELDS-21 - Getting familiar with User Data import to see how it can import custom fields

Spike: MODCFIELDS-21 - Getting familiar with User Data import to see how it can import custom fields

https://folio-org.atlassian.net/browse/MODCFIELDS-21

The goal of the spike is to investigate how user data is imported and how the import process can be extended to include custom fields.

1) Import process in mod-user-import: 

mod-user-import receives a POST "/user-import" request with collection of all imported users in a body.

Schema for users in mod-import-user matches schema in mod-users.

Each user in collection is updated or created with POST /users or PUT /users/{id}. 

2) Adding custom fields to mod-user-import: 

To pass custom fields to mod-users we just need to add following property to import schema:

"customFields" : {
"description": "Object that contains custom field",
"type": "object",
"additionalProperties": true
}

3)Adjusting custom field definitions

There is a requirement that we need to adjust custom field definition before importing users. For example if imported users contain unknown option for drop-down field, we need to add this option to the list of allowed options.

Proposed approaches:

1) Get all custom field definitions for users from mod-users, then update definitions with PUT requests. The logic for updating custom field definition has to be added to UserImportAPI.

Advantages:

  • Logic related to user import will be stored in mod-user-import

Disadvantages: 

  • Import logic will be duplicated if later we need to import objects for other modules

2) Send flag "_extendDefinition" in POST /users and PUT /users/{id}. Flag "_extendDefinition" will change validation logic in mod-custom-fields.

If _extendDefinition is true then unknown options for select fields (single select dropdown, multi-select dropdown, radiobutton) will be added to custom field definition, instead of causing a validation error.

Example: 

Following request will add option "new department" to custom field "department_1"

POST /users
{ ... "customFields": { "_extendDefinition": true, "department_1": "new department" } }


Advantages:

  • Logic for processing "_extendDefinition" flag will be stored in mod-custom-fields, so it can be used in the future for importing objects to other modules.

Disadvantages:

  • It adds a special case and makes validation logic more complicated.