Congratulations on completing (the first version of) your Luzmo plugin connector development! Before you launch it in production, please take a moment to ensure your plugin implementation aligns perfectly with our specifications and follows the best practices. To make this process easy for you, we've put together a comprehensive checklist below. Let's dive in and make sure your plugin is primed for success 🚀
3.0.0 (more info here), and might require an optional feature to be enabled. These checks are indicated in a similar way as this remark, and list the specific requirement(s).v3.0.0 checks
'X-Property-<Property>' authentication header value(s) as cache keys. These are often heavy database queries with rarely any changes. See this Academy article for a more detailed explanation.'X-Property-<Property>' header(s)user.metadata in the request body'X-Secret' header in the request! You should use this to verify that the request is coming from Luzmo. You can find more information about plugin secrets in this Academy article.'X-Secret' header in the request! You should use this to verify that the request is coming from Luzmo. You can find more information about plugin secrets in this Academy article."numeric""datetime""hierarchy""currency", "duration", etc. More information about these special data types in this Academy article.
This check is only applicable to plugins that implement plugin specification 3.0.0.
"date" (Luzmo will never apply timezone shifts on "date" columns), or as a "datetime" (Luzmo will only apply timezone shifts for time-level responses). A checkbox below verifies that your plugin's /query endpoint correctly applies timezone shifts when expected."subtype" property in the response set to either "date" or "datetime". If not specified, Luzmo will assume the column is of subtype "datetime", but you can always change this afterwards in the Luzmo dataset itself."subtype" property for hierarchy and numeric columns, or set it to null.'Content-Type': 'application/json'. You can see an example here.This check is only applicable to plugins that implement plugin specification 3.0.0.
"columns" property in the response body) when no list of table identifier is specified in the "ids" property of the request body. Optionally, you can also further limit search results by using the "search" property in the request body."columns" property, if necessary.This check is only applicable to plugins that implement plugin specification 3.0.0.
"id" property in the request).'X-Secret' header in the request! You should use this to verify that the request is coming from Luzmo. You can find more information about plugin secrets in this Academy article.id property indicates from which dataset Luzmo expects data to be returned.'Content-Type': 'application/json': the payload consists of an array of arrays, where each inner array represents a row of data."Text value")."2020-12-31T01:23:45.678Z").1.25647).null row values are supported by Luzmo; the plugin is expected to return them as null values in the response.'Content-Type': 'application/json' payload like below:{
"type": {
"code": 500,
"description": "Internal Server Error"
},
"message": "<message_displayed_upon_query_failed>"
}
columns property of the request, in the same order. Your plugin should also support querying the same column multiple times.options.pushdown property in the request is true. Otherwise, Luzmo expects the plugin to return row-level data for the columns requested."year""quarter""month""week""day""hour""minute""second""millisecond""day","week", "month", "quarter" and "year", we expect the plugin to apply the appropriate timezone shift as indicated by the options.timezone_id property (this is a timezone id from the IANA timezone database). We do still expect UTC RFC3339 date string values to be returned. "2023-01-01T00:00:00.000Z" on "day" level (assuming the column is of subtype "datetime"), we expect the following response:
"Etc/UTC", we expect a value "2023-01-01T00:00:00.000Z" to be returned."Japan" (i.e. "UTC+9"), we expect a value "2023-01-01T00:00:00.000Z" to be returned."US/Hawaii" (i.e. "UTC-10"), we expect a value "2022-12-31T00:00:00.000Z" to be returned (i.e. the previous day, due to timezone shift)."day" (i.e. "hour", "minute", etc.), Luzmo will apply the appropriate timezone shift after data retrieval (the plugin is expected to query and return UTC RFC3339 date string values). "2023-01-01T00:00:00.000Z" on "hour" level (assuming the column is of subtype "datetime"), we expect the response to always be the same for any timezone: the source UTC value "2023-01-01T00:00:00.000Z".
"sum""count""min""max""count" of column_id "*": this should count all rows of the (filtered) dataset.
This check is only applicable to plugins that implement plugin specification 3.0.0, and have enabled the property "supports_distinctcount": true.
"=""><"">="">""<""<=""is null""is not null""in""not in""is null" and "is not null", which do not provide a value). When querying data from your source, you should ensure that filters are applied according to the specified filter expression and the source data type (e.g. use boolean filter values on boolean columns, instead of numeric/text values).null values than Luzmo, as comparisons to null are tri-state. E.g.:
"in" with values ['a', null] should result in a query like '<column_name>' IN ('a') OR '<column_name>' IS NULL. This ensures that possible null values are appropriately returned by the query."not in" with values ['a'] should result in a query like '<column_name>' NOT IN ('a') OR '<column_name>' IS NULL. This ensures that possible null values are appropriately returned by the query."not in" with values ['a', null] should result in a query like '<column_name>' NOT IN ('a') AND '<column_name>' IS NOT NULL. This ensures that possible null values are excluded by the query.This check is only applicable to plugins that implement plugin specification 3.0.0, and have enabled the property "supports_like": true.
"ilike" and "not ilike" filter expressions in the /query request will expect your plugin to filter the referenced column(s) to only values that do (not) contain a specific text value."%" is used as a wildcard character at the beginning and/or end of the text value to filter to"contains", "starts with", "ends with", etc. will result in a "ilike" or "not ilike" Plugin filter expression.This check is only applicable to plugins that implement plugin specification 3.0.0, and have enabled the property "supports_join": true.
"join" property in the /query request will indicate which relations exist in Luzmo between the referenced datasets in the query. Next to that, each column reference will contain both a dataset_id (canonical dataset identifier) and a column_id (canonical column identifier) to ensure uniquely identifiable columns."lookup" or type "exists":
"lookup" joins retrieve exactly zero or one row from the lookup dataset, based on the join criteria. The "criteria" property for these join types will list the "many"->"one" links that have been defined in Luzmo between two datasets (i.e. the first dataset listed in each criterion is the "many" dataset, the second dataset is the "one" dataset)."exists" joins retrieve only rows from the lookup dataset, where the "many" dataset has at least one matching row, based on the join criteria. The "criteria" property for these join types will list the "one"<-"many" links that have been defined in Luzmo between two datasets (i.e. the first dataset listed in each criterion is the "one" dataset, the second dataset is the "many" dataset).3.0.0" features like "Distinct count" and "Order and Limit" could also reference linked datasets' columns.This check is only applicable to plugins that implement plugin specification 3.0.0, and have enabled the property "supports_order_limit": true.
"order" list property in the /query request will indicate on which column(s) the result should be sorted, as well as in which order and direction."limit" property in the request will indicate which offset should be applied on the resultset (in the "limit.offset" property), as well as how much rows should be returned from there (in the "limit.by" property).These checks are only useful for plugins that use OAuth2 authentication.
'Content-Type': 'application/json' and the property "auth_url". This URL will be used by Luzmo to redirect the user to start the OAuth2 connect, and is expected to be of a similar format as the following example: https://www.facebook.com/v3.0/dialog/oauth?client_id=<your_OAuth2_application_id>&redirect_uri=https%3A%2F%2Fapp.luzmo.com%2Fstart%2Fconnect%2F<your_Luzmo_plugin_slug>
'X-Secret' header to ensure the request is coming from us, see this Academy article). In the JSON body of the request, we will include a code property from the authorization, which you can now exchange in your plugin for an OAuth2 identifier, access token, and refresh token. The access and refresh token are expected to be returned as a JSON response in the access_token and refresh_token properties:{
"access_token": "<received_oauth2_access_token>",
"refresh_token": "<received_oauth2_refresh_token>"
}'X-token' header.'X-Property-<Property>' headers in each request.That's it, you've successfully managed to create a production-ready plugin! Time to enjoy the result by creating some dashboards on your first dataset(s) 🎉