Cómo crear, actualizar y eliminar videoconferencias para un usuario de una escuela usando el API de Teachlr Organizaciones.

Para crear, actualizar o eliminar una videoconferencia para un usuario de una escuela de Teachlr Organizaciones se debe realizar una petición al API de Teachlr Organizaciones. Dependiendo del caso, los URLs son los siguientes:

Creación de videoconferencia, petición de tipo POST:

https://api.teachlr.com/<dominio>/api/meetings

Actualización de videoconferencia, petición de tipo PUT:

https://api.teachlr.com/<dominio>/api/meetings/<meeting_id>

Eliminación de videoconferencia, petición de tipo DELETE:

https://api.teachlr.com/<dominio>/api/meetings/<meeting_id>

en donde <dominio> se debe sustituir por el dominio teachlr de la escuela (no el dominio personalizado) y <meeting_id> (cuando aplique) por el ID de la videoconferencia que se quiere actualizar o eliminar.

En cualquier tipo de petición se deben enviar las siguientes dos cabeceras:

Key Value
Content-Type application/json
Authorization key_0123456789ABCDEFGHIJK

Nota: El valor de Authorization mostrado arriba es ficticio. Cada escuela tendrá su propia llave (key) que debe ser solicitada por el cliente.

Para crear o actualizar una videoconferencia, el cuerpo de la petición debe ser un objeto JSON con la siguiente estructura:

{
  "email": "pedroperez@dominio.com",
  "topic": "Tópico de la videoconferencia",
  "date": "2020-05-12",
  "time": "21:00",
  "duration": 30,
  "timezone": "America/Caracas",
  "participants": [
    "luisvelasquez@dominio.com",
    "mariaperez@dominio.com"
  ]
}

Para eliminar una videoconferencia, el cuerpo de la petición debe ser un objeto JSON con la siguiente estructura:

{
  "email": "pedroperez@dominio.com"
}

El atributo «email» es obligatorio y debe contener la dirección de correo electrónica del usuario que será el anfitrión (para el caso de crear) o del anfitrión actual (para los casos de actualizar y eliminar) de la videoconferencia.

Condiciones para el atributo «email»:

  • Se debe enviar sólo una (1) dirección de correo electrónico. Si se envía más de una dirección de correo electrónico (separadas por coma o cualquier otro carácter), la petición fallará.
  • Si no se envía el campo email o éste se envía vacío, la petición fallará.
  • La dirección de correo electrónico debe tener un formato válido, de lo contrario la petición fallará.
  • Si la dirección de correo electrónico no está registrada en la base de datos, la petición fallará.

El atributo «topic» es obligatorio para la creación, pero opcional para la actualización, y establece el tópico de la videoconferencia.

El atributo «date» es obligatorio para la creación, pero opcional para la actualización, y establece la fecha de la videoconferencia, que debe expresarse con el formato «aaaa-mm-dd». Ej.: «2020-05-12» (para indicar 12 de mayo de 2020).

El atributo «time» es obligatorio para la creación, pero opcional para la actualización, y establece la hora de la videoconferencia, que debe expresarse con el formato «hh:mm» de 24 horas. Ej.: «20:30» (para indicar 8:30 p.m.).

El atributo «duration» es obligatorio para la creación, pero opcional para la actualización, y establece la duración de la videoconferencia, expresado en minutos. Debe ser un número entero entre 30 y 765. Ej.: 120 (para indicar 2 horas).

El atributo «timezone» es obligatorio para la creación, pero opcional para la actualización, y establece la zona horaria asociada a la fecha y hora de la videoconferencia. Ej.: «America/Caracas». Los valores soportados para este atributo se listan en el Apéndice A.

El atributo «participants» es opcional y, de ser enviado, debe contener un arreglo con los correos electrónicos de los usuarios de la escuela que serán invitados a la videoconferencia.

Condiciones para el atributo «participants»:

  • Si se envía vacío o un arreglo vacío, la petición fallará.
  • Las direcciones de correo electrónico deben tener un formato válido, de lo contrario la petición fallará
  • Las direcciones de correo electrónico deben pertenecer a usuarios de la escuela.
  • Si algunas de las direcciones de correo electrónico no pertenecen a un usuario de la escuela, dicho correo será ignorado y no será invitado a la videoconferencia.
  • Si alguna de las direcciones de correo electrónico es la del anfitrión, ésta será ignorada.

