处理每个用户的项目可见性的最佳方法是什么?

What is the best way to handle items visibility per user?

我正在寻找处理每个用户的项目可见性的最佳或好方法。 实际上我有以下实体...

public class Post
{
  public Guid Id {get;set;}
  public string Content {get; set;}
  public Guid VisibilityId {get; set;}
  public Visibility Visibility {get; set;}
}
public class Visibility
{
  public Guid Id {get; set;}
  public string Name {get; set;}
}
public class AllowedList
{
  public Guid PostId {get; set;}
  public Guid UserId {get; set;}
}

我为可见性实体添加了以下查找

Public, OnlyMe, Custom

我想在案例

中为用户显示 post 个项目
  1. "public" 在这种情况下所有用户都允许显示 Post.
  2. “自定义”在这种情况下,如果用户存在于 AllowedList 中,则他们可以显示它。
  3. "OnlyMe" 在这种情况下创建的用户只能显示 Post.

因此,根据该验收标准,我创建了以下代码。

/*
    1. PublicId => 1,
    2. OnlyMeId => 2,
    3. CustomId => 3
 */

public IQueryable<Post> GetPosts(ApplicationContext context ,ICurrentUser user)
{
   var userId = user.Id;
   var posts = context.Posts.Where(p => p.VisibilityId == 1 || (p.VisibilityId  == 2 && p.CreatedBy == userId) || context.AllowedList.Any(a => a.PostId == p.Id && a.UserId == userId));
   return posts; // return as IQueryble of Posts
}

这是我的解决方案,但我认为这不是那个案例的正确或好的解决方案。

我认为布尔值 IsPublic 应该足以表述所有情况,因为应该始终允许创建者看到 post。 OnlyMe 将对应于具有空允许列表的 Public == false。如果 Public 为真,则允许列表中是否有条目无关紧要。

public bool IsPublic { get; set; }
var posts = context.Posts
   .Where(p => p.IsPublic ||
               p.CreatedBy == userId ||
               context.AllowedList.Any(a => a.PostId == p.Id && a.UserId == userId));