connectors

object

%Connector

/phlo/resources/connectors/Connector.phlo
version 1.0
creator q-ai.nl
summary Base class for API connectors: credentials, JSON requests, retries, pagination and a normalized result contract
package connectors
frontend false
backend true
requires creds HTTP
tags api connector http rest base
const

Connector :: section

line 10
Definieert een sectie binnen een Connector, waarmee gerelateerde componenten en functionaliteiten kunnen worden georganiseerd.
void
const

Connector :: api

line 11
Definieert een connector voor API-interacties, waardoor naadloze communicatie tussen verschillende diensten mogelijk is.
void
method

%Connector -> __construct (?array $config = null)

line 13
Initialiseert een Connector-instantie met optionele configuratie-instellingen. Als er geen configuratie wordt opgegeven, probeert het inloggegevens te laden vanuit een vooraf gedefinieerde sectie.
if ($config === null){
	$section = static::section
	$creds = $section ? %creds->{$section} : null
	$config = $creds ? (array)$creds->toArray : []
}
$this->config = $config
$this->timeout = 15
$this->retries = 0
static

Connector :: make (?array $config = null):static

line 24
Maakt een nieuwe instantie van de Connector-klasse met de opgegeven configuratie.
new static($config)
method

%Connector -> base

line 26
Toegang tot de basis-API voor de Connector, waarmee interactie met de kernfunctionaliteiten mogelijk is.
static::api
method

%Connector -> headers

line 27
Deze eigenschap haalt de headers op die aan de Connector zijn gekoppeld.
[]
static

Connector :: fields

line 29
Connector::$fields is een statische eigenschap die een array met velddefinities voor de Connector-klasse bevat.
[]
method

%Connector -> configured (...$keys):bool

line 31
Controleert of alle opgegeven sleutels zijn geconfigureerd in de configuratie van de Connector. Geeft true terug als alle sleutels aanwezig zijn, anders false.
foreach ($keys AS $key){
	if (($this->config[$key] ?? void) === void) return false
}
return true
method

%Connector -> missing (...$keys):?obj

line 38
Controleert of de opgegeven inloggegevens zijn geconfigureerd en retourneert null als dat het geval is; anders wordt er een foutmelding geactiveerd die aangeeft welke inloggegevens ontbreken.
return $this->configured(...$keys) ? null : static::fail(static::section.' credentials not configured ('.implode(', ', $keys).')')
static

Connector :: bearer ($token):string

line 42
De Connector::$bearer-eigenschap bevat de geformatteerde autorisatieheaderwaarde met een Bearer-token voor API-aanvragen.
'Authorization: Bearer '.$token
static

Connector :: basic ($user, $pass):string

line 43
Genereert een Basic Authorization-header door de opgegeven gebruikersnaam en wachtwoord in base64-indeling te coderen.
'Authorization: Basic '.base64_encode($user.colon.$pass)
static

Connector :: build (string $method, string $url, ?array $query = null, array $headers = [], mixed $json = null, mixed $form = null):array