Casos de ejemplo:

Creación de videoconferencia (POST):

Se desea crear una videoconferencia cuyo anfitrión será el usuario con la dirección de correo electrónico pedroperez@dominio.com de la escuela https://escueladeprueba.teachlr.com, con la siguiente información:

Tópico: Educación a distancia

Fecha: 14 de mayo de 2020

Hora: 3:00 p.m. de Caracas, Venezuela

Duración: 2 horas.

Participantes: luisvelasquez@dominio.com y mariaperez@dominio.com

La petición al API de Teachlr Organizaciones se debe hacer al siguiente URL:

https://api.teachlr.com/escueladeprueba/api/meetings

El cuerpo de la petición sería:

{
  "email": "pedroperez@dominio.com",
  "topic": "Educación a distancia",
  "date": "2020-05-14",
  "time": "15:00",
  "duration": 120,
  "timezone": "America/Caracas",
  "participants": [
    "luisvelasquez@dominio.com",
    "mariaperez@dominio.com"
  ]
}

Una implementación utilizando la función $.ajax() de jQuery sería como sigue:

$.ajax({
	url: "https://api.teachlr.com/escueladeprueba/api/meetings",
	dataType: "json",
	type: "POST",
	contentType: "application/json",
      data: JSON.stringify {"email": "pedroperez@dominio.com", "topic": "Educación a
      distancia", "date": "2020-05-14", "time": "15:00", "duration": 120,
      "timezone": "America/Caracas", "participants": ["luisvelasquez@dominio.com", 
      "mariaperez@dominio.com"]}),
	headers: {
		"Authorization": "key_0123456789ABCDEFGHIJK"
	},
	success: function(data) {
		// la petición fue exitosa
		console.log('data', data);
	},
	error: function(xhr, status, err) {
		// falló la petición
		console.log('xhr', xhr);
		console.log('status', status);
		console.log('err', err);
	}
});

Actualización de videoconferencia (PUT):

Se desea actualizar alguno de los datos de una videoconferencia cuyo ID es 179 y el anfitrión es el usuario con la dirección de correo electrónico pedroperez@dominio.com de la escuela https://escueladeprueba.teachlr.com, con la siguiente nueva información:

Fecha: 14 de mayo de 2020

Hora: 3:00 p.m. de Caracas, Venezuela

Participantes: luisvelasquez@dominio.com y mariaperez@dominio.com

Nota: pueden enviarse sólo algunos atributos para actualizar sólo la información que se necesite, pero debe enviarse al menos uno (distinto al atributo «email», que es obligatorio), de lo contrario la petición fallará.

¡Atención!: si se envía el atributo «participants», se le removerá la videoconferencia a aquellos usuarios que no estén presentes en este nuevo listado, y se invitará sólo a los usuarios de ese nuevo listado que no habían sido invitados previamente. Si no se envía este atributo, los participantes actuales continuarán teniendo la videoconferencia asociada.

La petición al API de Teachlr Organizaciones se debe hacer al siguiente URL:

https://api.teachlr.com/escueladeprueba/api/meetings/179

El cuerpo de la petición sería:

{
  "email": "pedroperez@dominio.com",
  "date": "2020-05-14",
  "time": "15:00",
  "timezone": "America/Caracas",
  "participants": [
    "luisvelasquez@dominio.com",
    "mariaperez@dominio.com"
  ]
}

Una implementación utilizando la función $.ajax() de jQuery sería como sigue:

$.ajax({
	url: "https://api.teachlr.com/escueladeprueba/api/meetings/179",
	dataType: "json",
	type: "PUT",
	contentType: "application/json",
      data: JSON.stringify {"email": "pedroperez@dominio.com", "date": "2020-05-14",
      "time": "15:00", "timezone": "America/Caracas", "participants": 
      ["luisvelasquez@dominio.com", "mariaperez@dominio.com"]}),
	headers: {
		"Authorization": "key_0123456789ABCDEFGHIJK"
	},
	success: function(data) {
		// la petición fue exitosa
		console.log('data', data);
	},
	error: function(xhr, status, err) {
		// falló la petición
		console.log('xhr', xhr);
		console.log('status', status);
		console.log('err', err);
	}
});

