chore: sync current workspace changes
Desktop CI Build / Build macOS ARM64 DMG (push) Has been cancelled
Desktop CI Build / Build Windows x64 (push) Has been cancelled
Desktop CI Build / Build macOS ARM64 DMG (push) Has been cancelled
Desktop CI Build / Build Windows x64 (push) Has been cancelled
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1 @@
|
||||
-- Included in the consolidated MySQL/MariaDB initial schema.
|
||||
@@ -0,0 +1,320 @@
|
||||
ALTER TABLE `agent_runs`
|
||||
ADD CONSTRAINT `ck_agent_runs_status` CHECK (`status` IN ('starting','running','waiting_approval','waiting_input','cancelling','succeeded','failed','cancelled','interrupted'));
|
||||
|
||||
ALTER TABLE `api_billing_accounts`
|
||||
ADD CONSTRAINT `ck_billing_available` CHECK (`available_micros` >= 0),
|
||||
ADD CONSTRAINT `ck_billing_reserved` CHECK (`reserved_micros` >= 0),
|
||||
ADD CONSTRAINT `ck_billing_debt` CHECK (`debt_micros` >= 0),
|
||||
ADD CONSTRAINT `ck_billing_status` CHECK (`status` IN ('active','frozen','closed'));
|
||||
|
||||
ALTER TABLE `api_credit_grants`
|
||||
ADD CONSTRAINT `ck_grant_total` CHECK (`total_micros` > 0),
|
||||
ADD CONSTRAINT `ck_grant_remaining` CHECK (`remaining_micros` >= 0),
|
||||
ADD CONSTRAINT `ck_grant_reserved` CHECK (`reserved_micros` >= 0),
|
||||
ADD CONSTRAINT `ck_grant_sum` CHECK (`remaining_micros` + `reserved_micros` <= `total_micros`),
|
||||
ADD CONSTRAINT `ck_grant_status` CHECK (`status` IN ('scheduled','active','refund_pending','exhausted','expired','revoked'));
|
||||
|
||||
ALTER TABLE `api_request_leases`
|
||||
ADD CONSTRAINT `ck_request_lease_status` CHECK (`status` IN ('active','released','expired'));
|
||||
|
||||
ALTER TABLE `commerce_products`
|
||||
ADD CONSTRAINT `ck_product_type` CHECK (`product_type` IN ('credit_pack','subscription')),
|
||||
ADD CONSTRAINT `ck_product_credit` CHECK (`api_credit_micros` > 0),
|
||||
ADD CONSTRAINT `ck_product_shape` CHECK ((`product_type` = 'credit_pack' AND `subscription_days` IS NULL) OR (`product_type` = 'subscription' AND `subscription_days` > 0));
|
||||
|
||||
ALTER TABLE `commerce_product_prices`
|
||||
ADD CONSTRAINT `ck_product_price_amount` CHECK (`amount_minor` > 0),
|
||||
ADD CONSTRAINT `ck_product_price_currency` CHECK (`currency` IN ('CNY','USD'));
|
||||
|
||||
ALTER TABLE `commerce_orders`
|
||||
ADD CONSTRAINT `ck_commerce_order_amount` CHECK (`amount_minor` > 0),
|
||||
ADD CONSTRAINT `ck_commerce_order_credit` CHECK (`api_credit_micros_snapshot` > 0),
|
||||
ADD CONSTRAINT `ck_commerce_order_currency` CHECK (`currency` IN ('CNY','USD')),
|
||||
ADD CONSTRAINT `ck_commerce_order_kind` CHECK (`order_kind` IN ('credit_pack','subscription')),
|
||||
ADD CONSTRAINT `ck_commerce_order_snapshot` CHECK (`order_kind` = `product_type_snapshot`),
|
||||
ADD CONSTRAINT `ck_commerce_order_status` CHECK (`status` IN ('pending','paid','fulfilled','partially_refunded','cancelled','expired','refunded'));
|
||||
|
||||
ALTER TABLE `commerce_subscription_periods`
|
||||
ADD CONSTRAINT `ck_subscription_status` CHECK (`status` IN ('active','revoked'));
|
||||
|
||||
ALTER TABLE `payment_provider_instances`
|
||||
ADD CONSTRAINT `ck_provider_kind` CHECK (`provider` IN ('easypay','alipay','wechatpay','stripe','comfy_cloud')),
|
||||
ADD CONSTRAINT `ck_provider_credentials` CHECK (OCTET_LENGTH(`credentials_ciphertext`) > 29),
|
||||
ADD CONSTRAINT `ck_provider_callback_hash` CHECK (CHAR_LENGTH(`callback_token_hash`) = 64),
|
||||
ADD CONSTRAINT `ck_provider_callback_cipher` CHECK (OCTET_LENGTH(`callback_token_ciphertext`) > 29),
|
||||
ADD CONSTRAINT `ck_provider_config_json` CHECK (JSON_VALID(`config_json`)),
|
||||
ADD CONSTRAINT `ck_provider_credential_version` CHECK (`credentials_version` > 0);
|
||||
|
||||
ALTER TABLE `payment_method_routes`
|
||||
ADD CONSTRAINT `ck_method_route_method` CHECK (`payment_method` IN ('alipay','wechatpay','card','comfy_cloud')),
|
||||
ADD CONSTRAINT `ck_method_route_currency` CHECK (`currency` IN ('CNY','USD')),
|
||||
ADD CONSTRAINT `ck_method_route_strategy` CHECK (`selection_strategy` IN ('round_robin','least_amount'));
|
||||
|
||||
ALTER TABLE `payment_method_route_members`
|
||||
ADD CONSTRAINT `ck_route_member_capacity` CHECK (`daily_capacity_minor` IS NULL OR `daily_capacity_minor` > 0);
|
||||
|
||||
ALTER TABLE `payment_order_provider_bindings`
|
||||
ADD CONSTRAINT `ck_binding_amount` CHECK (`amount_minor` > 0),
|
||||
ADD CONSTRAINT `ck_binding_currency` CHECK (`currency` IN ('CNY','USD')),
|
||||
ADD CONSTRAINT `ck_binding_method` CHECK (`payment_method` IN ('alipay','wechatpay','card','comfy_cloud')),
|
||||
ADD CONSTRAINT `ck_binding_provider` CHECK (`provider` IN ('easypay','alipay','wechatpay','stripe','comfy_cloud')),
|
||||
ADD CONSTRAINT `ck_binding_capacity` CHECK (`capacity_state` IN ('reserved','released','captured','refunded')),
|
||||
ADD CONSTRAINT `ck_binding_status` CHECK (`status` IN ('bound','processing','paid','failed','cancelled','refunded'));
|
||||
|
||||
ALTER TABLE `payment_route_member_daily_usage`
|
||||
ADD CONSTRAINT `ck_usage_reserved` CHECK (`reserved_minor` >= 0),
|
||||
ADD CONSTRAINT `ck_usage_captured` CHECK (`captured_minor` >= 0),
|
||||
ADD CONSTRAINT `ck_usage_refunded` CHECK (`refunded_minor` >= 0 AND `refunded_minor` <= `captured_minor`);
|
||||
|
||||
ALTER TABLE `payment_provider_event_inbox`
|
||||
ADD CONSTRAINT `ck_event_status` CHECK (`status` IN ('received','processing','processed','failed')),
|
||||
ADD CONSTRAINT `ck_event_attempts` CHECK (`attempt_count` >= 0),
|
||||
ADD CONSTRAINT `ck_event_id` CHECK (CHAR_LENGTH(TRIM(`provider_event_id`)) > 0),
|
||||
ADD CONSTRAINT `ck_event_type` CHECK (CHAR_LENGTH(TRIM(`event_type`)) > 0),
|
||||
ADD CONSTRAINT `ck_event_sha` CHECK (CHAR_LENGTH(`payload_sha256`) = 64),
|
||||
ADD CONSTRAINT `ck_event_payload` CHECK (JSON_VALID(`payload_json`));
|
||||
|
||||
ALTER TABLE `payment_jobs`
|
||||
ADD CONSTRAINT `ck_job_type` CHECK (`job_type` IN ('create_checkout','query_payment','capture','process_event','refund')),
|
||||
ADD CONSTRAINT `ck_job_status` CHECK (`status` IN ('pending','running','succeeded','failed','dead')),
|
||||
ADD CONSTRAINT `ck_job_attempts` CHECK (`attempt_count` >= 0 AND `max_attempts` > 0),
|
||||
ADD CONSTRAINT `ck_job_payload` CHECK (JSON_VALID(`payload_json`)),
|
||||
ADD CONSTRAINT `ck_job_result` CHECK (`result_json` IS NULL OR JSON_VALID(`result_json`));
|
||||
|
||||
ALTER TABLE `payment_refund_requests`
|
||||
ADD CONSTRAINT `ck_refund_request_amount` CHECK (`amount_minor` > 0),
|
||||
ADD CONSTRAINT `ck_refund_request_currency` CHECK (`currency` IN ('CNY','USD')),
|
||||
ADD CONSTRAINT `ck_refund_request_status` CHECK (`status` IN ('pending','approved','rejected','processing','completed','failed')),
|
||||
ADD CONSTRAINT `ck_refund_entitlement_target` CHECK (`entitlement_target_micros` >= 0 AND `entitlement_shortfall_micros` >= 0),
|
||||
ADD CONSTRAINT `ck_refund_subscription_target` CHECK (`subscription_target_seconds` >= 0 AND `subscription_shortfall_seconds` >= 0);
|
||||
|
||||
ALTER TABLE `payment_refund_entitlement_reservations`
|
||||
ADD CONSTRAINT `ck_refund_entitlement_amount` CHECK (`reserved_micros` > 0),
|
||||
ADD CONSTRAINT `ck_refund_entitlement_status` CHECK (`status` IN ('reserved','finalized','released'));
|
||||
|
||||
ALTER TABLE `payment_refund_subscription_reservations`
|
||||
ADD CONSTRAINT `ck_refund_subscription_seconds` CHECK (`reversal_seconds` >= 0),
|
||||
ADD CONSTRAINT `ck_refund_subscription_previous` CHECK (`previous_status` IN ('active','revoked')),
|
||||
ADD CONSTRAINT `ck_refund_subscription_status` CHECK (`status` IN ('reserved','finalized','released'));
|
||||
|
||||
ALTER TABLE `payment_refunds`
|
||||
ADD CONSTRAINT `ck_refund_amount` CHECK (`amount_minor` > 0),
|
||||
ADD CONSTRAINT `ck_refund_currency` CHECK (`currency` IN ('CNY','USD')),
|
||||
ADD CONSTRAINT `ck_refund_status` CHECK (`status` IN ('processing','succeeded','failed')),
|
||||
ADD CONSTRAINT `ck_refund_response` CHECK (`response_json` IS NULL OR JSON_VALID(`response_json`));
|
||||
|
||||
ALTER TABLE `user_oauth_identities`
|
||||
ADD CONSTRAINT `ck_oauth_provider` CHECK (`provider` IN ('google','github','wechat')),
|
||||
ADD CONSTRAINT `ck_oauth_subject` CHECK (CHAR_LENGTH(`provider_subject`) > 0);
|
||||
|
||||
CREATE TRIGGER `payment_provider_instance_identity_immutable`
|
||||
BEFORE UPDATE ON `payment_provider_instances`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NOT (NEW.`public_id` <=> OLD.`public_id`) OR NOT (NEW.`provider` <=> OLD.`provider`) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'payment provider instance identity is immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `payment_method_route_identity_immutable`
|
||||
BEFORE UPDATE ON `payment_method_routes`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NOT (NEW.`public_id` <=> OLD.`public_id`)
|
||||
OR NOT (NEW.`payment_method` <=> OLD.`payment_method`)
|
||||
OR NOT (NEW.`currency` <=> OLD.`currency`) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'payment method route identity is immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `payment_binding_identity_immutable`
|
||||
BEFORE UPDATE ON `payment_order_provider_bindings`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NOT (NEW.`payment_order_id` <=> OLD.`payment_order_id`)
|
||||
OR NOT (NEW.`route_id` <=> OLD.`route_id`)
|
||||
OR NOT (NEW.`member_id` <=> OLD.`member_id`)
|
||||
OR NOT (NEW.`provider_instance_id` <=> OLD.`provider_instance_id`)
|
||||
OR NOT (NEW.`provider` <=> OLD.`provider`)
|
||||
OR NOT (NEW.`payment_method` <=> OLD.`payment_method`)
|
||||
OR NOT (NEW.`amount_minor` <=> OLD.`amount_minor`)
|
||||
OR NOT (NEW.`currency` <=> OLD.`currency`)
|
||||
OR (OLD.`provider_payment_id` IS NOT NULL AND NOT (NEW.`provider_payment_id` <=> OLD.`provider_payment_id`)) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'payment provider binding identity is immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `payment_provider_event_content_immutable`
|
||||
BEFORE UPDATE ON `payment_provider_event_inbox`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NOT (NEW.`public_id` <=> OLD.`public_id`)
|
||||
OR NOT (NEW.`provider_instance_id` <=> OLD.`provider_instance_id`)
|
||||
OR NOT (NEW.`provider_event_id` <=> OLD.`provider_event_id`)
|
||||
OR NOT (NEW.`event_type` <=> OLD.`event_type`)
|
||||
OR NOT (NEW.`payload_json` <=> OLD.`payload_json`)
|
||||
OR NOT (NEW.`payload_sha256` <=> OLD.`payload_sha256`)
|
||||
OR NOT (NEW.`received_at` <=> OLD.`received_at`) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'payment provider event content is immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `commerce_order_snapshot_immutable`
|
||||
BEFORE UPDATE ON `commerce_orders`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NOT (NEW.`user_id` <=> OLD.`user_id`)
|
||||
OR NOT (NEW.`payment_order_id` <=> OLD.`payment_order_id`)
|
||||
OR NOT (NEW.`product_id` <=> OLD.`product_id`)
|
||||
OR NOT (NEW.`product_public_id_snapshot` <=> OLD.`product_public_id_snapshot`)
|
||||
OR NOT (NEW.`product_code_snapshot` <=> OLD.`product_code_snapshot`)
|
||||
OR NOT (NEW.`product_name_snapshot` <=> OLD.`product_name_snapshot`)
|
||||
OR NOT (NEW.`product_type_snapshot` <=> OLD.`product_type_snapshot`)
|
||||
OR NOT (NEW.`order_kind` <=> OLD.`order_kind`)
|
||||
OR NOT (NEW.`currency` <=> OLD.`currency`)
|
||||
OR NOT (NEW.`amount_minor` <=> OLD.`amount_minor`)
|
||||
OR NOT (NEW.`api_credit_micros_snapshot` <=> OLD.`api_credit_micros_snapshot`)
|
||||
OR NOT (NEW.`subscription_days_snapshot` <=> OLD.`subscription_days_snapshot`)
|
||||
OR NOT (NEW.`idempotency_key` <=> OLD.`idempotency_key`)
|
||||
OR NOT (NEW.`expires_at` <=> OLD.`expires_at`)
|
||||
OR (OLD.`snapshot_sealed` = 1 AND NEW.`snapshot_sealed` <> 1) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'commerce order snapshot is immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `subscription_period_window_immutable`
|
||||
BEFORE UPDATE ON `commerce_subscription_periods`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NOT (NEW.`user_id` <=> OLD.`user_id`)
|
||||
OR NOT (NEW.`product_id` <=> OLD.`product_id`)
|
||||
OR NOT (NEW.`source_order_id` <=> OLD.`source_order_id`)
|
||||
OR NOT (NEW.`starts_at` <=> OLD.`starts_at`)
|
||||
OR NOT (NEW.`ends_at` <=> OLD.`ends_at`) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'subscription period window is immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `route_member_provider_guard_insert`
|
||||
BEFORE INSERT ON `payment_method_route_members`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM `payment_method_routes` r
|
||||
JOIN `payment_provider_instances` i ON i.`id` = NEW.`provider_instance_id`
|
||||
WHERE r.`id` = NEW.`route_id` AND (
|
||||
(r.`payment_method` = 'alipay' AND i.`provider` IN ('easypay','alipay')) OR
|
||||
(r.`payment_method` = 'wechatpay' AND i.`provider` IN ('easypay','wechatpay')) OR
|
||||
(r.`payment_method` = 'card' AND i.`provider` = 'stripe') OR
|
||||
(r.`payment_method` = 'comfy_cloud' AND i.`provider` = 'comfy_cloud')
|
||||
)
|
||||
) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'provider instance does not support route payment method';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `route_member_provider_guard_update`
|
||||
BEFORE UPDATE ON `payment_method_route_members`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM `payment_method_routes` r
|
||||
JOIN `payment_provider_instances` i ON i.`id` = NEW.`provider_instance_id`
|
||||
WHERE r.`id` = NEW.`route_id` AND (
|
||||
(r.`payment_method` = 'alipay' AND i.`provider` IN ('easypay','alipay')) OR
|
||||
(r.`payment_method` = 'wechatpay' AND i.`provider` IN ('easypay','wechatpay')) OR
|
||||
(r.`payment_method` = 'card' AND i.`provider` = 'stripe') OR
|
||||
(r.`payment_method` = 'comfy_cloud' AND i.`provider` = 'comfy_cloud')
|
||||
)
|
||||
) THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'provider instance does not support route payment method';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `commerce_gate_registry_no_update`
|
||||
BEFORE UPDATE ON `commerce_model_gate_registry`
|
||||
FOR EACH ROW SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'commerce model gate registry is append-only';
|
||||
|
||||
CREATE TRIGGER `commerce_gate_registry_no_delete`
|
||||
BEFORE DELETE ON `commerce_model_gate_registry`
|
||||
FOR EACH ROW SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'commerce model gate registry is append-only';
|
||||
|
||||
CREATE TRIGGER `commerce_unlock_scope_guard_insert`
|
||||
BEFORE INSERT ON `commerce_product_unlock_scopes`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT `product_type` FROM `commerce_products` WHERE `id` = NEW.`product_id`) <> 'subscription' THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'unlock scopes require a subscription product';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `commerce_unlock_scope_guard_update`
|
||||
BEFORE UPDATE ON `commerce_product_unlock_scopes`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT `product_type` FROM `commerce_products` WHERE `id` = NEW.`product_id`) <> 'subscription' THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'unlock scopes require a subscription product';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `commerce_unlock_scope_register_insert`
|
||||
AFTER INSERT ON `commerce_product_unlock_scopes`
|
||||
FOR EACH ROW INSERT IGNORE INTO `commerce_model_gate_registry` (`scope_type`, `scope_value`) VALUES (NEW.`scope_type`, NEW.`scope_value`);
|
||||
|
||||
CREATE TRIGGER `commerce_unlock_scope_register_update`
|
||||
AFTER UPDATE ON `commerce_product_unlock_scopes`
|
||||
FOR EACH ROW INSERT IGNORE INTO `commerce_model_gate_registry` (`scope_type`, `scope_value`) VALUES (NEW.`scope_type`, NEW.`scope_value`);
|
||||
|
||||
CREATE TRIGGER `order_credit_scope_sealed_insert`
|
||||
BEFORE INSERT ON `commerce_order_credit_scopes`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT `snapshot_sealed` FROM `commerce_orders` WHERE `id` = NEW.`order_id`) = 1 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'sealed commerce order credit scopes are immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `order_credit_scope_sealed_update`
|
||||
BEFORE UPDATE ON `commerce_order_credit_scopes`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT `snapshot_sealed` FROM `commerce_orders` WHERE `id` = OLD.`order_id`) = 1 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'sealed commerce order credit scopes are immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `order_credit_scope_sealed_delete`
|
||||
BEFORE DELETE ON `commerce_order_credit_scopes`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT `snapshot_sealed` FROM `commerce_orders` WHERE `id` = OLD.`order_id`) = 1 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'sealed commerce order credit scopes are immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `order_unlock_scope_sealed_insert`
|
||||
BEFORE INSERT ON `commerce_order_unlock_scopes`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT `snapshot_sealed` FROM `commerce_orders` WHERE `id` = NEW.`order_id`) = 1 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'sealed commerce order unlock scopes are immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `order_unlock_scope_sealed_update`
|
||||
BEFORE UPDATE ON `commerce_order_unlock_scopes`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT `snapshot_sealed` FROM `commerce_orders` WHERE `id` = OLD.`order_id`) = 1 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'sealed commerce order unlock scopes are immutable';
|
||||
END IF;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER `order_unlock_scope_sealed_delete`
|
||||
BEFORE DELETE ON `commerce_order_unlock_scopes`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT `snapshot_sealed` FROM `commerce_orders` WHERE `id` = OLD.`order_id`) = 1 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'sealed commerce order unlock scopes are immutable';
|
||||
END IF;
|
||||
END;
|
||||
@@ -0,0 +1,62 @@
|
||||
ALTER TABLE api_credit_grants ADD COLUMN grant_kind VARCHAR(32) NOT NULL DEFAULT 'balance';
|
||||
UPDATE api_credit_grants SET grant_kind = CASE WHEN source_type = 'subscription' THEN 'package' WHEN source_type = 'package' AND payment_order_id IS NULL THEN 'package' ELSE 'balance' END;
|
||||
CREATE INDEX api_credit_grants_kind_spend_idx ON api_credit_grants (user_id, grant_kind, status, expires_at, id);
|
||||
|
||||
CREATE TABLE comfy_billing_accounts (
|
||||
user_id BIGINT PRIMARY KEY, available_micros BIGINT NOT NULL DEFAULT 0, reserved_micros BIGINT NOT NULL DEFAULT 0,
|
||||
debt_micros BIGINT NOT NULL DEFAULT 0, status VARCHAR(32) NOT NULL DEFAULT 'active', version BIGINT NOT NULL DEFAULT 0,
|
||||
created_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)), updated_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)),
|
||||
CONSTRAINT comfy_account_user_fk FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB;
|
||||
CREATE TABLE comfy_credit_grants (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY, public_id VARCHAR(128) NOT NULL UNIQUE, user_id BIGINT NOT NULL,
|
||||
grant_kind VARCHAR(32) NOT NULL, source_type VARCHAR(64) NOT NULL, source_id VARCHAR(255), payment_order_id BIGINT,
|
||||
total_micros BIGINT NOT NULL, remaining_micros BIGINT NOT NULL, reserved_micros BIGINT NOT NULL DEFAULT 0,
|
||||
starts_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)), expires_at VARCHAR(64), status VARCHAR(32) NOT NULL DEFAULT 'active',
|
||||
idempotency_key VARCHAR(255) NOT NULL UNIQUE, created_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)), updated_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)),
|
||||
CONSTRAINT comfy_grant_user_fk FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
CONSTRAINT comfy_grant_order_fk FOREIGN KEY (payment_order_id) REFERENCES payment_orders(id) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB;
|
||||
CREATE INDEX comfy_credit_grants_spend_idx ON comfy_credit_grants (user_id, grant_kind, status, starts_at, expires_at, id);
|
||||
CREATE TABLE comfy_charge_holds (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY, public_id VARCHAR(128) NOT NULL UNIQUE, user_id BIGINT NOT NULL,
|
||||
task_type VARCHAR(128) NOT NULL, ref_id VARCHAR(255) NOT NULL, amount_micros BIGINT NOT NULL,
|
||||
package_micros BIGINT NOT NULL DEFAULT 0, balance_micros BIGINT NOT NULL DEFAULT 0, status VARCHAR(32) NOT NULL DEFAULT 'active',
|
||||
idempotency_key VARCHAR(255) NOT NULL UNIQUE, created_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)),
|
||||
updated_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)), settled_at VARCHAR(64), released_at VARCHAR(64),
|
||||
CONSTRAINT comfy_hold_user_fk FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB;
|
||||
CREATE INDEX comfy_charge_holds_ref_idx ON comfy_charge_holds (task_type, ref_id, status);
|
||||
CREATE TABLE comfy_charge_hold_allocations (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY, hold_id BIGINT NOT NULL, grant_id BIGINT NOT NULL,
|
||||
amount_micros BIGINT NOT NULL, grant_kind VARCHAR(32) NOT NULL, UNIQUE KEY comfy_hold_grant_unique (hold_id, grant_id),
|
||||
CONSTRAINT comfy_allocation_hold_fk FOREIGN KEY (hold_id) REFERENCES comfy_charge_holds(id) ON DELETE CASCADE,
|
||||
CONSTRAINT comfy_allocation_grant_fk FOREIGN KEY (grant_id) REFERENCES comfy_credit_grants(id)
|
||||
) ENGINE=InnoDB;
|
||||
CREATE TABLE comfy_entitlement_ledger (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id BIGINT NOT NULL, entry_type VARCHAR(64) NOT NULL,
|
||||
amount_micros BIGINT NOT NULL, balance_after_micros BIGINT NOT NULL, package_amount_micros BIGINT NOT NULL DEFAULT 0,
|
||||
balance_amount_micros BIGINT NOT NULL DEFAULT 0, grant_id BIGINT, task_type VARCHAR(128), ref_type VARCHAR(64),
|
||||
ref_id VARCHAR(255), operator VARCHAR(128), note TEXT, idempotency_key VARCHAR(255) NOT NULL UNIQUE,
|
||||
created_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)),
|
||||
CONSTRAINT comfy_ledger_user_fk FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
CONSTRAINT comfy_ledger_grant_fk FOREIGN KEY (grant_id) REFERENCES comfy_credit_grants(id) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB;
|
||||
CREATE INDEX comfy_entitlement_ledger_user_idx ON comfy_entitlement_ledger (user_id, created_at DESC, id DESC);
|
||||
CREATE TABLE comfy_task_prices (
|
||||
task_type VARCHAR(128) PRIMARY KEY, display_name VARCHAR(255) NOT NULL, points_micros BIGINT NOT NULL DEFAULT 0,
|
||||
enabled BOOLEAN NOT NULL DEFAULT FALSE, updated_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR))
|
||||
) ENGINE=InnoDB;
|
||||
INSERT INTO comfy_task_prices (task_type, display_name) VALUES
|
||||
('comfy-native-workflow','Comfy 工作流'),('money-printer-video','Money Printer 视频'),
|
||||
('digital-human-generation','数字人生成'),('jimeng-image-generation','即梦图片'),
|
||||
('jimeng-video-generation','即梦视频'),('seedance-video-generation','Seedance 视频');
|
||||
INSERT INTO comfy_billing_accounts (user_id,available_micros)
|
||||
SELECT user_id,ROUND(GREATEST(points_balance,0)*1000000.0) FROM user_credits WHERE points_balance > 0;
|
||||
INSERT INTO comfy_credit_grants (public_id,user_id,grant_kind,source_type,source_id,total_micros,remaining_micros,idempotency_key)
|
||||
SELECT CONCAT('cgrant_legacy_',user_id),user_id,'balance','legacy_opening_balance','user_credits',
|
||||
ROUND(GREATEST(points_balance,0)*1000000.0),ROUND(GREATEST(points_balance,0)*1000000.0),
|
||||
CONCAT('migration:20260711000004:comfy:user:',user_id) FROM user_credits WHERE points_balance > 0;
|
||||
INSERT INTO comfy_entitlement_ledger (user_id,entry_type,amount_micros,balance_after_micros,ref_type,ref_id,operator,idempotency_key)
|
||||
SELECT user_id,'opening_balance',available_micros,available_micros,'migration','20260711000004','system',
|
||||
CONCAT('migration:20260711000004:comfy:ledger:user:',user_id) FROM comfy_billing_accounts WHERE available_micros > 0;
|
||||
@@ -0,0 +1,16 @@
|
||||
ALTER TABLE commerce_products ADD COLUMN billing_track VARCHAR(32) NOT NULL DEFAULT 'api';
|
||||
ALTER TABLE commerce_products ADD COLUMN grant_kind VARCHAR(32) NOT NULL DEFAULT 'package';
|
||||
ALTER TABLE commerce_products ADD COLUMN benefit_type VARCHAR(32) NOT NULL DEFAULT 'api_credit';
|
||||
ALTER TABLE commerce_products ADD COLUMN validity_days BIGINT NULL;
|
||||
UPDATE commerce_products SET grant_kind = CASE WHEN product_type = 'subscription' THEN 'package' ELSE 'balance' END;
|
||||
|
||||
ALTER TABLE commerce_orders ADD COLUMN billing_track_snapshot VARCHAR(32) NOT NULL DEFAULT 'api';
|
||||
ALTER TABLE commerce_orders ADD COLUMN grant_kind_snapshot VARCHAR(32) NOT NULL DEFAULT 'package';
|
||||
ALTER TABLE commerce_orders ADD COLUMN benefit_type_snapshot VARCHAR(32) NOT NULL DEFAULT 'api_credit';
|
||||
ALTER TABLE commerce_orders ADD COLUMN validity_days_snapshot BIGINT NULL;
|
||||
UPDATE commerce_orders SET grant_kind_snapshot = CASE WHEN product_type_snapshot = 'subscription' THEN 'package' ELSE 'balance' END;
|
||||
|
||||
ALTER TABLE commerce_order_fulfillments ADD COLUMN comfy_credit_grant_id BIGINT NULL;
|
||||
ALTER TABLE commerce_order_fulfillments ADD CONSTRAINT commerce_fulfillment_comfy_grant_fk FOREIGN KEY (comfy_credit_grant_id) REFERENCES comfy_credit_grants(id);
|
||||
ALTER TABLE payment_orders ADD COLUMN billing_target VARCHAR(32) NOT NULL DEFAULT 'api';
|
||||
ALTER TABLE user_recharge_records ADD COLUMN billing_target VARCHAR(32) NOT NULL DEFAULT 'api';
|
||||
@@ -0,0 +1,16 @@
|
||||
ALTER TABLE api_entitlement_ledger ADD COLUMN package_amount_micros BIGINT NOT NULL DEFAULT 0;
|
||||
ALTER TABLE api_entitlement_ledger ADD COLUMN balance_amount_micros BIGINT NOT NULL DEFAULT 0;
|
||||
|
||||
CREATE TABLE comfy_refund_entitlement_reservations (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
refund_request_id BIGINT NOT NULL,
|
||||
grant_id BIGINT NOT NULL,
|
||||
reserved_micros BIGINT NOT NULL,
|
||||
grant_status_before VARCHAR(32) NOT NULL,
|
||||
status VARCHAR(32) NOT NULL DEFAULT 'reserved',
|
||||
created_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)),
|
||||
updated_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)),
|
||||
UNIQUE KEY comfy_refund_grant_unique (refund_request_id, grant_id),
|
||||
CONSTRAINT comfy_refund_request_fk FOREIGN KEY (refund_request_id) REFERENCES payment_refund_requests(id),
|
||||
CONSTRAINT comfy_refund_grant_fk FOREIGN KEY (grant_id) REFERENCES comfy_credit_grants(id)
|
||||
) ENGINE=InnoDB;
|
||||
@@ -0,0 +1,11 @@
|
||||
CREATE TABLE user_profile_avatars (
|
||||
user_id BIGINT PRIMARY KEY,
|
||||
public_id VARCHAR(80) NOT NULL UNIQUE,
|
||||
image_bytes LONGBLOB NOT NULL,
|
||||
mime_type VARCHAR(64) NOT NULL,
|
||||
size_bytes BIGINT NOT NULL,
|
||||
updated_at VARCHAR(64) NOT NULL DEFAULT (CAST(UTC_TIMESTAMP() AS CHAR)),
|
||||
CONSTRAINT user_profile_avatars_user_fk FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
CHECK (size_bytes > 0)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
Reference in New Issue
Block a user