{"version":3,"file":"index.mjs","sources":["../../server/src/bootstrap.ts","../../server/src/destroy.ts","../../server/src/register.ts","../../server/src/config/index.ts","../../server/src/content-types/index.ts","../../server/src/controllers/controller.ts","../../pluginId.ts","../../server/src/controllers/my-controller.ts","../../server/src/controllers/index.ts","../../server/src/middlewares/index.ts","../../server/src/policies/index.ts","../../server/src/routes/index.ts","../../server/src/services/service.ts","../../server/src/services/index.ts","../../server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/strapi';\n\nconst bootstrap = ({ strapi }: { strapi: Core.Strapi }) => {\n  // bootstrap phase\n};\n\nexport default bootstrap;\n","import type { Core } from '@strapi/strapi';\n\nconst destroy = ({ strapi }: { strapi: Core.Strapi }) => {\n  // destroy phase\n};\n\nexport default destroy;\n","import type { Core } from '@strapi/strapi';\n\nconst register = ({ strapi }: { strapi: Core.Strapi }) => {\n  // register phase\n};\n\nexport default register;\n","export default {\n  default: {},\n  validator() {},\n};\n","export default {};\n","import type { Core } from '@strapi/strapi';\n\nconst controller = ({ strapi }: { strapi: Core.Strapi }) => ({\n  index(ctx) {\n    ctx.body = strapi\n      .plugin('export-import')\n      // the name of the service file & the method.\n      .service('service')\n      .getWelcomeMessage();\n  },\n});\n\nexport default controller;\n","export const PLUGIN_ID = 'export-import-strapi5-plugin';\n","import fs from 'fs';\nimport csv from 'csv-parser';\nimport { Parser } from 'json2csv';\nimport type { Core } from '@strapi/strapi';\n\nimport { PLUGIN_ID } from '../../../pluginId';\nimport { ConfigData } from '../../../types';\n\nconst myController = ({ strapi }: { strapi: Core.Strapi }) => ({\n  // отправка конфигураций на фронт кнопкам\n  async getConfig(ctx) {\n    const config = strapi.plugin(PLUGIN_ID).config('entities');\n    ctx.body = config;\n  },\n\n  // загрузка файла CSV на фронт\n  async getData(ctx) {\n    const { data, modelName } = ctx.request.body;\n    const _q = data?._q || undefined;\n    const baseFilter = {\n      publishedAt: {\n        $notNull: true,\n      },\n    };\n\n    let finalFilters = { ...baseFilter };\n\n    const configFields: ConfigData = strapi.plugin(PLUGIN_ID).config('entities');\n    const fieldsArray = configFields[modelName]?.fields || [];\n    console.log(\n      '%c Start download!',\n      'color: red; background: yellow; font-size: 16px; padding: 5px;'\n    );\n    try {\n      const products = await strapi.db.query(modelName).findMany({\n        where: finalFilters,\n        populate: true,\n        _q,\n      });\n      console.log(\n        '%c Finish download!',\n        'color: red; background: yellow; font-size: 16px; padding: 5px;'\n      );\n      // Определяем нужные поля для CSV\n      const fields = ['documentId', ...fieldsArray];\n      const csv = new Parser({ fields }).parse(products);\n      console.log(\n        '%c Update CSV!',\n        'color: red; background: yellow; font-size: 16px; padding: 5px;'\n      );\n      ctx.set('Content-Disposition', 'attachment; filename=products.csv');\n      ctx.set('Content-Type', 'text/csv');\n      ctx.body = { csv };\n    } catch (error) {\n      console.error('Ошибка при получении данных:', error);\n      ctx.throw(500, 'Ошибка получения данных');\n    }\n  },\n\n  // изменение данных которые приходят с фронта\n  async updateData(ctx) {\n    try {\n      console.log('Получен запрос на импорт CSV');\n\n      const { files, body } = ctx.request;\n      const modelName = body?.modelName || undefined;\n\n      if (!files || !files?.file || !modelName) {\n        return ctx.badRequest('Файл не загружен');\n      }\n\n      const filePath = files.file?.filepath;\n      const updatedProducts = [];\n\n      // Читаем CSV\n      const stream = fs.createReadStream(filePath).pipe(csv());\n      const { attributes } = strapi.contentType(modelName);\n\n      for await (const row of stream) {\n        const { documentId } = row;\n\n        if (documentId) {\n          // Создаем пустой объект для данных\n          const data: Record<string, any> = {};\n\n          Object.keys(row).forEach((key) => {\n            if (attributes[key]) {\n              const attributesKey = attributes[key];\n              const type = attributesKey.type;\n              const value = row[key];\n\n              if (value === undefined || value === null || value === '') {\n                return;\n              }\n\n              // Проверяем тип поля и преобразуем значение\n              if (type === 'integer' || type === 'biginteger') {\n                const parsed = parseInt(value);\n                if (!isNaN(parsed)) data[key] = parsed;\n              } else if (type === 'float' || type === 'decimal') {\n                const parsed = parseFloat(value);\n                if (!isNaN(parsed)) data[key] = parsed;\n              } else if (type === 'boolean') {\n                data[key] = value.toLowerCase() === 'true';\n              } else if (type === 'string' || type === 'text') {\n                data[key] = value.trim();\n              } else {\n                console.log(`Поле ${key} с типом ${type} проигнорировано`);\n              }\n            }\n          });\n\n          // Проверяем, есть ли данные для обновления\n          if (Object.keys(data).length > 0) {\n            const updatedProduct = await strapi.documents(modelName).update({\n              documentId,\n              data,\n              status: 'published',\n            });\n\n            updatedProducts.push(updatedProduct);\n          } else {\n            console.log(\n              `Пропуск обновления для documentId: ${documentId} - нет данных для обновления`\n            );\n          }\n        }\n      }\n\n      // Удаляем файл после обработки\n      await fs.promises.unlink(filePath);\n      console.log('Файл успешно удален:', filePath);\n\n      return ctx.send({ success: true, updated: updatedProducts.length });\n    } catch (error) {\n      console.error('Ошибка при обработке CSV:', error);\n      ctx.throw(500, 'Ошибка обработки CSV');\n    }\n  },\n});\n\nexport default myController;\n","import controller from './controller';\nimport myController from './my-controller';\n\nexport default {\n  controller,\n  myController,\n};\n","export default {};\n","export default {};\n","// import contentAPIRoutes from './content-api';\n\n// const routes = {\n//   'content-api': {\n//     type: 'content-api',\n//     routes: contentAPIRoutes,\n//   },\n// };\n\n// export default routes;\n\nexport default {\n  admin: {\n    type: 'admin',\n    routes: [\n      {\n        method: 'POST',\n        path: '/get-config',\n        handler: 'myController.getConfig',\n        config: {\n          policies: [],\n          auth: false,\n        },\n      },\n      {\n        method: 'POST',\n        path: '/export-csv',\n        handler: 'myController.getData',\n        config: {\n          policies: [],\n          // auth: false,\n        },\n      },\n      {\n        method: 'POST',\n        path: '/import-csv',\n        handler: 'myController.updateData',\n        config: {\n          policies: [],\n          // auth: false,\n        },\n      },\n    ],\n  },\n};\n","import type { Core } from '@strapi/strapi';\n\nconst service = ({ strapi }: { strapi: Core.Strapi }) => ({\n  getWelcomeMessage() {\n    return 'Welcome to Strapi 🚀';\n  },\n});\n\nexport default service;\n","import service from './service';\n\nexport default {\n  service,\n};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n  register,\n  bootstrap,\n  destroy,\n  config,\n  controllers,\n  routes,\n  services,\n  contentTypes,\n  policies,\n  middlewares,\n};\n"],"names":["config","csv"],"mappings":"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"}