line 45
Stelt een HTTP-verzoekconfiguratie samen, inclusief methode, URL, headers en body op basis van de opgegeven parameters.
if ($query) $url .= (str_contains($url, qm) ? '&' : qm).http_build_query($query)
$body = null
if ($json !== null){
	$body = is_string($json) ? $json : json_encode($json, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
	$headers[] = 'Content-Type: application/json'
}
elseif ($form !== null){
	$body = is_string($form) ? $form : http_build_query($form)
	$headers[] = 'Content-Type: application/x-www-form-urlencoded'
}
$headers[] = 'Accept: application/json'
return ['method' => strtoupper($method), 'url' => $url, 'headers' => $headers, 'body' => $body]
static

Connector :: ok ($data, int $status = 200):obj

line 60
De Connector::$ok-eigenschap bevat een object met een boolean 'ok'-waarde, een 'status' en 'data'-attributen.
obj(ok: true, status: $status, data: $data)
static

Connector :: fail ($error, int $status = 0):obj

line 61
De Connector::$fail-eigenschap vertegenwoordigt een foutstatus, met een object waarin 'ok' op false is ingesteld, samen met de 'status' en 'error'-details.
obj(ok: false, status: $status, error: $error)
static

Connector :: errorMessage ($data, string $raw, int $status):string

line 63
Connector::$errorMessage haalt het foutbericht op uit een gegeven data-object, controleert verschillende eigenschappen op een stringrepresentatie van de fout en valt terug op een geformatteerd HTTP-statusbericht als er geen fout wordt gevonden.
if (is_object($data)){
	if (isset($data->error->message)) return (string)$data->error->message
	if (isset($data->error) && is_string($data->error)) return $data->error
	if (isset($data->message)) return (string)$data->message
	if (isset($data->errors)){
		$errors = $data->errors
		if (is_string($errors)) return $errors
		if (is_array($errors)) return is_string($errors[0] ?? null) ? $errors[0] : json_encode($errors)
		if (is_object($errors)) return json_encode($errors)
	}
}
return $raw !== void ? $raw : 'HTTP '.$status
static

Connector :: parse ($raw, int $status = 200):obj

line 78
Parses een ruwe invoerstring naar een JSON-object en retourneert een succesvolle reactie of een foutmelding op basis van de HTTP-statuscode.
$raw = (string)$raw
$data = $raw === void ? null : json_decode($raw)
if ($status < 200 || $status >= 300) return static::fail(static::errorMessage($data, $raw, $status), $status)
return obj(ok: true, status: $status, data: $data ?? $raw)
static

Connector :: retryable ($method, int $status):bool

line 85
in_array($method, ['GET', 'HEAD', 'QUERY']) && ($status === 429 || $status >= 500)
static

Connector :: backoff (int $attempt, $response):int

line 87
De Connector::$backoff-eigenschap berekent de backoff-tijd in microseconden op basis van de 'retry-after'-header van de respons, met een maximumlimiet van 30 seconden of een standaardwaarde vermenigvuldigd met het aantal pogingen.
$after = (int)($response->headers['retry-after'] ?? 0)
return $after > 0 ? min($after, 30) * 1000000 : 200000 * $attempt
method

%Connector -> dispatch (array $req):obj

line 92
$method = $req['method']
$body = $req['body']
$attempt = 0
$response = null
while (true){
	try {
		if ($method === 'GET') $raw = HTTP($req['url'], $req['headers'], cookies: false, timeout: $this->timeout, response: $response)
		elseif ($method === 'DELETE') $raw = HTTP($req['url'], $req['headers'], DELETE: true, cookies: false, timeout: $this->timeout, response: $response)
		elseif ($method === 'PUT') $raw = HTTP($req['url'], $req['headers'], PUT: $body ?? void, cookies: false, timeout: $this->timeout, response: $response)
		elseif ($method === 'PATCH') $raw = HTTP($req['url'], $req['headers'], PATCH: $body ?? void, cookies: false, timeout: $this->timeout, response: $response)
		elseif ($method === 'QUERY') $raw = HTTP($req['url'], $req['headers'], QUERY: $body ?? void, cookies: false, timeout: $this->timeout, response: $response)
		else $raw = HTTP($req['url'], $req['headers'], POST: $body ?? void, cookies: false, timeout: $this->timeout, response: $response)
	}
	catch (\Throwable $e){
		return static::fail($e->getMessage(), 0)
	}
	$status = $response->status ?? 0
	if (($status >= 200 && $status < 300) || !static::retryable($method, $status) || $attempt >= $this->retries) break
	usleep(static::backoff(++$attempt, $response))
}
$result = static::parse($raw, $status)
$result->headers = $response->headers ?? []
return $result
method

%Connector -> request (string $method, string $url, ?array $query = null, array $headers = [], mixed $json = null, mixed $form = null):obj

line 118
Verzendt een HTTP-verzoek met de opgegeven methode, URL, queryparameters, headers en optionele JSON- of formuliergegevens.
if (!str_starts_with($url, 'http')) $url = rtrim((string)$this->base, slash).slash.ltrim($url, slash)
$headers = array_merge((array)$this->headers, $headers)
return $this->dispatch(static::build($method, $url, $query, $headers, $json, $form))
method

%Connector -> get (string $url, ?array $query = null, array $headers = []):obj

line 124
Verstuurt een GET-verzoek naar de opgegeven URL met optionele queryparameters en headers.
$this->request('GET', $url, query: $query, headers: $headers)
method

%Connector -> post (string $url, mixed $json = null, array $headers = []):obj

line 125
Verzendt een POST-verzoek naar de opgegeven URL met optionele JSON-gegevens en headers.
$this->request('POST', $url, headers: $headers, json: $json)
method

%Connector -> put (string $url, mixed $json = null, array $headers = []):obj

line 126
Verzendt een PUT-verzoek naar de opgegeven URL met optionele JSON-gegevens en headers.
$this->request('PUT', $url, headers: $headers, json: $json)
method

%Connector -> patch (string $url, mixed $json = null, array $headers = []):obj

line 127
Verstuurt een PATCH-verzoek naar de opgegeven URL met optionele JSON-gegevens en headers.
$this->request('PATCH', $url, headers: $headers, json: $json)
method

%Connector -> query (string $url, mixed $json = null, array $headers = []):obj

line 128
$this->request('QUERY', $url, headers: $headers, json: $json)
method

%Connector -> del (string $url, array $headers = []):obj

line 129
Stuurt een DELETE-verzoek naar de opgegeven URL met optionele headers.
$this->request('DELETE', $url, headers: $headers)
method

%Connector -> form (string $url, array $fields, array $headers = []):obj

line 130
Verzendt een POST-verzoek naar de opgegeven URL met de gegeven formulier velden en headers.
$this->request('POST', $url, headers: $headers, form: $fields)
method

%Connector -> paginate (string $url, callable $extract, ?array $query = null, string $param = 'page', int $start = 1, int $max = 0):array

line 132
Haal gepagineerde gegevens op van een opgegeven URL, waarbij items worden geëxtraheerd met behulp van een opgegeven callable en deze worden verzameld totdat een maximum aantal is bereikt of er geen gegevens meer beschikbaar zijn.
$items = []
$page = $start
while (true){
	$res = $this->get($url, ($query ?? []) + [$param => $page])
	if (!$res->ok) break
	$batch = $extract($res->data)
	if (!$batch) break
	foreach ($batch AS $item) $items[] = $item
	if ($max && count($items) >= $max) break
	$page++
}
return $items
object

%EBoekhouden

/phlo/resources/connectors/finance/EBoekhouden.phlo
version 1.0
creator q-ai.nl
summary e-Boekhouden.nl connector: session auth from an API token, relations and sales invoices
extends Connector
package connectors
frontend false
backend true
requires @Connector creds:EBoekhouden
tags eboekhouden accounting invoices relations connector
const

EBoekhouden :: section

line 11
'EBoekhouden'
const

EBoekhouden :: api

line 12
'https://api.e-boekhouden.nl/v1'
prop

%EBoekhouden -> sessionToken

line 14
void
method

%EBoekhouden -> headers

line 16
$this->sessionToken !== void ? ['Authorization: '.$this->sessionToken] : []
static

EBoekhouden :: fields

line 18
arr(
	section: 'EBoekhouden',
	config: arr(source: 'Source label shown in the e-Boekhouden audit trail (optional)'),
	secret: arr(api_token: 'API token (Beheer > Instellingen > API)'),
)
method

%EBoekhouden -> session:obj

line 25
if ($m = $this->missing('api_token')) return $m
if ($this->sessionToken !== void) return static::ok($this->sessionToken)
$res = $this->post('session', ['accessToken' => trim((string)$this->config['api_token']), 'source' => (string)($this->config['source'] ?? 'Phlo')])
if (!$res->ok) return $res
$token = (string)($res->data->token ?? void)
if ($token === void) return static::fail('e-Boekhouden session token missing in response', $res->status)
$this->sessionToken = $token
return static::ok($token)
method

%EBoekhouden -> guard:?obj

line 36
$res = $this->session
return $res->ok ? null : $res
method

%EBoekhouden -> relations (array $query = []):obj

line 41
if ($m = $this->guard) return $m
return $this->get('relation', $query)
method

%EBoekhouden -> createRelation (array $relation):obj

line 46
if ($m = $this->guard) return $m
return $this->post('relation', $relation)
method

%EBoekhouden -> invoices (array $query = []):obj

line 51
if ($m = $this->guard) return $m
return $this->get('invoice', $query)
method

%EBoekhouden -> createInvoice (array $invoice):obj

line 56
if ($m = $this->guard) return $m
return $this->post('invoice', $invoice)
object

%ExactOnline

/phlo/resources/connectors/finance/ExactOnline.phlo
version 1.0
creator q-ai.nl
summary Exact Online connector (OAuth2): read sales invoices and accounts, create sales invoices
extends OAuthConnector
package connectors
frontend false
backend true
requires @OAuthConnector creds:ExactOnline
tags exact exactonline accounting invoices oauth connector
const

ExactOnline :: section

line 11
Definieert een sectie binnen de ExactOnline resource, waardoor gestructureerd databeheer mogelijk is.
'ExactOnline'
const

ExactOnline :: tokenUrl

line 12
Geeft de URL terug voor het verkrijgen van een OAuth2-token van ExactOnline.
'https://start.exactonline.nl/api/oauth2/token'
method

%ExactOnline -> base

line 14
Stelt de basis-URL voor de ExactOnline API samen met de opgegeven divisie uit de configuratie.
'https://start.exactonline.nl/api/v1/'.($this->config['division'] ?? void)
static

ExactOnline :: fields

line 16
Definieert de velden die nodig zijn voor integratie met ExactOnline, inclusief configuratie voor OAuth-gegevens en scopes.
arr(
	section: 'ExactOnline',
	config: arr(division: 'Division (administration) number'),
	secret: arr(
		client_id: 'OAuth client ID',
		client_secret: 'OAuth client secret',
		refresh_token: 'OAuth refresh token (managed and rotated after first authorization)',
	),
	scopes: 'OAuth2 authorization code flow; token endpoint refreshes automatically',
)
method

%ExactOnline -> guard

line 27
Controleert op de aanwezigheid van vereiste parameters 'division', 'client_id', 'client_secret' en 'refresh_token'.
$this->missing('division', 'client_id', 'client_secret', 'refresh_token')
method

%ExactOnline -> invoices (array $query = []):obj

line 29
Haal een lijst van verkoopfacturen op uit ExactOnline op basis van de opgegeven queryparameters.
if ($m = $this->guard) return $m
return $this->get('salesinvoice/SalesInvoices', $query)
method

%ExactOnline -> accounts (array $query = []):obj

line 34
Haal accountinformatie op van ExactOnline met de opgegeven queryparameters.
if ($m = $this->guard) return $m
return $this->get('crm/Accounts', $query)
method

%ExactOnline -> createInvoice (array $invoice):obj

line 39
Maakt een nieuwe factuur aan in ExactOnline met de opgegeven factuurgegevens.
if ($m = $this->guard) return $m
return $this->post('salesinvoice/SalesInvoices', $invoice)
object

%GoogleCalendar

/phlo/resources/connectors/cloud/GoogleCalendar.phlo
version 1.0
creator q-ai.nl
summary Google Calendar connector (OAuth2): read events and create events
extends OAuthConnector
package connectors
frontend false
backend true
requires @OAuthConnector creds:Google
tags google calendar events oauth connector
const

GoogleCalendar :: section

line 11
Definieert een sectie binnen een Google Calendar-resource, waarmee evenementen en details kunnen worden georganiseerd.
'Google'
const

GoogleCalendar :: tokenUrl

line 12
Dit is de URL-eindpunt die wordt gebruikt om een toegangstoken te verkrijgen van de OAuth 2.0-autorisatieserver van Google Calendar.
'https://oauth2.googleapis.com/token'
method

%GoogleCalendar -> base

line 14
Dit definieert de basis-URL voor toegang tot de Google Calendar API versie 3.
'https://www.googleapis.com/calendar/v3'
static

GoogleCalendar :: fields

line 16
GoogleCalendar::$fields biedt configuratiegegevens voor toegang tot Google Calendar, inclusief OAuth-gegevens en vereiste scopes.
arr(
	section: 'Google',
	secret: arr(
		client_id: 'OAuth client ID',
		client_secret: 'OAuth client secret',
		refresh_token: 'OAuth refresh token (scopes: calendar, spreadsheets)',
	),
	scopes: 'https://www.googleapis.com/auth/calendar, https://www.googleapis.com/auth/spreadsheets',
)
method

%GoogleCalendar -> guard

line 26
Controleert op de aanwezigheid van vereiste inloggegevens: client_id, client_secret en refresh_token.
$this->missing('client_id', 'client_secret', 'refresh_token')
method

%GoogleCalendar -> events (string $calendarId = 'primary', array $query = []):obj

line 28
Haal evenementen op uit een opgegeven Google Agenda met behulp van de opgegeven agenda-ID en optionele queryparameters.
if ($m = $this->guard) return $m
return $this->get('calendars/'.rawurlencode($calendarId).'/events', $query)
method

%GoogleCalendar -> createEvent (array $event, string $calendarId = 'primary'):obj

line 33
Maakt een nieuwe gebeurtenis in de opgegeven Google Calendar met de verstrekte gebeurtenisdetails.
if ($m = $this->guard) return $m
return $this->post('calendars/'.rawurlencode($calendarId).'/events', $event)
object

%GoogleSheets

/phlo/resources/connectors/cloud/GoogleSheets.phlo
version 1.0
creator q-ai.nl
summary Google Sheets connector (OAuth2): read ranges and append rows
extends OAuthConnector
package connectors
frontend false
backend true
requires @OAuthConnector creds:Google
tags google sheets spreadsheet oauth connector
const

GoogleSheets :: section

line 11
Definieert een sectie voor het organiseren van gegevens binnen een Google Sheets-resource.
'Google'
const

GoogleSheets :: tokenUrl

line 12
Dit is de URL-eindpunt voor het verkrijgen van OAuth 2.0-tokens van Google Sheets.
'https://oauth2.googleapis.com/token'
method

%GoogleSheets -> base

line 14
Dit item vertegenwoordigt een basis-URL voor het toegang krijgen tot de Google Sheets API, specifiek de eindpunt voor interactie met spreadsheets.
'https://sheets.googleapis.com/v4/spreadsheets'
static

GoogleSheets :: fields

line 16
Definieert de configuratievelden voor Google Sheets-integratie, inclusief OAuth-gegevens en vereiste scopes.
arr(
	section: 'Google',
	secret: arr(
		client_id: 'OAuth client ID',
		client_secret: 'OAuth client secret',
		refresh_token: 'OAuth refresh token (scopes: calendar, spreadsheets)',
	),
	scopes: 'https://www.googleapis.com/auth/spreadsheets',
)
method

%GoogleSheets -> guard

line 26
Controleert of de vereiste inloggegevens aanwezig zijn: client_id, client_secret en refresh_token.
$this->missing('client_id', 'client_secret', 'refresh_token')
method

%GoogleSheets -> values ($spreadsheetId, string $range):obj

line 28
Haalt de waarden op uit een opgegeven bereik in een Google Sheets-spreadsheet die wordt geïdentificeerd door de gegeven spreadsheet-ID.
if ($m = $this->guard) return $m
return $this->get($spreadsheetId.'/values/'.rawurlencode($range))
method

%GoogleSheets -> append ($spreadsheetId, string $range, array $rows, string $valueInputOption = 'USER_ENTERED'):obj

line 33
Voegt rijen met gegevens toe aan een opgegeven bereik in een Google Sheets-spreadsheet, met gebruik van de opgegeven invoeroptie voor waarden.
if ($m = $this->guard) return $m
return $this->post($spreadsheetId.'/values/'.rawurlencode($range).':append?valueInputOption='.$valueInputOption, ['values' => $rows])
object

%Lightspeed

/phlo/resources/connectors/shops/Lightspeed.phlo
version 1.0
creator q-ai.nl
summary Lightspeed Retail (V3) connector: read customers and sales, create customers
extends Connector
package connectors
frontend false
backend true
requires @Connector creds:Lightspeed
tags lightspeed webshop retail pos customers connector
const

Lightspeed :: section

line 11
Definieert een sectie in een Lightspeed-applicatie, waarmee de organisatie en het beheer van inhoud binnen die sectie mogelijk wordt gemaakt.
'Lightspeed'
method

%Lightspeed -> base

line 13
Lightspeed->base bouwt de basis-URL voor toegang tot de Lightspeed API, waarbij de cluster-ID uit de configuratie wordt opgenomen als deze beschikbaar is.
'https://api.lightspeedapp.com/API/V3/Account/'.($this->config['cluster_id'] ?? void)
method

%Lightspeed -> headers

line 15
Deze methode haalt de headers op die nodig zijn voor authenticatie bij de Lightspeed API met de opgegeven API-sleutel en geheim uit de configuratie.
[static::basic($this->config['api_key'] ?? void, $this->config['api_secret'] ?? void)]
static

Lightspeed :: fields

line 17
Lightspeed::$fields definieert de configuratievelden die nodig zijn voor verbinding met de Lightspeed API, inclusief cluster-ID, taal, API-sleutel, API-geheim en toegangsrechten.
arr(
	section: 'Lightspeed',
	config: arr(
		cluster_id: 'Account / cluster ID',
		language: 'Language (optional, default nl)',
	),
	secret: arr(
		api_key: 'API key',
		api_secret: 'API secret',
	),
	scopes: 'Customer read/write, Sale read',
)
method

%Lightspeed -> customers (array $query = []):obj

line 30
Haalt klantgegevens op van de Lightspeed API met de opgegeven queryparameters.
if ($m = $this->missing('cluster_id', 'api_key', 'api_secret')) return $m
return $this->get('Customer.json', $query)
method

%Lightspeed -> findCustomer ($participant):obj

line 35
Zoekt een klant op basis van hun e-mailadres of telefoonnummer, afhankelijk van het formaat van de opgegeven deelnemer identificatie.
if ($m = $this->missing('cluster_id', 'api_key', 'api_secret')) return $m
$field = str_contains((string)$participant, '@') ? 'Email' : 'Phone'
return $this->get('Customer.json', [$field => $participant, 'limit' => 1])
method

%Lightspeed -> customer ($id):obj

line 41
Haal klantinformatie op van de Lightspeed API met de opgegeven klant-ID.
if ($m = $this->missing('cluster_id', 'api_key', 'api_secret')) return $m
return $this->get('Customer/'.$id.'.json')
method

%Lightspeed -> sales (array $query = []):obj

line 46
Haal verkoopgegevens op van de API met de opgegeven queryparameters, waarbij wordt gecontroleerd of de vereiste inloggegevens aanwezig zijn.
if ($m = $this->missing('cluster_id', 'api_key', 'api_secret')) return $m
return $this->get('Sale.json', $query)
method

%Lightspeed -> createCustomer (array $customer):obj

line 51
Maakt een nieuwe klant aan door de opgegeven klantgegevens naar de Lightspeed API te sturen, waarbij wordt gecontroleerd of vereiste parameters aanwezig zijn.
if ($m = $this->missing('cluster_id', 'api_key', 'api_secret')) return $m
return $this->post('Customer.json', $customer)
object

%MessageBird

/phlo/resources/connectors/chat/MessageBird.phlo
version 1.0
creator q-ai.nl
summary MessageBird connector: send SMS
extends Connector
package connectors
frontend false
backend true
requires @Connector creds:MessageBird
tags messagebird sms messaging connector
const

MessageBird :: section

line 11
Definieert een sectie voor MessageBird binnen de Phlo-applicatie.
'MessageBird'
method

%MessageBird -> base

line 13
Dit definieert de basis-URL voor de MessageBird API, die wordt gebruikt voor het verzenden en ontvangen van berichten.
'https://rest.messagebird.com'
method

%MessageBird -> headers

line 15
Dit haalt de headers op die nodig zijn voor het authenticeren van verzoeken aan de MessageBird API met de opgegeven toegangssleutel.
['Authorization: AccessKey '.($this->config['access_key'] ?? void)]
static

MessageBird :: fields

line 17
Definieert de velden voor de MessageBird-configuratie, inclusief de afzender en toegangssleutel.
arr(
	section: 'MessageBird',
	config: arr(originator: 'Originator (sender number or name)'),
	secret: arr(access_key: 'Access key'),
)
static

MessageBird :: errorMessage ($data, string $raw, int $status):string

line 23
Haal het foutbericht op uit de MessageBird API-respons, indien beschikbaar; anders valt het terug op de foutberichtmethode van de bovenliggende klasse.
if (is_object($data) && isset($data->errors[0]->description)) return (string)$data->errors[0]->description
return parent::errorMessage($data, $raw, $status)
method

%MessageBird -> sms ($to, $body, array $extra = []):obj

line 28
Verzendt een SMS-bericht naar de opgegeven ontvanger(s) met behulp van de MessageBird API, waarbij een toegangssleutel en originator-configuratie vereist zijn.
if ($m = $this->missing('access_key', 'originator')) return $m
$recipients = is_array($to) ? $to : [$to]
return $this->post('messages', ['originator' => $this->config['originator'], 'recipients' => $recipients, 'body' => $body] + $extra)
object

%MicrosoftGraph

/phlo/resources/connectors/cloud/MicrosoftGraph.phlo
version 1.0
creator q-ai.nl
summary Microsoft Graph connector (app-only client credentials): read users and calendars, send mail, create events
extends Connector
package connectors
frontend false
backend true
requires @Connector creds:Microsoft
tags microsoft graph office365 calendar mail connector
const

MicrosoftGraph :: section

line 11
Deze functie werkt samen met de Microsoft Graph API om secties binnen een resource te beheren.
'Microsoft'
method

%MicrosoftGraph -> base

line 13
Dit definieert de basis-URL voor toegang tot de Microsoft Graph API, waarmee interactie met Microsoft-diensten en -bronnen mogelijk is.
'https://graph.microsoft.com/v1.0'
method

%MicrosoftGraph -> headers

line 15
Dit item haalt de headers op die nodig zijn voor authenticatie met Microsoft Graph met behulp van een bearer-token.
[static::bearer((string)$this->token)]
static

MicrosoftGraph :: fields

line 17
Definieert de configuratievelden die nodig zijn om verbinding te maken met Microsoft Graph, inclusief tenant-ID, client-ID, mailbox, clientgeheim en applicatiepermissies.
arr(
	section: 'Microsoft',
	config: arr(
		tenant_id: 'Azure AD tenant ID',
		client_id: 'App registration client ID',
		mailbox: 'Default mailbox / user UPN for calendar and mail (optional)',
	),
	secret: arr(client_secret: 'App registration client secret'),
	scopes: 'Application permissions: User.Read.All, Calendars.ReadWrite, Mail.Send',
)
prop

%MicrosoftGraph -> token

line 28
Haal een toegangstoken op van Microsoft Graph met behulp van de fetchToken-methode.
$this->fetchToken()
method

%MicrosoftGraph -> fetchToken

line 30
Haalt een OAuth2-token op van Microsoft Graph met behulp van clientreferenties en cachet het token voor toekomstig gebruik als APCu beschikbaar is.
$tenant = $this->config['tenant_id'] ?? void
$id = $this->config['client_id'] ?? void
$secret = $this->config['client_secret'] ?? void
if ($tenant === void || $id === void || $secret === void) return void
$key = 'phlo:graph:'.$tenant.colon.$id
if (function_exists('apcu_fetch')){
	$cached = apcu_fetch($key)
	if ($cached) return $cached
}
$res = $this->dispatch(static::build('POST', 'https://login.microsoftonline.com/'.$tenant.'/oauth2/v2.0/token', null, [], null, ['grant_type' => 'client_credentials', 'client_id' => $id, 'client_secret' => $secret, 'scope' => 'https://graph.microsoft.com/.default']))
if (!$res->ok) return void
$token = $res->data->access_token ?? void
$expires = (int)($res->data->expires_in ?? 3600)
if ($token !== void && function_exists('apcu_store')) apcu_store($key, $token, max(60, $expires - 60))
return $token
method

%MicrosoftGraph -> mailbox ($user = null)

line 48
Haal de mailbox op die is gekoppeld aan een opgegeven gebruiker, of gebruik een geconfigureerde mailbox als er geen gebruiker is opgegeven.
$user ?? ($this->config['mailbox'] ?? void)
method

%MicrosoftGraph -> users (array $query = []):obj

line 50
Haal een lijst van gebruikers op uit Microsoft Graph op basis van de opgegeven queryparameters.
if ($m = $this->missing('tenant_id', 'client_id', 'client_secret')) return $m
return $this->get('users', $query)
method

%MicrosoftGraph -> user ($id):obj

line 55
Haal gebruikersinformatie op van Microsoft Graph met de opgegeven gebruikers-ID.
if ($m = $this->missing('tenant_id', 'client_id', 'client_secret')) return $m
return $this->get('users/'.rawurlencode((string)$id))
method

%MicrosoftGraph -> events ($user = null, array $query = []):obj

line 60
Haal evenementen op uit de Microsoft mailbox van een opgegeven gebruiker met behulp van de Microsoft Graph API.
if ($m = $this->missing('tenant_id', 'client_id', 'client_secret')) return $m
$mailbox = $this->mailbox($user)
if ($mailbox === void) return static::fail('Microsoft mailbox required')
return $this->get('users/'.rawurlencode((string)$mailbox).'/events', $query)
method

%MicrosoftGraph -> sendMail ($message, $user = null, bool $save = true):obj

line 67
Verzendt een e-mailbericht met behulp van de Microsoft Graph API, met de optie om een gebruiker op te geven en of het bericht in de map Verzonden Items moet worden opgeslagen.
if ($m = $this->missing('tenant_id', 'client_id', 'client_secret')) return $m
$mailbox = $this->mailbox($user)
if ($mailbox === void) return static::fail('Microsoft mailbox required')
return $this->post('users/'.rawurlencode((string)$mailbox).'/sendMail', ['message' => $message, 'saveToSentItems' => $save])
method

%MicrosoftGraph -> createEvent (array $event, $user = null):obj

line 74
Maakt een nieuwe gebeurtenis aan in de Microsoft-agenda van de opgegeven gebruiker met de verstrekte gebeurtenisdetails.
if ($m = $this->missing('tenant_id', 'client_id', 'client_secret')) return $m
$mailbox = $this->mailbox($user)
if ($mailbox === void) return static::fail('Microsoft mailbox required')
return $this->post('users/'.rawurlencode((string)$mailbox).'/events', $event)
object

%Moneybird

/phlo/resources/connectors/finance/Moneybird.phlo
version 1.0
creator q-ai.nl
summary Moneybird connector: read contacts and invoices, create sales invoices
extends Connector
package connectors
frontend false
backend true
requires @Connector creds:Moneybird
tags moneybird accounting invoices contacts connector
const

Moneybird :: section

line 11
Definieert een sectie binnen de Moneybird-integratie voor het organiseren van gerelateerde functionaliteiten.
'Moneybird'
method

%Moneybird -> base

line 13
Dit haalt de basis-URL voor de Moneybird API op, waarbij de administratie-ID uit de configuratie wordt opgenomen als deze beschikbaar is.
'https://moneybird.com/api/v2/'.($this->config['administration_id'] ?? void)
method

%Moneybird -> headers

line 15
Geeft de headers terug die nodig zijn voor authenticatie met de Moneybird API, met behulp van een bearer token dat is afgeleid van de toegangstoken in de configuratie.
[static::bearer($this->config['access_token'] ?? void)]
static

Moneybird :: fields

line 17
Definieert de velden voor de Moneybird-integratie, inclusief de administratie-ID en een persoonlijk toegangstoken voor toegang tot contacten en facturen.
arr(
	section: 'Moneybird',
	config: arr(administration_id: 'Administration ID'),
	secret: arr(access_token: 'Personal access token with read/write for contacts and invoices'),
)
method

%Moneybird -> contacts (array $query = []):obj

line 23
Haalt een lijst van contacten op uit Moneybird op basis van de opgegeven queryparameters.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->get('contacts.json', $query)
method

%Moneybird -> findContact ($query):obj

line 28
Zoekt een contact in Moneybird op basis van de opgegeven zoekopdracht en retourneert het eerste gevonden resultaat.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->get('contacts.json', ['query' => $query, 'per_page' => 1])
method

%Moneybird -> contact ($id):obj

line 33
Haal de contactinformatie op die is gekoppeld aan de opgegeven ID van Moneybird, waarbij een administratie-ID en toegangstoken vereist zijn.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->get('contacts/'.$id.'.json')
method

%Moneybird -> invoices (array $query = []):obj

line 38
Haalt facturen op uit Moneybird op basis van de opgegeven queryparameters, waarbij een 'administration_id' en 'access_token' vereist zijn.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->get('sales_invoices.json', $query)
method

%Moneybird -> createContact (array $contact):obj

line 43
Maakt een nieuw contact aan in Moneybird met de opgegeven contactgegevens. Het vereist een administratie-ID en toegangstoken om correct te functioneren.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->post('contacts.json', ['contact' => $contact])
method

%Moneybird -> createInvoice (array $invoice):obj

line 48
Maakt een nieuwe factuur aan in Moneybird met de opgegeven factuurgegevens.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->post('sales_invoices.json', ['sales_invoice' => $invoice])
object

%OAuthConnector

/phlo/resources/connectors/OAuthConnector.phlo
version 1.0
creator q-ai.nl
summary Base class for OAuth2 connectors: stored, auto-refreshed bearer access tokens via TokenStore, on the OAuth2 primitive
extends Connector
package connectors
frontend false
backend true
requires @Connector TokenStore
tags oauth oauth2 connector base token refresh
const

OAuthConnector :: tokenUrl

line 11
Geeft de URL op voor het verkrijgen van een OAuth-token.
void
method

%OAuthConnector -> oauthKey

line 13
Haalt de OAuth-sleutel op voor de huidige sectie in de OAuthConnector.
static::section
prop

%OAuthConnector -> token

line 15
Haal de OAuth-token op met de opgegeven referenties en ververs-token uit de TokenStore.
TokenStore::access($this->oauthKey, static::tokenUrl, $this->config['client_id'] ?? void, $this->config['client_secret'] ?? void, ['refresh_token' => $this->config['refresh_token'] ?? null])
method

%OAuthConnector -> headers

line 17
Geeft de headers terug die nodig zijn voor OAuth-authenticatie, inclusief een bearer-token afgeleid van de token van de instantie.
[static::bearer((string)$this->token)]
method

%OAuthConnector -> authed

line 19
Controleert of het OAuth-token is geauthenticeerd door te verifiëren dat het niet leeg is.
(string)$this->token !== void
object

%Resend

/phlo/resources/connectors/chat/Resend.phlo
version 1.0
creator q-ai.nl
summary Resend connector: send transactional email via the HTTP API
extends Connector
package connectors
frontend false
backend true
requires @Connector creds:Resend
tags resend email transactional messaging connector
const

Resend :: section

line 11
Resend::section stelt je in staat om een sectie in een Resend-resource te definiëren voor het organiseren van gerelateerde inhoud.
'Resend'
method

%Resend -> base

line 13
Stelt de basis-URL in voor de Resend API.
'https://api.resend.com'
method

%Resend -> headers

line 15
Stelt de headers in voor het Resend-verzoek met de opgegeven API-sleutel uit de configuratie.
[static::bearer($this->config['api_key'] ?? void)]
static

Resend :: fields

line 17
Definieert de velden voor de Resend-configuratie, inclusief het standaard afzender-e-mailadres en de API-sleutel.
arr(
	section: 'Resend',
	config: arr(from_email: 'Default sender, e.g. "App <noreply@yourdomain.com>"'),
	secret: arr(api_key: 'API key (re_...)'),
)
method

%Resend -> send ($to, $subject, $html = void, array $extra = []):obj

line 23
Verzendt een e-mail naar de opgegeven ontvanger(s) met het opgegeven onderwerp en optionele HTML-inhoud, met gebruik van het geconfigureerde afzender-e-mailadres.
if ($m = $this->missing('api_key', 'from_email')) return $m
$email = ['from' => $this->config['from_email'], 'to' => is_array($to) ? $to : [$to], 'subject' => $subject]
if ($html !== void) $email['html'] = $html
return $this->post('emails', $email + $extra)
object

%Shopify

/phlo/resources/connectors/shops/Shopify.phlo
version 1.0
creator q-ai.nl
summary Shopify Admin API connector: read customers, orders and products; create draft orders and products; update inventory
extends Connector
package connectors
frontend false
backend true
requires @Connector creds:Shopify
tags shopify webshop ecommerce orders products connector
const

Shopify :: section

line 11
Definieert een sectie in een Shopify-thema, waarmee aanpasbare inhoud en lay-out binnen de winkel mogelijk zijn.
'Shopify'
method

%Shopify -> base

line 13
Bouwt de basis-URL voor de Shopify API met behulp van het winkeldomein en de API-versie uit de configuratie.
'https://'.($this->config['shop_domain'] ?? void).'/admin/api/'.($this->config['api_version'] ?? '2024-01')
method

%Shopify -> headers

line 15
Dit haalt de headers op die nodig zijn voor Shopify API-authenticatie, inclusief het toegangstoken uit de configuratie.
['X-Shopify-Access-Token: '.($this->config['access_token'] ?? void)]
static

Shopify :: fields

line 17
Definieert de configuratievelden voor integratie met Shopify, inclusief winkel-domein, API-versie, toegangstoken en vereiste scopes.
arr(
	section: 'Shopify',
	config: arr(
		shop_domain: 'Shop domain, e.g. your-store.myshopify.com',
		api_version: 'Admin API version (optional, default 2024-01)',
	),
	secret: arr(access_token: 'Admin API access token (shpat_...)'),
	scopes: 'read_customers, read_orders, read_products, write_draft_orders, write_inventory',
)
method

%Shopify -> customers (array $query = []):obj

line 27
Haalt een lijst van klanten op uit Shopify met de opgegeven queryparameters.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->get('customers.json', $query)
method

%Shopify -> searchCustomers ($query, int $limit = 10):obj

line 32
Zoekt naar klanten in Shopify op basis van een zoekopdracht en een optionele limiet voor het aantal geretourneerde resultaten.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->get('customers/search.json', ['query' => $query, 'limit' => $limit])
method

%Shopify -> customer ($id):obj

line 37
Haalt klantinformatie op uit Shopify met behulp van de opgegeven klant-ID.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->get('customers/'.$id.'.json')
method

%Shopify -> orders (array $query = []):obj

line 42
Haal een lijst van bestellingen op uit Shopify op basis van de opgegeven queryparameters.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->get('orders.json', $query)
method

%Shopify -> products (array $query = []):obj

line 47
Haalt een lijst van producten op uit Shopify met de opgegeven queryparameters.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->get('products.json', $query)
method

%Shopify -> createDraftOrder (array $order):obj

line 52
Maakt een conceptorder aan in Shopify met de opgegeven orderdetails.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->post('draft_orders.json', ['draft_order' => $order])
method

%Shopify -> createProduct (array $product):obj

line 57
Maakt een nieuw product aan in Shopify met de opgegeven productdetails.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->post('products.json', ['product' => $product])
method

%Shopify -> setInventory ($inventoryItemId, $locationId, int $available):obj

line 62
Stelt het beschikbare voorraadniveau in voor een specifiek voorraaditem op een bepaalde locatie in Shopify.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->post('inventory_levels/set.json', ['inventory_item_id' => $inventoryItemId, 'location_id' => $locationId, 'available' => $available])
object

%Slack

/phlo/resources/connectors/chat/Slack.phlo
version 1.0
creator q-ai.nl
summary Slack connector: post messages, read channel history and list channels
extends Connector
package connectors
frontend false
backend true
requires @Connector creds:Slack
tags slack messaging chat connector
const

Slack :: section

line 11
Maakt een sectieblok in een Slack-bericht, waarmee tekst en andere elementen kunnen worden opgenomen.
'Slack'
const

Slack :: api

line 12
Dit item biedt toegang tot de Slack API, waarmee integratie met Slack-diensten en functionaliteiten mogelijk is.
'https://slack.com/api'
method

%Slack -> headers

line 14
Geeft de headers terug die nodig zijn voor authenticatie bij het maken van verzoeken aan de Slack API met een bearer token.
[static::bearer($this->config['bot_token'] ?? void)]
static

Slack :: fields

line 16
Definieert de configuratievelden voor integratie met Slack, inclusief de bot-token, handtekeningsecreet en vereiste scopes.
arr(
	section: 'Slack',
	secret: arr(
		bot_token: 'Bot user OAuth token (xoxb-...)',
		signing_secret: 'Signing secret for inbound webhook verification (optional)',
	),
	scopes: 'chat:write, channels:history, channels:read',
)
method

%Slack -> result (obj $res):obj

line 25
Verwerkt het resultaat van een Slack API-aanroep en retourneert de respons als deze succesvol is of een foutmelding als er een fout is opgetreden.
if (!$res->ok) return $res
$data = $res->data
if (is_object($data) && ($data->ok ?? null) === false) return static::fail($data->error ?? 'Slack API error', $res->status)
return $res
method

%Slack -> send ($channel, $text, array $extra = []):obj

line 32
Verzendt een bericht naar een opgegeven Slack-kanaal met behulp van de Slack API. Het vereist een geconfigureerde bot-token en accepteert aanvullende parameters via een array.
if (!$this->configured('bot_token')) return static::fail('Slack bot_token not configured')
return $this->result($this->post('chat.postMessage', ['channel' => $channel, 'text' => $text] + $extra))
method

%Slack -> history ($channel, int $limit = 20):obj

line 37
Haalt de berichtgeschiedenis op van een opgegeven Slack-kanaal, met een optionele limiet op het aantal geretourneerde berichten.
if (!$this->configured('bot_token')) return static::fail('Slack bot_token not configured')
return $this->result($this->get('conversations.history', ['channel' => $channel, 'limit' => $limit]))
method

%Slack -> channels (int $limit = 100, string $types = 'public_channel'):obj

line 42
Haal een lijst van kanalen op uit Slack, met optionele parameters om het aantal kanalen te beperken en de types kanalen op te geven die moeten worden geretourneerd.
if (!$this->configured('bot_token')) return static::fail('Slack bot_token not configured')
return $this->result($this->get('conversations.list', ['limit' => $limit, 'types' => $types]))
object

%Telegram

/phlo/resources/connectors/chat/Telegram.phlo
version 1.0
creator q-ai.nl
summary Telegram Bot API connector: send messages, photos and documents; poll updates
extends Connector
package connectors
frontend false
backend true
requires @Connector creds:Telegram
tags telegram bot messaging chat connector
const

Telegram :: section

line 11
Definieert een sectie binnen een Telegram-resource, waardoor gerelateerde inhoud georganiseerd kan worden gegroepeerd.
'Telegram'
method

%Telegram -> base

line 13
Stelt de basis-URL voor de Telegram Bot API samen met de opgegeven bot-token uit de configuratie.
'https://api.telegram.org/bot'.($this->config['bot_token'] ?? void)
static

Telegram :: fields

line 15
Definieert de velden met betrekking tot de Telegram-configuratie, inclusief de bot-token en een optionele webhook-geheim voor verificatie.
arr(
	section: 'Telegram',
	secret: arr(
		bot_token: 'Bot token from BotFather',
		webhook_secret: 'Webhook secret token for inbound verification (optional)',
	),
	help: 'Create a bot via BotFather and store its token. The chat_id is the recipient or chat to message.',
)
method

%Telegram -> result (obj $res):obj

line 24
Verwerkt het resultaat van een Telegram API-respons en retourneert de respons als deze succesvol is of een foutmelding als er een fout wordt gedetecteerd.
if (!$res->ok) return $res
$data = $res->data
if (is_object($data) && ($data->ok ?? null) === false) return static::fail($data->description ?? 'Telegram API error', $res->status)
return $res
method

%Telegram -> send ($chatId, $text, array $extra = []):obj

line 31
Verzendt een bericht naar een opgegeven Telegram-chat met behulp van de opgegeven chat-ID en tekst, met optionele extra parameters.
if ($m = $this->missing('bot_token')) return $m
return $this->result($this->post('sendMessage', ['chat_id' => $chatId, 'text' => $text] + $extra))
method

%Telegram -> photo ($chatId, $photo, $caption = void, array $extra = []):obj

line 36
Verzendt een foto naar een opgegeven Telegram-chat met een optionele bijschrift en extra parameters.
if ($m = $this->missing('bot_token')) return $m
$payload = ['chat_id' => $chatId, 'photo' => $photo]
if ($caption !== void) $payload['caption'] = $caption
return $this->result($this->post('sendPhoto', $payload + $extra))
method

%Telegram -> document ($chatId, $document, $caption = void, array $extra = []):obj

line 43
Verzendt een document naar een opgegeven chat op Telegram, met optioneel een bijschrift en extra parameters.
if ($m = $this->missing('bot_token')) return $m
$payload = ['chat_id' => $chatId, 'document' => $document]
if ($caption !== void) $payload['caption'] = $caption
return $this->result($this->post('sendDocument', $payload + $extra))
method

%Telegram -> updates (int $offset = 0, int $limit = 100):obj

line 50
Haal updates op van de Telegram bot API, met paginering via de parameters 'offset' en 'limit'.
if ($m = $this->missing('bot_token')) return $m
return $this->result($this->get('getUpdates', ['offset' => $offset, 'limit' => $limit]))
object

%TokenStore

/phlo/resources/connectors/TokenStore.phlo
version 1.0
creator q-ai.nl
summary Persisted OAuth2 token store with automatic refresh via the OAuth2 resource
package connectors
frontend false
backend true
requires OAuth2
tags oauth oauth2 token refresh store credentials
static

TokenStore :: path ($key):string

line 10
De TokenStore::$path-eigenschap definieert het bestandspad voor het opslaan van tokengegevens, geformatteerd als een JSON-bestand op basis van een gesaniteerde versie van de opgegeven sleutel.
data.'tokens/'.preg_replace('/[^a-z0-9_.-]+/i', us, (string)$key).'.json'
static

TokenStore :: read ($key):array

line 12
Leest een token uit de TokenStore op basis van de sleutel en retourneert een array van tokens als het bestand bestaat en toegankelijk is.
$file = static::path($key)
if (!is_file($file)) return []
@chmod(data.'tokens', 0700)
@chmod($file, 0600)
return (array)json_read($file, true)
static

TokenStore :: write ($key, array $token):void

line 20
Deze methode schrijft een token naar een specifiek bestand in een veilige map, waarbij ervoor wordt gezorgd dat de map en het bestand de juiste machtigingen hebben.
$dir = data.'tokens'
is_dir($dir) || mkdir($dir, 0700, true)
@chmod($dir, 0700)
$file = static::path($key)
json_write($file, $token)
@chmod($file, 0600)
static

TokenStore :: valid (array $token):bool

line 29
Controleert of het toegangstoken geldig is door te verifiëren of het bestaat en niet is verlopen, met een buffer van 30 seconden voor de vervaldatum.
($token['access_token'] ?? void) !== void && (int)($token['expires_at'] ?? 0) > time() + 30
static

TokenStore :: store ($res, $refresh):array

line 31
Slaat het toegangstoken, het vernieuwings-token en de vervaltijd op voor authenticatiedoeleinden.
$token = [
	'access_token' => $res['access_token'],
	'refresh_token' => $res['refresh_token'] ?? $refresh,
	'expires_at' => time() + (int)($res['expires_in'] ?? 3600),
]
return $token
static

TokenStore :: lock ($key)

line 42
TokenStore::$lock beheert een op bestanden gebaseerde vergrendelingsmechanisme voor tokenopslag, waardoor exclusieve toegang tot het tokenbestand tijdens bewerkingen wordt gegarandeerd.
$dir = data.'tokens'
is_dir($dir) || mkdir($dir, 0700, true)
$lock = @fopen(static::path($key).'.lock', 'c')
if (!$lock || !flock($lock, LOCK_EX)){
	$lock && fclose($lock)
	return null
}
return $lock
static

TokenStore :: access ($key, $tokenUrl, $clientId, $clientSecret, array $seed = []):?string

line 53
Haal het toegangstoken op uit de TokenStore en vernieuw het indien nodig met behulp van het vernieuwings-token.
$token = static::read($key)
if (static::valid($token)) return $token['access_token']
$lock = static::lock($key)
if (!$lock) return null
try {
	$token = static::read($key)
	if (!($token['refresh_token'] ?? null) && ($seed['refresh_token'] ?? null)){
		$token = ['refresh_token' => $seed['refresh_token']]
		static::write($key, $token)
	}
	if (static::valid($token)) return $token['access_token']
	$refresh = $token['refresh_token'] ?? null
	if (!$refresh || !$tokenUrl || !$clientId) return null
	$res = OAuth2::refresh($tokenUrl, $clientId, $clientSecret, $refresh)
	if (!($res['access_token'] ?? null)) return null
	$token = static::store($res, $refresh)
	static::write($key, $token)
	return $token['access_token']
} finally {
	flock($lock, LOCK_UN)
	fclose($lock)
}
object

%Twilio

/phlo/resources/connectors/chat/Twilio.phlo
version 1.0
creator q-ai.nl
summary Twilio connector: send SMS and read message status
extends Connector
package connectors
frontend false
backend true
requires @Connector creds:Twilio
tags twilio sms messaging connector
const

Twilio :: section

line 11
Definieert een sectie voor Twilio-integratie binnen een Phlo-toepassing.
'Twilio'
method

%Twilio -> base

line 13
Bouwt de basis-URL voor toegang tot de Twilio API met de account SID uit de configuratie.
'https://api.twilio.com/2010-04-01/Accounts/'.($this->config['account_sid'] ?? void)
method

%Twilio -> headers

line 15
Haal de headers op die nodig zijn voor Twilio API-aanvragen met behulp van de opgegeven account SID en auth token uit de configuratie.
[static::basic($this->config['account_sid'] ?? void, $this->config['auth_token'] ?? void)]
static

Twilio :: fields

line 17
Definieert de velden voor het configureren van Twilio-integratie, inclusief account SID, afzendernummer en optionele messaging service SID, samen met het authenticatietoken.
arr(
	section: 'Twilio',
	config: arr(
		account_sid: 'Account SID (ACxxxx)',
		from_number: 'Sender number in E.164, e.g. +31600000000 (use this or messaging_service_sid)',
		messaging_service_sid: 'Messaging Service SID (optional alternative to from_number)',
	),
	secret: arr(auth_token: 'Auth token'),
)
method

%Twilio -> sms ($to, $body, array $extra = []):obj

line 27
Verzendt een SMS-bericht met behulp van de Twilio API, waarbij ofwel een from_number of messaging_service_sid uit de configuratie vereist is.
if ($m = $this->missing('account_sid', 'auth_token')) return $m
$from = $this->config['from_number'] ?? void
$service = $this->config['messaging_service_sid'] ?? void
if ($from === void && $service === void) return static::fail('Twilio from_number or messaging_service_sid required')
$fields = ['To' => $to, 'Body' => $body] + $extra
if ($service !== void) $fields['MessagingServiceSid'] = $service
else $fields['From'] = $from
return $this->form('Messages.json', $fields)
method

%Twilio -> message ($sid):obj

line 38
Haalt een bericht op van Twilio met de opgegeven message SID.
if ($m = $this->missing('account_sid', 'auth_token')) return $m
return $this->get('Messages/'.$sid.'.json')

We gebruiken essentiële cookies om deze site te laten werken. Met uw toestemming gebruiken we ook analytics om de site te verbeteren.