Eliminación de videoconferencia (DELETE):

Se desea eliminar la videoconferencia cuyo ID es 179 y el anfitrión es el usuario con la dirección de correo electrónico pedroperez@dominio.com de la escuela https://escueladeprueba.teachlr.com:

La petición al API de Teachlr Organizaciones se debe hacer al siguiente URL:

https://api.teachlr.com/escueladeprueba/api/meetings/179

El cuerpo de la petición sería:

{
  "email": "pedroperez@dominio.com"
}

Una implementación utilizando la función $.ajax() de jQuery sería como sigue:

$.ajax({
	url: "https://api.teachlr.com/escueladeprueba/api/meetings/179",
	dataType: "json",
	type: "DELETE",
	contentType: "application/json",
      data: JSON.stringify {"email": "pedroperez@dominio.com"}),
	headers: {
		"Authorization": "key_0123456789ABCDEFGHIJK"
	},
	success: function(data) {
		// la petición fue exitosa
		console.log('data', data);
	},
	error: function(xhr, status, err) {
		// falló la petición
		console.log('xhr', xhr);
		console.log('status', status);
		console.log('err', err);
	}
});

Posibles respuestas del API:

Status: 200 OK (creación y actualización)

{
    "id": 183,
    "duration": 120,
    "start_time": "2020-05-14 19:00:00",
    "timezone": "America/Caracas",
    "topic": "Educación a distancia",
    "start_url": "https://teachlr.zoom.us/s/99265850000?zak=eyJ6bV9XX00aaiJ6bV9vMm0iLCJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJjbGllbnQiLCJ1aWQiOiJsQmpIRVFJcVRtcUF5RUIxZndVZy1nIiwiaXNzIjoid2ViIiwic3R5Ijo5OSwid2NkIjoiYXcxIiwiY2x0IjowLCJzdGsiOiJodmpMQXh0S0VqR0lrTy1MYnZIbEQxQWkxV0RNTVdDanN6Y1JwMHRXOS1nLkJnVWdkelJMWVhOS1VVVjJkSE40V2xob2VWWjRUVVJ4TWpCRGJVUnhSbHB6WVhZQUFBd3pRMEpCZFc5cFdWTXpjejBBQTJGM01RIiwiZXhwIjoxNTk3MDkxMzkyLCJpYXQiOjE1ODkzMTUzOTI...",
    "join_url": "https://teachlr.zoom.us/j/99265850000",
    "uuid": "XiKLEbsrSau2atK2XXAA11==",
    "zoom_meeting_id": 99265850000,
    "host_id": "lBjHEQIqTmqAyXX44wUg-g",
    "created_at": "2020-05-12 16:29:52",
    "updated_at": "2020-05-12 16:29:52",
    "user_id": 98,
    "deleted_at": null,
    "gmt_time": "2020-05-14 15:00:00",
    "type": "scheduled",
    "offset": "-04:00",
    "expired": false,
    "sent": false,
    "date_sent": null,
    "host": [
        {
            "id": 98,
            "username": "pedroperez",
            "name": "Pedro",
            "last_name": "Pérez",
            "email": "pedroperez@dominio.com",
            "about": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.",
            "job": "Analista/programador",
            "department": "Informática",
            "picture": {
                "thumb": "https://d2j3j1vpt0andh.cloud.../avatars/D01-32x32.jpg",
                "small": "https://d2j3j1vpt0andh.cloud.../avatars/D01-54x54.jpg",
                "medium": "https://d2j3j1vpt0andh.cloud.../avatars/D01-64x64.jpg",
                "medium_large": "https://d2j3j1vpt0andh.cloud.../avatars/D01-98x98.jpg",
                "large": "https://d2j3j1vpt0andh.cloud.../avatars/D01-198x198.jpg"
            }
        }
    ],
    "participants": [
        {
            "username": "luisvelasquez",
            "name": "Luis",
            "last_name": "Velásquez",
            "email": "luisvelasquez@dominio.com",
            "about": "Etiam ultricies nisi vel augue",
            "job": "Asistente Administrativo",
            "department": "Administración",
            "picture": {
                "thumb": "https://d2j3j1vpt0andh.cloud.../avatars/D02-32x32.jpg",
                "small": "https://d2j3j1vpt0andh.cloud.../avatars/D02-54x54.jpg",
                "medium": "https://d2j3j1vpt0andh.cloud.../avatars/D02-64x64.jpg",
                "medium_large": "https://d2j3j1vpt0andh.cloud.../avatars/D02-98x98.jpg",
                "large": "https://d2j3j1vpt0andh.cloud.../avatars/D02-198x198.jpg"
            }
        },
        {
            "username": "mariaperez",
            "name": "María",
            "last_name": "Pérez",
            "email": "mariaperez@dominio.com",
            "about": null,
            "job": null,
            "department": null,
            "picture": {
                "thumb": "https://d2j3j1vpt0andh.../img/default_user_icon-32x32.jpg",
                "small": "https://d2j3j1vpt0andh.../img/default_user_icon-54x54.jpg",
                "medium": "https://d2j3j1vpt0andh.../img/default_user_icon-64x64.jpg",
                "medium_large": "https://d2j3j1vpt0andh.../img/default_user_icon-98x98.jpg",
                "large": "https://d2j3j1vpt0andh.../img/default_user_icon-198x198.jpg"
            }
        }
    ]
}

