Skip to content

PlacesOS Microsoft Graph API Driver

  • Groups booking requests and sends them to the Microsoft calendar
  • Manages calendar events, groups, and users through Microsoft Graph API
  • Sends emails and notifies invited users
  • Creates email templates for specified responses
KeyTypeDefault valueDescription
calendar_service_accountStringservice_account@email.address---
calendar_configObject{tenant: "", client_id: "", client_secret: "", conference_type: ""}---
rate_limit---5limits the number of API calls so it does not exceed limits set by Microsoft
mailer_fromStringemail_or_office_userPrincipalName
email_templatesObject{visitor: {checkin: {subject: ”%{name} has arrived”, text: “for your meeting at %{time}”, }}}

Shows true if the driver is connected to the Microsoft Graph API and false if not

Boolean

1. If connected to Microsoft Graph API

{
"connected": true
}

Displays the number of API calls waiting in the queue to be sent to Microsoft Graph API

NameRequired?TypeDefaultDescription
None

1. If no calls waiting in the queue:

0

Displays the number of API calls to Microsoft Graph API currently in progress

NameRequired?TypeDefaultDescription
None

1. If no calls in progress:

0

Generates an SVG of a QR code which encodes the given text.

NameRequired?TypeDefaultDescription
texttrueStringN/AThe text the user wishes to turn into a QR code

1.

