149 lines
4.0 KiB
Go
149 lines
4.0 KiB
Go
|
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
|
||
|
}
|