diff --git a/apps/api-gateway/src/controllers/family.controller.ts b/apps/api-gateway/src/controllers/family.controller.ts
index 686d311..efc91a0 100644
--- a/apps/api-gateway/src/controllers/family.controller.ts
+++ b/apps/api-gateway/src/controllers/family.controller.ts
@@ -5,7 +5,7 @@ import { firstValueFrom } from 'rxjs';
import { map } from 'rxjs/operators';
import { CoreGrpcService } from '../core-grpc.service';
import { getAuthorizedUserId } from '../document-access';
-import { AddFamilyMemberDto, CreateFamilyGroupDto, LeaveFamilyGroupDto, RespondFamilyInviteDto, SendFamilyInviteDto, UpdateFamilyGroupDto } from '../dto/identity.dto';
+import { AddFamilyMemberDto, CreateFamilyGroupDto, LeaveFamilyGroupDto, RespondFamilyInviteDto, SendFamilyInviteDto, TransferFamilyOwnershipDto, UpdateFamilyGroupDto } from '../dto/identity.dto';
@ApiTags('Семья')
@ApiBearerAuth()
@@ -108,6 +108,23 @@ export class FamilyController {
);
}
+ @Post('groups/:groupId/transfer-ownership')
+ @ApiOperation({ summary: 'Передать управление семейной группой' })
+ async transferOwnership(
+ @Headers('authorization') authorization: string | undefined,
+ @Param('groupId') groupId: string,
+ @Body() dto: TransferFamilyOwnershipDto
+ ) {
+ const requesterId = await this.auth(authorization);
+ return firstValueFrom(
+ this.core.family.TransferFamilyOwnership({
+ requesterId,
+ groupId,
+ newOwnerUserId: dto.newOwnerUserId
+ })
+ );
+ }
+
@Get('groups/:groupId/invite-search')
@ApiOperation({ summary: 'Поиск пользователей для приглашения в семью' })
async searchInviteUsers(
diff --git a/apps/api-gateway/src/dto/identity.dto.ts b/apps/api-gateway/src/dto/identity.dto.ts
index 0bcb37f..e073f96 100644
--- a/apps/api-gateway/src/dto/identity.dto.ts
+++ b/apps/api-gateway/src/dto/identity.dto.ts
@@ -161,3 +161,10 @@ export class LeaveFamilyGroupDto {
newOwnerUserId?: string;
}
+export class TransferFamilyOwnershipDto {
+ @ApiProperty({ description: 'ID пользователя, которому передаётся управление семьёй' })
+ @IsString({ message: 'ID нового главы семьи должен быть строкой' })
+ @IsNotEmpty({ message: 'Укажите нового главу семьи' })
+ newOwnerUserId!: string;
+}
+
diff --git a/apps/frontend/app/admin/users/page.tsx b/apps/frontend/app/admin/users/page.tsx
index b12a875..85046c5 100644
--- a/apps/frontend/app/admin/users/page.tsx
+++ b/apps/frontend/app/admin/users/page.tsx
@@ -324,7 +324,7 @@ export default function AdminUsersPage() {
-
+
{loading ? (
diff --git a/apps/frontend/app/documents/page.tsx b/apps/frontend/app/documents/page.tsx
index d8b3030..aa64619 100644
--- a/apps/frontend/app/documents/page.tsx
+++ b/apps/frontend/app/documents/page.tsx
@@ -52,7 +52,7 @@ export default function DocumentsPage() {
return (
- Документы
+ Документы
Храните документы и заполняйте формы — ID подставит данные там, где вы разрешите.
diff --git a/apps/frontend/app/family/[groupId]/page.tsx b/apps/frontend/app/family/[groupId]/page.tsx
index 0c6d9b5..2744a47 100644
--- a/apps/frontend/app/family/[groupId]/page.tsx
+++ b/apps/frontend/app/family/[groupId]/page.tsx
@@ -19,7 +19,7 @@ export default function FamilyGroupPage({ params }: { params: Promise<{ groupId:
const { groupId } = use(params);
return (
-
+
);
diff --git a/apps/frontend/app/family/page.tsx b/apps/frontend/app/family/page.tsx
index a8d6a47..fe20408 100644
--- a/apps/frontend/app/family/page.tsx
+++ b/apps/frontend/app/family/page.tsx
@@ -65,12 +65,12 @@ export default function FamilyPage() {
return (
Семья
- Семейный доступ
- Приглашайте близких, общайтесь в чатах и управляйте семейной группой.
+ Семейный доступ
+ Приглашайте близких, общайтесь в чатах и управляйте семейной группой.
-
-
setName(event.target.value)} placeholder="Название семьи" />
-