SCIM Patch operation (rfc7644).
npm install scim-patchRFC7644 SCIM(System for Cross-domain Identity Management) 2.0 implementation of the "Modifying with PATCH" section 3.5.2.
Want to have an example on how it works, check this example.
3.5.2. Modifying with PATCH chapter of the SCIM RFC https://tools.ietf.org/html/rfc7644#section-3.5.2. ``typescript
import {patchBodyValidation} from 'scim-patch';
const scimBody: ScimPatchOperation =
{
'schemas': ['urn:ietf:params:scim:api:messages:2.0:PatchOp'],
'Operations': [
{op: 'replace', path: 'name.familyName', value: 'newFamilyName'}
]
};
try {
patchBodyValidation(scimBody);
} catch (error) {
// Here if there are an error in you SCIM request.
}
`
This implements the PATCH of a SCIM object from a SCIM Query.
You should create a valid SCIM resource by extending the ScimResource interface.
`typescript`
export interface ScimUser extends ScimResource {
schemas: ['urn:ietf:params:scim:schemas:core:2.0:User'];
userName: string;
name: {
familyName: string;
givenName: string;
};
active: boolean;
emails: Array<{
value: string;
primary: boolean;
}>;
roles?: Array<{
value: string;
type?: string;
}>;
meta: ScimMeta & { resourceType: 'User' };
};
After you have created your object you can patch it by calling the scimPatch operation.`typescript
const scimUser: ScimUser = {
schemas: ['urn:ietf:params:scim:schemas:core:2.0:User'],
userName: 'user1@test.com',
name: { familyName: 'user1', givenName: 'user2' },
active: true,
emails: [{value: 'user1@test.com', primary: true}],
meta: { resourceType: 'User', created: new Date(), lastModified: new Date() }
};
const patch: ScimPatchOperation = { op: 'replace', value: { active: false } };
const patchedUser = scimPatch(scimUser, patch);
// scimUser === patchedUser, see Options section if you want to avoid updating the original object
`
This particular operation will return :
`json`
{
"schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ],
"userName": "user1@test.com",
"name": { "familyName": "user1", "givenName": "user2" },
"active": false,
"emails": [{"value": "user1@test.com", "primary": true }],
"meta": { "resourceType": "User", "created": "2019-12-19T14:36:08.838Z", "lastModified": "2019-12-19T14:36:08.838Z" }
}
#### Options
##### Mutate Document
By default scimPatch() is updating the scim resource you pass in the function. scimPatch()
If you want to avoid this, you can add an option while calling , it will do a copy of the object and work
on this copy.
Your call will look like this now:
`typescript`
const patchedUser = scimPatch(scimUser, patch, {mutateDocument: false});
// scimUser !== patchedUser
##### Treat Missing as Add
By default scimPatch() will treat as Add a replace operation that targets an attribute that does not exist.treatMissingAsAdd: false
If you prefer to throw an error instead, then set
`typescript ``
// scimUser has no addresses
const patch = {
op: 'replace',
path: 'addresses[type eq "work"].country',
value: 'Australia',
};
const patchedUser = scimPatch(scimUser, patch, {treatMissingAsAdd: false});
// patchedUser.addresses[0].country === "Australia"
Thanks so much to our contributors.