saleor-marketplace/surrealdb/schema.surql
2024-10-30 19:22:23 +01:00

284 lines
13 KiB
Text

#TODO:
# - precomputed view for landing page https://surrealdb.com/docs/surrealql/statements/define/table#pre-computed-table-views
# - Oauth for github
# - passwords and sign in
# - system user for frontend with EDITOR role scoped to only this db https://surrealdb.com/docs/surrealql/statements/define/user#roles
# - search function https://surrealdb.com/learn/fundamentals/performance/index-data-model#full-text-search-indexes
REMOVE NAMESPACE saleor_marketplace;
REMOVE DATABASE main;
DEFINE NAMESPACE saleor_marketplace;
DEFINE DATABASE main;
USE NS saleor_marketplace;
USE DB main;
DEFINE TABLE dashboard TYPE ANY SCHEMALESS
PERMISSIONS
FOR select
WHERE true
FOR create, update, delete
WHERE id.id()[0] = $auth.id OR $auth.admin = true
;
DEFINE FIELD versions ON dashboard TYPE array<string>
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE versions[*] ON dashboard TYPE string ASSERT string::is::semver($value)
PERMISSIONS FULL
;
DEFINE FIELD current_version ON dashboard TYPE string ASSERT string::is::semver($value)
PERMISSIONS FULL
;
DEFINE FIELD updated_at ON dashboard TYPE datetime VALUE time::now() ASSERT string::is::datetime($value)
PERMISSIONS FULL
;
DEFINE FIELD created_at ON dashboard TYPE datetime DEFAULT time::now() ASSERT string::is::datetime($value)
PERMISSIONS FULL
;
DEFINE FIELD images ON dashboard TYPE array<string>
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE images[*] ON dashboard TYPE string ASSERT string::is::url($value)
PERMISSIONS FULL
;
DEFINE FIELD is_verified ON dashboard TYPE bool
PERMISSIONS FULL
;
DEFINE FIELD supported_deployments ON dashboard TYPE array<'Docker' | 'Podman' | 'Linux' | 'Windows' | 'MacOS' | 'WASM'>
PERMISSIONS FULL
;
DEFINE FIELD built_for_url ON dashboard TYPE option<string>
PERMISSIONS FULL
;
DEFINE FIELD minimal_docker_compose ON dashboard TYPE option<string>
PERMISSIONS FULL
;
DEFINE TABLE storefront TYPE ANY SCHEMALESS
PERMISSIONS
FOR select
WHERE true
FOR create, update, delete
WHERE id.id()[0] = $auth.id OR $auth.admin = true
;
DEFINE FIELD versions ON storefront TYPE array<string>
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE versions[*] ON storefront TYPE string ASSERT string::is::semver($value)
PERMISSIONS FULL
;
DEFINE FIELD current_version ON storefront TYPE string ASSERT string::is::semver($value)
PERMISSIONS FULL
;
DEFINE FIELD updated_at ON storefront TYPE datetime VALUE time::now() ASSERT string::is::datetime($value)
PERMISSIONS FULL
;
DEFINE FIELD created_at ON storefront TYPE datetime DEFAULT time::now() ASSERT string::is::datetime($value)
PERMISSIONS FULL
;
DEFINE FIELD images ON storefront TYPE array<string>
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE images[*] ON storefront TYPE string ASSERT string::is::url($value)
PERMISSIONS FULL
;
DEFINE FIELD is_verified ON storefront TYPE bool
PERMISSIONS FULL
;
DEFINE FIELD supported_deployments ON storefront TYPE array<'Docker' | 'Podman' | 'Linux' | 'Windows' | 'MacOS' | 'WASM'>
PERMISSIONS FULL
;
DEFINE FIELD built_for_url ON storefront TYPE option<string>
PERMISSIONS FULL
;
DEFINE FIELD minimal_docker_compose ON storefront TYPE option<string>
PERMISSIONS FULL
;
DEFINE TABLE app TYPE ANY SCHEMALESS
PERMISSIONS
FOR select
WHERE true
FOR create, update, delete
WHERE id.id()[0] = $auth.id OR $auth.admin = true
;
DEFINE FIELD versions ON app TYPE array<string>
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE versions[*] ON app TYPE string ASSERT string::is::semver($value)
PERMISSIONS FULL
;
DEFINE FIELD current_version ON app TYPE string ASSERT string::is::semver($value)
PERMISSIONS FULL
;
DEFINE FIELD updated_at ON app TYPE datetime VALUE time::now() ASSERT string::is::datetime($value)
PERMISSIONS FULL
;
DEFINE FIELD created_at ON app TYPE datetime DEFAULT time::now() ASSERT string::is::datetime($value)
PERMISSIONS FULL
;
DEFINE FIELD images ON app TYPE array<string>
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE images[*] ON app TYPE string ASSERT string::is::url($value)
PERMISSIONS FULL
;
DEFINE FIELD manifest ON app TYPE {
about: option<string>,
app_permissions: array<'MANAGE_USERS' | 'MANAGE_STAFF' | 'IMPERSONATE_USER' | 'MANAGE_OBSERVABILITY' | 'MANAGE_CHECKOUTS' | 'HANDLE_CHECKOUTS' | 'HANDLE_TAXES' | 'MANAGE_TAXES' | 'MANAGE_CHANNELS' | 'MANAGE_DISCOUNTS' | 'MANAGE_GIFT_CARD' | 'MANAGE_MENUS' | 'MANAGE_ORDERS' | 'MANAGE_ORDERS_IMPORT' | 'MANAGE_PAGES' | 'MANAGE_PAGE_TYPES_AND_ATTRIBUTES' | 'HANDLE_PAYMENTS' | 'MANAGE_PLUGINS' | 'MANAGE_PRODUCTS' | 'MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES' | 'MANAGE_SHIPPING' | 'MANAGE_SETTINGS' | 'MANAGE_TRANSLATIONS' | 'MANAGE_APPS'>,
app_url: string,
author: option<string>,
brand: option<{
logo: {
default: string
}
}>,
configuration_url: option<string>,
data_privacy: option<string>,
data_privacy_url: option<string>,
extensions: option<array<{
label: string,
mount: 'PRODUCT_DETAILS_MORE_ACTIONS' | 'PRODUCT_OVERVIEW_CREATE' | 'PRODUCT_OVERVIEW_MORE_ACTIONS' | 'NAVIGATION_CATALOG' | 'NAVIGATION_ORDERS' | 'NAVIGATION_CUSTOMERS' | 'NAVIGATION_DISCOUNTS' | 'NAVIGATION_TRANSLATIONS' | 'NAVIGATION_PAGES' | 'ORDER_DETAILS_MORE_ACTIONS' | 'ORDER_OVERVIEW_CREATE' | 'ORDER_OVERVIEW_MORE_ACTIONS',
permissions: array<'MANAGE_USERS' | 'MANAGE_STAFF' | 'IMPERSONATE_USER' | 'MANAGE_OBSERVABILITY' | 'MANAGE_CHECKOUTS' | 'HANDLE_CHECKOUTS' | 'HANDLE_TAXES' | 'MANAGE_TAXES' | 'MANAGE_CHANNELS' | 'MANAGE_DISCOUNTS' | 'MANAGE_GIFT_CARD' | 'MANAGE_MENUS' | 'MANAGE_ORDERS' | 'MANAGE_ORDERS_IMPORT' | 'MANAGE_PAGES' | 'MANAGE_PAGE_TYPES_AND_ATTRIBUTES' | 'HANDLE_PAYMENTS' | 'MANAGE_PLUGINS' | 'MANAGE_PRODUCTS' | 'MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES' | 'MANAGE_SHIPPING' | 'MANAGE_SETTINGS' | 'MANAGE_TRANSLATIONS' | 'MANAGE_APPS'>,
target: 'Popup' | 'AppPage',
url: string
}>>,
homepage_url: option<string>,
id: string,
name: string,
required_saleor_version: option<string>,
support_url: option<string>,
token_target_url: string,
version: string,
webhooks: option<array<{
async_events: option<array<'ANY_EVENTS' | 'ACCOUNT_CONFIRMATION_REQUESTED' | 'ACCOUNT_CHANGE_EMAIL_REQUESTED' | 'ACCOUNT_EMAIL_CHANGED' | 'ACCOUNT_SET_PASSWORD_REQUESTED' | 'ACCOUNT_CONFIRMED' | 'ACCOUNT_DELETE_REQUESTED' | 'ACCOUNT_DELETED' | 'ADDRESS_CREATED' | 'ADDRESS_UPDATED' | 'ADDRESS_DELETED' | 'APP_INSTALLED' | 'APP_UPDATED' | 'APP_DELETED' | 'APP_STATUS_CHANGED' | 'ATTRIBUTE_CREATED' | 'ATTRIBUTE_UPDATED' | 'ATTRIBUTE_DELETED' | 'ATTRIBUTE_VALUE_CREATED' | 'ATTRIBUTE_VALUE_UPDATED' | 'ATTRIBUTE_VALUE_DELETED' | 'CATEGORY_CREATED' | 'CATEGORY_UPDATED' | 'CATEGORY_DELETED' | 'CHANNEL_CREATED' | 'CHANNEL_UPDATED' | 'CHANNEL_DELETED' | 'CHANNEL_STATUS_CHANGED' | 'CHANNEL_METADATA_UPDATED' | 'GIFT_CARD_CREATED' | 'GIFT_CARD_UPDATED' | 'GIFT_CARD_DELETED' | 'GIFT_CARD_SENT' | 'GIFT_CARD_STATUS_CHANGED' | 'GIFT_CARD_METADATA_UPDATED' | 'GIFT_CARD_EXPORT_COMPLETED' | 'MENU_CREATED' | 'MENU_UPDATED' | 'MENU_DELETED' | 'MENU_ITEM_CREATED' | 'MENU_ITEM_UPDATED' | 'MENU_ITEM_DELETED' | 'ORDER_CREATED' | 'ORDER_CONFIRMED' | 'ORDER_PAID' | 'ORDER_FULLY_PAID' | 'ORDER_REFUNDED' | 'ORDER_FULLY_REFUNDED' | 'ORDER_UPDATED' | 'ORDER_CANCELLED' | 'ORDER_EXPIRED' | 'ORDER_FULFILLED' | 'ORDER_METADATA_UPDATED' | 'ORDER_BULK_CREATED' | 'FULFILLMENT_CREATED' | 'FULFILLMENT_CANCELED' | 'FULFILLMENT_APPROVED' | 'FULFILLMENT_METADATA_UPDATED' | 'FULFILLMENT_TRACKING_NUMBER_UPDATED' | 'DRAFT_ORDER_CREATED' | 'DRAFT_ORDER_UPDATED' | 'DRAFT_ORDER_DELETED' | 'SALE_CREATED' | 'SALE_UPDATED' | 'SALE_DELETED' | 'SALE_TOGGLE' | 'PROMOTION_CREATED' | 'PROMOTION_UPDATED' | 'PROMOTION_DELETED' | 'PROMOTION_STARTED' | 'PROMOTION_ENDED' | 'PROMOTION_RULE_CREATED' | 'PROMOTION_RULE_UPDATED' | 'PROMOTION_RULE_DELETED' | 'INVOICE_REQUESTED' | 'INVOICE_DELETED' | 'INVOICE_SENT' | 'CUSTOMER_CREATED' | 'CUSTOMER_UPDATED' | 'CUSTOMER_DELETED' | 'CUSTOMER_METADATA_UPDATED' | 'COLLECTION_CREATED' | 'COLLECTION_UPDATED' | 'COLLECTION_DELETED' | 'COLLECTION_METADATA_UPDATED' | 'PRODUCT_CREATED' | 'PRODUCT_UPDATED' | 'PRODUCT_DELETED' | 'PRODUCT_METADATA_UPDATED' | 'PRODUCT_EXPORT_COMPLETED' | 'PRODUCT_MEDIA_CREATED' | 'PRODUCT_MEDIA_UPDATED' | 'PRODUCT_MEDIA_DELETED' | 'PRODUCT_VARIANT_CREATED' | 'PRODUCT_VARIANT_UPDATED' | 'PRODUCT_VARIANT_DELETED' | 'PRODUCT_VARIANT_METADATA_UPDATED' | 'PRODUCT_VARIANT_OUT_OF_STOCK' | 'PRODUCT_VARIANT_BACK_IN_STOCK' | 'PRODUCT_VARIANT_STOCK_UPDATED' | 'CHECKOUT_CREATED' | 'CHECKOUT_UPDATED' | 'CHECKOUT_FULLY_PAID' | 'CHECKOUT_METADATA_UPDATED' | 'NOTIFY_USER' | 'PAGE_CREATED' | 'PAGE_UPDATED' | 'PAGE_DELETED' | 'PAGE_TYPE_CREATED' | 'PAGE_TYPE_UPDATED' | 'PAGE_TYPE_DELETED' | 'PERMISSION_GROUP_CREATED' | 'PERMISSION_GROUP_UPDATED' | 'PERMISSION_GROUP_DELETED' | 'SHIPPING_PRICE_CREATED' | 'SHIPPING_PRICE_UPDATED' | 'SHIPPING_PRICE_DELETED' | 'SHIPPING_ZONE_CREATED' | 'SHIPPING_ZONE_UPDATED' | 'SHIPPING_ZONE_DELETED' | 'SHIPPING_ZONE_METADATA_UPDATED' | 'STAFF_CREATED' | 'STAFF_UPDATED' | 'STAFF_DELETED' | 'STAFF_SET_PASSWORD_REQUESTED' | 'TRANSACTION_ITEM_METADATA_UPDATED' | 'TRANSLATION_CREATED' | 'TRANSLATION_UPDATED' | 'WAREHOUSE_CREATED' | 'WAREHOUSE_UPDATED' | 'WAREHOUSE_DELETED' | 'WAREHOUSE_METADATA_UPDATED' | 'VOUCHER_CREATED' | 'VOUCHER_UPDATED' | 'VOUCHER_DELETED' | 'VOUCHER_METADATA_UPDATED' | 'VOUCHER_CODE_EXPORT_COMPLETED' | 'OBSERVABILITY' | 'THUMBNAIL_CREATED' | 'SHOP_METADATA_UPDATED'>>,
is_active: option<bool>,
name: string,
query: string,
sync_events: option<array<'PAYMENT_LIST_GATEWAYS' | 'PAYMENT_AUTHORIZE' | 'PAYMENT_CAPTURE' | 'PAYMENT_REFUND' | 'PAYMENT_VOID' | 'PAYMENT_CONFIRM' | 'PAYMENT_PROCESS' | 'CHECKOUT_CALCULATE_TAXES' | 'ORDER_CALCULATE_TAXES' | 'TRANSACTION_CHARGE_REQUESTED' | 'TRANSACTION_REFUND_REQUESTED' | 'TRANSACTION_CANCELATION_REQUESTED' | 'SHIPPING_LIST_METHODS_FOR_CHECKOUT' | 'CHECKOUT_FILTER_SHIPPING_METHODS' | 'ORDER_FILTER_SHIPPING_METHODS' | 'PAYMENT_GATEWAY_INITIALIZE_SESSION' | 'TRANSACTION_INITIALIZE_SESSION' | 'TRANSACTION_PROCESS_SESSION' | 'LIST_STORED_PAYMENT_METHODS' | 'STORED_PAYMENT_METHOD_DELETE_REQUESTED' | 'PAYMENT_GATEWAY_INITIALIZE_TOKENIZATION_SESSION' | 'PAYMENT_METHOD_INITIALIZE_TOKENIZATION_SESSION' | 'PAYMENT_METHOD_PROCESS_TOKENIZATION_SESSION'>>,
target_url: string
}>>
}
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE manifest.app_url ON app TYPE string ASSERT $value.is_url()
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE manifest.token_target_url ON app TYPE string ASSERT $value.is_url()
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE manifest.configuration_url ON app TYPE option<string> ASSERT $value.is_url()
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE manifest.data_privacy_url ON app TYPE option<string> ASSERT $value.is_url()
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE manifest.homepage_url ON app TYPE option<string> ASSERT $value.is_url()
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE manifest.support_url ON app TYPE option<string> ASSERT $value.is_url()
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE manifest.webhooks.target_url ON app TYPE string ASSERT $value.is_url()
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE manifest.extensions.url ON app TYPE string ASSERT $value.is_url()
PERMISSIONS FULL
;
DEFINE FIELD is_verified ON app TYPE bool
PERMISSIONS FULL
;
DEFINE FIELD supported_deployments ON app TYPE array<'Docker' | 'Podman' | 'Linux' | 'Windows' | 'MacOS' | 'WASM'>
PERMISSIONS FULL
;
DEFINE FIELD built_for_url ON app TYPE option<string>
PERMISSIONS FULL
;
DEFINE FIELD minimal_docker_compose ON app TYPE string
PERMISSIONS FULL
;
DEFINE FIELD supported_apls ON app TYPE array<'File' | 'Redis' | 'Env' | 'Upstash'>
PERMISSIONS FULL
;
DEFINE FIELD categories ON app TYPE array<'CMS' | 'Messaging' | 'Taxes' | 'Payments' | 'CRM' | 'Monitoring' | 'Marketplaces' | 'Search' | 'SEO' | 'DashboardUtilities' | 'Other'>
PERMISSIONS FULL
;
DEFINE TABLE author TYPE ANY SCHEMALESS
PERMISSIONS
FOR select
WHERE true
FOR create, update, delete
WHERE id.id()[0] = $auth.id OR $auth.admin = true
;
DEFINE FIELD name ON author TYPE string
PERMISSIONS FULL
;
DEFINE FIELD socials ON author TYPE array<string>
PERMISSIONS FULL
;
DEFINE FIELD OVERWRITE socials[*] ON author TYPE string ASSERT string::is::url($value)
PERMISSIONS FULL
;
DEFINE FIELD email ON author TYPE string ASSERT string::is::email($value)
PERMISSIONS FULL
;
DEFINE INDEX email ON author FIELDS email UNIQUE;
DEFINE ACCESS author ON DATABASE TYPE RECORD
SIGNUP (
CREATE author CONTENT {
name: $name,
email: $email,
socials: $socials,
password: crypto::argon2::generate($password),
}
)
SIGNIN (
SELECT * FROM user WHERE email = $email
AND crypto::argon2::compare(password, $password)
)
AUTHENTICATE {
RETURN $auth;
}
DURATION FOR SESSION 12h, FOR TOKEN 5s
;
DELETE author:djkato;
DELETE app:[
author:djkato,
'stripe-payment-gateway'
];
CREATE author:djkato SET name = 'Djkáťo', socials = [
'https://twitter.com/djkato_vfx'
], email = 'djkatovfx@gmail.com';
CREATE app:[
author:djkato,
'stripe-payment-gateway'
] SET versions = [
'1.0.0'
], slug = [
author:djkato,
'stripe-payment-gateway'
], current_version = '1.0.0', images = [
'https://imgur.com/g/img.jfif'
], is_verified = false, supported_deployments = [
'Docker'
], minimal_docker_compose = '', categories = [
'Payments'
], supported_apls = [
'Redis'
], manifest = {
about: 'cool stripe integration',
app_permissions: [
'MANAGE_USERS'
],
app_url: 'https://app-payment-gateway.test.com',
author: 'Djkáťo <djkatovfx@gmail.com>',
extensions: [],
id: 'stripe-payment-gateway',
name: 'Stripe Payment Gateway',
token_target_url: 'https://app-payment-gateway.test.com/api/register',
version: '1.0.0',
webhooks: []
};
SELECT manifest FROM app:[
author:djkato,
NONE
]..[
author:djkato
];