connectors
object
%Connector
/phlo/resources/connectors/Connector.phlo
const
Connector :: section
line 10
Definieert een sectie binnen een Connector, waarmee gerelateerde componenten en functionaliteiten kunnen worden georganiseerd.
voidconst
Connector :: api
line 11
Definieert een connector voor API-interacties, waardoor naadloze communicatie tussen verschillende diensten mogelijk is.
voidmethod
%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 = 0static
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::apimethod
%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 truemethod
%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 '.$tokenstatic
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 '.$statusstatic
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 * $attemptmethod
%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 $resultmethod
%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 $itemsobject
%EBoekhouden
/phlo/resources/connectors/finance/EBoekhouden.phlo
const
EBoekhouden :: section
line 11
'EBoekhouden'const
EBoekhouden :: api
line 12
'https://api.e-boekhouden.nl/v1'prop
%EBoekhouden -> sessionToken
line 14
voidmethod
%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 : $resmethod
%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
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
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
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
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
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
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 $tokenmethod
%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
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
const
OAuthConnector :: tokenUrl
line 11
Geeft de URL op voor het verkrijgen van een OAuth-token.
voidmethod
%OAuthConnector -> oauthKey
line 13
Haalt de OAuth-sleutel op voor de huidige sectie in de OAuthConnector.
static::sectionprop
%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 !== voidobject
%Resend
/phlo/resources/connectors/chat/Resend.phlo
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
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
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 $resmethod
%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
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 $resmethod
%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
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() + 30static
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 $tokenstatic
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 $lockstatic
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
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')