fix: invite

This commit is contained in:
richarjiang
2025-12-04 18:56:01 +08:00
parent eecc14d45a
commit 8a43b1795b
2 changed files with 25 additions and 22 deletions

View File

@@ -117,31 +117,49 @@ export class FamilyHealthService {
}
/**
* 生成邀请码
* 获取或生成邀请码
* 如果用户没有家庭组,自动创建一个
* 如果已有有效邀请码,直接返回
*/
async generateInviteCode(
userId: string,
dto: GenerateInviteCodeDto,
): Promise<{ familyGroupId: string; inviteCode: string; expiresAt: string; qrCodeUrl: string }> {
const membership = await this.familyMemberModel.findOne({
let membership = await this.familyMemberModel.findOne({
where: { userId },
});
// 如果用户没有家庭组,自动创建一个
if (!membership) {
throw new NotFoundException('您还没有家庭组');
this.logger.log(`用户 ${userId} 没有家庭组,自动创建`);
await this.createFamilyGroup(userId, { name: '我的家庭' });
membership = await this.familyMemberModel.findOne({
where: { userId },
});
}
// 只有 owner 和 admin 可以生成邀请码
if (membership.role === FamilyRole.MEMBER) {
if (membership!.role === FamilyRole.MEMBER) {
throw new ForbiddenException('只有管理员可以生成邀请码');
}
const familyGroup = await this.familyGroupModel.findByPk(membership.familyGroupId);
const familyGroup = await this.familyGroupModel.findByPk(membership!.familyGroupId);
if (!familyGroup) {
throw new NotFoundException('家庭组不存在');
}
// 生成邀请码
// 如果已有有效邀请码,直接返回
if (familyGroup.inviteCode && familyGroup.inviteCodeExpiresAt && dayjs(familyGroup.inviteCodeExpiresAt).isAfter(dayjs())) {
this.logger.log(`用户 ${userId} 获取家庭组 ${familyGroup.id} 的现有邀请码 ${familyGroup.inviteCode}`);
return {
familyGroupId: familyGroup.id,
inviteCode: familyGroup.inviteCode,
expiresAt: familyGroup.inviteCodeExpiresAt.toISOString(),
qrCodeUrl: `outlive://family/join?code=${familyGroup.inviteCode}`,
};
}
// 生成新邀请码
const inviteCode = this.generateUniqueInviteCode();
const expiresAt = dayjs().add(dto.expiresInHours || 24, 'hour').toDate();
@@ -155,7 +173,7 @@ export class FamilyHealthService {
familyGroupId: familyGroup.id,
inviteCode,
expiresAt: expiresAt.toISOString(),
qrCodeUrl: `outlive://family/join?code=${inviteCode}`, // 可以根据实际需求生成二维码 URL
qrCodeUrl: `outlive://family/join?code=${inviteCode}`,
};
}