2026-01-10 13:47:54 +08:00

192 lines
6.7 KiB
C#

using Infrastructure;
using Infrastructure.Attribute;
using Infrastructure.Extensions;
using Infrastructure.Model;
using Microsoft.AspNetCore.Mvc;
using RIZO.Model.Content.Dto;
using RIZO.Model.social;
using RIZO.Model.System;
using RIZO.Repository;
using RIZO.Service.Social.IService;
namespace RIZO.Service.Social
{
/// <summary>
/// 粉丝
/// </summary>
[AppService(ServiceType = typeof(ISocialFansService))]
public class SocialFansService : BaseService<SocialFans>, ISocialFansService, IDynamicApi
{
/// <summary>
/// 查询关注/粉丝列表
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpGet]
public ApiResult FollowList([FromQuery] FansQueryDto dto)
{
var userid = (int)HttpContextExtension.GetUId(App.HttpContext);
PagedInfo<SocialFansDto> list = dto.SelectType == 1 ? GetFollow(dto, userid) : GetFans(dto, userid);
return ApiResult.Success(list);
}
/// <summary>
/// 是否关注
/// </summary>
/// <param name="toUserid"></param>
/// <returns></returns>
public ApiResult IsFollow([FromQuery] int toUserid)
{
var userid = (int)HttpContextExtension.GetUId(App.HttpContext);
if (userid == toUserid || toUserid <= 0)
{
return ApiResult.Success("");
}
var isFollow = Any(f => f.Userid == userid && f.ToUserid == toUserid);
return ApiResult.Success(isFollow);
}
/// <summary>
/// 关注
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
public ApiResult Follow([FromBody] SocialFansDto dto)
{
dto.Userid = (int)HttpContextExtension.GetUId(App.HttpContext);
if (dto.Userid == dto.ToUserid)
{
throw new CustomException("不能关注自己");
};
if (dto.ToUserid <= 0)
{
return ApiResult.Error("关注失败");
}
//TODO 判断用户是否存在
var isFollow = GetFirst(x => x.Userid == dto.Userid && x.ToUserid == dto.ToUserid);
if (isFollow != null)
{
throw new CustomException("已关注");
}
var fans = new SocialFans
{
Userid = dto.Userid,
ToUserid = dto.ToUserid,
FollowTime = DateTime.Now,
UserIP = HttpContextExtension.GetClientUserIp(App.HttpContext)
};
var result = UseTran2(() =>
{
//添加粉丝
InsertReturnSnowflakeId(fans);
UpdateFollowInfo(dto.Userid, isFollowNum: true);
UpdateFollowInfo(dto.ToUserid, isFollowNum: false);
});
if (!result)
{
return ApiResult.Error("关注失败");
}
var data = Context.Queryable<SocialFansInfo>()
.Where(x => x.Userid == dto.Userid)
.First();
return ApiResult.Success("关注成功", data);
}
/// <summary>
/// 取消关注
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
public ApiResult CancelFollow([FromBody] SocialFansDto dto)
{
dto.Userid = (int)HttpContextExtension.GetUId(App.HttpContext);
var result = UseTran(() =>
{
//删除粉丝
Delete(f => f.Userid == dto.Userid && f.ToUserid == dto.ToUserid);
Context.Updateable<SocialFansInfo>()
.SetColumns(x => x.FollowNum == x.FollowNum - 1)
.Where(x => x.Userid == dto.Userid)
.ExecuteCommand();
Context.Updateable<SocialFansInfo>()
.SetColumns(x => x.FansNum == x.FansNum - 1)
.Where(x => x.Userid == dto.ToUserid)
.ExecuteCommand();
});
if (!result.IsSuccess)
{
return ApiResult.Error("取消关注失败");
}
var data = Context.Queryable<SocialFansInfo>()
.Where(x => x.Userid == dto.Userid)
.First();
return ApiResult.Success("取消关注成功", data);
}
private void UpdateFollowInfo(long userId, bool isFollowNum)
{
var count = Context.Updateable<SocialFansInfo>()
.SetColumnsIF(isFollowNum, x => x.FollowNum == x.FollowNum + 1)
.SetColumnsIF(!isFollowNum, x => x.FansNum == x.FansNum + 1)
.Where(x => x.Userid == userId)
.ExecuteCommand();
if (count > 0) return;
Context.Insertable(new SocialFansInfo
{
Userid = userId,
FollowNum = isFollowNum ? 1 : 0,
FansNum = isFollowNum ? 0 : 1,
UpdateTime = DateTime.Now
}).ExecuteCommand();
}
private PagedInfo<SocialFansDto> GetFollow(FansQueryDto dto, int userid)
{
return Queryable()
.LeftJoin<SysUser>((it, u) => it.ToUserid == u.UserId)
.Where(it => it.Userid == userid)
.Select((it, u) => new SocialFansDto()
{
User = new ArticleUser()
{
Avatar = u.Avatar,
NickName = u.NickName,
Sex = u.Sex,
},
Status = 1,
ToUserid = it.ToUserid,
})
.ToPage(dto);
}
private PagedInfo<SocialFansDto> GetFans(FansQueryDto dto, int userid)
{
return Queryable()
.LeftJoin<SysUser>((it, u) => it.Userid == u.UserId)
.Where(it => it.ToUserid == userid)
.Select((it, u) => new SocialFansDto()
{
User = new ArticleUser()
{
Avatar = u.Avatar,
NickName = u.NickName,
Sex = u.Sex,
},
Userid = it.Userid,
})
.ToPage(dto);
}
}
}