package user import ( "context" "leafdev.top/Ecosystem/recommender/internal/entity" "leafdev.top/Ecosystem/recommender/internal/schema" "time" ) const TaskProcessing = "user_likes" var LockTTL = time.Minute * 10 func (s *Service) HasLiked(c context.Context, externalUserEntity *entity.ExternalUser, applicationEntity *entity.Application, postEntity *entity.Post) (bool, error) { count, err := s.dao.WithContext(c).UserLike.Where(s.dao.UserLike.ExternalUserId.Eq(externalUserEntity.Id.Uint())). Where(s.dao.UserLike.PostId.Eq(postEntity.Id.Uint())). Where(s.dao.UserLike.ApplicationId.Eq(applicationEntity.Id.Uint())).Count() if err != nil { return false, err } return count > 0, nil } func (s *Service) UpdateLike(c context.Context, externalUserEntity *entity.ExternalUser, applicationEntity *entity.Application, postEntity *entity.Post, likeType schema.UserLikeType) error { count, err := s.dao.WithContext(c).UserLike.Where(s.dao.UserLike.ExternalUserId.Eq(externalUserEntity.Id.Uint())). Where(s.dao.UserLike.PostId.Eq(postEntity.Id.Uint())). Where(s.dao.UserLike.ApplicationId.Eq(applicationEntity.Id.Uint())).Count() if err != nil { return err } if count > 0 { // update _, err = s.dao.WithContext(c).UserLike.Where(s.dao.UserLike.ExternalUserId.Eq(externalUserEntity.Id.Uint())). Where(s.dao.UserLike.PostId.Eq(postEntity.Id.Uint())). Where(s.dao.UserLike.ApplicationId.Eq(applicationEntity.Id.Uint())). Update(s.dao.UserLike.Type, likeType) return err } var userLike = &entity.UserLike{ ApplicationId: applicationEntity.Id, ExternalUserId: externalUserEntity.Id, PostId: postEntity.Id, Type: likeType, } err = s.dao.WithContext(c).UserLike.Create(userLike) return err } func (s *Service) LikePost(c context.Context, externalUserEntity *entity.ExternalUser, applicationEntity *entity.Application, postEntity *entity.Post) error { //// 检测是否有 //var cacheKey = s.redis.Prefix(TaskProcessing) //lock, err := s.redis.Locker.Obtain(c, cacheKey, LockTTL, nil) //if err != nil { // return err //} //defer func(lock *redislock.Lock, ctx context.Context) { // err := lock.Release(ctx) // if err != nil { // s.logger.Sugar.Error(err) // } //}(lock, c) // get tags postTags, err := s.postService.GetPostTags(c, postEntity) if err != nil { return err } hasLike, err := s.HasLiked(c, externalUserEntity, applicationEntity, postEntity) if err != nil { return err } if hasLike { return nil } err = s.UpdateLike(c, externalUserEntity, applicationEntity, postEntity, schema.UserLikeTypeLike) if err != nil { return err } err = s.BindTags(context.Background(), externalUserEntity, applicationEntity, postTags) if err != nil { s.logger.Sugar.Error(err) } return nil } func (s *Service) DislikePost(c context.Context, externalUserEntity *entity.ExternalUser, applicationEntity *entity.Application, postEntity *entity.Post) error { // 检测是否有 //var cacheKey = s.redis.Prefix(TaskProcessing) //lock, err := s.redis.Locker.Obtain(c, cacheKey, LockTTL, nil) //if err != nil { // return err //} // //defer func(lock *redislock.Lock, ctx context.Context) { // err := lock.Release(ctx) // if err != nil { // s.logger.Sugar.Error(err) // } //}(lock, c) // get tags postTags, err := s.postService.GetPostTags(c, postEntity) if err != nil { return err } hasLike, err := s.HasLiked(c, externalUserEntity, applicationEntity, postEntity) if err != nil { return err } if !hasLike { return nil } err = s.UpdateLike(c, externalUserEntity, applicationEntity, postEntity, schema.UserLikeTypeDislike) if err != nil { return err } _, err = s.dao.WithContext(c).UserLike.Where(s.dao.UserLike.ExternalUserId.Eq(externalUserEntity.Id.Uint())). Where(s.dao.UserLike.PostId.Eq(postEntity.Id.Uint())). Where(s.dao.UserLike.ApplicationId.Eq(applicationEntity.Id.Uint())).Count() if err != nil { return err } err = s.RemoveTags(context.Background(), externalUserEntity, applicationEntity, postTags) if err != nil { s.logger.Sugar.Error(err) } return nil }