Files
IdP/apps/sso-core/src/domain/auth-grpc.controller.ts
2026-06-25 15:14:50 +03:00

1006 lines
37 KiB
TypeScript

import { BadRequestException, Controller, UseFilters } from '@nestjs/common';
import { GrpcMethod } from '@nestjs/microservices';
import { GrpcExceptionFilter } from '../infra/grpc-exception.filter';
import { AdminService } from './admin.service';
import { AuthService } from './auth.service';
import { LoginCommand, RegisterCommand, VerifyPinCommand } from './dto';
import { PinService } from './pin.service';
import { SessionService } from './session.service';
import { RbacService } from './rbac.service';
import { SecurityService } from './security.service';
import { SettingsService } from './settings.service';
import { UserStatus } from '../generated/prisma/client';
import { ProfileService } from './profile.service';
import { DocumentsService } from './documents.service';
import { AddressesService } from './addresses.service';
import { OAuthCoreService } from './oauth-core.service';
import { OtpService } from './otp.service';
import { AdvancedAuthService } from './advanced-auth.service';
import { FamilyService } from './family.service';
import { MediaService } from './media.service';
import { NotificationsService } from './notifications.service';
import { ChatService } from './chat.service';
import { PresenceService } from './presence.service';
import { TotpService } from './totp.service';
import { MessagingService } from '../infra/messaging.service';
@Controller()
@UseFilters(new GrpcExceptionFilter())
export class AuthGrpcController {
constructor(
private readonly auth: AuthService,
private readonly pin: PinService,
private readonly session: SessionService,
private readonly admin: AdminService,
private readonly rbac: RbacService,
private readonly security: SecurityService,
private readonly settings: SettingsService,
private readonly profile: ProfileService,
private readonly documents: DocumentsService,
private readonly addresses: AddressesService,
private readonly oauthCore: OAuthCoreService,
private readonly otp: OtpService,
private readonly advancedAuth: AdvancedAuthService,
private readonly family: FamilyService,
private readonly media: MediaService,
private readonly notifications: NotificationsService,
private readonly chat: ChatService,
private readonly presence: PresenceService,
private readonly messaging: MessagingService,
private readonly totp: TotpService
) {}
@GrpcMethod('AuthService', 'Register')
register(command: RegisterCommand) {
return this.auth.register(command);
}
@GrpcMethod('AuthService', 'Login')
login(command: LoginCommand) {
return this.auth.login(command);
}
@GrpcMethod('AuthService', 'Identify')
identify(command: { login: string }) {
return this.auth.identify(command.login);
}
@GrpcMethod('AuthService', 'SendOtp')
sendPasswordlessOtp(command: { recipient: string; channel?: string; ipAddress?: string }) {
return this.auth.sendOtp(command.recipient, command.channel, command.ipAddress);
}
@GrpcMethod('AuthService', 'VerifyOtp')
verifyPasswordlessOtp(command: LoginCommand & { recipient: string; code: string }) {
return this.auth.verifyOtp(command);
}
@GrpcMethod('AuthService', 'LoginWithPassword')
loginWithPassword(command: LoginCommand & { tempAuthToken?: string }) {
return this.auth.loginWithPassword(command);
}
@GrpcMethod('AuthService', 'LoginWithLdap')
loginWithLdap(command: {
username: string;
password: string;
fingerprint: string;
deviceName?: string;
deviceType?: string;
ipAddress?: string;
userAgent?: string;
}) {
return this.auth.loginWithLdap(command);
}
@GrpcMethod('AuthService', 'VerifyTotpLogin')
verifyTotpLogin(command: { totpChallengeToken: string; code: string }) {
return this.auth.verifyTotpLogin(command.totpChallengeToken, command.code);
}
@GrpcMethod('AuthService', 'BeginTotpLogin')
beginTotpLogin(command: {
recipient: string;
fingerprint: string;
deviceName?: string;
deviceType?: string;
ipAddress?: string;
userAgent?: string;
}) {
return this.auth.beginTotpLogin(command);
}
@GrpcMethod('AuthService', 'VerifyPin')
verifyPin(command: VerifyPinCommand) {
return this.pin.verifyPin(command.sessionId, command.pin);
}
@GrpcMethod('AuthService', 'GetMe')
getMe(command: { userId: string }) {
return this.auth.getMe(command.userId);
}
@GrpcMethod('AuthService', 'RefreshSession')
refreshSession(command: { refreshToken: string; sessionId?: string }) {
return this.session.refreshSession(command.refreshToken, command.sessionId);
}
@GrpcMethod('AuthService', 'ValidateSession')
validateSession(command: { userId: string; sessionId: string; touchActivity?: boolean }) {
return this.session.validateSession(command.userId, command.sessionId, command.touchActivity ?? false);
}
@GrpcMethod('AdminService', 'ListUsers')
async listUsers(command: { search?: string }) {
const users = await this.admin.listUsers(command.search);
return { users };
}
@GrpcMethod('AdminService', 'SuspendUser')
suspendUser(command: { userId: string }) {
return this.admin.suspendUser(command.userId);
}
@GrpcMethod('AdminService', 'UpdateUserProfile')
updateUserProfile(command: { userId: string; displayName?: string; email?: string; phone?: string; backupEmail?: string; backupPhone?: string; status?: UserStatus }) {
const { userId, ...data } = command;
return this.admin.updateUserProfile(userId, data);
}
@GrpcMethod('AdminService', 'ResetPassword')
resetPassword(command: { userId: string; newPassword: string }) {
return this.admin.resetPassword(command.userId, command.newPassword);
}
@GrpcMethod('AdminService', 'SetSuperAdmin')
setSuperAdmin(command: { actorUserId: string; userId: string; isSuperAdmin: boolean }) {
return this.admin.setSuperAdmin(command.actorUserId, command.userId, command.isSuperAdmin);
}
@GrpcMethod('RbacService', 'ListRoles')
async listRoles() {
const roles = await this.rbac.listRoles();
return {
roles: roles.map((role) => ({
id: role.id,
slug: role.slug,
name: role.name,
description: role.description ?? undefined,
isSystem: role.isSystem,
isDefault: role.isDefault,
permissions: role.permissions.map((link) => ({
id: link.permission.id,
slug: link.permission.slug,
name: link.permission.name,
description: link.permission.description ?? undefined
}))
}))
};
}
@GrpcMethod('RbacService', 'ListOAuthClients')
async listOAuthClients(command: { actorUserId: string }) {
const clients = await this.rbac.listOAuthClients(command.actorUserId);
return {
clients: clients.map((client) => ({
id: client.id,
name: client.name,
clientId: client.clientId,
redirectUris: client.redirectUris,
scopes: client.scopes,
isActive: client.isActive,
type: client.type,
createdById: client.createdById ?? undefined,
createdByDisplayName: client.createdByDisplayName ?? undefined,
canManage: client.canManage
}))
};
}
@GrpcMethod('RbacService', 'ListPermissions')
async listPermissions() {
const permissions = await this.rbac.listPermissions();
return {
permissions: permissions.map((permission) => ({
id: permission.id,
slug: permission.slug,
name: permission.name,
description: permission.description ?? undefined
}))
};
}
@GrpcMethod('RbacService', 'ListOAuthScopes')
async listOAuthScopes() {
const scopes = await this.rbac.listOAuthScopes();
return {
scopes: scopes.map((scope) => ({
id: scope.id,
slug: scope.slug,
name: scope.name,
description: scope.description ?? undefined
}))
};
}
@GrpcMethod('RbacService', 'CreateRole')
async createRole(command: { actorUserId: string; slug: string; name: string; description?: string; permissionSlugs?: string[] }) {
const role = await this.rbac.createRole(command.actorUserId, {
slug: command.slug,
name: command.name,
description: command.description,
permissionSlugs: command.permissionSlugs
});
return {
id: role.id,
slug: role.slug,
name: role.name,
description: role.description ?? undefined,
isSystem: role.isSystem,
isDefault: role.isDefault,
permissions: role.permissions.map((link) => ({
id: link.permission.id,
slug: link.permission.slug,
name: link.permission.name,
description: link.permission.description ?? undefined
}))
};
}
@GrpcMethod('RbacService', 'UpdateRole')
async updateRole(command: {
actorUserId: string;
roleSlug: string;
name?: string;
description?: string;
permissionSlugs?: string[];
}) {
const role = await this.rbac.updateRole(command.actorUserId, command.roleSlug, {
name: command.name,
description: command.description,
permissionSlugs: command.permissionSlugs
});
return {
id: role.id,
slug: role.slug,
name: role.name,
description: role.description ?? undefined,
isSystem: role.isSystem,
isDefault: role.isDefault,
permissions: role.permissions.map((link) => ({
id: link.permission.id,
slug: link.permission.slug,
name: link.permission.name,
description: link.permission.description ?? undefined
}))
};
}
@GrpcMethod('RbacService', 'DeleteRole')
async deleteRole(command: { actorUserId: string; roleSlug: string }) {
await this.rbac.deleteRole(command.actorUserId, command.roleSlug);
return {};
}
@GrpcMethod('RbacService', 'AssignUserRole')
async assignUserRole(command: { actorUserId: string; userId: string; roleSlug: string }) {
const roles = await this.rbac.assignRole(command.actorUserId, command.userId, command.roleSlug);
return { userId: command.userId, roles };
}
@GrpcMethod('RbacService', 'RemoveUserRole')
async removeUserRole(command: { actorUserId: string; userId: string; roleSlug: string }) {
await this.rbac.removeRole(command.actorUserId, command.userId, command.roleSlug);
return {};
}
@GrpcMethod('RbacService', 'AssignUserPermission')
async assignUserPermission(command: { actorUserId: string; userId: string; permissionSlug: string }) {
const permissions = await this.rbac.assignUserPermission(command.actorUserId, command.userId, command.permissionSlug);
return { userId: command.userId, permissions };
}
@GrpcMethod('RbacService', 'RemoveUserPermission')
async removeUserPermission(command: { actorUserId: string; userId: string; permissionSlug: string }) {
const permissions = await this.rbac.removeUserPermission(command.actorUserId, command.userId, command.permissionSlug);
return { userId: command.userId, permissions };
}
@GrpcMethod('RbacService', 'CreateOAuthClient')
async createOAuthClient(command: { actorUserId: string; name: string; redirectUris: string[]; scopes: string[]; type?: string }) {
const { client, clientSecret } = await this.rbac.createOAuthClient(command.actorUserId, {
name: command.name,
redirectUris: command.redirectUris,
scopes: command.scopes,
type: command.type as never
});
return {
id: client.id,
name: client.name,
clientId: client.clientId,
redirectUris: client.redirectUris,
scopes: client.scopes.map((link) => link.scope.slug),
isActive: client.isActive,
type: client.type,
clientSecret: clientSecret ?? undefined
};
}
@GrpcMethod('RbacService', 'UpdateOAuthClient')
async updateOAuthClient(command: {
actorUserId: string;
clientId: string;
name?: string;
redirectUris?: string[];
scopes?: string[];
isActive?: boolean;
}) {
const { client } = await this.rbac.updateOAuthClient(command.actorUserId, command.clientId, {
name: command.name,
redirectUris: command.redirectUris,
scopes: command.scopes,
isActive: command.isActive
});
return {
id: client.id,
name: client.name,
clientId: client.clientId,
redirectUris: client.redirectUris,
scopes: client.scopes.map((link) => link.scope.slug),
isActive: client.isActive,
type: client.type
};
}
@GrpcMethod('RbacService', 'RotateOAuthSecret')
async rotateOAuthSecret(command: { actorUserId: string; clientId: string }) {
return this.rbac.rotateOAuthSecret(command.actorUserId, command.clientId);
}
@GrpcMethod('RbacService', 'DeleteOAuthClient')
async deleteOAuthClient(command: { actorUserId: string; clientId: string }) {
return this.rbac.deleteOAuthClient(command.actorUserId, command.clientId);
}
@GrpcMethod('SecurityService', 'ListActiveDevices')
async listActiveDevices(command: { userId: string; exceptSessionId?: string }) {
const devices = await this.security.listActiveDevices(command.userId, command.exceptSessionId);
return {
devices: devices.map((device) => ({
id: device.id,
name: device.name,
type: device.type,
lastIp: device.lastIp,
lastSeenAt: device.lastSeenAt.toISOString(),
trusted: device.trusted
}))
};
}
@GrpcMethod('SecurityService', 'ListSignInHistory')
async listSignInHistory(command: { userId: string }) {
const events = await this.security.listSignInHistory(command.userId);
return {
events: events.map((event) => ({
id: event.id,
success: event.success,
reason: event.reason,
ipAddress: event.ipAddress,
userAgent: event.userAgent,
createdAt: event.createdAt.toISOString()
}))
};
}
@GrpcMethod('SecurityService', 'ListActiveSessions')
async listActiveSessions(command: { userId: string }) {
const sessions = await this.security.listActiveSessions(command.userId);
return {
sessions: sessions.map((session) => this.toSessionResponse(session))
};
}
@GrpcMethod('SecurityService', 'LockSession')
async lockSession(command: { userId: string; sessionId: string }) {
return this.toSessionResponse(await this.security.lockSession(command.userId, command.sessionId));
}
@GrpcMethod('SecurityService', 'RevokeSession')
async revokeSession(command: { userId: string; sessionId: string }) {
return this.toSessionResponse(await this.security.revokeSession(command.userId, command.sessionId));
}
@GrpcMethod('SecurityService', 'RevokeDevice')
async revokeDevice(command: { userId: string; deviceId: string }) {
const result = await this.security.revokeDevice(command.userId, command.deviceId);
return { count: result.count };
}
@GrpcMethod('SecurityService', 'RevokeAllSessions')
async revokeAllSessions(command: { userId: string; exceptSessionId?: string }) {
const result = await this.security.revokeAllSessions(command.userId, command.exceptSessionId);
return { count: result.count };
}
@GrpcMethod('SecurityService', 'GetTotpStatus')
getTotpStatus(command: { userId: string }) {
return this.totp.getStatus(command.userId);
}
@GrpcMethod('SecurityService', 'SetupTotp')
setupTotp(command: { userId: string }) {
return this.totp.setup(command.userId);
}
@GrpcMethod('SecurityService', 'EnableTotp')
enableTotp(command: { userId: string; code: string }) {
return this.totp.enable(command.userId, command.code);
}
@GrpcMethod('SecurityService', 'DisableTotp')
disableTotp(command: { userId: string; code: string }) {
return this.totp.disable(command.userId, command.code);
}
@GrpcMethod('SecurityService', 'SetupPin')
setupPin(command: { userId: string; pin: string }) {
return this.pin.setupPin(command.userId, command.pin);
}
@GrpcMethod('SecurityService', 'UpdatePin')
updatePin(command: { userId: string; pin: string }) {
return this.pin.updatePin(command.userId, command.pin);
}
@GrpcMethod('SecurityService', 'RequestPinDeletion')
requestPinDeletion(command: { userId: string; pin: string }) {
return this.pin.requestPinDeletion(command.userId, command.pin);
}
@GrpcMethod('SecurityService', 'CancelPinDeletion')
cancelPinDeletion(command: { userId: string }) {
return this.pin.cancelPinDeletion(command.userId);
}
@GrpcMethod('SecurityService', 'VerifyPinCode')
verifyPinCode(command: { sessionId: string; pin: string }) {
return this.pin.verifyPin(command.sessionId, command.pin);
}
@GrpcMethod('SecurityService', 'ConnectLinkedAccount')
async connectLinkedAccount(command: { userId: string; providerName: string; providerId: string; email?: string; displayName?: string; avatarUrl?: string }) {
return this.toLinkedAccountResponse(await this.security.connectSocialAccount(command.userId, command));
}
@GrpcMethod('SecurityService', 'DisconnectLinkedAccount')
disconnectLinkedAccount(command: { userId: string; providerName: string }) {
return this.security.disconnectSocialAccount(command.userId, command.providerName);
}
@GrpcMethod('SecurityService', 'ListLinkedAccounts')
async listLinkedAccounts(command: { userId: string }) {
const accounts = await this.security.listLinkedAccounts(command.userId);
return { accounts: accounts.map((account) => this.toLinkedAccountResponse(account)) };
}
@GrpcMethod('SettingsService', 'ListSettings')
async listSettings() {
const settings = await this.settings.list();
return {
settings: settings.map((setting) => ({
id: setting.id,
key: setting.key,
value: setting.value,
description: setting.description ?? undefined,
isSecret: setting.isSecret
}))
};
}
@GrpcMethod('SettingsService', 'ListPublicSettings')
async listPublicSettings() {
const settings = await this.settings.listPublic();
return {
settings: settings.map((setting) => ({
key: setting.key,
value: setting.value
}))
};
}
@GrpcMethod('SettingsService', 'GetSetting')
getSetting(command: { key: string }) {
return this.settings.get(command.key);
}
@GrpcMethod('SettingsService', 'UpsertSetting')
upsertSetting(command: { key: string; value: string; description?: string; isSecret?: boolean }) {
return this.settings.upsert(command);
}
@GrpcMethod('SettingsService', 'DeleteSetting')
deleteSetting(command: { key: string }) {
return this.settings.delete(command.key);
}
@GrpcMethod('SettingsService', 'ListSocialProviders')
async listSocialProviders() {
const providers = await this.settings.listSocialProviders();
return { providers: providers.map((provider) => this.toSocialProviderResponse(provider)) };
}
@GrpcMethod('SettingsService', 'UpsertSocialProvider')
async upsertSocialProvider(command: { providerName: string; clientId: string; clientSecret?: string; isEnabled: boolean }) {
return this.toSocialProviderResponse(await this.settings.upsertSocialProvider(command));
}
@GrpcMethod('SettingsService', 'DeleteSocialProvider')
deleteSocialProvider(command: { providerName: string }) {
return this.settings.deleteSocialProvider(command.providerName);
}
@GrpcMethod('SettingsService', 'TestMessagingDelivery')
async testMessagingDelivery(command: { channel: string; target: string }) {
const channel = command.channel === 'sms' ? 'sms' : 'email';
if (!command.target?.trim()) {
throw new BadRequestException('Укажите email или номер телефона для тестовой отправки');
}
return this.messaging.sendTestDelivery(channel, command.target.trim());
}
@GrpcMethod('ProfileService', 'GetProfile')
getProfile(command: { userId: string }) {
return this.profile.getProfile(command.userId);
}
@GrpcMethod('ProfileService', 'UpdateAvatar')
updateAvatar(command: { userId: string; avatarUrl?: string; avatarStorageKey?: string }) {
return this.profile.updateAvatar(command.userId, command.avatarUrl, command.avatarStorageKey);
}
@GrpcMethod('ProfileService', 'UpdateProfile')
updateProfile(command: { userId: string; firstName?: string; lastName?: string; bio?: string; age?: number; gender?: string; birthDate?: string }) {
return this.profile.updateProfile(command);
}
@GrpcMethod('ProfileService', 'UpdateContacts')
updateContacts(command: { userId: string; email?: string; phone?: string; backupEmail?: string; backupPhone?: string }) {
return this.profile.updateContacts(command);
}
@GrpcMethod('ProfileService', 'SetPassword')
setPassword(command: { userId: string; password: string }) {
return this.profile.setPassword(command.userId, command.password);
}
@GrpcMethod('ProfileService', 'SendPasswordVerificationOtp')
sendPasswordVerificationOtp(command: { userId: string; channel: string }) {
return this.profile.sendPasswordVerificationOtp(command.userId, command.channel as 'sms' | 'email');
}
@GrpcMethod('ProfileService', 'ChangePassword')
changePassword(command: {
userId: string;
newPassword: string;
currentPassword?: string;
otpCode?: string;
otpChannel?: string;
totpCode?: string;
}) {
return this.profile.changePassword(command.userId, command.newPassword, command);
}
@GrpcMethod('ProfileService', 'RemovePassword')
removePassword(command: {
userId: string;
currentPassword?: string;
otpCode?: string;
otpChannel?: string;
totpCode?: string;
}) {
return this.profile.removePassword(command.userId, command);
}
@GrpcMethod('ProfileService', 'SoftDeleteProfile')
softDeleteProfile(command: { userId: string }) {
return this.profile.softDeleteProfile(command.userId);
}
@GrpcMethod('ProfileService', 'RequestAccountDeletion')
requestAccountDeletion(command: { userId: string }) {
return this.profile.requestAccountDeletion(command.userId);
}
@GrpcMethod('ProfileService', 'CancelAccountDeletion')
cancelAccountDeletion(command: { userId: string }) {
return this.profile.cancelAccountDeletion(command.userId);
}
@GrpcMethod('ProfileService', 'GetAccountDeletionStatus')
getAccountDeletionStatus(command: { userId: string }) {
return this.profile.getAccountDeletionStatus(command.userId);
}
@GrpcMethod('DocumentsService', 'CreateDocument')
createDocument(command: { userId: string; type: string; number: string; issuedAt?: string; expiresAt?: string; metadataJson?: string }) {
return this.documents.create(command);
}
@GrpcMethod('DocumentsService', 'ListDocuments')
listDocuments(command: { userId: string }) {
return this.documents.list(command.userId);
}
@GrpcMethod('DocumentsService', 'GetDocument')
getDocument(command: { documentId: string; userId: string }) {
return this.documents.get(command.documentId, command.userId);
}
@GrpcMethod('DocumentsService', 'UpdateDocument')
updateDocument(command: { documentId: string; userId: string; number?: string; issuedAt?: string; expiresAt?: string; metadataJson?: string }) {
return this.documents.update(command);
}
@GrpcMethod('DocumentsService', 'DeleteDocument')
deleteDocument(command: { documentId: string; userId: string }) {
return this.documents.delete(command.documentId, command.userId);
}
@GrpcMethod('AddressesService', 'ListAddresses')
listAddresses(command: { userId: string }) {
return this.addresses.list(command.userId);
}
@GrpcMethod('AddressesService', 'UpsertAddress')
upsertAddress(command: {
userId: string;
addressId?: string;
label: string;
city: string;
street: string;
house: string;
apartment?: string;
comment?: string;
latitude?: number;
longitude?: number;
fullAddress?: string;
}) {
return this.addresses.upsert(command);
}
@GrpcMethod('AddressesService', 'DeleteAddress')
deleteAddress(command: { addressId: string; userId: string }) {
return this.addresses.delete(command.addressId, command.userId);
}
@GrpcMethod('MediaService', 'CreateAvatarUploadUrl')
createAvatarUploadUrl(command: { userId: string; contentType: string }) {
return this.media.createAvatarUploadUrl(command.userId, command.contentType);
}
@GrpcMethod('MediaService', 'ConfirmAvatar')
confirmAvatar(command: { userId: string; storageKey: string }) {
return this.media.confirmAvatar(command.userId, command.storageKey);
}
@GrpcMethod('MediaService', 'GetAvatarAccessUrl')
getAvatarAccessUrl(command: { requesterId: string; targetUserId: string }) {
return this.media.getAvatarAccessUrl(command.requesterId, command.targetUserId);
}
@GrpcMethod('MediaService', 'CreateDocumentPhotoUploadUrl')
createDocumentPhotoUploadUrl(command: { userId: string; documentId: string; contentType: string }) {
return this.media.createDocumentPhotoUploadUrl(command.userId, command.documentId, command.contentType);
}
@GrpcMethod('MediaService', 'GetDocumentPhotoAccessUrl')
getDocumentPhotoAccessUrl(command: { requesterId: string; targetUserId: string; storageKey: string }) {
return this.media.getDocumentPhotoAccessUrl(command.requesterId, command.targetUserId, command.storageKey);
}
@GrpcMethod('MediaService', 'ResolveStreamToken')
resolveStreamToken(command: { token: string; requesterId?: string }) {
return this.media.resolveStreamToken(command.token, command.requesterId);
}
@GrpcMethod('MediaService', 'CreateFamilyAvatarUploadUrl')
createFamilyAvatarUploadUrl(command: { requesterId: string; groupId: string; contentType: string }) {
return this.media.createFamilyAvatarUploadUrl(command.requesterId, command.groupId, command.contentType);
}
@GrpcMethod('MediaService', 'ConfirmFamilyAvatar')
confirmFamilyAvatar(command: { requesterId: string; groupId: string; storageKey: string }) {
return this.media.confirmFamilyAvatar(command.requesterId, command.groupId, command.storageKey);
}
@GrpcMethod('MediaService', 'GetFamilyAvatarAccessUrl')
getFamilyAvatarAccessUrl(command: { requesterId: string; groupId: string }) {
return this.media.getFamilyAvatarAccessUrl(command.requesterId, command.groupId);
}
@GrpcMethod('MediaService', 'CreateChatMediaUploadUrl')
createChatMediaUploadUrl(command: { requesterId: string; roomId: string; contentType: string; fileName?: string }) {
return this.media.createChatMediaUploadUrl(command.requesterId, command.roomId, command.contentType, command.fileName);
}
@GrpcMethod('MediaService', 'GetChatMediaAccessUrl')
getChatMediaAccessUrl(command: { requesterId: string; roomId: string; storageKey: string; fileName?: string }) {
return this.media.getChatMediaAccessUrl(command.requesterId, command.roomId, command.storageKey, command.fileName);
}
@GrpcMethod('MediaService', 'CreateChatRoomAvatarUploadUrl')
createChatRoomAvatarUploadUrl(command: { requesterId: string; roomId: string; contentType: string }) {
return this.media.createChatRoomAvatarUploadUrl(command.requesterId, command.roomId, command.contentType);
}
@GrpcMethod('MediaService', 'ConfirmChatRoomAvatar')
confirmChatRoomAvatar(command: { requesterId: string; roomId: string; storageKey: string }) {
return this.media.confirmChatRoomAvatar(command.requesterId, command.roomId, command.storageKey);
}
@GrpcMethod('MediaService', 'GetChatRoomAvatarAccessUrl')
getChatRoomAvatarAccessUrl(command: { requesterId: string; roomId: string }) {
return this.media.getChatRoomAvatarAccessUrl(command.requesterId, command.roomId);
}
@GrpcMethod('OAuthCoreService', 'Authorize')
authorize(command: { userId: string; clientId: string; redirectUri: string; scope: string; state?: string }) {
return this.oauthCore.authorize(command);
}
@GrpcMethod('OAuthCoreService', 'Token')
token(command: { grantType: string; code?: string; refreshToken?: string; clientId: string; clientSecret?: string; redirectUri?: string }) {
return this.oauthCore.token(command);
}
@GrpcMethod('OAuthCoreService', 'UserInfo')
userInfo(command: { accessToken: string }) {
return this.oauthCore.userInfo(command.accessToken);
}
@GrpcMethod('OtpService', 'SendOtp')
sendOtp(command: { target: string; channel: string; purpose: string; userId?: string }) {
return this.otp.send(command);
}
@GrpcMethod('OtpService', 'VerifyOtp')
verifyOtp(command: { target: string; code: string; purpose: string }) {
return this.otp.verify(command);
}
@GrpcMethod('AdvancedAuthService', 'CreateWebAuthnRegistrationChallenge')
createWebAuthnRegistrationChallenge(command: { userId: string }) {
return this.advancedAuth.createWebAuthnRegistrationChallenge(command.userId);
}
@GrpcMethod('AdvancedAuthService', 'CreateWebAuthnLoginChallenge')
createWebAuthnLoginChallenge(command: { userId: string }) {
return this.advancedAuth.createWebAuthnLoginChallenge(command.userId);
}
@GrpcMethod('AdvancedAuthService', 'CreateQrSession')
createQrSession(command: { deviceName: string; fingerprint?: string; deviceType?: string; ipAddress?: string; userAgent?: string }) {
return this.advancedAuth.createQrSession({
deviceName: command.deviceName,
fingerprint: command.fingerprint ?? command.deviceName,
deviceType: command.deviceType,
ipAddress: command.ipAddress,
userAgent: command.userAgent
});
}
@GrpcMethod('AdvancedAuthService', 'PollQrSession')
pollQrSession(command: { sessionId: string }) {
return this.advancedAuth.pollQrSession(command.sessionId);
}
@GrpcMethod('AdvancedAuthService', 'ApproveQrSession')
approveQrSession(command: { sessionId: string; userId: string }) {
return this.advancedAuth.approveQrSession(command.sessionId, command.userId);
}
@GrpcMethod('FamilyService', 'CreateFamilyGroup')
createFamilyGroup(command: { ownerId: string; name: string }) {
return this.family.create(command.ownerId, command.name);
}
@GrpcMethod('FamilyService', 'ListFamilyGroups')
listFamilyGroups(command: { userId: string }) {
return this.family.list(command.userId);
}
@GrpcMethod('FamilyService', 'GetFamilyGroup')
getFamilyGroup(command: { requesterId: string; groupId: string }) {
return this.family.get(command.requesterId, command.groupId);
}
@GrpcMethod('FamilyService', 'UpdateFamilyGroup')
updateFamilyGroup(command: { requesterId: string; groupId: string; name: string }) {
return this.family.update(command.requesterId, command.groupId, command.name);
}
@GrpcMethod('FamilyService', 'DeleteFamilyGroup')
deleteFamilyGroup(command: { requesterId: string; groupId: string }) {
return this.family.delete(command.requesterId, command.groupId);
}
@GrpcMethod('FamilyService', 'AddFamilyMember')
addFamilyMember(command: { groupId: string; userId: string; role: string }) {
return this.family.addMember(command.groupId, command.userId, command.role);
}
@GrpcMethod('FamilyService', 'RemoveFamilyMember')
removeFamilyMember(command: { requesterId: string; memberId: string }) {
return this.family.removeMember(command.requesterId, command.memberId);
}
@GrpcMethod('FamilyService', 'SendFamilyInvite')
sendFamilyInvite(command: { requesterId: string; groupId: string; target?: string; inviteeUserId?: string }) {
return this.family.sendInvite(command.requesterId, command.groupId, {
target: command.target,
inviteeUserId: command.inviteeUserId
});
}
@GrpcMethod('FamilyService', 'SearchFamilyInviteUsers')
searchFamilyInviteUsers(command: { requesterId: string; groupId: string; query: string }) {
return this.family.searchInviteUsers(command.requesterId, command.groupId, command.query);
}
@GrpcMethod('FamilyService', 'RespondFamilyInvite')
respondFamilyInvite(command: { userId: string; inviteId: string; accept: boolean }) {
return this.family.respondInvite(command.userId, command.inviteId, command.accept);
}
@GrpcMethod('FamilyService', 'ListFamilyInvites')
listFamilyInvites(command: { userId: string; groupId?: string }) {
return this.family.listInvites(command.userId, command.groupId);
}
@GrpcMethod('FamilyService', 'GetFamilyPresence')
getFamilyPresence(command: { requesterId: string; groupId: string }) {
return this.presence.getFamilyPresence(command.requesterId, command.groupId);
}
@GrpcMethod('NotificationsService', 'ListNotifications')
listNotifications(command: { userId: string; limit?: number; unreadOnly?: boolean }) {
return this.notifications.list(command.userId, command.limit, command.unreadOnly);
}
@GrpcMethod('NotificationsService', 'GetUnreadCount')
getUnreadCount(command: { userId: string }) {
return this.notifications.unreadCount(command.userId);
}
@GrpcMethod('NotificationsService', 'MarkNotificationRead')
markNotificationRead(command: { userId: string; notificationId: string }) {
return this.notifications.markRead(command.userId, command.notificationId);
}
@GrpcMethod('NotificationsService', 'MarkAllNotificationsRead')
markAllNotificationsRead(command: { userId: string }) {
return this.notifications.markAllRead(command.userId);
}
@GrpcMethod('NotificationsService', 'DeleteNotification')
deleteNotification(command: { userId: string; notificationId: string }) {
return this.notifications.delete(command.userId, command.notificationId);
}
@GrpcMethod('NotificationsService', 'DeleteAllNotifications')
deleteAllNotifications(command: { userId: string }) {
return this.notifications.deleteAll(command.userId);
}
@GrpcMethod('ChatService', 'ListRooms')
listChatRooms(command: { userId: string; groupId: string }) {
return this.chat.listRooms(command.userId, command.groupId);
}
@GrpcMethod('ChatService', 'CreateRoom')
createChatRoom(command: { userId: string; groupId: string; name: string; memberUserIds?: string[] }) {
return this.chat.createRoom(command.userId, command.groupId, command.name, command.memberUserIds ?? []);
}
@GrpcMethod('ChatService', 'UpdateRoomSettings')
updateChatRoomSettings(command: { userId: string; roomId: string; name?: string; notificationsMuted?: boolean }) {
return this.chat.updateRoomSettings(command.userId, command.roomId, command.name, command.notificationsMuted);
}
@GrpcMethod('ChatService', 'AddRoomMember')
addChatRoomMember(command: { userId: string; roomId: string; memberUserId: string }) {
return this.chat.addRoomMember(command.userId, command.roomId, command.memberUserId);
}
@GrpcMethod('ChatService', 'RemoveRoomMember')
removeChatRoomMember(command: { userId: string; roomId: string; memberUserId: string }) {
return this.chat.removeRoomMember(command.userId, command.roomId, command.memberUserId);
}
@GrpcMethod('ChatService', 'ListMessages')
listChatMessages(command: { userId: string; roomId: string; beforeMessageId?: string; limit?: number }) {
return this.chat.listMessages(command.userId, command.roomId, command.beforeMessageId, command.limit);
}
@GrpcMethod('ChatService', 'SendMessage')
sendChatMessage(command: {
userId: string;
roomId: string;
type: string;
content?: string;
replyToId?: string;
storageKey?: string;
mimeType?: string;
metadataJson?: string;
poll?: { question: string; options: string[]; allowsMultiple?: boolean; isAnonymous?: boolean };
}) {
return this.chat.sendMessage(
command.userId,
command.roomId,
command.type,
command.content,
command.replyToId,
command.storageKey,
command.mimeType,
command.metadataJson,
command.poll
);
}
@GrpcMethod('ChatService', 'VotePoll')
voteChatPoll(command: { userId: string; messageId: string; optionIds?: string[] }) {
return this.chat.votePoll(command.userId, command.messageId, command.optionIds ?? []);
}
@GrpcMethod('ChatService', 'SetRoomNotificationsMuted')
setRoomNotificationsMuted(command: { userId: string; roomId: string; muted: boolean }) {
return this.chat.setRoomNotificationsMuted(command.userId, command.roomId, command.muted);
}
@GrpcMethod('ChatService', 'EditMessage')
editChatMessage(command: { userId: string; messageId: string; content: string }) {
return this.chat.editMessage(command.userId, command.messageId, command.content);
}
@GrpcMethod('ChatService', 'DeleteMessage')
deleteChatMessage(command: { userId: string; messageId: string }) {
return this.chat.deleteMessage(command.userId, command.messageId);
}
@GrpcMethod('ChatService', 'MarkRoomRead')
markChatRoomRead(command: { userId: string; roomId: string; lastMessageId?: string }) {
return this.chat.markRoomRead(command.userId, command.roomId, command.lastMessageId);
}
private toSessionResponse(session: { id: string; userId: string; deviceId: string | null; pinVerified: boolean; status: string; ipAddress: string | null; userAgent: string | null; expiresAt: Date; createdAt: Date; updatedAt: Date }) {
return {
id: session.id,
userId: session.userId,
deviceId: session.deviceId,
pinVerified: session.pinVerified,
status: session.status,
ipAddress: session.ipAddress,
userAgent: session.userAgent,
expiresAt: session.expiresAt.toISOString(),
createdAt: session.createdAt.toISOString(),
updatedAt: session.updatedAt.toISOString()
};
}
private toLinkedAccountResponse(account: { id: string; userId: string; providerName: string; providerId: string; email: string | null; displayName: string | null; avatarUrl: string | null; createdAt: Date; updatedAt: Date }) {
return {
...account,
createdAt: account.createdAt.toISOString(),
updatedAt: account.updatedAt.toISOString()
};
}
private toSocialProviderResponse(provider: { id: string; providerName: string; clientId: string; clientSecret: string | null; isEnabled: boolean; createdAt: Date; updatedAt: Date }) {
return {
...provider,
createdAt: provider.createdAt.toISOString(),
updatedAt: provider.updatedAt.toISOString()
};
}
}