Esta respuesta se obtiene cuando la petición fue exitosa al crear o actualizar una videoconferencia. La respuesta de ejemplo muestra la información de la videoconferencia, del anfitrión (host) y de los participantes. Cabe destacar que el URL del anfitrión se especifica en el atributo «start_url» y el URL de los invitados se especifica en el atributo «join_url».

Status: 200 OK (eliminación)

[«Ok»]

Esta respuesta se obtiene cuando la petición fue exitosa al eliminar una videoconferencia.

Status: 400 Bad Request

[«Bad request»]

Esta respuesta se obtiene cuando la petición falla. También se puede obtener esta respuesta cuando no se envían otros atributos distintos al atributo «email» en la actualización.

Status: 401 Unauthorized

[«Unauthorized»]

Esta respuesta se obtiene cuando la llave (key) enviada en la cabecera «Authorization» de la petición no es válida. También es posible recibir esta respuesta si el rol del usuario anfitrión no tiene permitido crear videoconferencias o la escuela no tiene habilitado el complemento de videoconferencias.

Status: 404 Not Found

[«Not Found»]

Esta respuesta se obtiene cuando la dirección de correo electrónico enviada no está registrada en la base de datos o el URL al cual se está haciendo la petición está incorrecto.

Status: 404 Not Found

[«Meeting Not Found»]

Esta respuesta se obtiene cuando el meeting_id enviado en la petición de la actualización o eliminación de una videoconferencia no existe o no pertenece al usuario asociado a la dirección de correo electrónico enviada en el atributo «email».

Status: 409 Conflict

[«Expired Meeting»]

Esta respuesta se obtiene cuando la videoconferencia que se quiere actualizar ha expirado, es decir, su fecha de inicio ya pasó.

Status: 409 Conflict

[«Past Date»]

Esta respuesta se obtiene cuando la combinación de fecha, hora y zona horaria a la que se quiere actualizar la videoconferencia ya pasó. Si sólo se envían algunos de estos atributos, se tomarán los valores originales registrados en la videoconferencia para los restantes atributos para realizar el cálculo.

Status: 422 Unprocessable Entity

{
    "errors": {
        "email": [
            {
                "code": "required_rule_error"
            }
        ]
    }
}

Esta respuesta se obtiene cuando no se envía el atributo «email» o se envía vacío. Esta misma respuesta aplica para todos los demás atributos: topic, date, time, duration, timezone y participants (cuando es enviado), cambiando sólo el nombre del atributo dentro de «errors».

Status: 422 Unprocessable Entity

{
    "errors": {
        "email": [
            {
                "code": "email_rule_error"
            }
        ]
    }
}

Esta respuesta se obtiene cuando lo que se envió en el atributo «email» no tiene un formato de correo electrónico válido.

Status: 422 Unprocessable Entity