<?xml version="1.0" standalone="yes"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" width="231" height="231" shape-rendering="crispEdges">
<rect width="231" height="231" x="0" y="0" style="fill:#fff"/>
<rect width="11" height="11" x="0" y="0" style="fill:#000"/><rect width="11" height="11" x="11" y="0" style="fill:#000"/><rect width="11" height="11" x="22" y="0" style="fill:#000"/><rect width="11" height="11" x="33" y="0" style="fill:#000"/><rect width="11" height="11" x="44" y="0" style="fill:#000"/><rect width="11" height="11" x="55" y="0" style="fill:#000"/><rect width="11" height="11" x="66" y="0" style="fill:#000"/><rect width="11" height="11" x="88" y="0" style="fill:#000"/><rect width="11" height="11" x="132" y="0" style="fill:#000"/><rect width="11" height="11" x="154" y="0" style="fill:#000"/><rect width="11" height="11" x="165" y="0" style="fill:#000"/><rect width="11" height="11" x="176" y="0" style="fill:#000"/><rect width="11" height="11" x="187" y="0" style="fill:#000"/><rect width="11" height="11" x="198" y="0" style="fill:#000"/><rect width="11" height="11" x="209" y="0" style="fill:#000"/><rect width="11" height="11" x="220" y="0" style="fill:#000"/>
<rect width="11" height="11" x="0" y="11" style="fill:#000"/><rect width="11" height="11" x="66" y="11" style="fill:#000"/><rect width="11" height="11" x="99" y="11" style="fill:#000"/><rect width="11" height="11" x="110" y="11" style="fill:#000"/><rect width="11" height="11" x="121" y="11" style="fill:#000"/><rect width="11" height="11" x="132" y="11" style="fill:#000"/><rect width="11" height="11" x="154" y="11" style="fill:#000"/><rect width="11" height="11" x="220" y="11" style="fill:#000"/>
<rect width="11" height="11" x="0" y="22" style="fill:#000"/><rect width="11" height="11" x="22" y="22" style="fill:#000"/><rect width="11" height="11" x="33" y="22" style="fill:#000"/><rect width="11" height="11" x="44" y="22" style="fill:#000"/><rect width="11" height="11" x="66" y="22" style="fill:#000"/><rect width="11" height="11" x="88" y="22" style="fill:#000"/><rect width="11" height="11" x="99" y="22" style="fill:#000"/><rect width="11" height="11" x="121" y="22" style="fill:#000"/><rect width="11" height="11" x="132" y="22" style="fill:#000"/><rect width="11" height="11" x="154" y="22" style="fill:#000"/><rect width="11" height="11" x="176" y="22" style="fill:#000"/><rect width="11" height="11" x="187" y="22" style="fill:#000"/><rect width="11" height="11" x="198" y="22" style="fill:#000"/><rect width="11" height="11" x="220" y="22" style="fill:#000"/>
<rect width="11" height="11" x="0" y="33" style="fill:#000"/><rect width="11" height="11" x="22" y="33" style="fill:#000"/><rect width="11" height="11" x="33" y="33" style="fill:#000"/><rect width="11" height="11" x="44" y="33" style="fill:#000"/><rect width="11" height="11" x="66" y="33" style="fill:#000"/><rect width="11" height="11" x="110" y="33" style="fill:#000"/><rect width="11" height="11" x="121" y="33" style="fill:#000"/><rect width="11" height="11" x="154" y="33" style="fill:#000"/><rect width="11" height="11" x="176" y="33" style="fill:#000"/><rect width="11" height="11" x="187" y="33" style="fill:#000"/><rect width="11" height="11" x="198" y="33" style="fill:#000"/><rect width="11" height="11" x="220" y="33" style="fill:#000"/>
<rect width="11" height="11" x="0" y="44" style="fill:#000"/><rect width="11" height="11" x="22" y="44" style="fill:#000"/><rect width="11" height="11" x="33" y="44" style="fill:#000"/><rect width="11" height="11" x="44" y="44" style="fill:#000"/><rect width="11" height="11" x="66" y="44" style="fill:#000"/><rect width="11" height="11" x="88" y="44" style="fill:#000"/><rect width="11" height="11" x="99" y="44" style="fill:#000"/><rect width="11" height="11" x="121" y="44" style="fill:#000"/><rect width="11" height="11" x="154" y="44" style="fill:#000"/><rect width="11" height="11" x="176" y="44" style="fill:#000"/><rect width="11" height="11" x="187" y="44" style="fill:#000"/><rect width="11" height="11" x="198" y="44" style="fill:#000"/><rect width="11" height="11" x="220" y="44" style="fill:#000"/>
<rect width="11" height="11" x="0" y="55" style="fill:#000"/><rect width="11" height="11" x="66" y="55" style="fill:#000"/><rect width="11" height="11" x="99" y="55" style="fill:#000"/><rect width="11" height="11" x="132" y="55" style="fill:#000"/><rect width="11" height="11" x="154" y="55" style="fill:#000"/><rect width="11" height="11" x="220" y="55" style="fill:#000"/>
<rect width="11" height="11" x="0" y="66" style="fill:#000"/><rect width="11" height="11" x="11" y="66" style="fill:#000"/><rect width="11" height="11" x="22" y="66" style="fill:#000"/><rect width="11" height="11" x="33" y="66" style="fill:#000"/><rect width="11" height="11" x="44" y="66" style="fill:#000"/><rect width="11" height="11" x="55" y="66" style="fill:#000"/><rect width="11" height="11" x="66" y="66" style="fill:#000"/><rect width="11" height="11" x="88" y="66" style="fill:#000"/><rect width="11" height="11" x="110" y="66" style="fill:#000"/><rect width="11" height="11" x="132" y="66" style="fill:#000"/><rect width="11" height="11" x="154" y="66" style="fill:#000"/><rect width="11" height="11" x="165" y="66" style="fill:#000"/><rect width="11" height="11" x="176" y="66" style="fill:#000"/><rect width="11" height="11" x="187" y="66" style="fill:#000"/><rect width="11" height="11" x="198" y="66" style="fill:#000"/><rect width="11" height="11" x="209" y="66" style="fill:#000"/><rect width="11" height="11" x="220" y="66" style="fill:#000"/>
<rect width="11" height="11" x="88" y="77" style="fill:#000"/><rect width="11" height="11" x="99" y="77" style="fill:#000"/><rect width="11" height="11" x="110" y="77" style="fill:#000"/><rect width="11" height="11" x="132" y="77" style="fill:#000"/>
<rect width="11" height="11" x="55" y="88" style="fill:#000"/><rect width="11" height="11" x="66" y="88" style="fill:#000"/><rect width="11" height="11" x="132" y="88" style="fill:#000"/><rect width="11" height="11" x="154" y="88" style="fill:#000"/><rect width="11" height="11" x="176" y="88" style="fill:#000"/><rect width="11" height="11" x="198" y="88" style="fill:#000"/><rect width="11" height="11" x="220" y="88" style="fill:#000"/>
<rect width="11" height="11" x="0" y="99" style="fill:#000"/><rect width="11" height="11" x="11" y="99" style="fill:#000"/><rect width="11" height="11" x="22" y="99" style="fill:#000"/><rect width="11" height="11" x="33" y="99" style="fill:#000"/><rect width="11" height="11" x="88" y="99" style="fill:#000"/><rect width="11" height="11" x="99" y="99" style="fill:#000"/><rect width="11" height="11" x="110" y="99" style="fill:#000"/><rect width="11" height="11" x="121" y="99" style="fill:#000"/><rect width="11" height="11" x="143" y="99" style="fill:#000"/><rect width="11" height="11" x="154" y="99" style="fill:#000"/><rect width="11" height="11" x="176" y="99" style="fill:#000"/><rect width="11" height="11" x="187" y="99" style="fill:#000"/><rect width="11" height="11" x="198" y="99" style="fill:#000"/>
<rect width="11" height="11" x="22" y="110" style="fill:#000"/><rect width="11" height="11" x="33" y="110" style="fill:#000"/><rect width="11" height="11" x="44" y="110" style="fill:#000"/><rect width="11" height="11" x="66" y="110" style="fill:#000"/><rect width="11" height="11" x="88" y="110" style="fill:#000"/><rect width="11" height="11" x="99" y="110" style="fill:#000"/><rect width="11" height="11" x="121" y="110" style="fill:#000"/><rect width="11" height="11" x="132" y="110" style="fill:#000"/><rect width="11" height="11" x="143" y="110" style="fill:#000"/><rect width="11" height="11" x="176" y="110" style="fill:#000"/><rect width="11" height="11" x="187" y="110" style="fill:#000"/><rect width="11" height="11" x="198" y="110" style="fill:#000"/><rect width="11" height="11" x="209" y="110" style="fill:#000"/>
<rect width="11" height="11" x="33" y="121" style="fill:#000"/><rect width="11" height="11" x="55" y="121" style="fill:#000"/><rect width="11" height="11" x="121" y="121" style="fill:#000"/><rect width="11" height="11" x="176" y="121" style="fill:#000"/><rect width="11" height="11" x="187" y="121" style="fill:#000"/><rect width="11" height="11" x="198" y="121" style="fill:#000"/>
<rect width="11" height="11" x="22" y="132" style="fill:#000"/><rect width="11" height="11" x="66" y="132" style="fill:#000"/><rect width="11" height="11" x="88" y="132" style="fill:#000"/><rect width="11" height="11" x="110" y="132" style="fill:#000"/><rect width="11" height="11" x="121" y="132" style="fill:#000"/><rect width="11" height="11" x="143" y="132" style="fill:#000"/><rect width="11" height="11" x="154" y="132" style="fill:#000"/><rect width="11" height="11" x="220" y="132" style="fill:#000"/>
<rect width="11" height="11" x="88" y="143" style="fill:#000"/><rect width="11" height="11" x="110" y="143" style="fill:#000"/><rect width="11" height="11" x="154" y="143" style="fill:#000"/><rect width="11" height="11" x="165" y="143" style="fill:#000"/><rect width="11" height="11" x="198" y="143" style="fill:#000"/><rect width="11" height="11" x="209" y="143" style="fill:#000"/>
<rect width="11" height="11" x="0" y="154" style="fill:#000"/><rect width="11" height="11" x="11" y="154" style="fill:#000"/><rect width="11" height="11" x="22" y="154" style="fill:#000"/><rect width="11" height="11" x="33" y="154" style="fill:#000"/><rect width="11" height="11" x="44" y="154" style="fill:#000"/><rect width="11" height="11" x="55" y="154" style="fill:#000"/><rect width="11" height="11" x="66" y="154" style="fill:#000"/><rect width="11" height="11" x="110" y="154" style="fill:#000"/><rect width="11" height="11" x="154" y="154" style="fill:#000"/><rect width="11" height="11" x="165" y="154" style="fill:#000"/><rect width="11" height="11" x="187" y="154" style="fill:#000"/><rect width="11" height="11" x="209" y="154" style="fill:#000"/>
<rect width="11" height="11" x="0" y="165" style="fill:#000"/><rect width="11" height="11" x="66" y="165" style="fill:#000"/><rect width="11" height="11" x="88" y="165" style="fill:#000"/><rect width="11" height="11" x="99" y="165" style="fill:#000"/><rect width="11" height="11" x="121" y="165" style="fill:#000"/><rect width="11" height="11" x="132" y="165" style="fill:#000"/><rect width="11" height="11" x="143" y="165" style="fill:#000"/><rect width="11" height="11" x="165" y="165" style="fill:#000"/><rect width="11" height="11" x="176" y="165" style="fill:#000"/><rect width="11" height="11" x="187" y="165" style="fill:#000"/><rect width="11" height="11" x="198" y="165" style="fill:#000"/><rect width="11" height="11" x="220" y="165" style="fill:#000"/>
<rect width="11" height="11" x="0" y="176" style="fill:#000"/><rect width="11" height="11" x="22" y="176" style="fill:#000"/><rect width="11" height="11" x="33" y="176" style="fill:#000"/><rect width="11" height="11" x="44" y="176" style="fill:#000"/><rect width="11" height="11" x="66" y="176" style="fill:#000"/><rect width="11" height="11" x="110" y="176" style="fill:#000"/><rect width="11" height="11" x="143" y="176" style="fill:#000"/><rect width="11" height="11" x="165" y="176" style="fill:#000"/><rect width="11" height="11" x="187" y="176" style="fill:#000"/><rect width="11" height="11" x="209" y="176" style="fill:#000"/>
<rect width="11" height="11" x="0" y="187" style="fill:#000"/><rect width="11" height="11" x="22" y="187" style="fill:#000"/><rect width="11" height="11" x="33" y="187" style="fill:#000"/><rect width="11" height="11" x="44" y="187" style="fill:#000"/><rect width="11" height="11" x="66" y="187" style="fill:#000"/><rect width="11" height="11" x="99" y="187" style="fill:#000"/><rect width="11" height="11" x="110" y="187" style="fill:#000"/><rect width="11" height="11" x="121" y="187" style="fill:#000"/><rect width="11" height="11" x="143" y="187" style="fill:#000"/><rect width="11" height="11" x="154" y="187" style="fill:#000"/><rect width="11" height="11" x="187" y="187" style="fill:#000"/><rect width="11" height="11" x="198" y="187" style="fill:#000"/>
<rect width="11" height="11" x="0" y="198" style="fill:#000"/><rect width="11" height="11" x="22" y="198" style="fill:#000"/><rect width="11" height="11" x="33" y="198" style="fill:#000"/><rect width="11" height="11" x="44" y="198" style="fill:#000"/><rect width="11" height="11" x="66" y="198" style="fill:#000"/><rect width="11" height="11" x="99" y="198" style="fill:#000"/><rect width="11" height="11" x="132" y="198" style="fill:#000"/><rect width="11" height="11" x="143" y="198" style="fill:#000"/><rect width="11" height="11" x="187" y="198" style="fill:#000"/><rect width="11" height="11" x="198" y="198" style="fill:#000"/><rect width="11" height="11" x="209" y="198" style="fill:#000"/><rect width="11" height="11" x="220" y="198" style="fill:#000"/>
<rect width="11" height="11" x="0" y="209" style="fill:#000"/><rect width="11" height="11" x="66" y="209" style="fill:#000"/><rect width="11" height="11" x="99" y="209" style="fill:#000"/><rect width="11" height="11" x="110" y="209" style="fill:#000"/><rect width="11" height="11" x="132" y="209" style="fill:#000"/><rect width="11" height="11" x="143" y="209" style="fill:#000"/><rect width="11" height="11" x="154" y="209" style="fill:#000"/><rect width="11" height="11" x="176" y="209" style="fill:#000"/><rect width="11" height="11" x="198" y="209" style="fill:#000"/>
<rect width="11" height="11" x="0" y="220" style="fill:#000"/><rect width="11" height="11" x="11" y="220" style="fill:#000"/><rect width="11" height="11" x="22" y="220" style="fill:#000"/><rect width="11" height="11" x="33" y="220" style="fill:#000"/><rect width="11" height="11" x="44" y="220" style="fill:#000"/><rect width="11" height="11" x="55" y="220" style="fill:#000"/><rect width="11" height="11" x="66" y="220" style="fill:#000"/><rect width="11" height="11" x="99" y="220" style="fill:#000"/><rect width="11" height="11" x="121" y="220" style="fill:#000"/><rect width="11" height="11" x="132" y="220" style="fill:#000"/><rect width="11" height="11" x="154" y="220" style="fill:#000"/><rect width="11" height="11" x="176" y="220" style="fill:#000"/><rect width="11" height="11" x="198" y="220" style="fill:#000"/><rect width="11" height="11" x="209" y="220" style="fill:#000"/>
</svg>

