限制用户每篇文章发表一定数量的评论

时间:2018-07-14 19:34:23

标签: spring spring-boot

我以某种方式在圈子里跑了两天!我有女巫的MySQL数据库和注释表,我有id,user_id,日期,published_at,正文,喜欢和不喜欢。如何限制用户每天最多10条评论。我当然有用户表。 我知道我有某种方式可以计算特定日期的评论数,并将其放入安全性上下文中,但我不知道如何。我尝试了一些本地查询 像这样的存储库:

@Query(value = "select count from comments WHERE published_at=?1 AND user_id=?2", nativeQuery = true)
public int brojPostovaPoDanuPoUseru(Date datum, Integer user_id);

我想我应该从SecurityContext中找到登录的用户名,然后找到他的ID,但是如果有两个具有相同名称的用户又该怎么办,又可以在哪里使用SecurityContext来查找它。 请至少提供一些指导:)

1 个答案:

答案 0 :(得分:0)

您可以在数据库级别实现此功能。我的想法是在date(使用Java:System.currentTimeMillis())中节省时间(以秒为单位)。然后,当您通过用户ID查询时,您可以按date的降序对结果进行排序,并筛选出前10位。然后在date中选择最小的数字,然后检查是否小于24小时前,如果可以,则可以返回一个异常。

这将是一个示例查询:

select * from (SELECT * FROM `comments` where comments.user_id=?1 ORDER BY `comments`.`date` DESC limit 10) as c order by c.date ASC limit 1

假设您使用date来保存System.currentTimeMillis() / 1000的秒数。现在,使用查询结果,您将首先以小时为单位,然后以一天为单位计算秒数。这导致86400秒。现在,您将以秒为单位计算当前时间,并像以前计算的那样以秒为单位的24h将其提取。然后,您将检查此计算结果是否小于date的值,这表明最后10条评论是在24小时内做出的。

这是存储库中的示例代码:

@Query("select * from (SELECT * FROM `comments` where comments.user_id=?1 ORDER BY `comments`.`date` DESC limit 10) as c order by c.date ASC limit 1", nativeQuery=true)
public Comments  getLastTenthComment(int userId);

这是您服务中的示例代码:

public boolean isAllowedToComment(int userId){
   Comment comment = repository.getLastTenthComment(userId);
   int dayInSeconds = 86400;
   long currentTime = System.currentTimeMillis() / 1000;
   long yesterdayInSeconds = currentTime - dayInSeconds;
   if(comment.getDate() >= yesterdayInSeconds){
      return false;
   }
   return true;
}