feat(订阅式软件提供): 提供者重新声明定制页即失效该产品资源缓存

入口 URL 通常不含内容版本号,24h TTL 内主服务不会回源,重建后的产物要等过期才生效;改为 SetGroupRemotePage 时清空该产品缓存(PurgeRemoteAssets),下次请求立即回源并按 SHA256 只换来真正变化的文件
This commit is contained in:
TermiNexus committed 2026-10-07 17:44:29 +08:00
1 parent 3e642ca119
commit 8d98abe231
1 file changed
+19
@@ -585,11 +585,16 @@ class SubscriptionManager:
group.RemoteEntry = entry
group.RemoteModule = module_name
group.save(update_fields=['RemoteEntry', 'RemoteModule'])
# (重新)声明即失效本产品的资源缓存:入口 URL 通常不含内容版本号(如
# /venom/remote-entry.js),若不主动清理,主服务在 TTL 内会一直回旧内容;
# 清理后下一次请求立即回源,配合 SHA256 只换来真正变化的文件。
purged = SubscriptionManager.PurgeRemoteAssets(group.SubscriptionGroupUUID)
return {
'GroupUUID': _ToStr(group.SubscriptionGroupUUID),
'GroupName': group.GroupName,
'RemoteEntry': group.RemoteEntry,
'RemoteModule': group.RemoteModule,
'PurgedAssets': purged,
}, None
# ==================== 远端资源代理与缓存(主服务代子服务器出资源) ====================
@@ -699,6 +704,20 @@ class SubscriptionManager:
'Changed': changed,
}
@staticmethod
def PurgeRemoteAssets(GroupUUID):
"""清空某产品已缓存的远端资源(提供者重新声明定制页 / 手动失效时调用)
Returns:
int: 删除的缓存条数
"""
group_bytes = _ToBytes(GroupUUID)
if group_bytes is None:
return 0
deleted, _detail = SubscriptionRemoteAsset.objects.filter(
SubscriptionGroupUUID=group_bytes).delete()
return deleted
@staticmethod
def ListMySubscriptions(UserUUID, CompanyUUID=None):
"""我的订阅:当前用户作为订阅成员已订阅的产品(含定制页远端入口)