recommender/internal/service/user/posts.go
2024-11-10 03:49:53 +08:00

153 lines
4.2 KiB
Go

package user
import (
"context"
"leafdev.top/Ecosystem/recommender/internal/entity"
"leafdev.top/Ecosystem/recommender/internal/schema"
"leafdev.top/Ecosystem/recommender/pkg/consts"
)
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)
if !postEntity.Vectorized || !postEntity.Processed {
return consts.ErrPostNotReady
}
// 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)
if !postEntity.Vectorized || !postEntity.Processed {
return consts.ErrPostNotReady
}
// 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
}