Generates the code for a PNG version of a QR code which encodes the text provided at the specified size.

NameRequired?TypeDefaultDescription
texttrueStringN/AThe text the user wishes to turn into a QR code
sizefalseInt32128The size of the image the user wants to create

1. For the word “Test” at size 100:

iVBORw0KGgoAAAANSUhEUgAAAGQAAABkEAYAAAAgckkXAAADrklEQVR4nO2TMZLkMAzE5v+fvqvaumSCpcfnpgl6gESJioJI9uuPiPzKa1pAhIwBESkwICIFBkSkwICIFBgQkQIDIlJgQEQKDIhIgQERKTAgIgUGRKTAgIgUGBCRAgMiUmBARAoMiEgBLiCvH/jnWf/u/jy1n9Pg1KYHdXWg3QuQ8qGdVHBq04O6OtDuBUj50E4qODVaA1M+Uwv21H7eBU6N1kADkoXmcwROjdZAA5KF5nMETi21AFML1v0uzb/bZxqc2vaBdr9L8+/2mQantn2g3e/S/Lt9psGpfdtAU54p/+39TINT+7aBpjxT/tv7mQan9m0DTXmm/Lf3Mw1ObftAaYu0vZ/T4NS2D5S2SNv7OQ1ObftAaYu0vZ/T4NRoDZxa1FSdp/bzLnBqtAYakCw0nyNwarQGGpAsNJ8jcGq/NZB2nvWn3aedVHBq04O6OtAt92knFZza9KCuDnTLfdpJBay2k+6F2bZg27G1YQzIs7C1YQzIs7C1/0gt8JTnU+9PA1a7FwPCvD8NWO1eDAjz/jQ4tbOLSlvsKf+pOlN9vgvcV6YWbLv/VJ2pPt8F7itTC7bdf6rOVJ/vYv1XphYv5TP1r+53Uz7TLFR+p3twqfvddVILmXo35TPNQuV3ugeXut9dJ7WQqXdTPtMsVP6M1EJOMeXzrUH4jQd95R0Dkn3XgDwMA5J914AspXtA3UFLLd6WBab5HAFW+wwDkq3TDc3nCLDaZxiQbJ1uaD5HgNV20h2olE/q3S3B/F8WKrMxIAZECgyIAWnlbMOnzu7/dtc/+273fSo45enFv7pIqf921z/7bvd9Kjjl6cW/ukip/3bXP/tu930qOGVaY1OL0V1nqn7qXSo4NVoDuxcvVWeqfupdKjg1WgO7Fy9VZ6p+6l0qOLUtizT131Qd2n0qOGUDYkBI4JQNiAEhgVN+akCmPKf8nwLuK92Lkaqf+le355T/U8B9pXsxUvVT/+r2nPJ/CrivdC9Gqn73v1L/TZHqc7dnGpxaaoFTA0oNtLtO9+Kl+tztmQanllrg1IBSA+2u0714qT53e6bBqdEaSFvs7oXsvr8N3FdoDTcgBgQFreEGxICgSC1A95n6V6oP3e92e1LBKXctdPpM/SvVh+53uz2p4JS7Fjp9pv6V6kP3u92eVBYqi9yHAREpMCAiBQZEpMCAiBQYEJECAyJSYEBECgyISIEBESkwICIFBkSkwICIFBgQkQIDIlJgQEQKDIhIgQERKTAgIgV/AVWCRjmiRazdAAAAAElFTkSuQmCC

