n8n-nodes-magic-directory
Version:
Connect with n8n community members through intelligent profile matching. Powered by Magic Inbox for P2P messaging and workflow sharing.
979 lines (978 loc) β’ 51.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MagicDirectory = void 0;
const n8n_workflow_1 = require("n8n-workflow");
class MagicDirectory {
constructor() {
this.description = {
displayName: 'Magic Directory',
name: 'magicDirectory',
icon: 'fa:users',
group: ['magic'],
version: 3,
subtitle: '={{$parameter["operation"]}} - {{$parameter["category"]}}',
description: 'Connect with n8n community members through intelligent profile matching. Powered by Magic Inbox for P2P messaging, email communication, and instant workflow sharing between instances.',
defaults: {
name: 'Magic Directory',
},
inputs: ["main" /* NodeConnectionType.Main */],
outputs: ["main" /* NodeConnectionType.Main */],
credentials: [],
properties: [
{
displayName: 'π― Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
options: [
{
name: 'π Register Profile',
value: 'register',
description: 'Add your profile to Magic Directory community',
},
{
name: 'π Search Profiles',
value: 'search',
description: 'Find matching community members',
},
],
default: 'search',
},
{
displayName: 'π Category',
name: 'category',
type: 'options',
options: [
{ name: 'π€ Collaboration', value: 'collaboration' },
{ name: 'π¨βπ« Mentoring', value: 'mentorat' },
{ name: 'π€ Friends', value: 'friend' },
{ name: 'π Love Male', value: 'lovemale' },
{ name: 'π Love Female', value: 'lovefemale' },
{ name: 'π’ Business', value: 'business' },
{ name: 'πΌ Jobs', value: 'job' },
],
default: 'collaboration',
required: true,
},
// === CHAMPS COMMUNS REGISTRATION ===
{
displayName: 'π€ Your Name',
name: 'name',
type: 'string',
displayOptions: { show: { operation: ['register'] } },
required: true,
default: '',
placeholder: 'Charles Magic Dev',
},
{
displayName: 'π§ Email',
name: 'email',
type: 'string',
displayOptions: { show: { operation: ['register'] } },
required: true,
default: '',
placeholder: 'your-email@example.com',
},
{
displayName: 'π¬ Magic Inbox Webhook URL',
name: 'magic_inbox_url',
type: 'string',
displayOptions: { show: { operation: ['register'] } },
required: true,
default: '',
placeholder: 'https://your-n8n-instance.com/webhook/magic-inbox',
description: 'π¨ REQUIRED: First install n8n-nodes-magic-inbox (npm install n8n-nodes-magic-inbox). Magic Inbox enables P2P messaging between n8n instances, email-like inbox system, direct workflow sharing & teleportation, and decentralized communication. Setup steps: 1) Install the package 2) Add Magic Inbox node to your workflow 3) Configure webhook URL (/webhook/magic-inbox) 4) Copy the full webhook URL here 5) Test it first before registering!',
},
{
displayName: 'π Location',
name: 'location',
type: 'string',
displayOptions: { show: { operation: ['register'] } },
required: true,
default: '',
placeholder: 'Marseille, Remote, PACA, Worldwide',
},
// === COLLABORATION REGISTRATION ===
{
displayName: 'π Project Description',
name: 'project_description',
type: 'string',
typeOptions: { rows: 3 },
displayOptions: { show: { operation: ['register'], category: ['collaboration'] } },
required: true,
default: '',
placeholder: 'Describe your collaboration project...',
},
{
displayName: 'π Main Skills',
name: 'main_skills',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['register'], category: ['collaboration'] } },
options: [
{ name: 'Web Development', value: 'web-dev' },
{ name: 'Design', value: 'design' },
{ name: 'Marketing', value: 'marketing' },
{ name: 'Data Analysis', value: 'data-analysis' },
{ name: 'AI/ML', value: 'ai-ml' },
{ name: 'DevOps', value: 'devops' },
{ name: 'Mobile Development', value: 'mobile-dev' },
],
default: [],
required: true,
},
{
displayName: 'π° Budget Allocated',
name: 'budget',
type: 'string',
displayOptions: { show: { operation: ['register'], category: ['collaboration'] } },
default: '',
placeholder: 'β¬5000, Equity, Free, Negotiable',
},
{
displayName: 'π
Availability Start Date',
name: 'availability_date',
type: 'dateTime',
displayOptions: { show: { operation: ['register'], category: ['collaboration'] } },
default: '',
},
{
displayName: 'β±οΈ Experience (Years)',
name: 'experience_years',
type: 'number',
displayOptions: { show: { operation: ['register'], category: ['collaboration'] } },
default: 1,
typeOptions: { minValue: 0, maxValue: 50 },
},
// === COLLABORATION SEARCH ===
{
displayName: 'π Looking for Skills',
name: 'search_main_skills',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['collaboration'] } },
options: [
{ name: 'Web Development', value: 'web-dev' },
{ name: 'Design', value: 'design' },
{ name: 'Marketing', value: 'marketing' },
{ name: 'Data Analysis', value: 'data-analysis' },
{ name: 'AI/ML', value: 'ai-ml' },
{ name: 'DevOps', value: 'devops' },
{ name: 'Mobile Development', value: 'mobile-dev' },
],
default: [],
},
{
displayName: 'π° Budget Expectation',
name: 'search_budget',
type: 'string',
displayOptions: { show: { operation: ['search'], category: ['collaboration'] } },
default: '',
placeholder: 'Free, β¬5000+, Equity, Negotiable',
},
{
displayName: 'β±οΈ Minimum Experience (Years)',
name: 'search_experience_min',
type: 'number',
displayOptions: { show: { operation: ['search'], category: ['collaboration'] } },
default: 0,
typeOptions: { minValue: 0, maxValue: 50 },
},
{
displayName: 'π
Available From',
name: 'search_availability_from',
type: 'dateTime',
displayOptions: { show: { operation: ['search'], category: ['collaboration'] } },
default: '',
},
// === MENTORAT REGISTRATION ===
{
displayName: 'π― Expertise Domain',
name: 'expertise_domain',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['mentorat'] } },
options: [
{ name: 'Tech', value: 'tech' },
{ name: 'Entrepreneurship', value: 'entrepreneurship' },
{ name: 'Personal Development', value: 'personal-dev' },
{ name: 'Career Development', value: 'career' },
{ name: 'Leadership', value: 'leadership' },
{ name: 'Finance', value: 'finance' },
],
default: 'tech',
required: true,
},
{
displayName: 'ποΈ Experience Level',
name: 'experience_level',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['mentorat'] } },
options: [
{ name: 'π± Beginner', value: 'beginner' },
{ name: 'π Intermediate', value: 'intermediate' },
{ name: 'β Expert', value: 'expert' },
{ name: 'π₯· Ninja', value: 'ninja' },
],
default: 'intermediate',
required: true,
},
{
displayName: 'π Mentoring Duration',
name: 'mentoring_duration',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['mentorat'] } },
options: [
{ name: '1-3 months', value: 'short' },
{ name: '3-6 months', value: 'medium' },
{ name: '6+ months', value: 'long' },
{ name: 'Ongoing', value: 'ongoing' },
],
default: 'medium',
},
{
displayName: 'πΈ Mentoring Rate',
name: 'mentoring_rate',
type: 'string',
displayOptions: { show: { operation: ['register'], category: ['mentorat'] } },
default: '',
placeholder: 'Free, β¬50/hour, Equity, Negotiable',
},
// === MENTORAT SEARCH ===
{
displayName: 'π― Seeking Expertise In',
name: 'search_expertise_domain',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['mentorat'] } },
options: [
{ name: 'Tech', value: 'tech' },
{ name: 'Entrepreneurship', value: 'entrepreneurship' },
{ name: 'Personal Development', value: 'personal-dev' },
{ name: 'Career Development', value: 'career' },
{ name: 'Leadership', value: 'leadership' },
{ name: 'Finance', value: 'finance' },
],
default: ['tech'],
},
{
displayName: 'ποΈ Mentor Experience Level',
name: 'search_experience_level',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['mentorat'] } },
options: [
{ name: 'π Intermediate', value: 'intermediate' },
{ name: 'β Expert', value: 'expert' },
{ name: 'π₯· Ninja', value: 'ninja' },
],
default: ['expert'],
},
{
displayName: 'πΈ Budget Type',
name: 'search_mentoring_type',
type: 'options',
displayOptions: { show: { operation: ['search'], category: ['mentorat'] } },
options: [
{ name: 'Free mentoring', value: 'free' },
{ name: 'Paid mentoring', value: 'paid' },
{ name: 'Both', value: 'both' },
],
default: 'both',
},
// === FRIENDS REGISTRATION ===
{
displayName: 'π― Interests',
name: 'interests',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['register'], category: ['friend'] } },
options: [
{ name: 'Sport', value: 'sport' },
{ name: 'Travel', value: 'travel' },
{ name: 'Movies & TV', value: 'movies' },
{ name: 'Music', value: 'music' },
{ name: 'Gaming', value: 'gaming' },
{ name: 'Cooking', value: 'cooking' },
{ name: 'Art & Culture', value: 'art' },
{ name: 'Tech', value: 'tech' },
{ name: 'Reading', value: 'reading' },
{ name: 'Outdoor Activities', value: 'outdoor' },
],
default: [],
required: true,
},
{
displayName: 'π Age',
name: 'age',
type: 'number',
displayOptions: { show: { operation: ['register'], category: ['friend'] } },
default: 25,
typeOptions: { minValue: 16, maxValue: 99 },
},
{
displayName: 'π Availability',
name: 'availability',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['register'], category: ['friend'] } },
options: [
{ name: 'Weekends', value: 'weekends' },
{ name: 'Evenings', value: 'evenings' },
{ name: 'Daytime', value: 'daytime' },
{ name: 'Flexible', value: 'flexible' },
],
default: ['weekends'],
},
{
displayName: 'π₯ Preferred Age Group',
name: 'preferred_age_group',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['friend'] } },
options: [
{ name: '18-25', value: '18-25' },
{ name: '25-35', value: '25-35' },
{ name: '35-45', value: '35-45' },
{ name: '45+', value: '45+' },
{ name: 'Any age', value: 'any' },
],
default: 'any',
},
{
displayName: 'π£οΈ Languages Spoken',
name: 'languages',
type: 'string',
displayOptions: { show: { operation: ['register'], category: ['friend'] } },
default: '',
placeholder: 'French, English, Spanish',
},
// === FRIENDS SEARCH ===
{
displayName: 'π― Common Interests',
name: 'search_interests',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['friend'] } },
options: [
{ name: 'Sport', value: 'sport' },
{ name: 'Travel', value: 'travel' },
{ name: 'Movies & TV', value: 'movies' },
{ name: 'Music', value: 'music' },
{ name: 'Gaming', value: 'gaming' },
{ name: 'Cooking', value: 'cooking' },
{ name: 'Art & Culture', value: 'art' },
{ name: 'Tech', value: 'tech' },
{ name: 'Reading', value: 'reading' },
{ name: 'Outdoor Activities', value: 'outdoor' },
],
default: [],
},
{
displayName: 'π Age Range (Min)',
name: 'search_age_min',
type: 'number',
displayOptions: { show: { operation: ['search'], category: ['friend'] } },
default: 18,
typeOptions: { minValue: 16, maxValue: 99 },
},
{
displayName: 'π Age Range (Max)',
name: 'search_age_max',
type: 'number',
displayOptions: { show: { operation: ['search'], category: ['friend'] } },
default: 50,
typeOptions: { minValue: 16, maxValue: 99 },
},
{
displayName: 'π Shared Availability',
name: 'search_availability',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['friend'] } },
options: [
{ name: 'Weekends', value: 'weekends' },
{ name: 'Evenings', value: 'evenings' },
{ name: 'Daytime', value: 'daytime' },
{ name: 'Flexible', value: 'flexible' },
],
default: ['weekends'],
},
// === LOVE MALE REGISTRATION ===
{
displayName: 'π Age',
name: 'age',
type: 'number',
displayOptions: { show: { operation: ['register'], category: ['lovemale'] } },
required: true,
default: 25,
typeOptions: { minValue: 18, maxValue: 99 },
},
{
displayName: 'π Relationship Preferences',
name: 'relationship_preferences',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['lovemale'] } },
options: [
{ name: 'Serious Relationship', value: 'serious' },
{ name: 'Casual Dating', value: 'casual' },
{ name: 'Friendship First', value: 'friendship' },
{ name: 'Open to All', value: 'open' },
],
default: 'serious',
required: true,
},
{
displayName: 'π Personal Interests',
name: 'personal_interests',
type: 'string',
typeOptions: { rows: 2 },
displayOptions: { show: { operation: ['register'], category: ['lovemale'] } },
default: '',
placeholder: 'What do you enjoy doing in your free time?',
},
{
displayName: 'π³οΈβ Orientation',
name: 'orientation',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['lovemale'] } },
options: [
{ name: 'Heterosexual', value: 'hetero' },
{ name: 'Homosexual', value: 'homo' },
{ name: 'Bisexual', value: 'bi' },
{ name: 'Pansexual', value: 'pan' },
{ name: 'Other', value: 'other' },
],
default: 'hetero',
},
// === LOVE MALE SEARCH ===
{
displayName: 'π Age Range (Min)',
name: 'search_age_min',
type: 'number',
displayOptions: { show: { operation: ['search'], category: ['lovemale'] } },
default: 18,
typeOptions: { minValue: 18, maxValue: 99 },
},
{
displayName: 'π Age Range (Max)',
name: 'search_age_max',
type: 'number',
displayOptions: { show: { operation: ['search'], category: ['lovemale'] } },
default: 35,
typeOptions: { minValue: 18, maxValue: 99 },
},
{
displayName: 'π Seeking Relationship Type',
name: 'search_relationship_type',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['lovemale'] } },
options: [
{ name: 'Serious Relationship', value: 'serious' },
{ name: 'Casual Dating', value: 'casual' },
{ name: 'Friendship First', value: 'friendship' },
{ name: 'Open to All', value: 'open' },
],
default: ['serious'],
},
{
displayName: 'π³οΈβπ Preferred Orientation',
name: 'search_orientation',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['lovemale'] } },
options: [
{ name: 'Heterosexual', value: 'hetero' },
{ name: 'Homosexual', value: 'homo' },
{ name: 'Bisexual', value: 'bi' },
{ name: 'Pansexual', value: 'pan' },
{ name: 'Other', value: 'other' },
],
default: ['hetero'],
},
// === LOVE FEMALE REGISTRATION (identiques aux males) ===
{
displayName: 'π Age',
name: 'age',
type: 'number',
displayOptions: { show: { operation: ['register'], category: ['lovefemale'] } },
required: true,
default: 25,
typeOptions: { minValue: 18, maxValue: 99 },
},
{
displayName: 'π Relationship Preferences',
name: 'relationship_preferences',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['lovefemale'] } },
options: [
{ name: 'Serious Relationship', value: 'serious' },
{ name: 'Casual Dating', value: 'casual' },
{ name: 'Friendship First', value: 'friendship' },
{ name: 'Open to All', value: 'open' },
],
default: 'serious',
required: true,
},
{
displayName: 'π Personal Interests',
name: 'personal_interests',
type: 'string',
typeOptions: { rows: 2 },
displayOptions: { show: { operation: ['register'], category: ['lovefemale'] } },
default: '',
placeholder: 'What do you enjoy doing in your free time?',
},
{
displayName: 'π³οΈβπ Orientation',
name: 'orientation',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['lovefemale'] } },
options: [
{ name: 'Heterosexual', value: 'hetero' },
{ name: 'Homosexual', value: 'homo' },
{ name: 'Bisexual', value: 'bi' },
{ name: 'Pansexual', value: 'pan' },
{ name: 'Other', value: 'other' },
],
default: 'hetero',
},
// === LOVE FEMALE SEARCH (identiques aux males) ===
{
displayName: 'π Age Range (Min)',
name: 'search_age_min',
type: 'number',
displayOptions: { show: { operation: ['search'], category: ['lovefemale'] } },
default: 18,
typeOptions: { minValue: 18, maxValue: 99 },
},
{
displayName: 'π Age Range (Max)',
name: 'search_age_max',
type: 'number',
displayOptions: { show: { operation: ['search'], category: ['lovefemale'] } },
default: 35,
typeOptions: { minValue: 18, maxValue: 99 },
},
{
displayName: 'π Seeking Relationship Type',
name: 'search_relationship_type',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['lovefemale'] } },
options: [
{ name: 'Serious Relationship', value: 'serious' },
{ name: 'Casual Dating', value: 'casual' },
{ name: 'Friendship First', value: 'friendship' },
{ name: 'Open to All', value: 'open' },
],
default: ['serious'],
},
{
displayName: 'π³οΈβ Preferred Orientation',
name: 'search_orientation',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['lovefemale'] } },
options: [
{ name: 'Heterosexual', value: 'hetero' },
{ name: 'Homosexual', value: 'homo' },
{ name: 'Bisexual', value: 'bi' },
{ name: 'Pansexual', value: 'pan' },
{ name: 'Other', value: 'other' },
],
default: ['hetero'],
},
// === BUSINESS REGISTRATION ===
{
displayName: 'π’ Business Sector',
name: 'business_sector',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['business'] } },
options: [
{ name: 'Technology', value: 'tech' },
{ name: 'E-commerce', value: 'ecommerce' },
{ name: 'Services', value: 'services' },
{ name: 'Healthcare', value: 'healthcare' },
{ name: 'Education', value: 'education' },
{ name: 'Finance', value: 'finance' },
{ name: 'Real Estate', value: 'realestate' },
{ name: 'Manufacturing', value: 'manufacturing' },
],
default: 'tech',
required: true,
},
{
displayName: 'π Business Offer Description',
name: 'business_description',
type: 'string',
typeOptions: { rows: 3 },
displayOptions: { show: { operation: ['register'], category: ['business'] } },
required: true,
default: '',
placeholder: 'Describe your business opportunity, partnership, or service...',
},
{
displayName: 'π° Budget Range',
name: 'budget_range',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['business'] } },
options: [
{ name: '< β¬10k', value: 'small' },
{ name: 'β¬10k - β¬50k', value: 'medium' },
{ name: 'β¬50k - β¬200k', value: 'large' },
{ name: 'β¬200k+', value: 'enterprise' },
{ name: 'Equity based', value: 'equity' },
{ name: 'Revenue share', value: 'revenue' },
],
default: 'medium',
},
{
displayName: 'π― Business Goals',
name: 'business_goals',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['register'], category: ['business'] } },
options: [
{ name: 'Investment', value: 'investment' },
{ name: 'Partnership', value: 'partnership' },
{ name: 'Client Acquisition', value: 'clients' },
{ name: 'Supplier Network', value: 'suppliers' },
{ name: 'Joint Venture', value: 'joint-venture' },
],
default: ['partnership'],
},
// === BUSINESS SEARCH ===
{
displayName: 'π’ Seeking Business Sector',
name: 'search_business_sector',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['business'] } },
options: [
{ name: 'Technology', value: 'tech' },
{ name: 'E-commerce', value: 'ecommerce' },
{ name: 'Services', value: 'services' },
{ name: 'Healthcare', value: 'healthcare' },
{ name: 'Education', value: 'education' },
{ name: 'Finance', value: 'finance' },
{ name: 'Real Estate', value: 'realestate' },
{ name: 'Manufacturing', value: 'manufacturing' },
],
default: ['tech'],
},
{
displayName: 'π° Budget Range Looking For',
name: 'search_budget_range',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['business'] } },
options: [
{ name: '< β¬10k', value: 'small' },
{ name: 'β¬10k - β¬50k', value: 'medium' },
{ name: 'β¬50k - β¬200k', value: 'large' },
{ name: 'β¬200k+', value: 'enterprise' },
{ name: 'Equity based', value: 'equity' },
{ name: 'Revenue share', value: 'revenue' },
],
default: ['medium'],
},
{
displayName: 'π― Interested In',
name: 'search_business_goals',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['business'] } },
options: [
{ name: 'Investment', value: 'investment' },
{ name: 'Partnership', value: 'partnership' },
{ name: 'Client Acquisition', value: 'clients' },
{ name: 'Supplier Network', value: 'suppliers' },
{ name: 'Joint Venture', value: 'joint-venture' },
],
default: ['partnership'],
},
// === JOB REGISTRATION ===
{
displayName: 'πΌ Position Type',
name: 'position_type',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['job'] } },
options: [
{ name: 'Developer', value: 'developer' },
{ name: 'Designer', value: 'designer' },
{ name: 'Manager', value: 'manager' },
{ name: 'Sales', value: 'sales' },
{ name: 'Marketing', value: 'marketing' },
{ name: 'Data Analyst', value: 'data-analyst' },
{ name: 'DevOps', value: 'devops' },
{ name: 'Product Manager', value: 'product-manager' },
{ name: 'Consultant', value: 'consultant' },
],
default: 'developer',
required: true,
},
{
displayName: 'ποΈ Experience Level',
name: 'job_experience_level',
type: 'options',
displayOptions: { show: { operation: ['register'], category: ['job'] } },
options: [
{ name: 'Junior (0-2 years)', value: 'junior' },
{ name: 'Mid-level (2-5 years)', value: 'mid' },
{ name: 'Senior (5-10 years)', value: 'senior' },
{ name: 'Lead/Principal (10+ years)', value: 'lead' },
],
default: 'mid',
required: true,
},
{
displayName: 'π° Desired Salary',
name: 'desired_salary',
type: 'string',
displayOptions: { show: { operation: ['register'], category: ['job'] } },
default: '',
placeholder: 'β¬45k-55k/year, Negotiable, Equity + Salary',
},
{
displayName: 'π§ Specific Skills',
name: 'specific_skills',
type: 'string',
displayOptions: { show: { operation: ['register'], category: ['job'] } },
default: '',
placeholder: 'React, Node.js, AWS, Docker, Agile...',
},
{
displayName: 'π
Available Start Date',
name: 'start_date',
type: 'dateTime',
displayOptions: { show: { operation: ['register'], category: ['job'] } },
default: '',
},
// === JOB SEARCH ===
{
displayName: 'πΌ Looking for Position',
name: 'search_position_type',
type: 'options',
typeOptions: { multipleValues: true },
displayOptions: { show: { operation: ['search'], category: ['job'] } },
options: [
{ name: 'Developer', value: 'developer' },
{ name: 'Designer', value: 'designer' },
{ name: 'Manager', value: 'manager' },
{ name: 'Sales', value: 'sales' },
{ name: 'Marketing', value: 'marketing' },
{ name: 'Data Analyst', value: 'data-analyst' },
{ name: 'DevOps', value: 'devops' },
{ name: 'Product Manager', value: 'product-manager' },
{ name: 'Consultant', value: 'consultant' },
],
default: ['developer'],
},
{
displayName: 'ποΈ Minimum Experience Level',
name: 'search_experience_level',
type: 'options',
displayOptions: { show: { operation: ['search'], category: ['job'] } },
options: [
{ name: 'Junior (0-2 years)', value: 'junior' },
{ name: 'Mid-level (2-5 years)', value: 'mid' },
{ name: 'Senior (5-10 years)', value: 'senior' },
{ name: 'Lead/Principal (10+ years)', value: 'lead' },
],
default: 'junior',
},
{
displayName: 'π° Salary Range',
name: 'search_salary_range',
type: 'string',
displayOptions: { show: { operation: ['search'], category: ['job'] } },
default: '',
placeholder: 'β¬40k+, β¬50k-β¬70k, Equity welcome',
},
{
displayName: 'π§ Required Skills',
name: 'search_skills',
type: 'string',
displayOptions: { show: { operation: ['search'], category: ['job'] } },
default: '',
placeholder: 'React, Node.js, Python, * for any',
},
// === CHAMPS COMMUNS SEARCH ===
{
displayName: 'π€ Name Keywords',
name: 'search_name',
type: 'string',
displayOptions: { show: { operation: ['search'] } },
placeholder: 'charles, magic or * for any name',
default: '*',
},
{
displayName: 'π Location Search',
name: 'search_location',
type: 'string',
displayOptions: { show: { operation: ['search'] } },
placeholder: 'marseille, paca, remote or * for anywhere',
default: '*',
},
// === CHAMP LIBRE REGISTRATION ===
{
displayName: 'π Additional Information',
name: 'additional_info',
type: 'string',
typeOptions: { rows: 3 },
displayOptions: { show: { operation: ['register'] } },
default: '',
placeholder: 'Any additional relevant information you want to share...',
description: 'Free text field for any details you want to add',
},
// === BACKEND URL ===
{
displayName: 'π Backend URL',
name: 'backendUrl',
type: 'string',
default: 'https://n8n.srv740722.hstgr.cloud/webhook/MAGICDIRECTORY',
description: 'Magic Directory backend webhook URL',
},
],
};
}
async execute() {
const items = this.getInputData();
const returnData = [];
for (let i = 0; i < items.length; i++) {
try {
const operation = this.getNodeParameter('operation', i);
const category = this.getNodeParameter('category', i);
const backendUrl = this.getNodeParameter('backendUrl', i);
let payload = {};
if (operation === 'register') {
const registrationKey = `registration${category}`;
// Champs communs
const commonFields = {
name: this.getNodeParameter('name', i),
email: this.getNodeParameter('email', i),
magic_inbox_url: this.getNodeParameter('magic_inbox_url', i),
location: this.getNodeParameter('location', i),
additional_info: this.getNodeParameter('additional_info', i, ''),
};
// Champs spΓ©cifiques par catΓ©gorie
let categoryFields = {};
switch (category) {
case 'collaboration':
categoryFields = {
project_description: this.getNodeParameter('project_description', i),
main_skills: this.getNodeParameter('main_skills', i),
budget: this.getNodeParameter('budget', i, ''),
availability_date: this.getNodeParameter('availability_date', i, ''),
experience_years: this.getNodeParameter('experience_years', i, 1),
};
break;
case 'mentorat':
categoryFields = {
expertise_domain: this.getNodeParameter('expertise_domain', i),
experience_level: this.getNodeParameter('experience_level', i),
mentoring_duration: this.getNodeParameter('mentoring_duration', i, ''),
mentoring_rate: this.getNodeParameter('mentoring_rate', i, ''),
};
break;
case 'friend':
categoryFields = {
interests: this.getNodeParameter('interests', i),
age: this.getNodeParameter('age', i, 25),
availability: this.getNodeParameter('availability', i, []),
preferred_age_group: this.getNodeParameter('preferred_age_group', i, 'any'),
languages: this.getNodeParameter('languages', i, ''),
};
break;
case 'lovemale':
case 'lovefemale':
categoryFields = {
sex: category === 'lovemale' ? 'man' : 'woman',
age: this.getNodeParameter('age', i),
relationship_preferences: this.getNodeParameter('relationship_preferences', i),
personal_interests: this.getNodeParameter('personal_interests', i, ''),
orientation: this.getNodeParameter('orientation', i, 'hetero'),
};
break;
case 'business':
categoryFields = {
business_sector: this.getNodeParameter('business_sector', i),
business_description: this.getNodeParameter('business_description', i),
budget_range: this.getNodeParameter('budget_range', i, 'medium'),
business_goals: this.getNodeParameter('business_goals', i, []),
};
break;
case 'job':
categoryFields = {
position_type: this.getNodeParameter('position_type', i),
job_experience_level: this.getNodeParameter('job_experience_level', i),
desired_salary: this.getNodeParameter('desired_salary', i, ''),
specific_skills: this.getNodeParameter('specific_skills', i, ''),
start_date: this.getNodeParameter('start_date', i, ''),
};
break;
}
payload[registrationKey] = { ...commonFields, ...categoryFields };
}
else if (operation === 'search') {
const searchKey = `research${category}`;
let searchFields = {
name: this.getNodeParameter('search_name', i, '*'),
location: this.getNodeParameter('search_location', i, '*'),
};
// Champs de recherche spΓ©cifiques par catΓ©gorie
switch (category) {
case 'collaboration':
searchFields = {
...searchFields,
main_skills: this.getNodeParameter('search_main_skills', i, []),
budget: this.getNodeParameter('search_budget', i, '*'),
experience_min: this.getNodeParameter('search_experience_min', i, 0),
availability_from: this.getNodeParameter('search_availability_from', i, ''),
};
break;
case 'mentorat':
searchFields = {
...searchFields,
expertise_domain: this.getNodeParameter('search_expertise_domain', i, []),
experience_level: this.getNodeParameter('search_experience_level', i, []),
mentoring_type: this.getNodeParameter('search_mentoring_type', i, 'both'),
};
break;
case 'friend':
searchFields = {
...searchFields,
interests: this.getNodeParameter('search_interests', i, []),
age_min: this.getNodeParameter('search_age_min', i, 18),
age_max: this.getNodeParameter('search_age_max', i, 50),
availability: this.getNodeParameter('search_availability', i, []),
};
break;
case 'lovemale':
case 'lovefemale':
searchFields = {
...searchFields,
seeking_sex: category === 'lovemale' ? 'woman' : 'man',
age_min: this.getNodeParameter('search_age_min', i, 18),
age_max: this.getNodeParameter('search_age_max', i, 35),
relationship_type: this.getNodeParameter('search_relationship_type', i, ['serious']),
orientation: this.getNodeParameter('search_orientation', i, ['hetero']),
};
break;
case 'business':
searchFields = {
...searchFields,
business_sector: this.getNodeParameter('search_business_sector', i, []),
budget_range: this.getNodeParameter('search_budget_range', i, []),
business_goals: this.getNodeParameter('search_business_goals', i, []),
};
break;
case 'job':
searchFields = {
...searchFields,
position_type: this.getNodeParameter('search_position_type', i, []),
experience_level: this.getNodeParameter('search_experience_level', i, 'junior'),
salary_range: this.getNodeParameter('search_salary_range', i, '*'),
skills: this.getNodeParameter('search_skills', i, '*'),
};
break;