n8n-full-backend.json•11.8 kB
{
  "name": "Human Design Full Backend (No External API)",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "human-design",
        "responseMode": "responseNode",
        "options": {}
      },
      "name": "Webhook Entry",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [240, 300],
      "webhookId": "hd-full-backend"
    },
    {
      "parameters": {
        "jsCode": "// Полная реализация Human Design расчетов в n8n\n\nconst { birthDate, birthTime, birthLocation } = $input.item.json;\n\n// Валидация\nif (!birthDate || !birthTime || !birthLocation) {\n  return { json: { success: false, error: 'Missing required fields' } };\n}\n\n// Human Design константы\nconst GATES = {\n  1: { name: 'The Creative', ru_name: 'Творческий' }, 2: { name: 'The Receptive', ru_name: 'Воспринимающий' },\n  3: { name: 'Ordering', ru_name: 'Порядок' }, 4: { name: 'Formulization', ru_name: 'Формулирование' },\n  5: { name: 'Needing', ru_name: 'Потребность' }, 6: { name: 'Friction', ru_name: 'Трение' },\n  7: { name: 'The Role of Self', ru_name: 'Роль Я' }, 8: { name: 'Holding Together', ru_name: 'Удержание вместе' },\n  9: { name: 'The Focus', ru_name: 'Фокус' }, 10: { name: 'The Treading', ru_name: 'Шаги' },\n  11: { name: 'Ideas', ru_name: 'Идеи' }, 12: { name: 'Caution', ru_name: 'Осторожность' },\n  13: { name: 'The Listener', ru_name: 'Слушатель' }, 14: { name: 'Power Skills', ru_name: 'Силовые навыки' },\n  15: { name: 'Modesty', ru_name: 'Скромность' }, 16: { name: 'Skills', ru_name: 'Навыки' },\n  17: { name: 'Following', ru_name: 'Следование' }, 18: { name: 'Work', ru_name: 'Работа' },\n  19: { name: 'Approach', ru_name: 'Подход' }, 20: { name: 'Now', ru_name: 'Сейчас' },\n  21: { name: 'The Editor', ru_name: 'Редактор' }, 22: { name: 'Openness', ru_name: 'Открытость' },\n  23: { name: 'Splitting Apart', ru_name: 'Распад' }, 24: { name: 'Rationalizing', ru_name: 'Рационализация' },\n  25: { name: 'Spirit of the Self', ru_name: 'Дух Я' }, 26: { name: 'The Transmitter', ru_name: 'Передатчик' },\n  27: { name: 'Caring', ru_name: 'Забота' }, 28: { name: 'The Game Player', ru_name: 'Игрок' },\n  29: { name: 'Saying Yes', ru_name: 'Говорить да' }, 30: { name: 'Recognition of Feelings', ru_name: 'Узнавание чувств' },\n  31: { name: 'Influence', ru_name: 'Влияние' }, 32: { name: 'The Duration', ru_name: 'Продолжительность' },\n  33: { name: 'Retreat', ru_name: 'Отступление' }, 34: { name: 'Great Power', ru_name: 'Большая сила' },\n  35: { name: 'Progress', ru_name: 'Прогресс' }, 36: { name: 'Crisis', ru_name: 'Кризис' },\n  37: { name: 'Friendship', ru_name: 'Дружба' }, 38: { name: 'The Fighter', ru_name: 'Боец' },\n  39: { name: 'Provocation', ru_name: 'Провокация' }, 40: { name: 'Deliverance', ru_name: 'Освобождение' },\n  41: { name: 'Contraction', ru_name: 'Сокращение' }, 42: { name: 'Growth', ru_name: 'Рост' },\n  43: { name: 'Insight', ru_name: 'Инсайт' }, 44: { name: 'Coming to Meet', ru_name: 'Встреча' },\n  45: { name: 'The Gatherer', ru_name: 'Собирающий' }, 46: { name: 'Determination', ru_name: 'Определенность' },\n  47: { name: 'Realization', ru_name: 'Реализация' }, 48: { name: 'The Well', ru_name: 'Колодец' },\n  49: { name: 'Revolution', ru_name: 'Революция' }, 50: { name: 'Values', ru_name: 'Ценности' },\n  51: { name: 'The Arousing', ru_name: 'Побуждение' }, 52: { name: 'Keeping Still', ru_name: 'Сохранение покоя' },\n  53: { name: 'Development', ru_name: 'Развитие' }, 54: { name: 'The Marrying Maiden', ru_name: 'Невеста' },\n  55: { name: 'Abundance', ru_name: 'Изобилие' }, 56: { name: 'The Wanderer', ru_name: 'Странник' },\n  57: { name: 'The Gentle', ru_name: 'Нежный' }, 58: { name: 'The Joyous', ru_name: 'Радостный' },\n  59: { name: 'Dispersion', ru_name: 'Дисперсия' }, 60: { name: 'Limitation', ru_name: 'Ограничение' },\n  61: { name: 'Inner Truth', ru_name: 'Внутренняя правда' }, 62: { name: 'Detail', ru_name: 'Деталь' },\n  63: { name: 'After Completion', ru_name: 'После завершения' }, 64: { name: 'Before Completion', ru_name: 'До завершения' }\n};\n\nconst CENTER_GATES = {\n  Root: [19, 39, 52, 58],\n  Sacral: [2, 14, 26, 30, 31, 38, 42, 45, 59],\n  SolarPlexus: [10, 20, 29, 34, 40, 46, 50, 57],\n  Heart: [10, 21, 26, 34, 40, 51],\n  Throat: [2, 3, 5, 7, 10, 11, 12, 16, 17, 20, 21, 22, 23, 24, 28, 31, 33, 35, 45, 56, 62],\n  Ajna: [9, 20, 23, 30, 34, 40, 43, 47, 60, 61, 63, 64],\n  Head: [1, 7, 13, 26, 27, 44, 50, 64],\n  Spleen: [28, 32, 44, 48, 50, 57, 58],\n  GCenter: [1, 2, 7, 10, 13, 15, 25, 46]\n};\n\n// Расчет положения планет (упрощенная астрологическая модель)\nfunction calculatePlanetPositions(date, time) {\n  const [year, month, day] = date.split('-').map(Number);\n  const [hour, minute] = time.split(':').map(Number);\n  const birthDateTime = new Date(Date.UTC(year, month - 1, day, hour, minute));\n  const jd = getJulianDay(year, month, day, hour + minute / 60);\n  \n  // Расчет примерных позиций планет (без учета времени года)\n  // В реальном Human Design используются точные эфемериды\n  const planets = [\n    'Sun', 'Moon', 'Mercury', 'Venus', 'Mars', 'Jupiter', 'Saturn'\n  ];\n  \n  const positions = {};\n  const seed = year * 365 + month * 30 + day;\n  \n  planets.forEach((planet, i) => {\n    // Упрощенный расчет на основе даты\n    // В production используйте Swiss Ephemeris\n    const base = (seed % 360) + (i * 51.43); // примерное распределение\n    positions[planet] = {\n      longitude: base % 360,\n      sign: Math.floor(base / 30) + 1\n    };\n  });\n  \n  // Rahu и Ketu (лунные узлы) - противоположные точки\n  positions.Rahu = { longitude: positions.Moon.longitude + 180 % 360, sign: Math.floor((positions.Moon.longitude + 180) / 30) + 1 };\n  positions.Ketu = { longitude: positions.Rahu.longitude + 180 % 360, sign: Math.floor((positions.Rahu.longitude + 180) / 30) + 1 };\n  \n  return positions;\n}\n\nfunction getJulianDay(year, month, day, hour) {\n  // Упрощенный расчет юлианского дня\n  const a = Math.floor((14 - month) / 12);\n  const y = year + 4800 - a;\n  const m = month + 12 * a - 3;\n  return day + Math.floor((153 * m + 2) / 5) + 365 * y + Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400) - 32045 + hour / 24;\n}\n\n// Расчет ворот Human Design из долготы\nfunction longitudeToGate(longitude) {\n  const gate = Math.floor(longitude / 5.625) + 1;\n  const degreeInGate = longitude % 5.625;\n  const line = Math.floor(degreeInGate / 0.9375) + 1;\n  return { gate: Math.min(64, gate), line };\n}\n\n// Определение типа\nfunction determineType(gates) {\n  const gateNumbers = gates.map(g => g.gate);\n  const hasSacral = CENTER_GATES.Sacral.some(g => gateNumbers.includes(g));\n  const hasThroat = CENTER_GATES.Throat.some(g => gateNumbers.includes(g));\n  const hasSolarPlexus = CENTER_GATES.SolarPlexus.some(g => gateNumbers.includes(g));\n  \n  if (hasSacral && hasThroat) return { name: 'Manifesting Generator', ru_name: 'Манифестирующий Генератор' };\n  if (hasSacral) return { name: 'Generator', ru_name: 'Генератор' };\n  if (!hasThroat) return { name: 'Reflector', ru_name: 'Рефлектор' };\n  if (hasSolarPlexus) return { name: 'Projector', ru_name: 'Проектор' };\n  return { name: 'Manifestor', ru_name: 'Манифестор' };\n}\n\n// Определение авторитета\nfunction determineAuthority(gates) {\n  const gateNumbers = gates.map(g => g.gate);\n  const solarPlexusGates = CENTER_GATES.SolarPlexus;\n  const sacralGates = CENTER_GATES.Sacral;\n  const splenicGates = CENTER_GATES.Spleen;\n  \n  if (solarPlexusGates.some(g => gateNumbers.includes(g))) {\n    return { name: 'Emotional', ru_name: 'Эмоциональная' };\n  }\n  if (sacralGates.some(g => gateNumbers.includes(g))) {\n    return { name: 'Sacral', ru_name: 'Сакральная' };\n  }\n  if (splenicGates.some(g => gateNumbers.includes(g))) {\n    return { name: 'Splenic', ru_name: 'Селезеночная' };\n  }\n  return { name: 'Sacral', ru_name: 'Сакральная' };\n}\n\n// Основной расчет\nconst positions = calculatePlanetPositions(birthDate, birthTime);\nconst allGates = [];\n\n// Преобразуем позиции планет в ворота\nObject.entries(positions).forEach(([planet, pos]) => {\n  const { gate, line } = longitudeToGate(pos.longitude);\n  allGates.push({\n    planet,\n    gate,\n    line,\n    name: GATES[gate]?.name || 'Unknown',\n    ru_name: GATES[gate]?.ru_name || 'Неизвестно',\n    sign: pos.sign\n  });\n});\n\nconst type = determineType(allGates);\nconst authority = determineAuthority(allGates);\nconst strategy = {\n  'Manifestor': 'Информировать',\n  'Generator': 'Отвечать',\n  'Manifesting Generator': 'Отвечать и информировать',\n  'Projector': 'Ждать приглашения',\n  'Reflector': 'Ждать полного лунного цикла'\n}[type.name] || 'Отвечать';\n\nconst sunPos = positions.Sun;\nconst sunGate = longitudeToGate(sunPos.longitude);\nconst earthGate = longitudeToGate((sunPos.longitude + 180) % 360);\nconst profile = {\n  sun_line: sunGate.line,\n  earth_line: earthGate.line,\n  number: `${sunGate.line}/${earthGate.line}`,\n  description: `Профиль ${sunGate.line}/${earthGate.line}`\n};\n\n// Определенные центры\nconst definedCenters = [];\nconst gateNumbers = allGates.map(g => g.gate);\nObject.entries(CENTER_GATES).forEach(([name, gates]) => {\n  if (gates.some(g => gateNumbers.includes(g))) {\n    definedCenters.push({ name, defined: true });\n  }\n});\n\n// Результат\nreturn {\n  json: {\n    birthDate,\n    birthTime,\n    birthLocation,\n    type,\n    strategy,\n    authority,\n    profile,\n    gates: allGates,\n    definedCenters,\n    calculationSource: 'n8n Full Backend'\n  }\n};"
      },
      "name": "Calculate HD (Full Logic)",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [460, 300]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ $json }}"
      },
      "name": "Respond",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": [680, 300]
    }
  ],
  "connections": {
    "Webhook Entry": {
      "main": [
        [
          {
            "node": "Calculate HD (Full Logic)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate HD (Full Logic)": {
      "main": [
        [
          {
            "node": "Respond",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [],
  "triggerCount": 1,
  "updatedAt": "2024-01-01T00:00:00.000Z",
  "versionId": "1"
}