我以某种方式在圈子里跑了两天!我有女巫的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来查找它。 请至少提供一些指导:)
答案 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;
}