{
    "errors": {
        "duration": [
            {
                "code": "integer_rule_error"
            }
        ]
    }
}

Esta respuesta se obtiene cuando lo que se envió en el atributo «duration» no es un número entero.

Status: 422 Unprocessable Entity

{
    "errors": {
        "duration": [
            {
                "code": "min_rule_error"
            }
        ]
    }
}

Esta respuesta se obtiene cuando lo que se envió en el atributo «duration» es un número entero menor a 30 (30 minutos).

Status: 422 Unprocessable Entity

{
    "errors": {
        "duration": [
            {
                "code": "max_rule_error"
            }
        ]
    }
}

Esta respuesta se obtiene cuando lo que se envió en el atributo «duration» es un número entero mayor a 765 (12 horas, 45 minutos).

Status: 422 Unprocessable Entity

{
    "errors": {
        "date": [
            {
                "code": "dateformat_rule_error"
            }
        ]
    }
}

Esta respuesta se obtiene cuando lo que se envió en el atributo «date» no es una fecha válida o no tiene el formato «yyyy-mm-dd».

Status: 422 Unprocessable Entity

{
    "errors": {
        "time": [
            {
                "code": "dateformat_rule_error"
            }
        ]
    }
}

Esta respuesta se obtiene cuando lo que se envió en el atributo «time» no es una hora válida o no tiene el formato «hh:mm» de 24 horas.

Status: 422 Unprocessable Entity

{
    "errors": {
        "timezone": [
            {
                "code": "timezone_rule_error"
            }
        ]
    }
}

Esta respuesta se obtiene cuando lo que se envió en el atributo «timezone» no tiene un formato de zona horaria.

Status: 422 Unprocessable Entity

{
    "errors": {
        "timezone": [
            {
                "code": "in_rule_error"
            }
        ]
    }
}

Esta respuesta se obtiene cuando lo que se envió en el atributo «timezone» no es ninguna de las zonas horarias soportadas para crear las videoconferencias (Apéndice A).

Status: 422 Unprocessable Entity

{
    "errors": {
        "participants": [
            {
                "email": "pedroperez@ dominio.com",
                "code": "email_rule_error"
            },
            {
                "email": "luisvelazquezdominnio.com",
                "code": "email_rule_error"
            }
        ]
    }
}

Esta respuesta se obtiene cuando uno de los elementos enviados en el atributo «participants» no tiene un formato de correo electrónico válido.

Es posible que el API devuelva varios de los errores 422 descritos anteriormente en una misma respuesta si no se cumplen varias condiciones al mismo tiempo, como se muestra a continuación:

{
    "errors": {
        "email": [
            {
                "code": "required_rule_error"
            }
        ],
        "topic": [
            {
                "code": "required_rule_error"
            }
        ],
        "date": [
            {
                "code": "dateformat_rule_error"
            }
        ]
    }
}

APÉNDICE A

LISTADO DE ZONAS HORARIAS SOPORTADAS POR LAS VIDEOCONFERENCIAS.

