存储'共享'项目中的MongoDB与RESTful API一起使用

时间:2013-05-14 19:47:36

标签: api mongodb authentication schema

我正在创建一个用户可以共享文章的应用程序。

目前,当user共享article时,它会将共享项的article ID添加到shares上名为user的数组中。

var userSchema = {
  // `sharedItems` is a list of article IDs that the user has shared
  sharedItems: { type: Array }
};

但是,因为我需要一种方法来查询共享项目的多个用户ID(类似于新闻提要类型的查询),所以我决定沿着为共享项目创建单独集合的路线。

var shareSchema = {
  // The ID of the user who shared the article
  userId: { type: String },
  // The ID of the article shared
  articleId: { type: String },
  dateCreated: { type: Date }
};

要在我的应用程序代码中将其绑定在一起,当更新user时,会检查sharedItems上的user数组是否已更新 - 如果是,将任务委派给shares集合以分别添加或删除任何匹配项。我这样做是因为,当用户共享一个项目时,我的客户端应用程序只需要担心向POST资源发出user请求,而不是POST user share资源。这里的麻烦在于我依赖于复制,我担心由于各种原因,可能存在一些不准确之处。

sharedItems实体上对user数组的需求是因为,当加载任何文章时,我的应用程序必须检测已登录用户共享的项目。我的应用程序解析每个加载的article的响应,并检查当前user是否在其article数组中具有sharedItems ID - 如果是,则添加属性isShared的文章。

实现所有这一切的唯一另一种选择 - 我能想到的 - 是从用户模式中删除sharedItems数组,并为我的API添加某种身份验证,以便{{1对GET资源的请求将知道当前用户是谁,因此,我的后端可能会担心检查当前用户是否已共享发送的article响应,而不是在客户端进行解析。

我遇到的麻烦是我不希望我的API要求身份验证。所有用户都可以访问文章,登录或注销(article资源上的GET)。但是,我只希望登录的用户能够共享文章(articlePOST资源,或当前sharePOST资源,该文件委托创建/删除股票文件)。

您将如何处理MongoDB集合和模式?

2 个答案:

答案 0 :(得分:0)

如果你担心自己无法让它们保持同步,我就不会费心将sharedItems保留在userSchema中。只需让sharedSchema保持最新状态即可。分享文章似乎不应该是秘密,因此您可以在请求中包含当前用户ID,无需身份验证即可获取文章,并让后端告诉您指定的用户是否共享文章。

如果您想尝试保密共享信息,那么您可以向GET文章API添加可选身份验证,并仅返回有关已通过身份验证的用户的共享信息,但无论身份验证如何,都会返回其余的文章信息。或者,当您请求sharedItems信息并将其包含在响应中时,您可以从sharedSchema在后​​端构建user数组。

答案 1 :(得分:0)

我建议在shareCount资源中使用GET /article字段(以防止未经身份验证的曝光),然后使用可用于GET /user的{​​{1}}的异步(并经过身份验证的)API调用在初始加载后将文章标记为共享。

如果您这样做,您的GET /article资源不需要在幕后进行任何额外的工作,并且每个请求都将获得相同的信息(使用shareCount)。只有当用户登录时,您的设计才会将任何内容标记为共享。