feat: implement managed storage plans and provider settings

- Added new UI schema for managing storage plans, including catalog, pricing, and product configurations.
- Introduced StoragePlanService to handle storage plan operations and integrate with existing billing services.
- Updated SuperAdmin settings to include managed storage provider configurations.
- Enhanced localization files with new keys for storage plan management.
- Implemented API endpoints for fetching and updating storage plans.

Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
Innei
2025-11-21 16:23:13 +08:00
parent 914342807d
commit f0678038c2
37 changed files with 3537 additions and 171 deletions

View File

@@ -275,6 +275,25 @@
"photos.library.tags.toast.success-description": "Storage paths have been updated for the new tag structure.",
"photos.page.description": "Sync and manage photo assets on the server.",
"photos.page.title": "Photo Library",
"photos.storage.managed.actions.cancel": "Cancel managed storage",
"photos.storage.managed.actions.current": "Current plan",
"photos.storage.managed.actions.loading": "Updating…",
"photos.storage.managed.actions.retry": "Try again",
"photos.storage.managed.actions.subscribe": "Subscribe",
"photos.storage.managed.actions.switch": "Switch to this plan",
"photos.storage.managed.capacity.label": "Storage capacity: {{value}}",
"photos.storage.managed.capacity.unknown": "Capacity information is not available.",
"photos.storage.managed.capacity.unlimited": "Unlimited storage capacity",
"photos.storage.managed.description": "Subscribe to managed storage plans powered by the platforms shared provider—no self-hosted bucket required.",
"photos.storage.managed.empty": "No managed storage plans are currently available.",
"photos.storage.managed.error.load": "Failed to load managed storage plans.",
"photos.storage.managed.price.free": "Included in your current plan",
"photos.storage.managed.price.label": "{{price}} / month",
"photos.storage.managed.provider": "Backed by provider {{provider}}",
"photos.storage.managed.title": "Managed storage",
"photos.storage.managed.toast.error": "Failed to update managed storage: {{reason}}",
"photos.storage.managed.toast.success": "Managed storage plan updated.",
"photos.storage.managed.unavailable": "Managed storage hasnt been enabled for this workspace yet.",
"photos.sync.actions.button.apply": "Sync photos",
"photos.sync.actions.button.preview": "Preview sync",
"photos.sync.actions.toast.apply-success": "Photo sync completed",
@@ -716,11 +735,46 @@
"superadmin.nav.settings": "System Settings",
"superadmin.nav.tenants": "Tenants",
"superadmin.plans.description": "Manage plan quotas, pricing, and Creem product mappings. Only super admins can edit these settings.",
"superadmin.plans.storage.actions.add": "Add plan",
"superadmin.plans.storage.actions.remove": "Remove",
"superadmin.plans.storage.actions.save": "Save storage plans",
"superadmin.plans.storage.description": "Create managed storage plans without editing JSON. One plan per tenant; capacity stacks with app plan bundled storage.",
"superadmin.plans.storage.empty": "No storage plans yet. Add one to get started.",
"superadmin.plans.storage.error": "Failed to load storage plans: {{reason}}",
"superadmin.plans.storage.fields.active": "Expose this plan",
"superadmin.plans.storage.fields.capacity": "Capacity (GB)",
"superadmin.plans.storage.fields.creem": "Creem product ID",
"superadmin.plans.storage.fields.currency": "Currency",
"superadmin.plans.storage.fields.description": "Description",
"superadmin.plans.storage.fields.id": "Plan ID",
"superadmin.plans.storage.fields.name": "Display name",
"superadmin.plans.storage.fields.placeholder.description": "Who is this plan for? What's included?",
"superadmin.plans.storage.fields.placeholder.name": "Managed B2 • 5GB",
"superadmin.plans.storage.fields.price": "Monthly price",
"superadmin.plans.storage.saved": "Storage plans updated",
"superadmin.plans.storage.title": "Storage plans",
"superadmin.plans.storage.validation.block": "Fix validation errors before saving.",
"superadmin.plans.storage.validation.capacity": "Capacity must be a number in GB.",
"superadmin.plans.storage.validation.id": "Plan ID is required.",
"superadmin.plans.storage.validation.name": "Display name is required.",
"superadmin.plans.storage.validation.price": "Price must be a number.",
"superadmin.plans.tabs.app": "App plans",
"superadmin.plans.tabs.storage": "Storage plans",
"superadmin.plans.title": "Plan Configuration",
"superadmin.settings.button.loading": "Saving…",
"superadmin.settings.button.save": "Save changes",
"superadmin.settings.description": "Control platform-wide registration policies and local sign-in channels. Managed centrally by super admins.",
"superadmin.settings.error.loading": "Unable to load super admin settings: {{reason}}",
"superadmin.settings.managed-storage.actions.edit": "Edit",
"superadmin.settings.managed-storage.actions.save": "Save managed provider",
"superadmin.settings.managed-storage.actions.select": "Set as managed",
"superadmin.settings.managed-storage.actions.selected": "Selected",
"superadmin.settings.managed-storage.current": "Managed",
"superadmin.settings.managed-storage.description": "Configure the storage provider used for built-in managed storage (e.g., B2).",
"superadmin.settings.managed-storage.empty": "No storage providers yet. Add one to use as managed storage.",
"superadmin.settings.managed-storage.error": "Failed to load storage providers: {{reason}}",
"superadmin.settings.managed-storage.title": "Managed storage provider",
"superadmin.settings.managed-storage.type": "Type: {{type}}",
"superadmin.settings.message.dirty": "You have unsaved changes",
"superadmin.settings.message.error": "Failed to save settings: {{reason}}",
"superadmin.settings.message.idle": "All settings are up to date",
@@ -730,6 +784,8 @@
"superadmin.settings.stats.remaining": "Remaining registration slots",
"superadmin.settings.stats.total-users": "Total users",
"superadmin.settings.stats.unlimited": "Unlimited",
"superadmin.settings.tabs.general": "General",
"superadmin.settings.tabs.managed-storage": "Managed storage",
"superadmin.settings.title": "System Settings",
"superadmin.tenants.button.ban": "Ban",
"superadmin.tenants.button.processing": "Working…",

