diff --git a/fm/THESE FILES ARE DEPRECATED b/fm/THESE FILES ARE DEPRECATED deleted file mode 100644 index f69f907..0000000 --- a/fm/THESE FILES ARE DEPRECATED +++ /dev/null @@ -1 +0,0 @@ -See internet2/fed-mgr-msg for latest diff --git a/fm/fed-mgr-msg-01.json b/fm/fed-mgr-msg-01.json deleted file mode 100644 index 9530413..0000000 --- a/fm/fed-mgr-msg-01.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "asyncapi": "2.0.0", - "id": "https://github.internet2.edu/internet2/msg/fmPerson", - - "info": { - "title": "Federation Manager Async API", - "description": "Draft 01: Specification of the Async API for TAP-ICP Federation Manager Messaging", - "termsOfService": "http://asyncapi.org/terms/", - "contact": { - "name": "API Support", - "url": "http://www.asyncapi.org/support", - "email": "support@asyncapi.org" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - }, - "version": "1.0.0" - }, - - "servers": { - "development": { - "url": "dev.fm.internet2.edu", - "description": "Development server", - "protocol": "amqp", - "protocolVersion": "0.9.1" - }, - "staging": { - "url": "staging.fm.internet2.edu", - "description": "Staging server", - "protocol": "amqp", - "protocolVersion": "0.9.1" - }, - "production": { - "url": "api.fm.internet2.edu", - "description": "Production server", - "protocol": "amqp", - "protocolVersion": "0.9.1" - } - }, - - "channels": { - "fmPerson/": { - "publish": { - "message": { - "$ref": "#/components/messages/fmPerson" - } - }, - "subscribe": { - "message": { - "$ref": "#/components/messages/fmPerson" - } - } - } - }, - - "components": { - - "schemas": { - "lastModified": { - "type": "datetime" - }, - "schoemas": { - "type": "string" - }, - "eventType": { - "type": "string", - "description": "One of the following: create, read, update, delete" - }, - "identifier": { - "type": "array", - "items": { - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "type": { - "type": "string" - }, - "description": { - "type": "string" - } - } - } - }, - "email": { - "type": "array", - "description": "same as telephoneNumber in Core Attribute Specification", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "type": { - "type": "string" - }, - "verified": { - "type": "string" - } - } - } - }, - "name": { - "type": "object", - "properties": { - "family": { - "type": "string" - }, - "given": { - "type": "string" - }, - "middle": { - "type": "string" - }, - "type": { - "type": "string" - } - } - }, - "telephoneNumber": { - "type": "array", - "description": "same as telephoneNumber in Core Attribute Specification", - "items": { - "type": "object", - "properties": { - "number": { - "type": "string" - }, - "type": { - "type": "string" - }, - "verified": { - "type": "string" - } - } - } - }, - "fmIsIdentityProofed": { - "type": "boolean" - } - }, - - "messages": { - "fmPerson": { - "summary": "Action taken on a Federation Manager person", - "description": "Describes a CRUD action on a person by the Federation Manager", - "name": "FMperson", - "bindings": { - "amqp": { - "clientId": "fmPersonCrudClient" - } - }, - "headers": { - "type": "object", - "properties": { - "header": { - "type": "string" - } - } - }, - "payload": { - "type": "object", - "properties": { - "resourceType": { - "type": "string" - }, - "resourceTypeVersion": { - "type": "string" - }, - "schoemas": { - "$ref": "#/components/schemas/schoemas" - }, - "eventType": { - "$ref": "#/components/schemas/eventType" - }, - "lastModified": { - "$ref": "#/components/schemas/lastModified" - }, - "identifier": { - "$ref": "#/components/schemas/identifier" - }, - "email": { - "$ref": "#/components/schemas/email" - }, - "name": { - "$ref": "#/components/schemas/name" - }, - "telephoneNumber": { - "$ref": "#/components/schemas/telephoneNumber" - }, - "fmIsIdentityProofed": { - "$ref": "#/components/schemas/fmIsIdentityProofed" - } - } - } - } - } - } -} diff --git a/fm/fed-mgr-msg.json b/fm/fed-mgr-msg.json deleted file mode 100644 index cbe4534..0000000 --- a/fm/fed-mgr-msg.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "asyncapi": "2.0.0", - "info": { - "title": "AsyncAPI Sample App", - "description": "Draft 00: Specification of the Async API for TAP-ICP Federation Manager Messaging", - "termsOfService": "http://asyncapi.org/terms/", - "contact": { - "name": "API Support", - "url": "http://www.asyncapi.org/support", - "email": "support@asyncapi.org" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - } - }, - "servers": { - "development": { - "url": "development.gigantic-server.com", - "description": "Development server", - "protocol": "mqtt" - }, - "staging": { - "url": "staging.gigantic-server.com", - "description": "Staging server", - "protocol": "secure-mqtt" - }, - "production": { - "url": "api.gigantic-server.com", - "description": "Production server", - "protocol": "secure-mqtt" - } - }, - "channels": { - "FMpersonCreated": {}, - "publish": { - "operationId": "create", - "message": { - "$ref": "#/components/messages/CRUD" - } - } - }, - "components": { - "schemas": { - "email": { - "type": "string", - "format": "email" - }, - "sentAt": { - "type": "string", - "format": "datetime" - }, - "address": { - "type": "object", - "properties": { - "street": { - "type": "string" - }, - "postalCode": { - "type": "string" - }, - "city": { - "type": "string" - }, - "region": { - "type": "string" - }, - "country": { - "type": "string" - } - } - } - }, - "messages": { - "CRUD": { - "summary": "Person new to FM added to FM.", - "description": "Multiline description of what this action does.\nHere you have another line.\n", - "tags": [ - { - "name": "FMperson" - }, - { - "name": "created" - } - ], - "bindings": { - "mqtt": { - "cleanSession": false, - "clientId": "myApp" - } - }, - "headers": { - "type": "object", - "properties": { - "myAppHeader": { - "type": "string" - } - } - }, - "payload": { - "type": "object", - "properties": { - "username": { - "type": "string" - }, - "email": { - "$ref": "#/components/schemas/email" - }, - "address": { - "$ref": "#/components/schemas/address" - }, - "sentAt": { - "$ref": "#/components/schemas/sentAt" - } - } - } - } - } - } -} diff --git a/fm/federation-manager-message-formats.adoc b/fm/federation-manager-message-formats.adoc deleted file mode 100644 index 772802e..0000000 --- a/fm/federation-manager-message-formats.adoc +++ /dev/null @@ -1,97 +0,0 @@ -**Title**: InCommon Federation Manager Message Schema - -**Status**: Implementer’s Draft (I-D) - -**Version**: 1.1 - -**Date**: 2020-08-11 - -**Prepared by**: Nic Roy, Internet2 Trust and Identity Services - -**Contributors**: Nic Roy, David Shafer, Keith Hazelton, Shannon Roddy - -=== Notes: - -* ? == nullable field. Field must not contain null values if not prepended with “?” - -* Null fields are represented in the JSON-standard way, with a non-quoted literal value of null. - -* All values are strings unless otherwise specified in [ ] after the value - -* “read” actions are in here specifically for situations where an object instance is included within a message for a different object type - -* All eventTypes determine the behavior in the source system and do not dictate what the clients should do with them - -== Object type: FMperson (person) - -=== Attributes: - -resourceTypeVersion: { string literal: “1.1.0” } - -resourceType: { string literal: “FMperson” } - -schemas: { collection of schema references for the message format(s) } <1> - -eventType: {create, read, update, delete} - -sorID: ? {COmanage user identifier (COmanage-generated ePPN- this will be null at first, then we will start flowing it into FM user models from COmanage. Need to add this as an attribute on FM user model/database now)} Format should be according to: https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json[https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json] and “source” should be “icp-comanage” for COmanage-sourced identifiers. The FM primary int32 user record key should also be included as a “source” of “fm-user-pk” - -lastModified: ?  { ISO 8601 date time stamp of object most recent modification } - -email: ? { email address formatted according to https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json[https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json]} “emailType” should be “fm-user-email” - -ePPN: ? { eduPersonPrincipalName/”username”} - -name: ? { name element formatted according to https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json[https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json], including all properties that exist for this person in the FM database } - -phone: ? { phone number(s) formatted according to https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json[https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json] containing zero or more phoneNumber/phoneType elements }  - -fmIsIdentityProofed: ? {if LOA < 1, should be “false”; if LOA > 1, should be “true”} [bool] - -== Object type: FMrole (role) - -=== Attributes: - -resourceTypeVersion: { string literal: “1.1.0” } - -resourceType: { string literal: “FMrole” } - -schemas: { collection of schema references for the message format(s) } - -lastModified: ?  { ISO 8601 date time stamp of object most recent modification } - -eventType: {create, read, update, delete, personadd, personremove } - -sorID: ? { FM role primary key [int32] } Format should be according to: https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json[https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json] and “source” should be “fm-role-pk” - -roleName: {Name of role: {exec, site-admin, delegated-admin, registration-authority-admin, cert-rao, etc.} - -FMorg: {embedded FMorg object that this role applies to, see below. Action should be “read” in the embedded FMorg in this case} [FMorg] - -FMperson: ? {If message action is personadd or personremove, this value MUST NOT be null, and this attribute should contain a collection of one or more embedded FMperson objects that the change applies to, see above. Action should be “read” in the embedded FMperson in this case} [FMperson] - -== Object type: FMorg (organization) - -=== Attributes: - -resourceTypeVersion: { string literal: “1.1.0” } - -resourceType: { string literal: “FMorg” } - -schemas: { collection of schema references for the message format(s) } - -lastModified: ?  { ISO 8601 date time stamp of object most recent modification } - -eventType: {create, read, update, delete} - -sorID: ? { FM role primary key [int32] } Format should be according to: https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json[https://github.internet2.edu/api-schema/person/blob/master/schema/minimalRegistryPerson.json] and “source” should be “fm-org-pk”; Also include SalesForce org identifier with a “source” set to “fm-sf-id” - -orgName: ? {FM organization name NOTE: These can include punctuation and other special characters that Grouper doesn’t like. Will need to post-normalize them in message consumers } - -orgDisplayName: ? {FM organization display name} - -orgURL: ? {FM organization URL} - -== Object type: FederationMetadata - -** (CURRENTLY OUT OF SCOPE) diff --git a/fm/federation-manager-pxp.adoc b/fm/federation-manager-pxp.adoc deleted file mode 100644 index fc047af..0000000 --- a/fm/federation-manager-pxp.adoc +++ /dev/null @@ -1,643 +0,0 @@ -=== Federation Manager P*P -https://github.internet2.edu/InCommon/siteadmin/blob/master/api/swagger.json (404) + -https://fmdev.inc.testbed.tier.internet2.edu/siteadmin/api (404) + -Editor: Nick Roy - -- - - -_2020-08-05 20:23 JIRA link:https://todos.internet2.edu/browse/FMIC-25[FMIC-25]: Fed Mgr messaging_ - -Create and test FM message consumer(s) to read FM messages in ICP dev environment, reconcile group changes into the proper groups via Grouper API calls. Reconcile user changes into COmanage via COmanage API calls. - -Reference: Message schema https://github.internet2.edu/internet2/event-msg/blob/master/fm/federation-manager-message-formats.adoc - -Consume messages consisting of outer resourceTypes: - -=== *FMperson* - -==== eventType "create": -These messages should be processed into COmanage person add actions where a person with a matching ePPN and/or email address does not exist in COmanage. The ePPN and/or email address sent in the message should be mapped into upstream / source system ePPN and email address in the new person record. - -==== eventType "update": -These messages should be processed into COmanage person update actions where a person with a matching ePPN and/or email address already exists in COmanage. The ePPN and/or email address sent in the message should be matched with into upstream / source system ePPN and/or email address in the existing person record. Any other attributes of the existing person record present in the message should be updated with values contained in the message. - -In the case where a person record does not yet exist for this person, the message should be treated as an eventType of "create". - -=== *FMrole* - -==== eventType "create" -These messages should be processed into Grouper using Grouper API calls. They should result in groups within the folder/group structure - -"app:incommon:fm:(Normalized Organization Name (contained within the embedded FMorg message in the orgName field)):(roleName)" - -where (roleName) is the group name within an org folder. Organization groups should be decorated with attributes for "FMorgIdentifier" and "SForgIdentifier" and these attribute values should be set for these groups based on the information contained in the embedded FMorg resourceType message. All FMperson resourceTypes contained in the embedded collection of - -{ FMperson } - -messages should be added to the initial population of the group. - -organizationName values within embedded FMorg messages MUST be normalized by the message consumer using the following regular expression before being added to Grouper: - -[^a-zA-Z0-9 _\-] (all non-alphanumeric characters should be removed) - -==== eventType "update" -An existing group matching the full computed group path determined using the folder/group structure noted in the "create" eventType for this resourceType should be treated as the target of an update. All fields EXCEPT the FMorgIdentifier and SForgIdentifier attributes on the organization folder should be updated according to the values contained in this message and any embedded FMorg and/or FMperson resourceType messages. In the case where an existing path to a group cannot be found, the message should be treated as a "create" message and a WARN log event should be generated noting this, along with appropriate diagnostic details. - -==== eventType "personadd" -An existing group matching the full computed group path determined using the folder/group structure noted in the "create" eventType for this resourceType should be treated as the target of this message. Any FMperson resourceType messages embedded within the message should be added to existing group membership. In the event that a group cannot be found matching the computed group path, the message should be treated as an eventType of "create" and a WARN log event should be generated noting this, along with appropriate diagnostic details. - -==== eventType "personremove" -An existing group matching the full computed group path determined using the folder/group structure noted in the "create" eventType for this resourceType should be treated as the target of this message. Any FMperson resourceType messages embedded within the message should be removed from existing group membership. In the event that a group cannot be found matching the computed group path, the message should be treated as an eventType of "create" and a WARN log event should be generated noting this, along with appropriate diagnostic details. - -=== *FMorg* - -These messages are only relevant in the context of a wrapping FMrole resourceType message, for the time being. - -All resourceType/eventType combinations not documented here should be silently dropped (FMperson and FMorg messages in the context of a wrapping FMrole resourceType / personadd or personremove eventType should be handled as documented above). - -- - - -_2020-08-03 11:18 FM messaging requirements_ - -*Bill Kaufman 11:10* - -Reminder @channel, Nick completed final implementer’s draft of the FM message types, thanks everyone for your feedback -prior to the ICP meeting this Thursday: -https://github.internet2.edu/internet2/event-msg/blob/master/fm/federation-manager-message-formats.adoc - -Additionally, here are the detailed FM message consumer requirements: https://todos.internet2.edu/browse/FMIC-25 -Please comment on these requirements in JIRA. - -*Nic Roy* - -Additionally, here are the detailed FM message consumer requirements: https://todos.internet2.edu/browse/FMIC-25 -Please comment on these requirements in JIRA. - -- - - -_2020-03-10 18:06 references and links_ - -https://github.internet2.edu/internet2/event-msg/blob/master/fm/federation-manager-message-formats.adoc <= Federation Manager 2020 ICP Planning + - -- - - -_2019-05-28 16:49 connector for fedmgr api: https://fmdev.inc.testbed.tier.internet2.edu/siteadmin/api_ - -returnable resources - -``` -/entities -/people -/organizations/roles -``` - -next step: develop a very basic Java Spring Boot app that can accept the json object coming from the Fed Manager API and transform it to a pojo per http://www.jsonschema2pojo.org/ - -- - - -_2019-05-17 17:45 connector for fedmgr_ - -https://wiki.evolveum.com/display/midPoint/Read-only+Resource+HOWTO - -notes from http://bit.ly/apiRegWG-9 - -Federation Manager <=> midPoint: 1st as SoR0:00, eventually as provisioning target. - -* Initial Experiments with the Federation Manager read-only API -* Notes on the use of API keys -** “API keys aren't as secure as authentication tokens (see Security of API keys), but they identify the application or project that's calling an API.” -** It’s a bearer token: “Because anyone who makes a request of a service transmits their key, in theory, this key can be picked up just as easy as any network transmission, and if any point in the entire network is insecure, the entire network is exposed. This makes API keys a hard thing to recommend – often misused and fundamentally insecure, they nonetheless do have their place when properly secured and hemmed in by authorization systems.” -* Is the ConnID REST connector superclass from midPoint a good basis for developing a Federation Manager API connector? EthanK: Yes. -* Wordpress connector is based on this superclass; See on I2 Github (Ethan) -* midPoint provides a Dummy connector just illustrating the basic structure of a REST connector. -* Example of a fully functional midPoint connector for Drupal using its REST API -* midPoint’s core reference: Guide to Connector Development -* Step 1: Understand which operations we want to do against the API, mapping to the connector functions; Understand which objects we expect to get from FM: Accounts, Organizations, Entitlements (roles) -* Federation Manager API is read only for now - -. - -- - - -_2019-05-17 07:09 success with fedmgr api_ - -using Poster - -``` -https://fmdev.inc.testbed.tier.internet2.edu/siteadmin/api/organizations/roles - -Content-Type application/json -X-API-Key 0336034bd52cfadee08e9c87d20c7638 - - -Response: -status: 200 OK -content-security-policy: script-src 'self' blob: filesystem: chrome-extension-resource:; object-src 'self' blob: filesystem:; -cache-control: no-cache -etag: "5vpNazOuDZnW54clALeRFXoa+AI=" -content-type: text/html - - - - - - - -
-URL: -
-
- -
-
-Content Body: - -
-
-
- - - - - -
-
-Response: -
-
-
-
-
- - - -``` - -- - - -_2019-05-16 21:09 2nd attempt to work with fedmgr api_ - - -``` -curl -X GET "https://fmdev.inc.testbed.tier.internet2.edu/siteadmin/api/organizations/roles" -H "accept: application/json" -H "X-API-Key: 0336034bd52cfadee08e9c87d20c7638" > fmRoles.adoc -``` -======= -curl -X GET "https://fmdev.inc.testbed.tier.internet2.edu/siteadmin/api/organizations/roles" -H "accept: application/json" -H "X-API-Key: 0336034bd52cfadee08e9c87d20c7638" > fmRoles.adoc - - -snippet of fmRoles.json from the successful call to the fedMgr API - -``` -{ - "data": [ - { - "id": "1", - "attributes": { - "organization_id": 10002, - "organization_name": "The Ohio State University", - "role": "Site administrator", - "status": "active", - "person_id": 1000002, - "person_name": "Scott Cantor", - "email": "demo@example.edu" - } - }, - { - "id": "14", - "attributes": { - "organization_id": 10014, - "organization_name": "University of Virginia", - "role": "Site administrator", - "status": "active", - "person_id": 1000015, - "person_name": "James Jokl", - "email": "demo@example.edu" - } - }, - { - "id": "17", - "attributes": { - "organization_id": 10016, - "organization_name": "Iparadigms, LLC", - "role": "Site administrator", - "status": "active", - "person_id": 1000018, - "person_name": "David Wu", - "email": "demo@example.edu" - } - }, - { - "id": "20", - "attributes": { - "organization_id": 10019, - "organization_name": "Miami University", - "role": "Site administrator", - "status": "active", - "person_id": 1000021, - "person_name": "Dirk Tepe", - "email": "demo@example.edu" - } - }, - { - "id": "21", - "attributes": { - "organization_id": 10020, - "organization_name": "Stanford University", - "role": "Site administrator", - "status": "active", - "person_id": 1000022, - "person_name": "Bruce Vincent", - "email": "demo@example.edu" - } - }, - { - "id": "24", - "attributes": { - "organization_id": 10023, - "organization_name": "University of Rochester", - "role": "Site administrator", - "status": "active", - "person_id": 1000025, - "person_name": "Sean Singh", - "email": "demo@example.edu" - } - } - ] -} -``` - -- - - -_2019-05-16 11:39 basic access to generic protected api_ - -see agro.adoc for successful trials of another HTTP API - -- - - -_2019-05-16 11:39 Access to FM person repo_ - -``` - Nicholas Roy: - Hi Keith - are you OK with me getting you access to the staging instance of the FM API first? - The data is pretty old there, but functional. - k: - sure, that would be useful - n: - OK - I also gave your Internet2 GitHub Enterprise user account read-only access to the FM repository. The API spec is at: - https://github.internet2.edu/InCommon/siteadmin/blob/master/api/swagger.json - I’ll get your API key/secret and the API URL for you for staging, just a sec. - What’s the best phone number for you to receive an activation call from Duo Security? Likely this won’t be needed, but the FM makes me supply a phone number. - Your password, which it’s unlikely you’ll need, is `A phrase 4 a pass!` - - Your API key is: `keith-h-fm-api-testing`+ - Your API secret is: `0336034bd52cfadee08e9c87d20c7638`+ - Base API path is: - https://fmdev.inc.testbed.tier.internet2.edu/siteadmin/api - - Let me know if you hit any issues/etc. - -``` - { - "swagger": "2.0", - "info": { - "title": "InCommon Federation Manager", - "description": "This API provides read-only access to the InCommon Federation Manager.", - "contact": { - "name": "InCommon Support", - "url": "http://www.incommon.org/", - "email": "admin@incommon.org" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - }, - "version": "0.0.2" - }, - "host": "service1.internet2.edu", - "basePath": "/api", - "schemes": [ - "https" - ], - "paths": { - "/entities": { - "get": { - "tags": [ - "Entities" - ], - "summary": "Get all entities", - "operationId": "getEntities", - "parameters": [ - { - "$ref": "#/parameters/apiKeyParam" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntitiesResponse" - } - } - } - } - }, - "/people": { - "get": { - "tags": [ - "People" - ], - "summary": "Get all people", - "operationId": "getPeople", - "parameters": [ - { - "$ref": "#/parameters/apiKeyParam" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/PeopleResponse" - } - } - } - } - }, - "/organizations/roles": { - "get": { - "tags": [ - "Roles" - ], - "summary": "Get all organization roles", - "operationId": "getOrganizationsRoles", - "parameters": [ - { - "$ref": "#/parameters/apiKeyParam" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/OrganizationRolesResponse" - } - } - } - } - } - }, - "definitions": { - "Entity": { - "type": "object", - "required": [ - "id", - "attributes" - ], - "properties": { - "id": { - "type": "string", - "example": "1" - }, - "attributes": { - "type": "object", - "required": [ - "id", - "entity_name", - "type", - "organization_id", - "organization_name", - "status" - ], - "properties": { - "id": { - "type": "integer", - "example": 1 - }, - "entity_name": { - "type": "string", - "example": "https://idp.example.org/Shibboleth" - }, - "type": { - "type": "string", - "example": "Entities::Idp" - }, - "organization_id": { - "type": "integer", - "example": 1 - }, - "organization_name": { - "type": "string", - "example": "Example Organization" - }, - "status": { - "type": "string", - "example": "published" - } - } - } - } - }, - "EntitiesResponse": { - "type": "object", - "required": ["data"], - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/Entity" - } - } - } - }, - "OrganizationRole": { - "type": "object", - "required": [ - "id", - "attributes" - ], - "properties": { - "id": { - "type": "string", - "example": "1" - }, - "attributes": { - "type": "object", - "required": [ - "id", - "organization_id", - "firstname", - "middlename", - "lastname", - "informalname", - "email", - "phonenumber", - "mobilenumber", - "faxnumber", - "website" - ], - "properties": { - "id": { - "type": "integer", - "example": 1 - }, - "organization_id": { - "type": "integer", - "example": 1 - }, - "firstname": { - "type": "string", - "example": "J." - }, - "middlename": { - "type": "string" - }, - "lastname": { - "type": "string", - "example": "Doe" - }, - "informalname": { - "type": "string" - }, - "email": { - "type": "string", - "example": "jdoe@example.org" - }, - "phonenumber": { - "type": "string", - "example": "(800) 555-0100" - }, - "mobilenumber": { - "type": "string", - "example": "(800) 555-0100" - }, - "faxnumber": { - "type": "string", - "example": "(800) 555-0100" - }, - "website": { - "type": "string", - "example": "https://example.org" - } - } - } - } - }, - "OrganizationRolesResponse": { - "type": "object", - "required": ["data"], - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/OrganizationRole" - } - } - } - }, - "PeopleResponse": { - "type": "object", - "required": ["data"], - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/Person" - } - } - } - }, - "Person": { - "type": "object", - "required": [ - "id", - "attributes" - ], - "properties": { - "id": { - "type": "string", - "example": "1" - }, - "attributes": { - "type": "object", - "required": [ - "id", - "organization_id", - "firstname", - "middlename", - "lastname", - "informalname", - "email", - "phonenumber", - "mobilenumber", - "faxnumber", - "website" - ], - "properties": { - "id": { - "type": "integer", - "example": 1 - }, - "organization_id": { - "type": "integer", - "example": 1 - }, - "firstname": { - "type": "string", - "example": "J." - }, - "middlename": { - "type": ["string","null"] - }, - "lastname": { - "type": "string", - "example": "Doe" - }, - "informalname": { - "type": ["string","null"] - }, - "email": { - "type": "string", - "example": "jdoe@example.org" - }, - "phonenumber": { - "type": ["string","null"], - "example": "(800) 555-0100" - }, - "mobilenumber": { - "type": ["string","null"], - "example": "(800) 555-0100" - }, - "faxnumber": { - "type": ["string","null"], - "example": "(800) 555-0100" - }, - "website": { - "type": ["string","null"], - "example": "https://example.org" - } - } - } - } - } - }, - "parameters": { - "apiKeyParam": { - "in": "header", - "name": "X-API-Key", - "type": "string", - "required": true - } - } -} -```