59 lines
1.5 KiB
TypeScript
59 lines
1.5 KiB
TypeScript
import { userService } from "./user";
|
|
import { sessionService } from "./session";
|
|
import type { LoginResult, SessionMetadata } from "./types";
|
|
|
|
/**
|
|
* Сервис авторизации
|
|
*/
|
|
export const loginService = {
|
|
/**
|
|
* Авторизация пользователя
|
|
*/
|
|
async login(
|
|
email: string,
|
|
password: string,
|
|
metadata: SessionMetadata
|
|
): Promise<LoginResult | null> {
|
|
// Найти пользователя по email
|
|
const user = await userService.findByEmail(email);
|
|
|
|
if (!user) {
|
|
return null;
|
|
}
|
|
|
|
// Проверить пароль
|
|
const isPasswordValid = await userService.verifyPassword(
|
|
password,
|
|
user.password
|
|
);
|
|
|
|
if (!isPasswordValid) {
|
|
return null;
|
|
}
|
|
|
|
// Создать новую сессию
|
|
const { sessionId, accessToken } = await sessionService.create(
|
|
user.id,
|
|
metadata
|
|
);
|
|
|
|
// Получить пользователя с полными данными (филиал и компания)
|
|
const userWithRelations = await userService.findByIdWithRelations(user.id);
|
|
|
|
// Вычислить дату истечения токена
|
|
const expiresAt = new Date();
|
|
expiresAt.setDate(expiresAt.getDate() + 7);
|
|
|
|
return {
|
|
user: userWithRelations
|
|
? userService.sanitizeWithRelations(userWithRelations)
|
|
: userService.sanitize(user),
|
|
session: {
|
|
id: sessionId,
|
|
token: accessToken,
|
|
expiresAt: expiresAt.toISOString(),
|
|
},
|
|
};
|
|
},
|
|
};
|