View File

@@ -275,6 +275,25 @@
"photos.library.tags.toast.success-description": "已根据新标签更新存储路径。",
"photos.page.description": "在此同步和管理服务器中的照片资产。",
"photos.page.title": "照片库",
"photos.storage.managed.actions.cancel": "取消托管存储",
"photos.storage.managed.actions.current": "当前方案",
"photos.storage.managed.actions.loading": "处理中…",
"photos.storage.managed.actions.retry": "重试",
"photos.storage.managed.actions.subscribe": "立即订阅",
"photos.storage.managed.actions.switch": "切换到此方案",
"photos.storage.managed.capacity.label": "可用容量:{{value}}",
"photos.storage.managed.capacity.unknown": "暂无法获取该方案的容量信息。",
"photos.storage.managed.capacity.unlimited": "容量无限制",
"photos.storage.managed.description": "订阅由平台托管的存储方案,无需自建对象存储即可扩容。",
"photos.storage.managed.empty": "当前没有可订阅的托管存储方案。",
"photos.storage.managed.error.load": "无法加载托管存储方案。",
"photos.storage.managed.price.free": "包含在当前订阅内",
"photos.storage.managed.price.label": "{{price}} / 月",
"photos.storage.managed.provider": "托管服务提供方:{{provider}}",
"photos.storage.managed.title": "托管存储",
"photos.storage.managed.toast.error": "更新托管存储方案失败:{{reason}}",
"photos.storage.managed.toast.success": "托管存储方案已更新。",
"photos.storage.managed.unavailable": "托管存储尚未启用,请联系管理员。",
"photos.sync.actions.button.apply": "同步照片",
"photos.sync.actions.button.preview": "预览同步",
"photos.sync.actions.toast.apply-success": "照片同步完成",
@@ -715,11 +734,46 @@
"superadmin.nav.settings": "系统设置",
"superadmin.nav.tenants": "租户管理",
"superadmin.plans.description": "管理各个订阅计划的资源配额、定价信息与 Creem Product 连接,仅超级管理员可编辑。",
"superadmin.plans.storage.actions.add": "新增计划",
"superadmin.plans.storage.actions.remove": "删除",
"superadmin.plans.storage.actions.save": "保存存储计划",
"superadmin.plans.storage.description": "直接编辑托管存储方案,无需填 JSON。每个租户仅一份存储计划会与应用计划的赠送存储叠加。",
"superadmin.plans.storage.empty": "还没有存储计划,请先新增一条。",
"superadmin.plans.storage.error": "加载存储计划失败:{{reason}}",
"superadmin.plans.storage.fields.active": "在前台展示该计划",
"superadmin.plans.storage.fields.capacity": "容量 (GB)",
"superadmin.plans.storage.fields.creem": "Creem 商品 ID",
"superadmin.plans.storage.fields.currency": "币种",
"superadmin.plans.storage.fields.description": "描述",
"superadmin.plans.storage.fields.id": "计划 ID",
"superadmin.plans.storage.fields.name": "展示名称",
"superadmin.plans.storage.fields.placeholder.description": "适用人群与包含的内容",
"superadmin.plans.storage.fields.placeholder.name": "托管 B2 · 5GB",
"superadmin.plans.storage.fields.price": "月费",
"superadmin.plans.storage.saved": "存储计划已更新",
"superadmin.plans.storage.title": "存储计划",
"superadmin.plans.storage.validation.block": "请先修复校验错误后再保存。",
"superadmin.plans.storage.validation.capacity": "容量必须是数字GB。",
"superadmin.plans.storage.validation.id": "计划 ID 必填。",
"superadmin.plans.storage.validation.name": "展示名称必填。",
"superadmin.plans.storage.validation.price": "价格必须是数字。",
"superadmin.plans.tabs.app": "应用计划",
"superadmin.plans.tabs.storage": "存储计划",
"superadmin.plans.title": "订阅计划配置",
"superadmin.settings.button.loading": "保存中...",
"superadmin.settings.button.save": "保存修改",
"superadmin.settings.description": "管理整个平台的注册策略与本地登录渠道,由超级管理员统一维护。",
"superadmin.settings.error.loading": "无法加载超级管理员设置:{{reason}}",
"superadmin.settings.managed-storage.actions.edit": "编辑",
"superadmin.settings.managed-storage.actions.save": "保存托管 Provider",
"superadmin.settings.managed-storage.actions.select": "设为托管",
"superadmin.settings.managed-storage.actions.selected": "已选择",
"superadmin.settings.managed-storage.current": "托管使用",
"superadmin.settings.managed-storage.description": "配置用于内置托管存储的 Provider例如 B2。",
"superadmin.settings.managed-storage.empty": "还没有存储提供商,请先新增。",
"superadmin.settings.managed-storage.error": "加载存储提供商失败:{{reason}}",
"superadmin.settings.managed-storage.title": "托管存储 Provider",
"superadmin.settings.managed-storage.type": "类型:{{type}}",
"superadmin.settings.message.dirty": "您有尚未保存的变更",
"superadmin.settings.message.error": "保存失败:{{reason}}",
"superadmin.settings.message.idle": "所有设置已同步",
@@ -729,6 +783,8 @@
"superadmin.settings.stats.remaining": "剩余可注册名额",
"superadmin.settings.stats.total-users": "当前用户总数",
"superadmin.settings.stats.unlimited": "不限",
"superadmin.settings.tabs.general": "通用",
"superadmin.settings.tabs.managed-storage": "托管存储",
"superadmin.settings.title": "系统设置",
"superadmin.tenants.button.ban": "封禁",
"superadmin.tenants.button.processing": "处理中…",