{
 "name": "[노드 한 장] Compression · 샘플 CSV 3개를 ZIP 하나로",
 "nodes": [
  {
   "id": "m",
   "name": "Run manually",
   "type": "n8n-nodes-base.manualTrigger",
   "typeVersion": 1,
   "position": [
    0,
    0
   ],
   "parameters": {}
  },
  {
   "id": "p",
   "name": "Sample CSV files",
   "type": "n8n-nodes-base.code",
   "typeVersion": 2,
   "position": [
    220,
    0
   ],
   "parameters": {
    "jsCode": "// 直接 authored educational samples, not real company data\nconst files={\"sales.csv\":\"sample,team,week,count\\ntrue,alpha,2026-W44,12\\ntrue,beta,2026-W44,9\\n\",\"support.csv\":\"sample,category,tickets\\ntrue,howto,7\\ntrue,error,3\\n\",\"ops.csv\":\"sample,task,count\\ntrue,check,5\\ntrue,backup,2\\n\"};const binary={};let i=0;for(const[name,text]of Object.entries(files)){binary[['sales','support','ops'][i++]]=await this.helpers.prepareBinaryData(Buffer.from(text,'utf8'),name,'text/csv');}return [{json:{sample:true,description:'교육용 가상 집계 CSV. 실제 회사 수치 아님',originalFiles:3,originalBytes:Object.values(files).reduce((s,t)=>s+Buffer.byteLength(t,'utf8'),0)},binary}];"
   }
  },
  {
   "id": "z",
   "name": "Create ZIP",
   "type": "n8n-nodes-base.compression",
   "typeVersion": 1.1,
   "position": [
    440,
    0
   ],
   "parameters": {
    "operation": "compress",
    "binaryPropertyName": "sales,support,ops",
    "outputFormat": "zip",
    "fileName": "sample-team-reports.zip",
    "binaryPropertyOutput": "archive"
   }
  },
  {
   "id": "s",
   "name": "Measure ZIP",
   "type": "n8n-nodes-base.code",
   "typeVersion": 2,
   "position": [
    660,
    0
   ],
   "parameters": {
    "jsCode": "const item=$input.first();const buf=await this.helpers.getBinaryDataBuffer(0,'archive');return [{json:{...$('Sample CSV files').first().json,zipBytes:buf.length,zipBase64:buf.toString('base64')},binary:item.binary}];"
   }
  },
  {
   "id": "e",
   "name": "Extract ZIP",
   "type": "n8n-nodes-base.compression",
   "typeVersion": 1.1,
   "position": [
    880,
    0
   ],
   "parameters": {
    "operation": "decompress",
    "binaryPropertyName": "archive",
    "outputPrefix": "file_"
   }
  },
  {
   "id": "v",
   "name": "Verify restored files",
   "type": "n8n-nodes-base.code",
   "typeVersion": 2,
   "position": [
    1100,
    0
   ],
   "parameters": {
    "jsCode": "const expected={\"sales.csv\":\"sample,team,week,count\\ntrue,alpha,2026-W44,12\\ntrue,beta,2026-W44,9\\n\",\"support.csv\":\"sample,category,tickets\\ntrue,howto,7\\ntrue,error,3\\n\",\"ops.csv\":\"sample,task,count\\ntrue,check,5\\ntrue,backup,2\\n\"};const input=$input.all();const checks=[];for(let i=0;i<input.length;i++){for(const[key,b]of Object.entries(input[i].binary||{})){const buf=await this.helpers.getBinaryDataBuffer(i,key);checks.push({fileName:b.fileName,bytes:buf.length,contentMatch:expected[b.fileName]===buf.toString('utf8')});}}const z=$('Measure ZIP').first().json;return [{json:{sample:true,originalFiles:3,extractedFiles:checks.length,allContentsMatch:checks.length===3&&checks.every(c=>c.contentMatch),originalBytes:z.originalBytes,zipBytes:z.zipBytes,checks}}];"
   }
  }
 ],
 "connections": {
  "Run manually": {
   "main": [
    [
     {
      "node": "Sample CSV files",
      "type": "main",
      "index": 0
     }
    ]
   ]
  },
  "Sample CSV files": {
   "main": [
    [
     {
      "node": "Create ZIP",
      "type": "main",
      "index": 0
     }
    ]
   ]
  },
  "Create ZIP": {
   "main": [
    [
     {
      "node": "Measure ZIP",
      "type": "main",
      "index": 0
     }
    ]
   ]
  },
  "Measure ZIP": {
   "main": [
    [
     {
      "node": "Extract ZIP",
      "type": "main",
      "index": 0
     }
    ]
   ]
  },
  "Extract ZIP": {
   "main": [
    [
     {
      "node": "Verify restored files",
      "type": "main",
      "index": 0
     }
    ]
   ]
  }
 },
 "settings": {
  "timezone": "Asia/Seoul",
  "executionOrder": "v1"
 },
 "meta": {
  "templateCredsSetupCompleted": false,
  "source": "datapopcorn.ai/workflow/nodes"
 }
}