diff --git a/gvsds/apps/gerp/apps/subscription/manager.py b/gvsds/apps/gerp/apps/subscription/manager.py index b261d64a..383d6076 100644 --- a/gvsds/apps/gerp/apps/subscription/manager.py +++ b/gvsds/apps/gerp/apps/subscription/manager.py @@ -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): """我的订阅:当前用户作为订阅成员已订阅的产品(含定制页远端入口)