import { join, resolve } from 'node:path'; function requireEnv(name: string): string { const value = process.env[name]; if (!value) { throw new Error(`Не задана переменная окружения ${name}`); } return value; } /** * Каталог с сертификатом и приватным ключом приложения. Одна переменная на весь * каталог, а не путь к каждому файлу: так его можно подменить централизованно — * локально это `secrets/` в корне репозитория (в git не попадает), в контейнере * SECRETS_DIR=/certs, куда смонтирован каталог с хоста (см. docker-compose.yml). * * __dirname здесь — server/dist, поэтому до корня репозитория два уровня вверх. */ const secretsDir = process.env.SECRETS_DIR ?? resolve(__dirname, '../../secrets'); export const config = { tenantId: requireEnv('GRAPH_TENANT_ID'), clientId: requireEnv('GRAPH_CLIENT_ID'), certPath: join(secretsDir, 'SPFxDeploy_cert.pem'), keyPath: join(secretsDir, 'SPFxDeploy_key.pem'), // Токен нужен не для Graph напрямую, а для api.tnsu.kz — он сам ходит в // SharePoint. Это его App ID URI: с graph.microsoft.com/.default api вернёт // 401, потому что проверяет aud во входящем JWT. scope: process.env.GRAPH_SCOPE ?? 'api://9232d9e2-9807-4753-808f-07250e5474b0/.default', port: Number(process.env.PORT ?? 3000), sharepointSiteUrl: 'https://tnsukz.sharepoint.com/sites/hrm', sharepointListName: 'Обращения' };