Sends an email to any email address NOTE - ONE of message_plaintext OR message_html IS required.

Security Level: Support

NameRequired?TypeDefaultDescription
totrueString OR Array(String)N/Athe destation of the email
subjecttrueStringN/AThe subject line of the email
message_plaintextfalseStringnilThe message body of the email
message_htmlfalseStringnilThe message body of the email that will be displayed as HTML
resource_attachmentsfalseArray(ResourceAttachment)[]Array of objects to be attached to the email
ccfalseString OR Array(String)[]---
bccfalseString OR Array(String)[]---
fromfalseString Or Array(String) Or Nilnil---

1. If the email is not registered to a user

{
"error": "request failed",
"sys_id": "sys-E7A7jh9V4U",
"module_name": "Calendar",
"index": 1,
"message": "module raised: \"email_or_office_userPrincipalName\" is invalid as a mail address. (EMail::Error::AddressError)",
"backtrace": [
"repositories/drivers/lib/email/src/email/address.cr:16:5 in 'valid_address!'",
"repositories/drivers/lib/email/src/email/address.cr:32:13 in 'initialize'",
"repositories/drivers/lib/email/src/email/address.cr:31:3 in 'new'",
"repositories/drivers/lib/email/src/email/header.cr:114:16 in 'add'",
"repositories/drivers/lib/email/src/email/message.cr:415:3 in 'from'",
"repositories/drivers/lib/place_calendar/src/google.cr:447:7 in 'send_mail'",
"repositories/drivers/drivers/place/calendar_common.cr:142:14 in 'send_mail'",
"repositories/drivers/drivers/place/calendar.cr:3:1 in '->'",
"repositories/drivers/drivers/place/calendar.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Generates an access token for an admin to log in to Microsoft services as a given user.

Security Level: Admin

NameRequired?TypeDefaultDescription
user_idfalseStringnilemail address of the user as registered in BackOffice

1. If user does not exist:

{
"error": "request failed",
"sys_id": "sys-E7A7jh9V4U",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Bad Request\n{\n \"error\": \"invalid_request\",\n \"error_description\": \"Invalid impersonation \\u0026quot;sub\\u0026quot; field: H84U9JLbocG\"\n} (Google::Exception)",
"backtrace": [
"repositories/drivers/lib/google/src/google.cr:25:9 in 'raise_on_failure'",
"repositories/drivers/lib/google/src/auth/service_auth.cr:50:7 in 'get_token'",
"repositories/drivers/lib/place_calendar/src/google.cr:67:15 in 'access_token'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'access_token'",
"repositories/drivers/drivers/place/calendar_common.cr:158:14 in 'access_token'",
"repositories/drivers/drivers/place/calendar.cr:3:1 in '->'",
"repositories/drivers/drivers/place/calendar.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

2. If user exists:

{
"expires": "2023-03-09T12:51:24Z",
"token": "eyJ0eXAiOiJKV1QiLCJub25jZSI6IjhkXzJxRVMxb0hoWHFjV2h1cnh1RUlwNWVUQlBvM3A1SjVicTlpaTRxWm8iLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyIsImtpZCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyJ9.eyJhdWQiOiJodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9lMTJkNDlhZi02YWRkLTRlNmQtODNiOS1hZTI4YWJhNmZhYmMvIiwiaWF0IjoxNjc4MzYyMzg1LCJuYwa3Q0ZDFxYlU2RHVhNG9xNmI2dkFNQUFBQUFBQUFBd0FBQUFBQUFBQUJCQUFBLiIsInJvbGVzIjpbIkRpcmVjdG9yeS5SZWFkV3JpdGUuQWxsIiwiQ29udGFjdHMuUmVhZFdyaXRlIiwiVXNlci5SZWFkLkFsbCIsIkNhbGVuZGFycy5SZWFkV3JpdGUiXSwic31uv58xYs4Ul7naaDPJZzDz49q5ZeukN-2qLAoHBP6wBa57Ms55rmFsaijTovYemVIzDpFBVltczZbTVkUSHb0vpbqB3GJAo5yO_qder_U5kugC48RLJxzxSnNZRnjLLbFLuA10uFDFkLJGb4sgQCPAjLvyYxcolu8bdnZYFalMY55-tF2nhEB0aHcCAszs4ikPMxsxXP7RoF8UjBQiYbLayGXhGMN8U_M7LlqRJMOmCd162wQsV31WnMeDSIFC7GQ"
}

Shows all the groups a given user belongs to.

Security Level: Support

NameRequired?TypeDefaultDescription
user_idfalseStringnilemail address of the user to search
[
{
"id": <the id of the group,
"name": <the name of the group>
}
]

1. If the user exists and is a member of at least one group:

[
{
"id": "668dsfd3c5-fcd4-4dc8-a6bb-335ewerfsb8c5",
"name": "All Users"
}
]

2. If user does not exist:

{
"error": "request failed",
"sys_id": "sys-E7A7jh9V4U",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Forbidden\n{\n \"error\": {\n \"code\": 403,\n \"message\": \"Request had insufficient authentication scopes.\",\n \"errors\": [\n {\n \"message\": \"Insufficient Permission\",\n \"domain\": \"global\",\n \"reason\": \"insufficientPermissions\"\n }\n ],\n \"status\": \"PERMISSION_DENIED\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n \"reason\": \"ACCESS_TOKEN_SCOPE_INSUFFICIENT\",\n \"domain\": \"googleapis.com\",\n \"metadata\": {\n \"service\": \"admin.googleapis.com\",\n \"method\": \"ccc.hosted.frontend.directory.v1.DirectoryGroups.List\"\n }\n }\n ]\n }\n}\n (PlaceCalendar::Exception)",
"backtrace": [
"repositories/drivers/lib/place_calendar/src/google.cr:303:7 in 'handle_google_exception'",
"repositories/drivers/lib/place_calendar/src/google.cr:94:7 in 'get_groups'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'get_groups'",
"repositories/drivers/drivers/place/calendar_common.cr:164:14 in 'get_groups'",
"repositories/drivers/drivers/place/calendar.cr:3:1 in '->'",
"repositories/drivers/drivers/place/calendar.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Shows all the members of a given group.

Security Level: Support

NameRequired?TypeDefaultDescription
group_idfalseStringnilThe group ID - can be obtained by running get_groups on a known group member

2. If group exisits:

[
{
"id": "9ddsfs04e-ffa3-451f-93cb-dfhsfh74ac70",
"name": "On-Premises Directory Synchronization Service Account",
"email": "Sync_c7dfgdf2ae9c@company.onmicrosoft.com",
"username": "Sync__c7dfgdf2ae9c@company.onmicrosoft.com"
},
{
"id": "a7asdgf8b-ebc1-4843-8479-0ctgsdgfsb2d6",
"name": "variant",
"email": "variant@company.onmicrosoft.com",
"username": "variant@company.com.au"
}

1. If group does not exist:

{
"error": "request failed",
"sys_id": "sys-E7A7jh9V4U",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Forbidden\n{\n \"error\": {\n \"code\": 403,\n \"message\": \"Request had insufficient authentication scopes.\",\n \"errors\": [\n {\n \"message\": \"Insufficient Permission\",\n \"domain\": \"global\",\n \"reason\": \"insufficientPermissions\"\n }\n ],\n \"status\": \"PERMISSION_DENIED\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n \"reason\": \"ACCESS_TOKEN_SCOPE_INSUFFICIENT\",\n \"domain\": \"googleapis.com\",\n \"metadata\": {\n \"service\": \"admin.googleapis.com\",\n \"method\": \"ccc.hosted.frontend.directory.v1.DirectoryMembers.List\"\n }\n }\n ]\n }\n}\n (PlaceCalendar::Exception)",
"backtrace": [
"repositories/drivers/lib/place_calendar/src/google.cr:303:7 in 'handle_google_exception'",
"repositories/drivers/lib/place_calendar/src/google.cr:100:7 in 'get_members'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'get_members'",
"repositories/drivers/drivers/place/calendar_common.cr:170:14 in 'get_members'",
"repositories/drivers/drivers/place/calendar.cr:3:1 in '->'",
"repositories/drivers/drivers/place/calendar.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Lists all users if no paramaters are filled. Can be filtered by name.

Security Level: Support

NameRequired?TypeDefaultDescription
queryfalseStringnilfilters results whose “name” category contains the entered string
limitfalseInt32nilLimits the number of results to the number entered

1. If group does not exist:

[
{
"id": "116847001215",
"name": "Firstname Lastname",
"email": "email@place.os"
},
{
"id": "107849665",
"name": "First Last",
"email": "email1@place.os",
"photo": "https://www.google.com/photos/private/AIbEiAIAAABDCIHpmpHo6cCzGUO0TUcpevl6e27"
},
{
"id": "1017948066277",
"name": "Given Last",
"email": "email2@place.os",
"department": "Department department",
"title": "Department head",
"photo": "https://www.google.com/photos/private/AIbEiAIAkS9j5GQ"
}
]

Searches for a user by their email. The user_id is considered their email - this is different from what is returned in the results under “id”.

Security Level: Support

NameRequired?TypeDefaultDescription
user_idtrueStringN/AThe user email to search for

2. If user exists:

{
"id": "85348a34-1c88-4ed6-9efd-92gefgddb2daa",
"name": "ACA test",
"email": "ACA.test@company.com.au",
"username": "ACA.test@company.com.au"
}

1. If user does not exist:

{
"error": "request failed",
"sys_id": "sys-EJhU_4DEvQ",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Forbidden (PlaceCalendar::Exception)",
"backtrace": [
"repositories/drivers/lib/place_calendar/src/office365.cr:420:7 in 'handle_office365_exception'",
"repositories/drivers/lib/place_calendar/src/office365.cr:85:7 in 'get_user'",
"repositories/drivers/lib/place_calendar/src/office365.cr:93:9 in 'get_user_by_email'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'get_user_by_email'",
"repositories/drivers/drivers/place/calendar_common.cr:182:14 in 'get_user'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in '->'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Lists the calendars that belong to a user, specified by their email as registered in BackOffice.

Security Level: Support

NameRequired?TypeDefaultDescription
user_idtrueStringN/AThe email of the user, as shown in BackOffice

2. If user exists:

[
{
"id": "ACA.test@company.com.au",
"ref": "AAkALgAAAAfdgdfmEc2byACqAC-EWg0ASuIL0BZ9OEGaBdfgdfgKM9wAAAAAhlgAA",
"summary": "Calendar",
"primary": true,
"can_edit": true
}
]

1. If user does not exist:

{
"error": "request failed",
"sys_id": "sys-EJhU_4DEvQ",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Not Found (PlaceCalendar::Exception)",
"backtrace": [
"repositories/drivers/lib/place_calendar/src/office365.cr:420:7 in 'handle_office365_exception'",
"repositories/drivers/lib/place_calendar/src/office365.cr:138:7 in 'list_calendars'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'list_calendars'",
"repositories/drivers/drivers/place/calendar_common.cr:188:14 in 'list_calendars'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in '->'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Gets the registered manager of a given user

Security Level: Support

NameRequired?TypeDefaultDescription
user_idtrueStringN/AThe email of the user to search

1. If user does not have a registered manager:

{
"error": "request failed",
"sys_id": "sys-Ewmyx8wEF_",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Not Found (Office365::Exception)",
"backtrace": [
"repositories/drivers/lib/office365/src/client.cr:132:9 in 'graph_request'",
"repositories/drivers/lib/office365/src/users.cr:39:22 in 'get_user_manager'",
"repositories/drivers/drivers/place/calendar_common.cr:197:9 in 'get_user_manager'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in '->'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Lists all groups if no parameters entered.

Security Level: Support

NameRequired?TypeDefaultDescription
queryfalseStringnilfilters search results by whether the query appears in the “name”

1.

[
{
"id": "0013fdgd63-7bd8-4e8d-92d4-ea3dfgfg7d38",
"name": "LaptopUsers-Brisbane"
},
{
"id": "0dfgdfcd-dfg6-462d-aa86-8fcaf2dfgdfdf",
"name": "UserAdmins",
"description": "Members can manage users in this forest."
},
{
"id": "00dfgfg3ae-9fdgd-4645-9dbc-a4172a4fdg8e",
"name": "WebVPN"
}
]

Searches for a group by its group ID, as returned in the “id” section of list_groups UNLIKE with get_user

Security Level: Support

NameRequired?TypeDefaultDescription
group_idtrueStringN/AThe group ID to use in the search - can be found by using list_groups

1. If id is correct:

{
"id": "0sfdf6063-7bd8-4e8sdfd-92d4-ea3sdfd38",
"name": "LaptopUsers-Brisbane"
}

2. If group does not exist:

{
"error": "request failed",
"sys_id": "sys-Ewmyx8wEF_",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Bad Request (Office365::Exception)",
"backtrace": [
"repositories/drivers/lib/office365/src/client.cr:132:9 in 'graph_request'",
"repositories/drivers/lib/office365/src/groups.cr:41:15 in 'get_group'",
"repositories/drivers/drivers/place/calendar_common.cr:219:9 in 'get_group'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in '->'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Searches for all events happening on a given calendar within a specified time frame.

Security Level: Support

NameRequired?TypeDefaultDescription
calendar_idtrueStringN/AThe EMAIL of the user OR the EMAIL of the room whose calender you want to search
period_starttrueInt64N/AThe start of the time period to search in Unix time
period_endtrueInt64N/AThe end of the period to search in Unix time
time_zonefalseStringnilfilters results by time zone - format: 2/3 letter timezone code e.g UTC, AU
user_idfalseStringnilfilters results by user EMAIL (Only necessary if the calendar_id you are looking up belongs to a room)
include_cancelledfalseBooleanfalseif true, includes cancelled events

1. If the user or room has no events in the given time frame:

[]

4. If the room or user has events within the given time frame:

[
{
"event_start": 1671408000,
"event_end": 1671410700,
"id": "AAkALgAAAAAAHYQDEapmdsfdsm8FgRUSiiZH26Qy2dwAEM3At3gAA",
"host": "Person@company.com.au",
"title": "Fortnightly Catch-Up",
"body": "<html>\r\n<head></head>\r\n<body>html body</body>\r\n</html>\r\n",
"attendees": [
{
"name": "Person Mcfolk",
"email": "Person@company.com.au",
"response_status": "needsAction",
"resource": false
},
{
"name": "Jim Bob",
"email": "Jim@company.com.au",
"response_status": "accepted",
"resource": false
},
{
"name": "Resource - Meeting Room",
"email": "meetingroom@company.com.au",
"response_status": "accepted",
"resource": false
}
],
"location": "Microsoft Teams Meeting",
"private": false,
"all_day": false,
"timezone": "Australia/Sydney",
"recurring": false,
"created": "2022-12-18T23:58:18Z",
"updated": "2022-12-19T00:08:08Z",
"attachments": [],
"status": "confirmed",
"creator": "person@company.com.au",
"ical_uid": "04000000810000000000000000100000001186DAC27148E847BB58B773F3B941A7",
"online_meeting_provider": "teamsForBusiness",
"online_meeting_phones": [],
"online_meeting_url": "https://teams.microsoft.com/l/meetup-join/19%3ameetFkLTliNjMtODQ2NzcwODJkZjQ1%40thread.v2/0?context=%7b%2212d49af-6add-4e6d-83b9-ae28aba6fabc%22%2c%2f-431f-91a1-b893ed3b6dbf%22%7d"
},
{
"event_start": 1671417000,
"event_end": 1671420600,
"id": "AAkALgAAAAAAHYQDEapmEc2byACqAC-EWg0A2oF4m8FgRUSiiZH26Qy2dwAEM3BNNQAA",
"host": "person2@company.com.au",
"title": "Meeting",
"body": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta name=\"Generator\" content=\"Microsoft Word 15 (filt63C1;\r\n\ttext-decoration:underline}\r\nspan.EmailStyle18\r\n\t{font-family:\"Calibri\",sans-serif;\r\n\tcolor:windowtext}\r\n.MsoChpDefault\r\n\t{font-size:10.0pt}\r\n@page WordSection1\r\n\t{margin:72.0pt 72.0pt 72.0pt 72.0pt}\r\ndiv.WordSection1\r\n\t{}\r\n-->\r\n</style>\r\n</head>\r\n<body lang=\"EN-AU\" link=\"#0563C1\" vlink=\"#954F72\" style=\"word-wrap:break-word\">\r\n<div class=\"WordSection1\">\r\n<p class=\"MsoNormal\">&nbsp;</p>\r\n<div>\r\n<p class=\"MsoNormal\"><span style=\"color:#5F5F5F\">________________________________________________________________________________</span>\r\n</p>\r\n</div>\r\n<div>\r\n<div style=\"margin-top:18.0pt; margin-bottom:15.0pt\">\r\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"font-size:18.0pt; font-family:&quot;Segoe UI&quot;,sans-serif; color:#252424\">Microsoft Teams meeting</span><span lang=\"EN-US\" style=\"font-family:&quot;Segoe UI&quot;,sans-serif; color:#252424\">\r\n</span></p>\r\n</div>\r\n<div style=\"margin-bottom:15.0pt\">\r\n<div>\r\n<p class=\"MsoNormal\"><b><span lang=\"EN-US\" style=\"font-size:10.52424\">Join with a video conferencing device</span></b><span lang=\"EN-US\" style=\"font-family:&quot;Segoe UI&quot;,sans-serif; color:#252424\">\r\n</span></p>\r\n</div>\r\n</span></a> </span></p>\r\n</div>\r\n<div style=\"margin-top:15.0pt; margin-bottom:18.0pt\">\r\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"font-family:&quot;Segoe UI&quot;,sans-serif; color:#252424\"><a href=\"https://aka.ms/JoinTeamsMeeting\"><span style=\"font-size:10.5pt; colorZDdmMzUtNWYzYy00NGJkLWE2N2QtNmYyOTMyMGFjYjRl@thread.v2&amp;messageId=0&amp;language=en-US\">\r\n<span style=\"font-size:10.5pt; color:#6264A7\">Meeting options</span></a> </span></p>\r\n</div>\r\n</div>\r\n<div>\r\n<p class=\"MsoNormal\"><span style=\"color:#5F5F5F\">________________________________________________________________________________</span>\r\n</p>\r\n</div>\r\n<p class=\"MsoNormal\">&nbsp;</p>\r\n</div>\r\n</body>\r\n</html>\r\n",
"attendees": [
{
"name": "Person Two",
"email": "person2@company.com.au",
"response_status": "needsAction",
"resource": false
},
{
"name": "Resource Meeting Room",
"email": "meetingroom@company.com.au",
"response_status": "accepted",
"resource": true
}
],
"location": "Microsoft Teams Meeting; Resource VIC - Meeting Room 2 (80a Turner St, Port Melb)",
"private": false,
"all_day": false,
"timezone": "Australia/Sydney",
"recurring": false,
"created": "2022-12-19T02:23:59Z",
"updated": "2022-12-19T02:29:40Z",
"attachments": [],
"status": "confirmed",
"creator": "person2@company.com.au",
"ical_uid": "040000008200E00074C5B71010010000000B4D1E494FA625B43B2FEE33B578A80A6",
"online_meeting_provider": "teamsForBusiness",
"online_meeting_phones": [],
"online_meeting_url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_ZDZlZDdmMzUtNWYzYy00NGJkLWE2N2QtNmYyOTMyMGFjYjRl%40thread.v2/0?context=%7b%22Tid%22%3a%22e50f-a2fe-41c6-af48-4bd90ecc006e%22%7d"
}

3. If calendar_id does not exist:

{
"error": "request failed",
"sys_id": "sys-EJhU_4DEvQ",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Not Found (PlaceCalendar::Exception)",
"backtrace": [
"repositories/drivers/lib/place_calendar/src/office365.cr:420:7 in 'handle_office365_exception'",
"repositories/drivers/lib/place_calendar/src/office365.cr:192:7 in 'list_events:period_start:period_end:showDeleted'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'list_events:period_start:period_end:showDeleted'",
"repositories/drivers/drivers/place/calendar_common.cr:243:7 in 'list_events'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in '->'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Deletes an event from the calendar. Requires a calendar ID (the email of the room OR a user) AND a meeting ID - a long set of numbers and letters as returned by list_events

Security Level: Support

NameRequired?TypeDefaultDescription
calendar_idtrueStringN/AThe user Email OR the room EMAIL
event_idtrueStringN/AThe ID of the event as returned by list_events
user_idfalseStringnilIF the calendar_id is the email of a ROOM, this filters by the email of a user
notifyfalseBooleanfalsenotifies attendees if set to true
commentfalseStringniladds a comment to the cancellation notification

1. If request fails:

{
"error": "request failed",
"sys_id": "sys-Ewmyx8wEF_",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Status 204 should not have a body (ArgumentError)",
"backtrace": [
"/usr/share/crystal/src/http/client/response.cr:20:11 in 'initialize'",
"/usr/share/crystal/src/http/client/response.cr:13:5 in 'new'",
"/usr/share/crystal/src/http/client/response.cr:150:22 in 'from_io?'",
"/usr/share/crystal/src/http/client.cr:604:5 in 'exec_internal_single'",
"/usr/share/crystal/src/http/client.cr:587:18 in 'exec_internal'",
"/usr/share/crystal/src/http/client.cr:581:7 in 'exec'",
"repositories/drivers/lib/office365/src/client.cr:125:7 in 'graph_request'",
"repositories/drivers/lib/office365/src/events.cr:107:16 in 'delete_event:mailbox:calendar_id:id'",
"repositories/drivers/lib/place_calendar/src/office365.cr:239:7 in 'delete_event:calendar_id:notify'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'delete_event:calendar_id:notify'",
"repositories/drivers/drivers/place/calendar_common.cr:275:14 in 'delete_event'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in '->'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Declines an event from the calendar. Event is still shown but crossed out. Requires a calendar ID (the email of the room OR a user) AND a meeting ID - a long set of numbers and letters as returned by list_events

Security Level: Support

NameRequired?TypeDefaultDescription
calendar_idtrueStringN/AThe user Email OR the room EMAIL
event_idtrueStringN/AThe ID of the event as returned by list_events
user_idfalseStringnilIF the calendar_id is the email of a ROOM, this filters by the email of a user
notifyfalseBooleanfalsenotifies attendees if set to true
commentfalseStringniladds a comment to the cancellation notification

1. If request fails:

{
"error": "request failed",
"sys_id": "sys-EJhU_4DEvQ",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Not Found (PlaceCalendar::Exception)",
"backtrace": [
"repositories/drivers/lib/place_calendar/src/office365.cr:420:7 in 'handle_office365_exception'",
"repositories/drivers/lib/place_calendar/src/office365.cr:251:7 in 'decline_event:calendar_id:notify:comment'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'decline_event:calendar_id:notify:comment'",
"repositories/drivers/drivers/place/calendar_common.cr:266:14 in 'decline_event'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in '->'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Creates an event

Security Level: Support

NameRequired?TypeDefaultDescription
titletrueStringN/AThe title of the event
event_starttrueInt64N/AStart time of the event in Unix time
event_endfalseStringN/AEnd time of the even in Unix time
descriptionfalseStringN/Adescription of the event sent to the attendees
attendeesfalseString/Array(String)nil---
locationfalseStringnilShown on the invitation, human-readable name
timezonefalseStringnil2/3 letter timezone code - affects time meeting may appear for all users
user_idfalseStringnilThe SERVER user to create the event AS
calendar_idfalseStringnilThe EMAIL of the ROOM
online_meeting_idfalseStringnilNeed to generate meeting with provider first, these details will be provided by then
online_meeting_providerfalseStringnilNeed to generate meeting with provider first, these details will be provided by them
online_meeting_urlfalseStringnilNeed to generate meeting with provider first, these details will be provided by them
online_meeting_sipfalseStringnilNeed to generate meeting with provider first, these details will be provided by them
online_meeting_phonesfalseStringnilNeed to generate meeting with provider first, these details will be provided by them
online_meeting_pinfalseStringnilNeed to generate meeting with provider first, these details will be provided by them
#### Response Schema
```
```

1. If request fails:

{
"error": "request failed",
"sys_id": "sys-Ewmyx8wEF_",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Not Found (PlaceCalendar::Exception)",
"backtrace": [
"repositories/drivers/lib/place_calendar/src/office365.cr:420:7 in 'handle_office365_exception'",
"repositories/drivers/lib/place_calendar/src/office365.cr:213:7 in 'create_event'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'create_event'",
"repositories/drivers/drivers/place/calendar_common.cr:322:14 in 'create_event'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in '->'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Send an email template you have created to given users to get specific responses back from them.

| Name | Required? | Type | Default | Description | | to | true | String | N/A | email to send the template to | | template | true | String | N/A | template to send | | args | true | String | N/A | --- | | resource_attachments | false | String/Array(string) | [] | --- | | attachments | false | String/Array(string) | [] | --- | | cc | false | String/Array(string) | [] | --- | | bcc | false | String/Array(string) | [] | --- | | from | false | String | null | optional email to use as sender |

1. If request fails:

{
"error": "request failed",
"sys_id": "sys-Ewmyx8wEF_",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Not Found (PlaceCalendar::Exception)",
"backtrace": [
"repositories/drivers/lib/place_calendar/src/office365.cr:420:7 in 'handle_office365_exception'",
"repositories/drivers/lib/place_calendar/src/office365.cr:213:7 in 'create_event'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'create_event'",
"repositories/drivers/drivers/place/calendar_common.cr:322:14 in 'create_event'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in '->'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}

Generates an email template to be used for questionaires/to generate specific responses

| Name | Required? | Type | Default | Description | | string | true | String | N/A | --- | | args | true | String | N/A | --- |

1. If request fails:

{
"error": "request failed",
"sys_id": "sys-Ewmyx8wEF_",
"module_name": "Calendar",
"index": 1,
"message": "module raised: Not Found (PlaceCalendar::Exception)",
"backtrace": [
"repositories/drivers/lib/place_calendar/src/office365.cr:420:7 in 'handle_office365_exception'",
"repositories/drivers/lib/place_calendar/src/office365.cr:213:7 in 'create_event'",
"repositories/drivers/lib/place_calendar/src/place_calendar.cr:23:5 in 'create_event'",
"repositories/drivers/drivers/place/calendar_common.cr:322:14 in 'create_event'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in '->'",
"repositories/drivers/drivers/microsoft/graph_api.cr:3:1 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:164:5 in 'execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver.cr:522:1 in 'run_execute'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:262:24 in 'process'",
"repositories/drivers/lib/placeos-driver/src/placeos-driver/driver_manager.cr:179:7 in '->'",
"/usr/share/crystal/src/fiber.cr:146:11 in 'run'",
"/usr/share/crystal/src/fiber.cr:98:34 in '->'",
"???"
]
}