如何仅当所有关联消息已发送时允许关闭邮件营销活动?
邮件营销活动关闭权限校验实现
应用管理邮件营销活动时,规则为:仅当所有关联消息均处于已发送状态,才能关闭该活动。
实体定义
// CampaignEntity class CampaignEntity { id: number; messages: MessageEntity[]; status: 'CLOSED' | 'OPEN' } // MessageEntity class MessageEntity{ id: number; status: 'DRAFT' | 'WAITING' | 'SENT' }
已实现的权限逻辑
目前已支持关闭无关联消息的活动:
can(Close, CampaignEntity, { messages: { $size: 0 }, });
需求实现:关闭所有消息已发送的活动
方案1:使用$not + $elemMatch(推荐,若框架支持)
你提到的$not写法完全可行,它通过否定“存在非已发送状态消息”的逻辑,确保所有消息状态都是SENT:
can(Close, CampaignEntity, { messages: { $not: { $elemMatch: { status: { $ne: 'SENT' } } }, }, });
方案2:使用$all操作符
如果权限框架支持$all,可以直接指定数组内所有消息的status必须为SENT:
can(Close, CampaignEntity, { messages: { $all: [{ status: 'SENT' }] }, });
方案3:使用$nin排除非目标状态
通过排除DRAFT和WAITING两种非已发送状态,间接确保所有消息都是SENT:
can(Close, CampaignEntity, { 'messages.status': { $nin: ['DRAFT', 'WAITING'] }, });
内容的提问来源于stack exchange,提问作者Martial
相关产品推荐
相关产品推荐