ID Nombre
Pacific/Midway Midway Island, Samoa
Pacific/Pago_Pago Pago Pago
Pacific/Honolulu Hawaii
America/Anchorage Alaska
America/Vancouver Vancouver
America/Los_Angeles Pacific Time (US and Canada)
America/Tijuana Tijuana
America/Edmonton Edmonton
America/Denver Mountain Time (US and Canada)
America/Phoenix Arizona
America/Mazatlan Mazatlan
America/Winnipeg Winnipeg
America/Regina Saskatchewan
America/Chicago Central Time (US and Canada)
America/Mexico_City Mexico City
America/Guatemala Guatemala
America/El_Salvador El Salvador
America/Managua Managua
America/Costa_Rica Costa Rica
America/Montreal Montreal
America/New_York Eastern Time (US and Canada)
America/Indianapolis Indiana (East)
America/Panama Panama
America/Bogota Bogota
America/Lima Lima
America/Halifax Halifax
America/Puerto_Rico Puerto Rico
America/Caracas Caracas
America/Santiago Santiago
America/St_Johns Newfoundland and Labrador
America/Montevideo Montevideo
America/Araguaina Brasilia
America/Argentina/Buenos_Aires Buenos Aires, Georgetown
America/Godthab Greenland
America/Sao_Paulo Sao Paulo
Atlantic/Azores Azores
Canada/Atlantic Atlantic Time (Canada)
Atlantic/Cape_Verde Cape Verde Islands
UTC Universal Time UTC
Etc/Greenwich Greenwich Mean Time
Europe/Belgrade Belgrade, Bratislava, Ljubljana
CET Sarajevo, Skopje, Zagreb
Atlantic/Reykjavik Reykjavik
Europe/Dublin Dublin
Europe/London London
Europe/Lisbon Lisbon
Africa/Casablanca Casablanca
Africa/Nouakchott Nouakchott
Europe/Oslo Oslo
Europe/Copenhagen Copenhagen
Europe/Brussels Brussels
Europe/Berlin Amsterdam, Berlin, Rome, Stockholm, Vienna
Europe/Helsinki Helsinki
Europe/Amsterdam Amsterdam
Europe/Rome Rome
Europe/Stockholm Stockholm
Europe/Vienna Vienna
Europe/Luxembourg Luxembourg
Europe/Paris Paris
Europe/Zurich Zurich
Europe/Madrid Madrid
Africa/Bangui West Central Africa
Africa/Algiers Algiers
Africa/Tunis Tunis
Africa/Harare Harare, Pretoria
Africa/Nairobi Nairobi
Europe/Warsaw Warsaw
Europe/Prague Prague Bratislava
Europe/Budapest Budapest
Europe/Sofia Sofia
Europe/Istanbul Istanbul
Europe/Athens Athens
Europe/Bucharest Bucharest
Asia/Nicosia Nicosia
Asia/Beirut Beirut
Asia/Damascus Damascus
Asia/Jerusalem Jerusalem
Asia/Amman Amman
Africa/Tripoli Tripoli
Africa/Cairo Cairo
Africa/Johannesburg Johannesburg
Europe/Moscow Moscow
Asia/Baghdad Baghdad
Asia/Kuwait Kuwait
Asia/Riyadh Riyadh
Asia/Bahrain Bahrain
Asia/Qatar Qatar
Asia/Aden Aden
Asia/Tehran Tehran
Africa/Khartoum Khartoum
Africa/Djibouti Djibouti
Africa/Mogadishu Mogadishu
Asia/Dubai Dubai
Asia/Muscat Muscat
Asia/Baku Baku, Tbilisi, Yerevan
Asia/Kabul Kabul
Asia/Yekaterinburg Yekaterinburg
Asia/Tashkent Islamabad, Karachi, Tashkent
Asia/Calcutta India
Asia/Kathmandu Kathmandu
Asia/Novosibirsk Novosibirsk
Asia/Almaty Almaty
Asia/Dacca Dacca
Asia/Krasnoyarsk Krasnoyarsk
Asia/Dhaka Astana, Dhaka
Asia/Bangkok Bangkok
Asia/Saigon Vietnam
Asia/Jakarta Jakarta
Asia/Irkutsk Irkutsk, Ulaanbaatar
Asia/Shanghai Beijing, Shanghai
Asia/Hong_Kong Hong Kong
Asia/Taipei Taipei
Asia/Kuala_Lumpur Kuala Lumpur
Asia/Singapore Singapore
Australia/Perth Perth
Asia/Yakutsk Yakutsk
Asia/Seoul Seoul
Asia/Tokyo Osaka, Sapporo, Tokyo
Australia/Darwin Darwin
Australia/Adelaide Adelaide
Asia/Vladivostok Vladivostok
Pacific/Port_Moresby Guam, Port Moresby
Australia/Brisbane Brisbane
Australia/Sydney Canberra, Melbourne, Sydney
Australia/Hobart Hobart
Asia/Magadan Magadan
SST Solomon Islands
Pacific/Noumea New Caledonia
Asia/Kamchatka Kamchatka
Pacific/Fiji Fiji Islands, Marshall Islands
Pacific/Auckland Auckland, Wellington
Asia/Kolkata Mumbai, Kolkata, New Delhi
Europe/Kiev Kiev
America/Tegucigalpa Tegucigalpa
Pacific/Apia Independent State of Samoa

Leave A Comment?