mirror of https://github.com/msgbyte/tailchat
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
4.2 KiB
TypeScript
185 lines
4.2 KiB
TypeScript
import {
|
|
TcService,
|
|
TcDbService,
|
|
TcContext,
|
|
Errors,
|
|
DataNotFoundError,
|
|
NoPermissionError,
|
|
} from 'tailchat-server-sdk';
|
|
import _ from 'lodash';
|
|
import type { FriendRequest } from '../../../models/user/friendRequest';
|
|
|
|
interface FriendService extends TcService, TcDbService<any> {}
|
|
class FriendService extends TcService {
|
|
get serviceName(): string {
|
|
return 'friend.request';
|
|
}
|
|
onInit(): void {
|
|
this.registerLocalDb(require('../../../models/user/friendRequest').default);
|
|
// this.registerMixin(TcCacheCleaner(['cache.clean.friend']));
|
|
|
|
this.registerAction('add', this.add, {
|
|
params: {
|
|
to: 'string',
|
|
message: [{ type: 'string', optional: true }],
|
|
},
|
|
});
|
|
this.registerAction('allRelated', this.allRelated);
|
|
this.registerAction('accept', this.accept, {
|
|
params: {
|
|
requestId: 'string',
|
|
},
|
|
});
|
|
this.registerAction('deny', this.deny, {
|
|
params: {
|
|
requestId: 'string',
|
|
},
|
|
});
|
|
this.registerAction('cancel', this.cancel, {
|
|
params: {
|
|
requestId: 'string',
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 请求添加好友
|
|
*/
|
|
async add(ctx: TcContext<{ to: string; message?: string }>) {
|
|
const from = ctx.meta.userId;
|
|
|
|
const { to, message } = ctx.params;
|
|
|
|
if (from === to) {
|
|
throw new Errors.ValidationError('不能添加自己为好友');
|
|
}
|
|
|
|
const exist = await this.adapter.findOne({
|
|
from,
|
|
to,
|
|
});
|
|
if (exist) {
|
|
throw new Errors.MoleculerError('不能发送重复的好友请求');
|
|
}
|
|
|
|
const isFriend = await ctx.call('friend.checkIsFriend', { targetId: to });
|
|
if (isFriend) {
|
|
throw new Error('对方已经是您的好友, 不能再次添加');
|
|
}
|
|
|
|
const doc = await this.adapter.insert({
|
|
from,
|
|
to,
|
|
message,
|
|
});
|
|
const request = await this.transformDocuments(ctx, {}, doc);
|
|
|
|
this.listcastNotify(ctx, [from, to], 'add', request);
|
|
|
|
return request;
|
|
}
|
|
|
|
/**
|
|
* 所有与自己相关的好友请求
|
|
*/
|
|
async allRelated(ctx: TcContext) {
|
|
const userId = ctx.meta.userId;
|
|
|
|
const doc = await this.adapter.find({
|
|
query: {
|
|
$or: [{ from: userId }, { to: userId }],
|
|
},
|
|
});
|
|
|
|
const list = await await this.transformDocuments(ctx, {}, doc);
|
|
return list;
|
|
}
|
|
|
|
/**
|
|
* 接受好友请求
|
|
*/
|
|
async accept(ctx: TcContext<{ requestId: string }>) {
|
|
const requestId = ctx.params.requestId;
|
|
|
|
const request: FriendRequest = await this.adapter.findById(requestId);
|
|
if (_.isNil(request)) {
|
|
throw new DataNotFoundError('该好友请求未找到');
|
|
}
|
|
|
|
if (ctx.meta.userId !== String(request.to)) {
|
|
throw new NoPermissionError();
|
|
}
|
|
|
|
await ctx.call('friend.buildFriendRelation', {
|
|
user1: String(request.from),
|
|
user2: String(request.to),
|
|
});
|
|
|
|
await this.adapter.removeById(request._id);
|
|
|
|
this.listcastNotify(
|
|
ctx,
|
|
[String(request.from), String(request.to)],
|
|
'remove',
|
|
{
|
|
requestId,
|
|
}
|
|
);
|
|
}
|
|
|
|
/**
|
|
* 拒绝好友请求
|
|
*/
|
|
async deny(ctx: TcContext<{ requestId: string }>) {
|
|
const requestId = ctx.params.requestId;
|
|
|
|
const request: FriendRequest = await this.adapter.findById(requestId);
|
|
if (_.isNil(request)) {
|
|
throw new DataNotFoundError('该好友请求未找到');
|
|
}
|
|
|
|
if (ctx.meta.userId !== String(request.to)) {
|
|
throw new NoPermissionError();
|
|
}
|
|
|
|
await this.adapter.removeById(request._id);
|
|
|
|
this.listcastNotify(
|
|
ctx,
|
|
[String(request.from), String(request.to)],
|
|
'remove',
|
|
{
|
|
requestId,
|
|
}
|
|
);
|
|
}
|
|
|
|
/**
|
|
* 取消好友请求
|
|
*/
|
|
async cancel(ctx: TcContext<{ requestId: string }>) {
|
|
const requestId = ctx.params.requestId;
|
|
|
|
const request: FriendRequest = await this.adapter.findById(requestId);
|
|
if (_.isNil(request)) {
|
|
throw new DataNotFoundError('该好友请求未找到');
|
|
}
|
|
|
|
if (ctx.meta.userId !== String(request.from)) {
|
|
throw new NoPermissionError();
|
|
}
|
|
|
|
await this.adapter.removeById(request._id);
|
|
|
|
this.listcastNotify(
|
|
ctx,
|
|
[String(request.from), String(request.to)],
|
|
'remove',
|
|
{
|
|
requestId,
|
|
}
|
|
);
|
|
}
|
|
}
|
|
export default FriendService;
|