base commit

This commit is contained in:
@kirill.komarov
2026-05-10 14:38:32 +05:00
parent 5ddde15fd3
commit f56d6a79fb
6 changed files with 141 additions and 4 deletions
+20
View File
@@ -0,0 +1,20 @@
DATABASE_URL="file:./dev.db"
ADMIN_EMAIL=admin@example.com
# Default code for login
DEFAULT_CODE=123456
IS_DEFAULT_CODE_ENABLED=true
PORT=3333
# Токен для админ-запросов с фронта: Authorization: Bearer <значение>
ADMIN_API_TOKEN=dev-secret-change-me
# JWT для пользовательской авторизации (замени в проде)
JWT_SECRET=dev-jwt-secret-change-me
# Опционально: список origin для CORS через запятую (в dev можно не задавать)
# CORS_ORIGIN=http://localhost:5173
# SMTP для отправки кода (если не задано — код логируется в консоль как [DEV])
# SMTP_HOST=smtp.example.com
# SMTP_PORT=587
# SMTP_SECURE=false
# SMTP_USER=user@example.com
# SMTP_PASS=password
# MAIL_FROM="Craftshop <no-reply@example.com>"
+4
View File
@@ -3,6 +3,10 @@ PORT=3333
ADMIN_EMAIL=admin@example.com
JWT_SECRET=замените-на-секрет-jwt
# Только приватный стенд: фиксированный код входа (без письма), см. server/.dev_env и npm run dev/start:dev_env
# IS_DEFAULT_CODE_ENABLED=true
# DEFAULT_CODE=123456
# Разрешённый Origin фронта (через запятую при нескольких)
# CORS_ORIGIN=http://127.0.0.1:5173
+8 -2
View File
@@ -4,11 +4,17 @@
"private": true,
"type": "module",
"scripts": {
"dev": "node --watch src/index.js",
"dev": "node --env-file=.dev_env --watch src/index.js",
"dev:classic": "node --watch src/index.js",
"start": "node src/index.js",
"start:dev_env": "node --env-file=.dev_env src/index.js",
"db:migrate": "prisma migrate dev",
"db:migrate:test": "node --env-file=.dev_env ./node_modules/prisma/build/index.js migrate deploy",
"db:seed": "prisma db seed",
"db:studio": "prisma studio"
"db:seed:test": "node --env-file=.dev_env prisma/seed.js",
"db:reset:test": "node --env-file=.dev_env ./node_modules/prisma/build/index.js migrate reset --force",
"db:studio": "prisma studio",
"db:studio:test": "node --env-file=.dev_env ./node_modules/prisma/build/index.js studio"
},
"prisma": {
"seed": "node prisma/seed.js"
+15
View File
@@ -29,7 +29,22 @@ export async function issueEmailCode({ email, purpose, userId = null }) {
await sendLoginCodeEmail({ to: email, code })
}
function parseEnvBool(raw) {
const v = String(raw ?? '').trim().toLowerCase()
return v === 'true' || v === '1' || v === 'yes'
}
/** Тестовые стенды: принять код из переменной DEFAULT_CODE без записи в БД. */
export function isDefaultLoginCodeAccepted(codeInput) {
if (!parseEnvBool(process.env.IS_DEFAULT_CODE_ENABLED)) return false
const expected = String(process.env.DEFAULT_CODE ?? '').trim()
if (!expected || expected.length < 4) return false
return String(codeInput ?? '').trim() === expected
}
export async function verifyEmailCode({ email, purpose, code, userId = null }) {
if (purpose === 'login' && isDefaultLoginCodeAccepted(code)) return true
const now = new Date()
const codeHash = sha256(`${email}:${purpose}:${code}:${userId ?? ''}`)