Miembros
`members.list`, `list_all`, `iterate`, `get`, `add`, `update`, `remove`, `grant_address`, `revoke_address` y los métodos de invitaciones junto a ellos.
Todos los métodos
support_role_id = "role_8b1f4c2e9a7d3b60e5f1a2c4"viewer_role_id = "role_2c7e9a1f4b8d3e60c5a7f1b9" invitation = client.members.add( email: "[email protected]", roleId: support_role_id, addressIds: ["2b81de07-9c3f-4a61-b8e2-5d07f4c19a36"], access: "member")puts invitation[:id], invitation[:expiresAt] people = client.members.list_allputs people.map { |person| "#{person[:email]} #{person[:userId]}" } sam_id = "q7Vd3kX9mT2pLw8RzN4bYc6HfJ1sGa5E"member = client.members.get(sam_id)puts member.dig(:role, :name), member[:implied] client.members.update(sam_id, roleId: viewer_role_id) address_id = "c40a95f2-1e7b-4d38-a6c9-82f05b3d7e14"client.members.grant_address(sam_id, addressId: address_id, access: "viewer")client.members.revoke_address(sam_id, address_id) removed = client.members.remove(sam_id)puts removed[:addressesRevoked]Dos concesiones por persona, y no deben fusionarse. role es lo que puede hacer. addresses es aquello sobre lo que puede hacerlo. Ambas tienen que coincidir: un rol con emails:send y access: "viewer" sobre invoices@ es alguien que puede enviar correo y no puede enviarlo desde esa dirección. La excepción es un rol con addresses:all, que llega a todas las direcciones liste lo que liste addresses, porque ese Array solo contiene concesiones directas. Así que comprueba permissions antes de leer addresses como todo el alcance de alguien.
Cada llamada sobre una persona recibe su userId como primer argumento, no su correo, así que léelo de list o list_all como hace el ejemplo. add es la única excepción, porque invita a una dirección: la persona solo tiene un userId una vez que acepta, y list_invitations sigue la invitación hasta entonces. Los campos de un cuerpo de solicitud conservan los nombres en camelCase de la API (roleId:, addressIds:, addressId:), pasados como argumentos nombrados o como un solo Hash.
list devuelve una OpenEmail::Page, list_all devuelve todos los miembros en un solo Array, e iterate pasa cada miembro a un bloque o devuelve un Enumerator sin bloque. Un miembro vuelve como un Hash con claves Symbol, y role es un Hash dentro de él, así que member.dig(:role, :name) lee el nombre del rol.
implied: true significa que nadie eligió el rol. La persona tiene direcciones y ninguna fila de rol, así que se dedujo a partir de la concesión más amplia que posee. Trátalo como «aún sin decidir»: update es lo que convierte la inferencia en una decisión. Hasta entonces, ampliar su acceso a direcciones amplía en silencio lo que puede hacer.
El propietario del espacio de trabajo es la primera fila, marcada con isOwner: true, mientras que add, update y remove lo siguen rechazando con member_is_owner, un 422 lanzado como OpenEmail::ValidationError. Un espacio de trabajo sin compartir informa de un miembro y no de ninguno, así que excluye isOwner cuando cuentes puestos: client.members.list_all.count { |member| !member[:isOwner] }.
remove actúa sobre los dos ejes: el rol Y todas las concesiones de direcciones en este espacio de trabajo, e informa de addressesRevoked. revoke_address es el acotado, para alguien que cambió de equipo y no para alguien que se marchó.
Parámetros
emailStringobligatorio- A quién invitar, recortado y en minúsculas. Todavía no necesita una cuenta: se invita a cualquiera, y el rol y las concesiones se aplican cuando acepta. Alguien que ya está en el espacio de trabajo devuelve `member_is_owner` (422).
roleIdStringobligatorio- El rol que tendrá, de 1 a 128 caracteres, y debe ser un rol de este espacio de trabajo: un id desconocido es `role_not_found` (404), lanzado como `OpenEmail::NotFoundError`. El rol de propietario no se puede repartir y devuelve `role_immutable` (409), porque convertir a alguien en propietario es una transferencia del espacio de trabajo y aquí no hay ninguna llamada para eso.
addressIdsArray<String>- Direcciones que lleva la invitación, como máximo 64 ids de 1 a 128 caracteres cada uno, concedidas cuando se acepta. Cada id se comprueba antes de escribir nada, así que uno que no corresponde a una dirección de este espacio de trabajo hace que se rechace toda la llamada con 422 `member_not_found` y no se envía nada. Invitar de nuevo a la misma dirección en menos de diez minutos es 409 `invitation_too_soon`.
accessString- Lo que puede hacer con cada id de `addressIds`: `member` lee la dirección y envía desde ella, `viewer` solo la lee. El valor por defecto es `member`, el nivel que siempre han usado la consola y la antigua vía de compartición, de modo que la misma llamada significa lo mismo desde un script y desde una pantalla. Para conceder una combinación, llama después a `grant_address` para las que difieran.
Respuesta
objectString- Siempre `member`. Una eliminación responde con el mismo valor, su `userId`, `deleted: true` y `addressesRevoked`, y ninguno de los demás campos de abajo.
userIdString- El id de su cuenta, y el identificador que todas las demás llamadas de miembros reciben como primer argumento: `get`, `update`, `remove` y las dos llamadas de direcciones. Añadir a alguien es la única llamada que funciona en cambio a partir de un correo, porque quien añade a un compañero conoce su dirección y no su id.
emailString- El correo de su cuenta, devuelto tal como lo guarda esa fila. Este recurso nunca lo escribe, y la conversión a minúsculas de `add` se aplica a la dirección que envías para la búsqueda, no a lo que vuelve. Después del propietario, la lista de miembros se ordena por él y no por la fecha de incorporación, porque la lista se lee para encontrar a una persona y no para ver qué cambió.
nameString or nil- Su nombre visible, tomado de su cuenta, donde la columna siempre tiene un valor. El nil del tipo es defensivo, no un estado que se haya visto producir a esta API. Pertenece a la persona y no al espacio de trabajo, así que nada de este recurso puede establecerlo.
imageString or nil- Su avatar, tomado de su cuenta, y nil cuando no ha configurado ninguno.
role.idString or nil- El id del rol que tiene, que se lee con `member.dig(:role, :id)`, o nil cuando nadie lo eligió. Véase `implied`. Un nil aquí es el único caso en el que `role` informa de una inferencia y no de una decisión que alguien tomó.
role.nameString- El nombre del rol. Para un miembro implícito es el nombre de la plantilla integrada a la que corresponde su acceso, no una fila de este espacio de trabajo.
role.builtinString or nil- Qué rol integrado es, `owner`, `admin`, `member`, `viewer`, `developer` o `billing`, o nil si es personalizado. `owner` aparece únicamente en la fila del propio propietario, junto a `isOwner: true`. Asignar ese rol a alguien se rechaza con `role_immutable` (409).
isOwnerBoolean- True en exactamente una fila: la cuenta a la que está vinculado el espacio de trabajo. Tiene todos los permisos diga lo que diga su fila de rol, se ordena en primer lugar, y `add`, `update` y `remove` la rechazan con `member_is_owner`. Exclúyela cuando cuentes puestos.
impliedBoolean- True cuando esta persona tiene concesiones de direcciones y ninguna fila de miembro, de modo que su rol se dedujo en vez de elegirse. Cualquier concesión de `member` lo convierte en el rol integrado Member, y si no, en Viewer. Nunca es true para el propietario. Muéstralo como «implícito por acceso». Hasta que un `update` convierta la inferencia en una decisión, ampliar su acceso a direcciones amplía en silencio lo que puede hacer.
permissionsArray<String>- Los permisos del rol aplanados sobre el miembro, de modo que una sola lectura responde a «¿puede hacerlo?» sin tener que obtener el rol. Para un miembro implícito provienen de la PLANTILLA integrada y no de la fila de rol de este espacio de trabajo, así que editar el rol Member integrado no cambia lo que tiene un miembro implícito.
addressesArray<Hash>- Las direcciones que se le han dado, ordenadas por dirección, cada una con su propio nivel de acceso. Vacío para alguien que tiene un rol y ninguna concesión, que es el aspecto de un miembro nuevo hasta que se le concede una dirección, y es el fallo correcto mientras todavía estás decidiendo qué debería ver.
addresses[].addressIdString- El id de la dirección, y lo que reciben `grant_address` y `revoke_address`. Un id que no corresponde a una dirección de este espacio de trabajo se rechaza en ambos, en lugar de informar de una revocación que nunca ocurrió.
addresses[].addressString- La dirección completa, en minúsculas, reconstruida a partir de su parte local y su dominio.
addresses[].accessString- Lo que puede hacer con esta dirección concreta: `member` la lee y envía desde ella, `viewer` solo la lee. Tanto esto como el rol tienen que permitir un envío para que se produzca, así que un rol con `emails:send` sobre una concesión `viewer` no envía desde ninguna dirección. La columna almacenada se llama `role`, y aquí se renombra para que un mismo Hash no lleve dos claves `role` procedentes de dos vocabularios distintos.
createdAtString or nil- Cuándo se escribió su fila de miembro, como String ISO 8601, y nil cuando no existe ninguna fila de miembro. Ese nil describe el mismo grupo que `implied: true`: personas con direcciones de antes de que existieran los roles y a las que nadie ha asignado un rol desde entonces.
Invitaciones
waiting = client.members.list_all_invitations waiting.each do |invitation| client.members.resend_invitation(invitation[:id]) if invitation[:expired]end client.members.revoke_invitation("winv_6bb640f5b99e47deb758f1f5")add responde con una invitación, y estas son las llamadas que le dan seguimiento. list_invitations devuelve una OpenEmail::Page de las que nadie ha aceptado todavía, list_all_invitations las devuelve todas en un solo Array, e iterate_invitations pasa cada una a un bloque o devuelve un Enumerator. resend_invitation vuelve a enviar una con un enlace nuevo y catorce días más, y revoke_invitation la retira. Una invitación pendiente no concede nada hasta que se acepta.
resend_invitation rechaza la misma dirección dos veces en diez minutos con 409 invitation_too_soon, y revoke_invitation rechaza una que se aceptó antes con 409 invitation_accepted. Ambos se lanzan como OpenEmail::ConflictError, así que conflict? es true y code los distingue.