From 9e0a67d6bc7350376b880ae4fc3a72b2def2adcb Mon Sep 17 00:00:00 2001 From: chpark Date: Thu, 19 Dec 2024 11:59:04 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.app.yml | 84 ++--- docker-compose.db.yml | 216 ++++++------- docker-compose.dev.yml | 40 +-- ...c9b956018e7ebc08dc33061795e3736-audit.json | 40 --- ...d3be0bd8551fdd86d0d3cca3a97cd90-audit.json | 40 --- .../logs/info/info-2024-11-25.log.gz | Bin 2213 -> 0 bytes ...363f7141809635bfe8d8a1642abfc24-audit.json | 40 --- .../logs/system/system-2024-11-25.log.gz | Bin 2214 -> 0 bytes {fems-admin => plm-admin}/.eslintrc.json | 0 {fems-admin => plm-admin}/.gitignore | 0 {fems-admin => plm-admin}/Dockerfile | 0 {fems-admin => plm-admin}/README.md | 0 {fems-admin => plm-admin}/components.json | 0 {fems-admin => plm-admin}/next.config.mjs | 0 {fems-admin => plm-admin}/package.json | 0 {fems-admin => plm-admin}/postcss.config.mjs | 0 {fems-admin => plm-admin}/src/app/favicon.ico | Bin .../src/app/fonts/GeistMonoVF.woff | Bin .../src/app/fonts/GeistVF.woff | Bin {fems-admin => plm-admin}/src/app/globals.css | 0 {fems-admin => plm-admin}/src/app/layout.tsx | 0 {fems-admin => plm-admin}/src/app/page.tsx | 0 {fems-admin => plm-admin}/src/lib/utils.ts | 0 {fems-admin => plm-admin}/tailwind.config.ts | 0 {fems-admin => plm-admin}/tsconfig.json | 0 {fems-admin => plm-admin}/yarn.lock | 0 {fems-api => plm-api}/.eslintrc.json | 0 {fems-api => plm-api}/.gitignore | 0 {fems-api => plm-api}/Dockerfile | 0 {fems-api => plm-api}/package.json | 0 {fems-api => plm-api}/src/app.js | 0 {fems-api => plm-api}/src/config/config.js | 0 {fems-api => plm-api}/src/config/database.js | 0 {fems-api => plm-api}/src/config/logger.js | 0 {fems-api => plm-api}/src/config/redis.js | 0 .../admin/apiKey/apiKey.controller.js | 0 .../admin/companies/branches.controller.js | 0 .../admin/companies/companies.controller.js | 0 .../contracts/contract-details.controller.js | 0 .../admin/contracts/contracts.controller.js | 0 .../admin/users/departments.controller.js | 0 .../admin/users/roles.controller.js | 0 .../admin/users/users.controller.js | 0 .../app/alerts/alerts.controller.js | 0 .../controllers/app/auth/auth.controller.js | 0 .../app/common/common.controller.js | 0 .../app/dashboard/dashboard.controller.js | 0 .../app/department/department.controller.js | 0 .../app/device/device.controller.js | 0 .../app/equipment/equipment.controller.js | 0 .../equipmentParts.controller.js | 0 .../controllers/app/file/file.controller.js | 0 .../app/health/health.controller.js | 0 .../app/maintenance/maintenance.controller.js | 0 .../controllers/app/parts/parts.controller.js | 0 .../app/personnel/personnel.controller.js | 0 .../controllers/app/users/users.controller.js | 0 .../controllers/app/zone/zone.controller.js | 0 .../src/middleware/apiKey.middleware.js | 0 .../src/middleware/auth.middleware.js | 0 .../checkContractStatus.middleware.js | 0 .../src/middleware/cors.middleware.js | 0 .../src/middleware/error.middleware.js | 0 .../src/middleware/errorHandler.middleware.js | 0 .../src/middleware/menu.middleware.js | 0 .../src/middleware/permission.middleware.js | 0 .../src/middleware/rateLimit.middleware.js | 0 .../middleware/requestLogger.middleware.js | 0 .../src/middleware/roleCheck.middleware.js | 0 .../middleware/securityHeaders.middleware.js | 0 .../src/middleware/validator.middleware.js | 0 {fems-api => plm-api}/src/models/AlarmRule.js | 0 {fems-api => plm-api}/src/models/Alert.js | 0 {fems-api => plm-api}/src/models/ApiKey.js | 0 {fems-api => plm-api}/src/models/AuthLog.js | 0 {fems-api => plm-api}/src/models/Branch.js | 0 {fems-api => plm-api}/src/models/Company.js | 0 {fems-api => plm-api}/src/models/Contract.js | 0 .../src/models/ContractDetail.js | 0 {fems-api => plm-api}/src/models/Dashboard.js | 0 {fems-api => plm-api}/src/models/DataPoint.js | 0 .../src/models/Department.js | 0 {fems-api => plm-api}/src/models/Device.js | 0 .../src/models/DeviceConnection.js | 0 .../src/models/DeviceStatus.js | 0 .../src/models/EnergyCost.js | 0 .../src/models/EnergyPrediction.js | 0 .../src/models/EnergyTarget.js | 0 .../src/models/EnergyUsage.js | 0 {fems-api => plm-api}/src/models/Equipment.js | 0 .../src/models/EquipmentData.js | 0 .../src/models/EquipmentParts.js | 0 {fems-api => plm-api}/src/models/File.js | 0 {fems-api => plm-api}/src/models/Kpi.js | 0 .../src/models/MaintenanceLog.js | 0 .../src/models/MaintenanceLogParts.js | 0 .../src/models/MaintenanceLogPersonnel.js | 0 {fems-api => plm-api}/src/models/MenuInfo.js | 0 {fems-api => plm-api}/src/models/Parts.js | 0 {fems-api => plm-api}/src/models/Personnel.js | 0 .../src/models/PredictionDetail.js | 0 {fems-api => plm-api}/src/models/Report.js | 0 .../src/models/ReportTemplate.js | 0 {fems-api => plm-api}/src/models/Role.js | 0 .../src/models/SystemSetting.js | 0 {fems-api => plm-api}/src/models/User.js | 0 {fems-api => plm-api}/src/models/UserRole.js | 0 {fems-api => plm-api}/src/models/Userinfo.js | 0 {fems-api => plm-api}/src/models/Widget.js | 0 {fems-api => plm-api}/src/models/Zone.js | 0 {fems-api => plm-api}/src/models/index.js | 0 {fems-api => plm-api}/src/routes/admin.js | 0 {fems-api => plm-api}/src/routes/app.js | 0 {fems-api => plm-api}/src/routes/index.js | 0 .../src/services/alert.service.js | 0 .../src/services/apiKey.service.js | 0 .../src/services/auth.service.js | 0 .../src/services/branch.service.js | 0 .../src/services/common.service.js | 0 .../src/services/companies.service.js | 0 .../src/services/contract-detail.service.js | 0 .../src/services/contract.service.js | 0 .../src/services/dashboard.service.js | 0 .../src/services/department.service.js | 0 .../src/services/device.service.js | 0 .../src/services/equipment.service.js | 0 .../src/services/equipmentParts.service.js | 0 .../src/services/file.service.js | 0 .../src/services/maintenance.service.js | 0 .../src/services/parts.service.js | 0 .../src/services/permission.service.js | 0 .../src/services/personnel.service.js | 0 .../src/services/role.service.js | 0 .../src/services/system.service.js | 0 .../src/services/user.service.js | 0 .../src/services/zone.service.js | 0 .../src/utils/asyncHandler.js | 0 {fems-api => plm-api}/src/utils/cache.js | 0 .../src/utils/createInitialAdmin.js | 0 {fems-api => plm-api}/src/utils/database.js | 0 {fems-api => plm-api}/src/utils/errors.js | 0 .../src/utils/initialSetup/dataSetup.js | 0 .../utils/initialSetup/deviceInitializer.js | 0 .../src/utils/initialSetup/loggingSetup.js | 0 .../utils/initialSetup/maintenanceSetup.js | 0 .../utils/initialSetup/organizationSetup.js | 0 .../src/utils/initialSetup/setupData.js | 0 .../src/utils/koreanParticle.js | 0 {fems-api => plm-api}/src/utils/logger.js | 0 .../src/utils/permissions.js | 0 {fems-api => plm-api}/src/utils/security.js | 0 {fems-api => plm-api}/src/utils/validators.js | 0 {fems-api => plm-api}/yarn.lock | 0 {fems-app => plm-app}/.eslintrc.json | 0 {fems-app => plm-app}/.gitignore | 0 {fems-app => plm-app}/Dockerfile | 0 {fems-app => plm-app}/README.md | 0 {fems-app => plm-app}/components.json | 0 {fems-app => plm-app}/next.config.mjs | 0 {fems-app => plm-app}/package.json | 0 {fems-app => plm-app}/postcss.config.mjs | 0 .../common/menu/components/UserForm.tsx | 0 .../src/app/(admin)/common/menu/page.tsx | 0 .../src/app/(admin)/company/billing/page.tsx | 0 .../branches/components/ApiKeyDialog.tsx | 0 .../branches/components/ApiKeySection.tsx | 0 .../branches/components/BranchCard.tsx | 0 .../branches/components/BranchFormDialog.tsx | 0 .../components/DeleteApiKeyDialog.tsx | 0 .../components/DeleteBranchDialog.tsx | 0 .../branches/hooks/useApiKeyMutations.ts | 0 .../branches/hooks/useBranchMutations.ts | 0 .../src/app/(admin)/company/branches/page.tsx | 0 .../company/branches/utils/api-helpers.ts | 0 .../company/branches/utils/clipboard.ts | 0 .../company/branches/utils/constants.ts | 0 .../company/branches/utils/formatters.ts | 0 .../company/branches/utils/validators.ts | 0 .../src/app/(admin)/company/profile/page.tsx | 0 .../src/app/(admin)/layout.tsx | 0 .../src/app/(admin)/system/page.tsx | 0 .../users/accounts/components/UserForm.tsx | 0 .../src/app/(admin)/users/accounts/page.tsx | 0 .../departments/components/DepartmentCard.tsx | 0 .../departments/components/DepartmentForm.tsx | 0 .../app/(admin)/users/departments/page.tsx | 0 .../users/roles/components/RoleForm.tsx | 0 .../src/app/(admin)/users/roles/page.tsx | 0 .../src/app/(alarm)/history/page.tsx | 0 .../src/app/(alarm)/layout.tsx | 0 .../src/app/(alarm)/realtime/page.tsx | 0 .../src/app/(alarm)/settings/page.tsx | 0 .../src/app/(analysis)/efficiency/page.tsx | 0 .../src/app/(analysis)/energy/page.tsx | 0 .../src/app/(analysis)/layout.tsx | 0 .../src/app/(analysis)/reports/page.tsx | 0 .../src/app/(auth)/layout.tsx | 0 .../src/app/(auth)/login/page.tsx | 0 .../src/app/(auth)/register/page.tsx | 0 .../src/app/(equipment)/devices/[id]/page.tsx | 0 .../components/Detail/DeviceDetailDialog.tsx | 0 .../DeviceForm/DataPointFormFields.tsx | 0 .../DeviceForm/DeviceFormFields.tsx | 0 .../devices/components/DeviceForm/index.tsx | 0 .../devices/components/DeviceForm/schema.ts | 0 .../components/DeviceForm/useDeviceForm.ts | 0 .../app/(equipment)/devices/new/layout.tsx | 0 .../src/app/(equipment)/devices/new/page.tsx | 0 .../src/app/(equipment)/devices/page.tsx | 0 .../[mode]/components/EquipmentForm.tsx | 0 .../app/(equipment)/inventory/[mode]/page.tsx | 0 .../detail/[id]/components/EquipmentFiles.tsx | 0 .../inventory/detail/[id]/page.tsx | 0 .../src/app/(equipment)/inventory/page.tsx | 0 .../src/app/(equipment)/layout.tsx | 0 .../[mode]/components/MaintenanceForm.tsx | 0 .../(equipment)/maintenance/[mode]/page.tsx | 0 .../[id]/components/MaintenanceFiles.tsx | 0 .../maintenance/detail/[id]/page.tsx | 0 .../src/app/(equipment)/maintenance/page.tsx | 0 .../src/app/(equipment)/monitoring/page.tsx | 0 .../parts/components/PartsDetailDialog.tsx | 0 .../parts/components/PartsForm.tsx | 0 .../src/app/(equipment)/parts/page.tsx | 0 .../components/PersonnelDetailDialog.tsx | 0 .../personnel/components/PersonnelForm.tsx | 0 .../src/app/(equipment)/personnel/page.tsx | 0 .../app/(general)/dashboard/costs/page.tsx | 0 .../src/app/(general)/dashboard/kpi/page.tsx | 0 .../app/(general)/dashboard/overview/page.tsx | 0 .../src/app/(general)/layout.tsx | 0 .../src/app/(general)/settings/page.tsx | 0 .../src/app/(monitoring)/electricity/page.tsx | 0 .../src/app/(monitoring)/gas/page.tsx | 0 .../src/app/(monitoring)/layout.tsx | 0 .../src/app/(monitoring)/steam/page.tsx | 0 .../src/app/(monitoring)/water/page.tsx | 0 .../src/app/(planning)/forecast/page.tsx | 0 .../src/app/(planning)/layout.tsx | 0 .../src/app/(planning)/optimization/page.tsx | 0 .../src/app/(planning)/targets/page.tsx | 0 .../app/(support)/community/forum/page.tsx | 0 .../src/app/(support)/community/news/page.tsx | 0 .../src/app/(support)/contact/page.tsx | 0 .../src/app/(support)/faq/page.tsx | 0 .../src/app/(support)/layout.tsx | 0 .../src/app/(support)/manual/page.tsx | 0 {fems-app => plm-app}/src/app/favicon.ico | Bin .../src/app/fonts/GeistMonoVF.woff | Bin .../src/app/fonts/GeistVF.woff | Bin {fems-app => plm-app}/src/app/globals.css | 0 {fems-app => plm-app}/src/app/layout.tsx | 0 {fems-app => plm-app}/src/app/page.tsx | 0 .../src/components/auth/AdminGuard.tsx | 0 .../src/components/charts/CostChart.tsx | 0 .../src/components/charts/UsageChart.tsx | 0 .../src/components/headers/UnifiedHeader.tsx | 0 .../src/components/layout/AdminSidebar.tsx | 0 plm-app/src/components/layout/SideNav.tsx | 297 ++++++++++++++++++ .../src/components/layout/TopNav.tsx | 0 .../src/components/ui/FilePreview.tsx | 0 .../src/components/ui/alert-dialog.tsx | 0 .../src/components/ui/alert.tsx | 0 .../src/components/ui/badge.tsx | 0 .../src/components/ui/button.tsx | 0 .../src/components/ui/calendar.tsx | 0 .../src/components/ui/card.tsx | 0 .../src/components/ui/checkbox.tsx | 0 .../src/components/ui/data-table.tsx | 0 .../src/components/ui/date-range-picker.tsx | 0 .../src/components/ui/dialog.tsx | 0 .../src/components/ui/dropdown-menu.tsx | 0 .../src/components/ui/file-uploader.tsx | 0 .../src/components/ui/form.tsx | 0 .../src/components/ui/input.tsx | 0 .../src/components/ui/label.tsx | 0 .../src/components/ui/pagination.tsx | 0 .../src/components/ui/popover.tsx | 0 .../src/components/ui/select.tsx | 0 .../src/components/ui/separator.tsx | 0 .../src/components/ui/skeleton.tsx | 0 .../src/components/ui/switch.tsx | 0 .../src/components/ui/table.tsx | 0 .../src/components/ui/tabs.tsx | 0 .../src/components/ui/textarea.tsx | 0 .../src/components/ui/toast.tsx | 0 .../src/components/ui/toaster.tsx | 0 .../src/config/permissions.ts | 0 {fems-app => plm-app}/src/hooks/use-toast.ts | 0 {fems-app => plm-app}/src/hooks/useAuth.ts | 0 .../src/hooks/usePermissions.ts | 0 {fems-app => plm-app}/src/lib/api.ts | 0 {fems-app => plm-app}/src/lib/jwt.ts | 0 {fems-app => plm-app}/src/lib/utils.ts | 0 {fems-app => plm-app}/src/middleware.tsx | 0 {fems-app => plm-app}/src/providers.tsx | 0 {fems-app => plm-app}/src/stores/auth.ts | 0 {fems-app => plm-app}/src/types/auth.ts | 0 {fems-app => plm-app}/src/types/company.ts | 0 {fems-app => plm-app}/src/types/dashboard.ts | 0 {fems-app => plm-app}/src/types/department.ts | 0 {fems-app => plm-app}/src/types/device.ts | 0 {fems-app => plm-app}/src/types/equipment.ts | 0 {fems-app => plm-app}/src/types/index.ts | 0 .../src/types/maintenance.ts | 0 {fems-app => plm-app}/src/types/menu.ts | 0 {fems-app => plm-app}/src/types/user.ts | 0 {fems-app => plm-app}/tailwind.config.ts | 0 {fems-app => plm-app}/tsconfig.json | 0 {fems-app => plm-app}/yarn.lock | 0 {fems-mqtt => plm-mqtt}/Dockerfile | 0 {fems-mqtt => plm-mqtt}/config/acl | 0 {fems-mqtt => plm-mqtt}/config/mosquitto.conf | 0 {fems-mqtt => plm-mqtt}/data/mosquitto.db | Bin {fems-mqtt => plm-mqtt}/data/passwd | 0 {fems-mqtt => plm-mqtt}/log/mosquitto.log | 0 {fems-postgres => plm-postgres}/pg_hba.conf | 0 .../postgresql.conf | 0 .../.gitignore | 0 .../Dockerfile | 0 .../package.json | 0 .../src/app.js | 0 .../src/config/config.js | 0 .../src/config/database.js | 0 .../src/config/logger.js | 0 .../src/controllers/data.controller.js | 0 .../src/middleware/apiKey.middleware.js | 0 .../src/models/SensorData.js | 0 .../src/services/mainBackend.service.js | 0 .../src/services/mqtt.service.js | 0 .../yarn.lock | 0 .../Dockerfile | 0 .../init-scripts/00-init-user.sh | 0 .../pg_hba.conf | 0 .../postgresql.conf | 0 .../yarn.lock | 0 windows_start-dev-full.bat | 2 +- 337 files changed, 468 insertions(+), 291 deletions(-) delete mode 100644 fems-realtime-api/logs/error/.f0712455ac9b956018e7ebc08dc33061795e3736-audit.json delete mode 100644 fems-realtime-api/logs/info/.17ff23bf9d3be0bd8551fdd86d0d3cca3a97cd90-audit.json delete mode 100644 fems-realtime-api/logs/info/info-2024-11-25.log.gz delete mode 100644 fems-realtime-api/logs/system/.d741815bd363f7141809635bfe8d8a1642abfc24-audit.json delete mode 100644 fems-realtime-api/logs/system/system-2024-11-25.log.gz rename {fems-admin => plm-admin}/.eslintrc.json (100%) rename {fems-admin => plm-admin}/.gitignore (100%) rename {fems-admin => plm-admin}/Dockerfile (100%) rename {fems-admin => plm-admin}/README.md (100%) rename {fems-admin => plm-admin}/components.json (100%) rename {fems-admin => plm-admin}/next.config.mjs (100%) rename {fems-admin => plm-admin}/package.json (100%) rename {fems-admin => plm-admin}/postcss.config.mjs (100%) rename {fems-admin => plm-admin}/src/app/favicon.ico (100%) rename {fems-admin => plm-admin}/src/app/fonts/GeistMonoVF.woff (100%) rename {fems-admin => plm-admin}/src/app/fonts/GeistVF.woff (100%) rename {fems-admin => plm-admin}/src/app/globals.css (100%) rename {fems-admin => plm-admin}/src/app/layout.tsx (100%) rename {fems-admin => plm-admin}/src/app/page.tsx (100%) rename {fems-admin => plm-admin}/src/lib/utils.ts (100%) rename {fems-admin => plm-admin}/tailwind.config.ts (100%) rename {fems-admin => plm-admin}/tsconfig.json (100%) rename {fems-admin => plm-admin}/yarn.lock (100%) rename {fems-api => plm-api}/.eslintrc.json (100%) rename {fems-api => plm-api}/.gitignore (100%) rename {fems-api => plm-api}/Dockerfile (100%) rename {fems-api => plm-api}/package.json (100%) rename {fems-api => plm-api}/src/app.js (100%) rename {fems-api => plm-api}/src/config/config.js (100%) rename {fems-api => plm-api}/src/config/database.js (100%) rename {fems-api => plm-api}/src/config/logger.js (100%) rename {fems-api => plm-api}/src/config/redis.js (100%) rename {fems-api => plm-api}/src/controllers/admin/apiKey/apiKey.controller.js (100%) rename {fems-api => plm-api}/src/controllers/admin/companies/branches.controller.js (100%) rename {fems-api => plm-api}/src/controllers/admin/companies/companies.controller.js (100%) rename {fems-api => plm-api}/src/controllers/admin/contracts/contract-details.controller.js (100%) rename {fems-api => plm-api}/src/controllers/admin/contracts/contracts.controller.js (100%) rename {fems-api => plm-api}/src/controllers/admin/users/departments.controller.js (100%) rename {fems-api => plm-api}/src/controllers/admin/users/roles.controller.js (100%) rename {fems-api => plm-api}/src/controllers/admin/users/users.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/alerts/alerts.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/auth/auth.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/common/common.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/dashboard/dashboard.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/department/department.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/device/device.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/equipment/equipment.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/equipmentParts/equipmentParts.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/file/file.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/health/health.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/maintenance/maintenance.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/parts/parts.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/personnel/personnel.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/users/users.controller.js (100%) rename {fems-api => plm-api}/src/controllers/app/zone/zone.controller.js (100%) rename {fems-api => plm-api}/src/middleware/apiKey.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/auth.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/checkContractStatus.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/cors.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/error.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/errorHandler.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/menu.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/permission.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/rateLimit.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/requestLogger.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/roleCheck.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/securityHeaders.middleware.js (100%) rename {fems-api => plm-api}/src/middleware/validator.middleware.js (100%) rename {fems-api => plm-api}/src/models/AlarmRule.js (100%) rename {fems-api => plm-api}/src/models/Alert.js (100%) rename {fems-api => plm-api}/src/models/ApiKey.js (100%) rename {fems-api => plm-api}/src/models/AuthLog.js (100%) rename {fems-api => plm-api}/src/models/Branch.js (100%) rename {fems-api => plm-api}/src/models/Company.js (100%) rename {fems-api => plm-api}/src/models/Contract.js (100%) rename {fems-api => plm-api}/src/models/ContractDetail.js (100%) rename {fems-api => plm-api}/src/models/Dashboard.js (100%) rename {fems-api => plm-api}/src/models/DataPoint.js (100%) rename {fems-api => plm-api}/src/models/Department.js (100%) rename {fems-api => plm-api}/src/models/Device.js (100%) rename {fems-api => plm-api}/src/models/DeviceConnection.js (100%) rename {fems-api => plm-api}/src/models/DeviceStatus.js (100%) rename {fems-api => plm-api}/src/models/EnergyCost.js (100%) rename {fems-api => plm-api}/src/models/EnergyPrediction.js (100%) rename {fems-api => plm-api}/src/models/EnergyTarget.js (100%) rename {fems-api => plm-api}/src/models/EnergyUsage.js (100%) rename {fems-api => plm-api}/src/models/Equipment.js (100%) rename {fems-api => plm-api}/src/models/EquipmentData.js (100%) rename {fems-api => plm-api}/src/models/EquipmentParts.js (100%) rename {fems-api => plm-api}/src/models/File.js (100%) rename {fems-api => plm-api}/src/models/Kpi.js (100%) rename {fems-api => plm-api}/src/models/MaintenanceLog.js (100%) rename {fems-api => plm-api}/src/models/MaintenanceLogParts.js (100%) rename {fems-api => plm-api}/src/models/MaintenanceLogPersonnel.js (100%) rename {fems-api => plm-api}/src/models/MenuInfo.js (100%) rename {fems-api => plm-api}/src/models/Parts.js (100%) rename {fems-api => plm-api}/src/models/Personnel.js (100%) rename {fems-api => plm-api}/src/models/PredictionDetail.js (100%) rename {fems-api => plm-api}/src/models/Report.js (100%) rename {fems-api => plm-api}/src/models/ReportTemplate.js (100%) rename {fems-api => plm-api}/src/models/Role.js (100%) rename {fems-api => plm-api}/src/models/SystemSetting.js (100%) rename {fems-api => plm-api}/src/models/User.js (100%) rename {fems-api => plm-api}/src/models/UserRole.js (100%) rename {fems-api => plm-api}/src/models/Userinfo.js (100%) rename {fems-api => plm-api}/src/models/Widget.js (100%) rename {fems-api => plm-api}/src/models/Zone.js (100%) rename {fems-api => plm-api}/src/models/index.js (100%) rename {fems-api => plm-api}/src/routes/admin.js (100%) rename {fems-api => plm-api}/src/routes/app.js (100%) rename {fems-api => plm-api}/src/routes/index.js (100%) rename {fems-api => plm-api}/src/services/alert.service.js (100%) rename {fems-api => plm-api}/src/services/apiKey.service.js (100%) rename {fems-api => plm-api}/src/services/auth.service.js (100%) rename {fems-api => plm-api}/src/services/branch.service.js (100%) rename {fems-api => plm-api}/src/services/common.service.js (100%) rename {fems-api => plm-api}/src/services/companies.service.js (100%) rename {fems-api => plm-api}/src/services/contract-detail.service.js (100%) rename {fems-api => plm-api}/src/services/contract.service.js (100%) rename {fems-api => plm-api}/src/services/dashboard.service.js (100%) rename {fems-api => plm-api}/src/services/department.service.js (100%) rename {fems-api => plm-api}/src/services/device.service.js (100%) rename {fems-api => plm-api}/src/services/equipment.service.js (100%) rename {fems-api => plm-api}/src/services/equipmentParts.service.js (100%) rename {fems-api => plm-api}/src/services/file.service.js (100%) rename {fems-api => plm-api}/src/services/maintenance.service.js (100%) rename {fems-api => plm-api}/src/services/parts.service.js (100%) rename {fems-api => plm-api}/src/services/permission.service.js (100%) rename {fems-api => plm-api}/src/services/personnel.service.js (100%) rename {fems-api => plm-api}/src/services/role.service.js (100%) rename {fems-api => plm-api}/src/services/system.service.js (100%) rename {fems-api => plm-api}/src/services/user.service.js (100%) rename {fems-api => plm-api}/src/services/zone.service.js (100%) rename {fems-api => plm-api}/src/utils/asyncHandler.js (100%) rename {fems-api => plm-api}/src/utils/cache.js (100%) rename {fems-api => plm-api}/src/utils/createInitialAdmin.js (100%) rename {fems-api => plm-api}/src/utils/database.js (100%) rename {fems-api => plm-api}/src/utils/errors.js (100%) rename {fems-api => plm-api}/src/utils/initialSetup/dataSetup.js (100%) rename {fems-api => plm-api}/src/utils/initialSetup/deviceInitializer.js (100%) rename {fems-api => plm-api}/src/utils/initialSetup/loggingSetup.js (100%) rename {fems-api => plm-api}/src/utils/initialSetup/maintenanceSetup.js (100%) rename {fems-api => plm-api}/src/utils/initialSetup/organizationSetup.js (100%) rename {fems-api => plm-api}/src/utils/initialSetup/setupData.js (100%) rename {fems-api => plm-api}/src/utils/koreanParticle.js (100%) rename {fems-api => plm-api}/src/utils/logger.js (100%) rename {fems-api => plm-api}/src/utils/permissions.js (100%) rename {fems-api => plm-api}/src/utils/security.js (100%) rename {fems-api => plm-api}/src/utils/validators.js (100%) rename {fems-api => plm-api}/yarn.lock (100%) rename {fems-app => plm-app}/.eslintrc.json (100%) rename {fems-app => plm-app}/.gitignore (100%) rename {fems-app => plm-app}/Dockerfile (100%) rename {fems-app => plm-app}/README.md (100%) rename {fems-app => plm-app}/components.json (100%) rename {fems-app => plm-app}/next.config.mjs (100%) rename {fems-app => plm-app}/package.json (100%) rename {fems-app => plm-app}/postcss.config.mjs (100%) rename {fems-app => plm-app}/src/app/(admin)/common/menu/components/UserForm.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/common/menu/page.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/company/billing/page.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/components/ApiKeyDialog.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/components/ApiKeySection.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/components/BranchCard.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/components/BranchFormDialog.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/components/DeleteApiKeyDialog.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/components/DeleteBranchDialog.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/hooks/useApiKeyMutations.ts (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/hooks/useBranchMutations.ts (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/page.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/utils/api-helpers.ts (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/utils/clipboard.ts (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/utils/constants.ts (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/utils/formatters.ts (100%) rename {fems-app => plm-app}/src/app/(admin)/company/branches/utils/validators.ts (100%) rename {fems-app => plm-app}/src/app/(admin)/company/profile/page.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/layout.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/system/page.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/users/accounts/components/UserForm.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/users/accounts/page.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/users/departments/components/DepartmentCard.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/users/departments/components/DepartmentForm.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/users/departments/page.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/users/roles/components/RoleForm.tsx (100%) rename {fems-app => plm-app}/src/app/(admin)/users/roles/page.tsx (100%) rename {fems-app => plm-app}/src/app/(alarm)/history/page.tsx (100%) rename {fems-app => plm-app}/src/app/(alarm)/layout.tsx (100%) rename {fems-app => plm-app}/src/app/(alarm)/realtime/page.tsx (100%) rename {fems-app => plm-app}/src/app/(alarm)/settings/page.tsx (100%) rename {fems-app => plm-app}/src/app/(analysis)/efficiency/page.tsx (100%) rename {fems-app => plm-app}/src/app/(analysis)/energy/page.tsx (100%) rename {fems-app => plm-app}/src/app/(analysis)/layout.tsx (100%) rename {fems-app => plm-app}/src/app/(analysis)/reports/page.tsx (100%) rename {fems-app => plm-app}/src/app/(auth)/layout.tsx (100%) rename {fems-app => plm-app}/src/app/(auth)/login/page.tsx (100%) rename {fems-app => plm-app}/src/app/(auth)/register/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/devices/[id]/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/devices/components/Detail/DeviceDetailDialog.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/devices/components/DeviceForm/DataPointFormFields.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/devices/components/DeviceForm/DeviceFormFields.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/devices/components/DeviceForm/index.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/devices/components/DeviceForm/schema.ts (100%) rename {fems-app => plm-app}/src/app/(equipment)/devices/components/DeviceForm/useDeviceForm.ts (100%) rename {fems-app => plm-app}/src/app/(equipment)/devices/new/layout.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/devices/new/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/devices/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/inventory/[mode]/components/EquipmentForm.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/inventory/[mode]/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/inventory/detail/[id]/components/EquipmentFiles.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/inventory/detail/[id]/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/inventory/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/layout.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/maintenance/[mode]/components/MaintenanceForm.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/maintenance/[mode]/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/maintenance/detail/[id]/components/MaintenanceFiles.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/maintenance/detail/[id]/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/maintenance/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/monitoring/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/parts/components/PartsDetailDialog.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/parts/components/PartsForm.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/parts/page.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/personnel/components/PersonnelDetailDialog.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/personnel/components/PersonnelForm.tsx (100%) rename {fems-app => plm-app}/src/app/(equipment)/personnel/page.tsx (100%) rename {fems-app => plm-app}/src/app/(general)/dashboard/costs/page.tsx (100%) rename {fems-app => plm-app}/src/app/(general)/dashboard/kpi/page.tsx (100%) rename {fems-app => plm-app}/src/app/(general)/dashboard/overview/page.tsx (100%) rename {fems-app => plm-app}/src/app/(general)/layout.tsx (100%) rename {fems-app => plm-app}/src/app/(general)/settings/page.tsx (100%) rename {fems-app => plm-app}/src/app/(monitoring)/electricity/page.tsx (100%) rename {fems-app => plm-app}/src/app/(monitoring)/gas/page.tsx (100%) rename {fems-app => plm-app}/src/app/(monitoring)/layout.tsx (100%) rename {fems-app => plm-app}/src/app/(monitoring)/steam/page.tsx (100%) rename {fems-app => plm-app}/src/app/(monitoring)/water/page.tsx (100%) rename {fems-app => plm-app}/src/app/(planning)/forecast/page.tsx (100%) rename {fems-app => plm-app}/src/app/(planning)/layout.tsx (100%) rename {fems-app => plm-app}/src/app/(planning)/optimization/page.tsx (100%) rename {fems-app => plm-app}/src/app/(planning)/targets/page.tsx (100%) rename {fems-app => plm-app}/src/app/(support)/community/forum/page.tsx (100%) rename {fems-app => plm-app}/src/app/(support)/community/news/page.tsx (100%) rename {fems-app => plm-app}/src/app/(support)/contact/page.tsx (100%) rename {fems-app => plm-app}/src/app/(support)/faq/page.tsx (100%) rename {fems-app => plm-app}/src/app/(support)/layout.tsx (100%) rename {fems-app => plm-app}/src/app/(support)/manual/page.tsx (100%) rename {fems-app => plm-app}/src/app/favicon.ico (100%) rename {fems-app => plm-app}/src/app/fonts/GeistMonoVF.woff (100%) rename {fems-app => plm-app}/src/app/fonts/GeistVF.woff (100%) rename {fems-app => plm-app}/src/app/globals.css (100%) rename {fems-app => plm-app}/src/app/layout.tsx (100%) rename {fems-app => plm-app}/src/app/page.tsx (100%) rename {fems-app => plm-app}/src/components/auth/AdminGuard.tsx (100%) rename {fems-app => plm-app}/src/components/charts/CostChart.tsx (100%) rename {fems-app => plm-app}/src/components/charts/UsageChart.tsx (100%) rename {fems-app => plm-app}/src/components/headers/UnifiedHeader.tsx (100%) rename {fems-app => plm-app}/src/components/layout/AdminSidebar.tsx (100%) create mode 100644 plm-app/src/components/layout/SideNav.tsx rename {fems-app => plm-app}/src/components/layout/TopNav.tsx (100%) rename {fems-app => plm-app}/src/components/ui/FilePreview.tsx (100%) rename {fems-app => plm-app}/src/components/ui/alert-dialog.tsx (100%) rename {fems-app => plm-app}/src/components/ui/alert.tsx (100%) rename {fems-app => plm-app}/src/components/ui/badge.tsx (100%) rename {fems-app => plm-app}/src/components/ui/button.tsx (100%) rename {fems-app => plm-app}/src/components/ui/calendar.tsx (100%) rename {fems-app => plm-app}/src/components/ui/card.tsx (100%) rename {fems-app => plm-app}/src/components/ui/checkbox.tsx (100%) rename {fems-app => plm-app}/src/components/ui/data-table.tsx (100%) rename {fems-app => plm-app}/src/components/ui/date-range-picker.tsx (100%) rename {fems-app => plm-app}/src/components/ui/dialog.tsx (100%) rename {fems-app => plm-app}/src/components/ui/dropdown-menu.tsx (100%) rename {fems-app => plm-app}/src/components/ui/file-uploader.tsx (100%) rename {fems-app => plm-app}/src/components/ui/form.tsx (100%) rename {fems-app => plm-app}/src/components/ui/input.tsx (100%) rename {fems-app => plm-app}/src/components/ui/label.tsx (100%) rename {fems-app => plm-app}/src/components/ui/pagination.tsx (100%) rename {fems-app => plm-app}/src/components/ui/popover.tsx (100%) rename {fems-app => plm-app}/src/components/ui/select.tsx (100%) rename {fems-app => plm-app}/src/components/ui/separator.tsx (100%) rename {fems-app => plm-app}/src/components/ui/skeleton.tsx (100%) rename {fems-app => plm-app}/src/components/ui/switch.tsx (100%) rename {fems-app => plm-app}/src/components/ui/table.tsx (100%) rename {fems-app => plm-app}/src/components/ui/tabs.tsx (100%) rename {fems-app => plm-app}/src/components/ui/textarea.tsx (100%) rename {fems-app => plm-app}/src/components/ui/toast.tsx (100%) rename {fems-app => plm-app}/src/components/ui/toaster.tsx (100%) rename {fems-app => plm-app}/src/config/permissions.ts (100%) rename {fems-app => plm-app}/src/hooks/use-toast.ts (100%) rename {fems-app => plm-app}/src/hooks/useAuth.ts (100%) rename {fems-app => plm-app}/src/hooks/usePermissions.ts (100%) rename {fems-app => plm-app}/src/lib/api.ts (100%) rename {fems-app => plm-app}/src/lib/jwt.ts (100%) rename {fems-app => plm-app}/src/lib/utils.ts (100%) rename {fems-app => plm-app}/src/middleware.tsx (100%) rename {fems-app => plm-app}/src/providers.tsx (100%) rename {fems-app => plm-app}/src/stores/auth.ts (100%) rename {fems-app => plm-app}/src/types/auth.ts (100%) rename {fems-app => plm-app}/src/types/company.ts (100%) rename {fems-app => plm-app}/src/types/dashboard.ts (100%) rename {fems-app => plm-app}/src/types/department.ts (100%) rename {fems-app => plm-app}/src/types/device.ts (100%) rename {fems-app => plm-app}/src/types/equipment.ts (100%) rename {fems-app => plm-app}/src/types/index.ts (100%) rename {fems-app => plm-app}/src/types/maintenance.ts (100%) rename {fems-app => plm-app}/src/types/menu.ts (100%) rename {fems-app => plm-app}/src/types/user.ts (100%) rename {fems-app => plm-app}/tailwind.config.ts (100%) rename {fems-app => plm-app}/tsconfig.json (100%) rename {fems-app => plm-app}/yarn.lock (100%) rename {fems-mqtt => plm-mqtt}/Dockerfile (100%) rename {fems-mqtt => plm-mqtt}/config/acl (100%) rename {fems-mqtt => plm-mqtt}/config/mosquitto.conf (100%) rename {fems-mqtt => plm-mqtt}/data/mosquitto.db (100%) rename {fems-mqtt => plm-mqtt}/data/passwd (100%) rename {fems-mqtt => plm-mqtt}/log/mosquitto.log (100%) mode change 100755 => 100644 rename {fems-postgres => plm-postgres}/pg_hba.conf (100%) rename {fems-postgres => plm-postgres}/postgresql.conf (100%) rename {fems-realtime-api => plm-realtime-api}/.gitignore (100%) rename {fems-realtime-api => plm-realtime-api}/Dockerfile (100%) rename {fems-realtime-api => plm-realtime-api}/package.json (100%) rename {fems-realtime-api => plm-realtime-api}/src/app.js (100%) rename {fems-realtime-api => plm-realtime-api}/src/config/config.js (100%) rename {fems-realtime-api => plm-realtime-api}/src/config/database.js (100%) rename {fems-realtime-api => plm-realtime-api}/src/config/logger.js (100%) rename {fems-realtime-api => plm-realtime-api}/src/controllers/data.controller.js (100%) rename {fems-realtime-api => plm-realtime-api}/src/middleware/apiKey.middleware.js (100%) rename {fems-realtime-api => plm-realtime-api}/src/models/SensorData.js (100%) rename {fems-realtime-api => plm-realtime-api}/src/services/mainBackend.service.js (100%) rename {fems-realtime-api => plm-realtime-api}/src/services/mqtt.service.js (100%) rename {fems-realtime-api => plm-realtime-api}/yarn.lock (100%) rename {fems-timescaledb => plm-timescaledb}/Dockerfile (100%) rename {fems-timescaledb => plm-timescaledb}/init-scripts/00-init-user.sh (100%) mode change 100755 => 100644 rename {fems-timescaledb => plm-timescaledb}/pg_hba.conf (100%) rename {fems-timescaledb => plm-timescaledb}/postgresql.conf (100%) rename {fems-timescaledb => plm-timescaledb}/yarn.lock (100%) diff --git a/docker-compose.app.yml b/docker-compose.app.yml index 39c1224..ee9c800 100644 --- a/docker-compose.app.yml +++ b/docker-compose.app.yml @@ -3,12 +3,12 @@ version: "3.8" services: - fems-admin: + plm-admin: build: - context: ./fems-admin + context: ./plm-admin dockerfile: Dockerfile target: production - container_name: fems-admin + container_name: plm-admin restart: unless-stopped env_file: - .env.${NODE_ENV:-development} @@ -17,7 +17,7 @@ services: environment: - NODE_ENV=${NODE_ENV:-development} volumes: - - ./fems-admin:/app + - ./plm-admin:/app - /app/node_modules logging: driver: "json-file" @@ -30,14 +30,14 @@ services: timeout: 10s retries: 3 depends_on: - - fems-api + - plm-api - fems-app: + plm-app: build: - context: ./fems-app + context: ./plm-app dockerfile: Dockerfile target: production - container_name: fems-app + container_name: plm-app restart: unless-stopped env_file: - .env.${NODE_ENV:-development} @@ -46,17 +46,17 @@ services: environment: - NODE_ENV=${NODE_ENV:-development} volumes: - - ./fems-app:/app + - ./plm-app:/app - /app/node_modules depends_on: - - fems-api + - plm-api - fems-api: + plm-api: build: - context: ./fems-api + context: ./plm-api dockerfile: Dockerfile target: production - container_name: fems-api + container_name: plm-api restart: unless-stopped env_file: - .env.${NODE_ENV:-development} @@ -65,7 +65,7 @@ services: environment: - NODE_ENV=${NODE_ENV:-development} volumes: - - ./fems-api:/app + - ./plm-api:/app - /app/node_modules healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3001/health"] @@ -73,32 +73,32 @@ services: timeout: 10s retries: 3 - fems-realtime-api: - build: - context: ./fems-realtime-api - dockerfile: Dockerfile - target: production - container_name: fems-realtime-api - restart: unless-stopped - env_file: - - .env.${NODE_ENV:-development} - ports: - - "${REALTIME_API_PORT}:3004" - environment: - - NODE_ENV=${NODE_ENV:-development} - volumes: - - ./fems-realtime-api:/app - - /app/node_modules - depends_on: - - fems-api - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:3004/health"] - interval: 30s - timeout: 10s - retries: 3 +# plm-realtime-api: +# build: +# context: ./plm-realtime-api +# dockerfile: Dockerfile +# target: production +# container_name: plm-realtime-api +# restart: unless-stopped +# env_file: +# - .env.${NODE_ENV:-development} +# ports: +# - "${REALTIME_API_PORT}:3004" +# environment: +# - NODE_ENV=${NODE_ENV:-development} +# volumes: +# - ./plm-realtime-api:/app +# - /app/node_modules +# depends_on: +# - plm-api +# healthcheck: +# test: ["CMD", "curl", "-f", "http://localhost:3004/health"] +# interval: 30s +# timeout: 10s +# retries: 3 -networks: - default: - driver: bridge - internal: - driver: bridge +# networks: +# default: +# driver: bridge +# internal: +# driver: bridge diff --git a/docker-compose.db.yml b/docker-compose.db.yml index 75930ff..d09ff0f 100644 --- a/docker-compose.db.yml +++ b/docker-compose.db.yml @@ -3,9 +3,9 @@ version: "3.8" services: - fems-postgres: + plm-postgres: image: postgres:16 - container_name: fems-postgres + container_name: plm-postgres restart: unless-stopped env_file: - .env.${NODE_ENV:-development} @@ -22,11 +22,11 @@ services: - POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256 --auth-local=scram-sha-256 - TZ=Asia/Seoul volumes: - - fems_postgres:/var/lib/postgresql/data + - plm_postgres:/var/lib/postgresql/data - ./backups/postgres:/backups - - ./fems-postgres/init-scripts:/docker-entrypoint-initdb.d - - ./fems-postgres/postgresql.conf:/etc/postgresql/postgresql.conf:ro - - ./fems-postgres/pg_hba.conf:/etc/postgresql/pg_hba.conf:ro + - ./plm-postgres/init-scripts:/docker-entrypoint-initdb.d + - ./plm-postgres/postgresql.conf:/etc/postgresql/postgresql.conf:ro + - ./plm-postgres/pg_hba.conf:/etc/postgresql/pg_hba.conf:ro command: - "postgres" - "-c" @@ -37,112 +37,112 @@ services: timeout: 5s retries: 5 - fems-timescaledb: - build: - context: ./fems-timescaledb - dockerfile: Dockerfile - container_name: fems-timescaledb - restart: unless-stopped - env_file: - - .env.${NODE_ENV:-development} - ports: - - "${TIMESCALEDB_PORT}:5433" - environment: - - NODE_ENV=${NODE_ENV:-development} - - LANG=en_US.utf8 - - LANGUAGE=en_US.utf8 - - LC_ALL=en_US.utf8 - - TZ=Asia/Seoul - - POSTGRES_HOST_AUTH_METHOD=scram-sha-256 - - POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256 --auth-local=scram-sha-256 - - POSTGRES_DB=${TIMESCALEDB_DB} - - POSTGRES_USER=${TIMESCALEDB_USER} - - POSTGRES_PASSWORD=${TIMESCALEDB_PASSWORD} - # - TIMESCALEDB_DB=${TIMESCALEDB_DB} - # - TIMESCALEDB_USER=${TIMESCALEDB_USER} - # - TIMESCALEDB_PASSWORD=${TIMESCALEDB_PASSWORD} - volumes: - - fems_timescaledb:/var/lib/postgresql/data - - ./fems-timescaledb/postgresql.conf:/etc/postgresql/postgresql.conf:ro - - ./fems-timescaledb/pg_hba.conf:/etc/postgresql/pg_hba.conf:ro - - ./fems-timescaledb/init-scripts:/docker-entrypoint-initdb.d/:ro - command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"] - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: 10s - timeout: 5s - retries: 5 +# plm-timescaledb: +# build: +# context: ./plm-timescaledb +# dockerfile: Dockerfile +# container_name: plm-timescaledb +# restart: unless-stopped +# env_file: +# - .env.${NODE_ENV:-development} +# ports: +# - "${TIMESCALEDB_PORT}:5433" +# environment: +# - NODE_ENV=${NODE_ENV:-development} +# - LANG=en_US.utf8 +# - LANGUAGE=en_US.utf8 +# - LC_ALL=en_US.utf8 +# - TZ=Asia/Seoul +# - POSTGRES_HOST_AUTH_METHOD=scram-sha-256 +# - POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256 --auth-local=scram-sha-256 +# - POSTGRES_DB=${TIMESCALEDB_DB} +# - POSTGRES_USER=${TIMESCALEDB_USER} +# - POSTGRES_PASSWORD=${TIMESCALEDB_PASSWORD} +# # - TIMESCALEDB_DB=${TIMESCALEDB_DB} +# # - TIMESCALEDB_USER=${TIMESCALEDB_USER} +# # - TIMESCALEDB_PASSWORD=${TIMESCALEDB_PASSWORD} +# volumes: +# - plm_timescaledb:/var/lib/postgresql/data +# - ./plm-timescaledb/postgresql.conf:/etc/postgresql/postgresql.conf:ro +# - ./plm-timescaledb/pg_hba.conf:/etc/postgresql/pg_hba.conf:ro +# - ./plm-timescaledb/init-scripts:/docker-entrypoint-initdb.d/:ro +# command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"] +# healthcheck: +# test: ["CMD-SHELL", "pg_isready -U postgres"] +# interval: 10s +# timeout: 5s +# retries: 5 - fems-redis: - image: redis:alpine - container_name: fems-redis - restart: unless-stopped - env_file: - - .env.${NODE_ENV:-development} - # ports: - # - "${REDIS_PORT}:6379" - command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"] - volumes: - - fems_redis:/data - - ./backups/redis:/backups - environment: - - NODE_ENV=${NODE_ENV:-development} - - REDIS_PASSWORD=${REDIS_PASSWORD} - depends_on: - - fems-postgres - - fems-timescaledb - healthcheck: - test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] - interval: 10s - timeout: 5s - retries: 3 +# plm-redis: +# image: redis:alpine +# container_name: plm-redis +# restart: unless-stopped +# env_file: +# - .env.${NODE_ENV:-development} +# # ports: +# # - "${REDIS_PORT}:6379" +# command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"] +# volumes: +# - plm_redis:/data +# - ./backups/redis:/backups +# environment: +# - NODE_ENV=${NODE_ENV:-development} +# - REDIS_PASSWORD=${REDIS_PASSWORD} +# depends_on: +# - plm-postgres +# - plm-timescaledb +# healthcheck: +# test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] +# interval: 10s +# timeout: 5s +# retries: 3 - fems-mqtt: - build: - context: ./fems-mqtt - dockerfile: Dockerfile - args: - - MQTT_USERNAME=${MQTT_USERNAME} - - MQTT_PASSWORD=${MQTT_PASSWORD} - - NODE_RED_USERNAME=${NODE_RED_USERNAME} - - NODE_RED_PASSWORD=${NODE_RED_PASSWORD} - container_name: fems-mqtt - restart: unless-stopped - env_file: - - .env.${NODE_ENV:-development} - ports: - - "${MQTT_PORT}:1883" - - "${MQTT_WSS_PORT}:8883" - environment: - - MQTT_USERNAME=${MQTT_USERNAME} - - MQTT_PASSWORD=${MQTT_PASSWORD} - - NODE_RED_USERNAME=${NODE_RED_USERNAME} - - NODE_RED_PASSWORD=${NODE_RED_PASSWORD} - volumes: - - ./fems-mqtt/data:/mosquitto/data - - ./fems-mqtt/config:/mosquitto/config - - ./fems-mqtt/log:/mosquitto/log - - ./fems-mqtt/certs:/mosquitto/certs - # entrypoint: ["/docker-entrypoint.sh"] - # command: ["/usr/sbin/mosquitto", "-c", "/mosquitto/config/mosquitto.conf"] - user: mosquitto - healthcheck: - test: - [ - "CMD-SHELL", - "mosquitto_sub -h localhost -t '$$SYS/#' -C 1 -u ${MQTT_USERNAME} -P ${MQTT_PASSWORD} || exit 1", - ] - interval: 30s - timeout: 10s - retries: 3 - depends_on: - - fems-postgres - - fems-timescaledb +# plm-mqtt: +# build: +# context: ./plm-mqtt +# dockerfile: Dockerfile +# args: +# - MQTT_USERNAME=${MQTT_USERNAME} +# - MQTT_PASSWORD=${MQTT_PASSWORD} +# - NODE_RED_USERNAME=${NODE_RED_USERNAME} +# - NODE_RED_PASSWORD=${NODE_RED_PASSWORD} +# container_name: plm-mqtt +# restart: unless-stopped +# env_file: +# - .env.${NODE_ENV:-development} +# ports: +# - "${MQTT_PORT}:1883" +# - "${MQTT_WSS_PORT}:8883" +# environment: +# - MQTT_USERNAME=${MQTT_USERNAME} +# - MQTT_PASSWORD=${MQTT_PASSWORD} +# - NODE_RED_USERNAME=${NODE_RED_USERNAME} +# - NODE_RED_PASSWORD=${NODE_RED_PASSWORD} +# volumes: +# - ./plm-mqtt/data:/mosquitto/data +# - ./plm-mqtt/config:/mosquitto/config +# - ./plm-mqtt/log:/mosquitto/log +# - ./plm-mqtt/certs:/mosquitto/certs +# # entrypoint: ["/docker-entrypoint.sh"] +# # command: ["/usr/sbin/mosquitto", "-c", "/mosquitto/config/mosquitto.conf"] +# user: mosquitto +# healthcheck: +# test: +# [ +# "CMD-SHELL", +# "mosquitto_sub -h localhost -t '$$SYS/#' -C 1 -u ${MQTT_USERNAME} -P ${MQTT_PASSWORD} || exit 1", +# ] +# interval: 30s +# timeout: 10s +# retries: 3 +# depends_on: +# - plm-postgres +# - plm-timescaledb volumes: - fems_postgres: - fems_redis: - fems_timescaledb: + plm_postgres: + # plm_redis: + # plm_timescaledb: networks: default: diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index fd5dd8e..f8de28d 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -3,7 +3,7 @@ version: "3.8" services: - fems-admin: + plm-admin: build: target: development env_file: @@ -14,11 +14,11 @@ services: - WATCHPACK_POLLING=true # 개발 환경에서는 healthcheck 비활성화 volumes: - - ../../wacefems/uploads:/app/uploads + - ../../waceplm/uploads:/app/uploads # healthcheck: # disable: true - fems-app: + plm-app: build: target: development env_file: @@ -28,9 +28,9 @@ services: - NEXT_WEBPACK_USEPOLLING=1 - WATCHPACK_POLLING=true volumes: - - ../../wacefems/uploads:/app/uploads + - ../../waceplm/uploads:/app/uploads - fems-api: + plm-api: build: target: development env_file: @@ -38,20 +38,20 @@ services: environment: - NODE_ENV=${NODE_ENV:-development} volumes: - - ../../wacefems/uploads:/app/uploads + - ../../waceplm/uploads:/app/uploads - fems-realtime-api: - build: - target: development - env_file: - - .env.${NODE_ENV:-development} - environment: - - NODE_ENV=${NODE_ENV:-development} - volumes: - - ../../wacefems/uploads:/app/uploads +# plm-realtime-api: +# build: +# target: development +# env_file: +# - .env.${NODE_ENV:-development} +# environment: +# - NODE_ENV=${NODE_ENV:-development} +# volumes: +# - ../../waceplm/uploads:/app/uploads -networks: - default: - driver: bridge - internal: - driver: bridge +# networks: +# default: +# driver: bridge +# internal: +# driver: bridge diff --git a/fems-realtime-api/logs/error/.f0712455ac9b956018e7ebc08dc33061795e3736-audit.json b/fems-realtime-api/logs/error/.f0712455ac9b956018e7ebc08dc33061795e3736-audit.json deleted file mode 100644 index efa988b..0000000 --- a/fems-realtime-api/logs/error/.f0712455ac9b956018e7ebc08dc33061795e3736-audit.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "keep": { - "days": true, - "amount": 14 - }, - "auditLog": "/app/logs/error/.f0712455ac9b956018e7ebc08dc33061795e3736-audit.json", - "files": [ - { - "date": 1733746784906, - "name": "/app/logs/error/error-2024-12-09.log", - "hash": "bc01734a47c5ab9a0c8c5579b91d673c834b9da80bf2bec63403efb28be39c35" - }, - { - "date": 1733793585406, - "name": "/app/logs/error/error-2024-12-10.log", - "hash": "bb9f2826cd5ea0ca46e9f22cc120339198f29e37cf5d03b8f53b36a37ac45b22" - }, - { - "date": 1733879841776, - "name": "/app/logs/error/error-2024-12-11.log", - "hash": "39195d6169da96b7fe430ade1b2115a82fb0a51334153ceb54541d28d6f739ee" - }, - { - "date": 1733996836759, - "name": "/app/logs/error/error-2024-12-12.log", - "hash": "4fc1efc550131d80937035aba62464a360b76f1c7050cdc48b28858bf254152e" - }, - { - "date": 1734056145579, - "name": "/app/logs/error/error-2024-12-13.log", - "hash": "cc5bbf7c932c3d774eca30710f1f6e4c27bd563a9b7f09bd7082373375712a72" - }, - { - "date": 1734271478004, - "name": "/app/logs/error/error-2024-12-15.log", - "hash": "cabb58ab38fec604b311d3aaf8fc4d0f0c6f592f473f0900ee851cc7dd523459" - } - ], - "hashType": "sha256" -} \ No newline at end of file diff --git a/fems-realtime-api/logs/info/.17ff23bf9d3be0bd8551fdd86d0d3cca3a97cd90-audit.json b/fems-realtime-api/logs/info/.17ff23bf9d3be0bd8551fdd86d0d3cca3a97cd90-audit.json deleted file mode 100644 index afbb78f..0000000 --- a/fems-realtime-api/logs/info/.17ff23bf9d3be0bd8551fdd86d0d3cca3a97cd90-audit.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "keep": { - "days": true, - "amount": 14 - }, - "auditLog": "/app/logs/info/.17ff23bf9d3be0bd8551fdd86d0d3cca3a97cd90-audit.json", - "files": [ - { - "date": 1733746784908, - "name": "/app/logs/info/info-2024-12-09.log", - "hash": "91a97133406f7c8225f6a4c44c7e5b284852ffe413bfba6b024440a56cef6046" - }, - { - "date": 1733793585410, - "name": "/app/logs/info/info-2024-12-10.log", - "hash": "9adf5bcedf67ed51d1e795830fd55f28eafff19169585bf2109a3e8a1eea2ad4" - }, - { - "date": 1733879841786, - "name": "/app/logs/info/info-2024-12-11.log", - "hash": "e966ad92bddef5e4c0517226872d8bab241ca53eec10b0d6c43a1dd46388bfef" - }, - { - "date": 1733996836771, - "name": "/app/logs/info/info-2024-12-12.log", - "hash": "1c987d2eab99acceb0ee4f85ab1653ed592ec1c5aa9214aaf54230e15830404c" - }, - { - "date": 1734056145586, - "name": "/app/logs/info/info-2024-12-13.log", - "hash": "37d2e4f9e427887b31fa4bba1b2f1e41d1d54514adb78509870cd3f636c47ea1" - }, - { - "date": 1734271478014, - "name": "/app/logs/info/info-2024-12-15.log", - "hash": "bc3f088f0c8b7520435ea7873cf36de592eb566add967608002b63eef96088bd" - } - ], - "hashType": "sha256" -} \ No newline at end of file diff --git a/fems-realtime-api/logs/info/info-2024-11-25.log.gz b/fems-realtime-api/logs/info/info-2024-11-25.log.gz deleted file mode 100644 index d94917b422f8550b8c8805f67d93b6880bdcfcce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2213 zcmX9<3pf*O8+LA_Z;rJgCDoM5oafj_p&Wz*a;u8(!J!Rz_gb8|=hNDt4>D(e;P7KH7v z3^doxMw(q7FvCawio;>18vVwZUj}@o-)z4Sh0KhjR4-yiHVON+lD39b&MQ7H;!Mn& zK&FrSE^x0rvd&d&zl@StJhhr&TEua%?pX5xK&ta>4r*MQ13GSsSK5pKw|pQ4@K+kZ zS5cGz`@w?h0=KAeu1;7DEC32SGtd`<>0hInz?4!~-)#+$N5e1@e3 zCiL=WT5*MS%lpR@u*LaaJ;m62Y9WC5IggC z+bf6=r%KTcZyGa$wSDlB{Y~FJ#l?HAz#_U5L=iMz-EijwCq@-H1YFBm#7J6cmDbv)2{36 zuDn3we*RN6q03V#(nRQ!7y}`+9Df9$9V+neq*|e^9bl8{q4DoN=SIuj&AlPt$32`K z#`l`LT0dr^kQ(|wamH6JU5#d420U}2uI5MRh=_?Aw>*?7YDZ|?qR+x_f2Ky<}ei+I+ z4+sIdNvT>YCNPDR!iZKFvnjzid0{W0I9Ddk2ugR72!*(D?>7fZFIXP|-jeO=%Ny-; z{Y*_IKn9Xe>FeoA=d|C&Awo((hNwvr1GnN^hKA9j)~qxW#^G6D&9T6?BT6!(%FERHc^ww1EMssW?#5Lt(|*{)eOk@ z_?&ZFbG!NFrA(gyf{DCT-kWd2LAUPp4xVBu12WOL8>X7(40Zykygy-9r!D6MgFsZ5 zPvAX7M?6BTGXNAMn>GbysRGcT#zaR)TU1*U5h`B}e+|vrP#skj_xfpB?2ZNrBE`1E z7&)yD6laj-DhVHt{-5ok0w|LCTQ(uX&~H?=KZiqIejgZdtno4B!>owQ$h$cYbi}~Q ziqpgu;O@E*3%E7+3^z9#&G2fOHv2=y%pUlWiPtv#628A_}HSH~3-^t!$SN7!umj#9y=d^0z4JrS1HBUcQ|3@EZ<7JRP zDz|w#Ij_oF!8!(igsw-Ze~5gLhuNVT{9MVjSYOt8kl-h}6;z}sB;QlqaNf8L^stjm zRR1T!+D%Be?kIZsBB!GU|@qd(g0!Ty3&d_N-Qiqg}Jf`tvmsw zJ3a5-22yY5`6`SKeakMfovDgnHvZf_sWwxeR?6*jt9NF$RLyH7W~DJhu>EA4g~s8{SUb<3nlKlc8|?H$97|HVT_snXl|+@Ja=;Y1I`t;`1T2X^rBd$L6*^Xh8fH(f zc}Awnp>H`5HLHS- z5aZ75iuCBn?bX%IrLKS?rJhB_@eMD-9&b$${N~gTh2z)q%ll2W<4)=1VMUa0)AA%i zk~Z4XwVKviqm&t_iIxDrnJn23$&I}ybS>cK5a8xhq!tk@X|MH!5$Zd3~kXK$*scE5+OW0^9*34gtB)TK1>x>0POBJ~{4NUH zVw>o%S`KwyjbKF%Jxj*;j&}r&vL={;;?0|-f*O;fURvtDL+f$7PeE|g2E^MzVJA>&Kz&g7j(TxC&B8O@{ z(dt-Yuw#EwW0AoZTGZeGXu%V*hYE?B2aY;}o5 zNviz`UM)1Q2ht9Lnan6Xd2 z4k(>VUkfTx?21gO!QvXCIxPCzO(g5k5eUyc`?=d##|sUp|w~aTh$!Nl>`i zx(zwv+1*zis09b~8u6}(;ez$ezlxtjvY!CPii_Opuvyi2yuqJC=t$tNGk|C&yCpAm06UTr2Q@(wna^Ir5%n$1gA@%ltB$847p^{IWa zXS(#`?u$rA&s)#U&xdcUlycbDMw7`psLq^L|Mj~Lw3bYH(Z%O^gEJSGNA<9#M3x7l z<~Ft>;HLBu@iOlNbUQ%!K6VS1R2SJM#PFl0q|XR4y7gC%WhMr))xmrNRC|a(Nob`H z&~ygg1HQ{>Q2uPrVHSl>8jvExtlHBuCW=5h6&_~-{RqTi*UTFr*Y=E@Qx!0TZjzkv4sdb00=?BX#={|e!j^o-omX|o=qVQKF8l=oAe zAtDishNMuU{)!~7&5&B_r7OUis)@8T9+uuZs6dEWaRtNKTzzV-UE3`17TUSdIJxlC zgP8t(x#B=x;K~S;6{{24($$oSa}wo9&%Fr5-)RB63%mD?`1QApXpm>y^mBI2c!76TThEKGz;=veNo@+sw+~ zEGu+tp1TuXCSmAcnbX*CoVf>gbma8#41)Y|Vb3Fd)Wc;#}mos@+DqhJ| zO?_+$+i_2`ZnOHHcGuqCpXlb-y2bEhZ#zK2Zg0E*KKtwU$PmIi>`ziq{_|&=?Mtm2 zgq9G(MC)3;jfPMB^>CqmKLivagP z=AFa3P~dy}(gh30D5i$PMR#5onqQ?1QcKnu+WWsMw=9RtbeAlbb)bu|NlhiqAq#RL z)O997?E*BwP-+BlZTt}lgja1rd>$kupkidyXv|Q5^sl2M+658u# zScAqX*)+(MKS-;UshyW5%B-=`2hC9O-ZxJaW}$Hn!L}m+^IQ)oOcUe`z2Ey()VBCH z_*#kC-tstwGW6tLQK^~cS6e%OsP>b-tCbOppf2;wdHN1vS8MIdvyKk26_WQB^D8Xe zTh=UoZ(2wQ5>+iniN>oI#<;)E{;8VJ^tk}?Ukf`$4KC0V8UcEb-5^P4s@9^dd@Kw` zY~S=l1|2G~H2y&Vzl5uS8M5t21&G=NvQ!bX@f`#NSXc}iiM$J~&f7kp=h5dkX8s}( z>U;B;Ih4lp%9Y8Nw^LSt6ymx@J6jTbzrF3gQXw+oOW(Ic@6Hihc%`_;;km{Y zlxL>Z7FZ+O21v%TVJpJ+&_I+(2a*^7E~Ap7yOZi_`cZH6?;=s80C4UwNxCoX5h; + items?: ProcessedMenuItem[]; +} + +interface MenuItemProps { + item: ProcessedMenuItem; + depth: number; + openSections: { [key: string]: boolean }; + onToggle: (id: string) => void; + pathname: string; +} + +const MenuItemComponent: React.FC = ({ + item, + depth, + openSections, + onToggle, + pathname, + }) => { + const hasChildren = item.items && item.items.length > 0; + const isOpen = openSections[item.id]; + const IconComponent = item.icon || Box; + + // 들여쓰기 계산 + const getIndentClass = (depth: number) => { + if (depth === 0) return "px-3"; + if (depth === 1) return "px-3 pl-7"; + return "px-3 pl-11"; + }; + + const itemContent = ( + <> + + {item.title} + {hasChildren && ( +
+ {isOpen + ? + : + } +
+ )} + + ); + + return ( +
+ {item.href ? ( + 0 && "bg-gray-50/50" + ) + )} + > + {itemContent} + + ) : ( + + )} + + {hasChildren && isOpen && ( +
+ {item.items?.map((subItem) => ( + + ))} +
+ )} +
+ ); + }; + +function processMenuItems(responseData: DBApiResponse, role: string): ProcessedMenuItem[] { + if (!responseData?.data?.data) { + return []; + } + + const menuData = responseData.data.data; + + const buildMenuItem = (menu: DBMenuItem): ProcessedMenuItem => { + // 자식 메뉴들을 seq 기준으로 정렬 + const sortedChildren = menu.children + ? [...menu.children].sort((a, b) => { + const seqA = parseInt(a.seq) || 0; + const seqB = parseInt(b.seq) || 0; + return seqA - seqB; + }) + : []; + + // 재귀적으로 자식 메뉴들을 처리 + const processedChildren = sortedChildren.map(buildMenuItem); + + return { + id: menu.id, + title: menu.menu_name_kor, + href: menu.menu_url || undefined, + icon: Box, + ...(processedChildren.length > 0 && { items: processedChildren }), + }; + }; + + // 최상위 메뉴들을 찾고 권한 체크 후 seq로 정렬 + return menuData + .filter(menu => + (menu.menu_type !== "0" || ["super_admin", "company_admin"].includes(role)) && + !menu.parent_id + ) + .sort((a, b) => { + const seqA = parseInt(a.seq) || 0; + const seqB = parseInt(b.seq) || 0; + return seqA - seqB; + }) + .map(buildMenuItem); +} + +export function SideNav() { + const pathname = usePathname(); + const { user } = useAuth(); + const { hasPermission } = usePermissions(); + const { token } = useAuthStore(); + + const { data: dbMenuData } = useQuery({ + queryKey: ["menus"], + queryFn: async () => { + const response = await api.get("/api/v1/app/common/menu"); + return response.data; + }, + enabled: !!token, + }); + + const menuItems = dbMenuData ? processMenuItems(dbMenuData, user?.role || "") : []; + + const [openSections, setOpenSections] = useState<{ [key: string]: boolean }>( + () => { + const findOpenSections = (items: ProcessedMenuItem[], path: string): string[] => { + const openSections: string[] = []; + + const findPath = (items: ProcessedMenuItem[]): boolean => { + for (const item of items) { + if (item.href === path) { + return true; + } + if (item.items) { + if (findPath(item.items)) { + openSections.push(item.id); + return true; + } + } + } + return false; + }; + + findPath(items); + return openSections; + }; + + const openIds = findOpenSections(menuItems, pathname); + return openIds.reduce((acc, id) => ({ ...acc, [id]: true }), {}); + } + ); + + const toggleSection = (id: string) => { + setOpenSections((prev) => ({ + ...prev, + [id]: !prev[id], + })); + }; + + return ( + + ); +} + +export default SideNav; \ No newline at end of file diff --git a/fems-app/src/components/layout/TopNav.tsx b/plm-app/src/components/layout/TopNav.tsx similarity index 100% rename from fems-app/src/components/layout/TopNav.tsx rename to plm-app/src/components/layout/TopNav.tsx diff --git a/fems-app/src/components/ui/FilePreview.tsx b/plm-app/src/components/ui/FilePreview.tsx similarity index 100% rename from fems-app/src/components/ui/FilePreview.tsx rename to plm-app/src/components/ui/FilePreview.tsx diff --git a/fems-app/src/components/ui/alert-dialog.tsx b/plm-app/src/components/ui/alert-dialog.tsx similarity index 100% rename from fems-app/src/components/ui/alert-dialog.tsx rename to plm-app/src/components/ui/alert-dialog.tsx diff --git a/fems-app/src/components/ui/alert.tsx b/plm-app/src/components/ui/alert.tsx similarity index 100% rename from fems-app/src/components/ui/alert.tsx rename to plm-app/src/components/ui/alert.tsx diff --git a/fems-app/src/components/ui/badge.tsx b/plm-app/src/components/ui/badge.tsx similarity index 100% rename from fems-app/src/components/ui/badge.tsx rename to plm-app/src/components/ui/badge.tsx diff --git a/fems-app/src/components/ui/button.tsx b/plm-app/src/components/ui/button.tsx similarity index 100% rename from fems-app/src/components/ui/button.tsx rename to plm-app/src/components/ui/button.tsx diff --git a/fems-app/src/components/ui/calendar.tsx b/plm-app/src/components/ui/calendar.tsx similarity index 100% rename from fems-app/src/components/ui/calendar.tsx rename to plm-app/src/components/ui/calendar.tsx diff --git a/fems-app/src/components/ui/card.tsx b/plm-app/src/components/ui/card.tsx similarity index 100% rename from fems-app/src/components/ui/card.tsx rename to plm-app/src/components/ui/card.tsx diff --git a/fems-app/src/components/ui/checkbox.tsx b/plm-app/src/components/ui/checkbox.tsx similarity index 100% rename from fems-app/src/components/ui/checkbox.tsx rename to plm-app/src/components/ui/checkbox.tsx diff --git a/fems-app/src/components/ui/data-table.tsx b/plm-app/src/components/ui/data-table.tsx similarity index 100% rename from fems-app/src/components/ui/data-table.tsx rename to plm-app/src/components/ui/data-table.tsx diff --git a/fems-app/src/components/ui/date-range-picker.tsx b/plm-app/src/components/ui/date-range-picker.tsx similarity index 100% rename from fems-app/src/components/ui/date-range-picker.tsx rename to plm-app/src/components/ui/date-range-picker.tsx diff --git a/fems-app/src/components/ui/dialog.tsx b/plm-app/src/components/ui/dialog.tsx similarity index 100% rename from fems-app/src/components/ui/dialog.tsx rename to plm-app/src/components/ui/dialog.tsx diff --git a/fems-app/src/components/ui/dropdown-menu.tsx b/plm-app/src/components/ui/dropdown-menu.tsx similarity index 100% rename from fems-app/src/components/ui/dropdown-menu.tsx rename to plm-app/src/components/ui/dropdown-menu.tsx diff --git a/fems-app/src/components/ui/file-uploader.tsx b/plm-app/src/components/ui/file-uploader.tsx similarity index 100% rename from fems-app/src/components/ui/file-uploader.tsx rename to plm-app/src/components/ui/file-uploader.tsx diff --git a/fems-app/src/components/ui/form.tsx b/plm-app/src/components/ui/form.tsx similarity index 100% rename from fems-app/src/components/ui/form.tsx rename to plm-app/src/components/ui/form.tsx diff --git a/fems-app/src/components/ui/input.tsx b/plm-app/src/components/ui/input.tsx similarity index 100% rename from fems-app/src/components/ui/input.tsx rename to plm-app/src/components/ui/input.tsx diff --git a/fems-app/src/components/ui/label.tsx b/plm-app/src/components/ui/label.tsx similarity index 100% rename from fems-app/src/components/ui/label.tsx rename to plm-app/src/components/ui/label.tsx diff --git a/fems-app/src/components/ui/pagination.tsx b/plm-app/src/components/ui/pagination.tsx similarity index 100% rename from fems-app/src/components/ui/pagination.tsx rename to plm-app/src/components/ui/pagination.tsx diff --git a/fems-app/src/components/ui/popover.tsx b/plm-app/src/components/ui/popover.tsx similarity index 100% rename from fems-app/src/components/ui/popover.tsx rename to plm-app/src/components/ui/popover.tsx diff --git a/fems-app/src/components/ui/select.tsx b/plm-app/src/components/ui/select.tsx similarity index 100% rename from fems-app/src/components/ui/select.tsx rename to plm-app/src/components/ui/select.tsx diff --git a/fems-app/src/components/ui/separator.tsx b/plm-app/src/components/ui/separator.tsx similarity index 100% rename from fems-app/src/components/ui/separator.tsx rename to plm-app/src/components/ui/separator.tsx diff --git a/fems-app/src/components/ui/skeleton.tsx b/plm-app/src/components/ui/skeleton.tsx similarity index 100% rename from fems-app/src/components/ui/skeleton.tsx rename to plm-app/src/components/ui/skeleton.tsx diff --git a/fems-app/src/components/ui/switch.tsx b/plm-app/src/components/ui/switch.tsx similarity index 100% rename from fems-app/src/components/ui/switch.tsx rename to plm-app/src/components/ui/switch.tsx diff --git a/fems-app/src/components/ui/table.tsx b/plm-app/src/components/ui/table.tsx similarity index 100% rename from fems-app/src/components/ui/table.tsx rename to plm-app/src/components/ui/table.tsx diff --git a/fems-app/src/components/ui/tabs.tsx b/plm-app/src/components/ui/tabs.tsx similarity index 100% rename from fems-app/src/components/ui/tabs.tsx rename to plm-app/src/components/ui/tabs.tsx diff --git a/fems-app/src/components/ui/textarea.tsx b/plm-app/src/components/ui/textarea.tsx similarity index 100% rename from fems-app/src/components/ui/textarea.tsx rename to plm-app/src/components/ui/textarea.tsx diff --git a/fems-app/src/components/ui/toast.tsx b/plm-app/src/components/ui/toast.tsx similarity index 100% rename from fems-app/src/components/ui/toast.tsx rename to plm-app/src/components/ui/toast.tsx diff --git a/fems-app/src/components/ui/toaster.tsx b/plm-app/src/components/ui/toaster.tsx similarity index 100% rename from fems-app/src/components/ui/toaster.tsx rename to plm-app/src/components/ui/toaster.tsx diff --git a/fems-app/src/config/permissions.ts b/plm-app/src/config/permissions.ts similarity index 100% rename from fems-app/src/config/permissions.ts rename to plm-app/src/config/permissions.ts diff --git a/fems-app/src/hooks/use-toast.ts b/plm-app/src/hooks/use-toast.ts similarity index 100% rename from fems-app/src/hooks/use-toast.ts rename to plm-app/src/hooks/use-toast.ts diff --git a/fems-app/src/hooks/useAuth.ts b/plm-app/src/hooks/useAuth.ts similarity index 100% rename from fems-app/src/hooks/useAuth.ts rename to plm-app/src/hooks/useAuth.ts diff --git a/fems-app/src/hooks/usePermissions.ts b/plm-app/src/hooks/usePermissions.ts similarity index 100% rename from fems-app/src/hooks/usePermissions.ts rename to plm-app/src/hooks/usePermissions.ts diff --git a/fems-app/src/lib/api.ts b/plm-app/src/lib/api.ts similarity index 100% rename from fems-app/src/lib/api.ts rename to plm-app/src/lib/api.ts diff --git a/fems-app/src/lib/jwt.ts b/plm-app/src/lib/jwt.ts similarity index 100% rename from fems-app/src/lib/jwt.ts rename to plm-app/src/lib/jwt.ts diff --git a/fems-app/src/lib/utils.ts b/plm-app/src/lib/utils.ts similarity index 100% rename from fems-app/src/lib/utils.ts rename to plm-app/src/lib/utils.ts diff --git a/fems-app/src/middleware.tsx b/plm-app/src/middleware.tsx similarity index 100% rename from fems-app/src/middleware.tsx rename to plm-app/src/middleware.tsx diff --git a/fems-app/src/providers.tsx b/plm-app/src/providers.tsx similarity index 100% rename from fems-app/src/providers.tsx rename to plm-app/src/providers.tsx diff --git a/fems-app/src/stores/auth.ts b/plm-app/src/stores/auth.ts similarity index 100% rename from fems-app/src/stores/auth.ts rename to plm-app/src/stores/auth.ts diff --git a/fems-app/src/types/auth.ts b/plm-app/src/types/auth.ts similarity index 100% rename from fems-app/src/types/auth.ts rename to plm-app/src/types/auth.ts diff --git a/fems-app/src/types/company.ts b/plm-app/src/types/company.ts similarity index 100% rename from fems-app/src/types/company.ts rename to plm-app/src/types/company.ts diff --git a/fems-app/src/types/dashboard.ts b/plm-app/src/types/dashboard.ts similarity index 100% rename from fems-app/src/types/dashboard.ts rename to plm-app/src/types/dashboard.ts diff --git a/fems-app/src/types/department.ts b/plm-app/src/types/department.ts similarity index 100% rename from fems-app/src/types/department.ts rename to plm-app/src/types/department.ts diff --git a/fems-app/src/types/device.ts b/plm-app/src/types/device.ts similarity index 100% rename from fems-app/src/types/device.ts rename to plm-app/src/types/device.ts diff --git a/fems-app/src/types/equipment.ts b/plm-app/src/types/equipment.ts similarity index 100% rename from fems-app/src/types/equipment.ts rename to plm-app/src/types/equipment.ts diff --git a/fems-app/src/types/index.ts b/plm-app/src/types/index.ts similarity index 100% rename from fems-app/src/types/index.ts rename to plm-app/src/types/index.ts diff --git a/fems-app/src/types/maintenance.ts b/plm-app/src/types/maintenance.ts similarity index 100% rename from fems-app/src/types/maintenance.ts rename to plm-app/src/types/maintenance.ts diff --git a/fems-app/src/types/menu.ts b/plm-app/src/types/menu.ts similarity index 100% rename from fems-app/src/types/menu.ts rename to plm-app/src/types/menu.ts diff --git a/fems-app/src/types/user.ts b/plm-app/src/types/user.ts similarity index 100% rename from fems-app/src/types/user.ts rename to plm-app/src/types/user.ts diff --git a/fems-app/tailwind.config.ts b/plm-app/tailwind.config.ts similarity index 100% rename from fems-app/tailwind.config.ts rename to plm-app/tailwind.config.ts diff --git a/fems-app/tsconfig.json b/plm-app/tsconfig.json similarity index 100% rename from fems-app/tsconfig.json rename to plm-app/tsconfig.json diff --git a/fems-app/yarn.lock b/plm-app/yarn.lock similarity index 100% rename from fems-app/yarn.lock rename to plm-app/yarn.lock diff --git a/fems-mqtt/Dockerfile b/plm-mqtt/Dockerfile similarity index 100% rename from fems-mqtt/Dockerfile rename to plm-mqtt/Dockerfile diff --git a/fems-mqtt/config/acl b/plm-mqtt/config/acl similarity index 100% rename from fems-mqtt/config/acl rename to plm-mqtt/config/acl diff --git a/fems-mqtt/config/mosquitto.conf b/plm-mqtt/config/mosquitto.conf similarity index 100% rename from fems-mqtt/config/mosquitto.conf rename to plm-mqtt/config/mosquitto.conf diff --git a/fems-mqtt/data/mosquitto.db b/plm-mqtt/data/mosquitto.db similarity index 100% rename from fems-mqtt/data/mosquitto.db rename to plm-mqtt/data/mosquitto.db diff --git a/fems-mqtt/data/passwd b/plm-mqtt/data/passwd similarity index 100% rename from fems-mqtt/data/passwd rename to plm-mqtt/data/passwd diff --git a/fems-mqtt/log/mosquitto.log b/plm-mqtt/log/mosquitto.log old mode 100755 new mode 100644 similarity index 100% rename from fems-mqtt/log/mosquitto.log rename to plm-mqtt/log/mosquitto.log diff --git a/fems-postgres/pg_hba.conf b/plm-postgres/pg_hba.conf similarity index 100% rename from fems-postgres/pg_hba.conf rename to plm-postgres/pg_hba.conf diff --git a/fems-postgres/postgresql.conf b/plm-postgres/postgresql.conf similarity index 100% rename from fems-postgres/postgresql.conf rename to plm-postgres/postgresql.conf diff --git a/fems-realtime-api/.gitignore b/plm-realtime-api/.gitignore similarity index 100% rename from fems-realtime-api/.gitignore rename to plm-realtime-api/.gitignore diff --git a/fems-realtime-api/Dockerfile b/plm-realtime-api/Dockerfile similarity index 100% rename from fems-realtime-api/Dockerfile rename to plm-realtime-api/Dockerfile diff --git a/fems-realtime-api/package.json b/plm-realtime-api/package.json similarity index 100% rename from fems-realtime-api/package.json rename to plm-realtime-api/package.json diff --git a/fems-realtime-api/src/app.js b/plm-realtime-api/src/app.js similarity index 100% rename from fems-realtime-api/src/app.js rename to plm-realtime-api/src/app.js diff --git a/fems-realtime-api/src/config/config.js b/plm-realtime-api/src/config/config.js similarity index 100% rename from fems-realtime-api/src/config/config.js rename to plm-realtime-api/src/config/config.js diff --git a/fems-realtime-api/src/config/database.js b/plm-realtime-api/src/config/database.js similarity index 100% rename from fems-realtime-api/src/config/database.js rename to plm-realtime-api/src/config/database.js diff --git a/fems-realtime-api/src/config/logger.js b/plm-realtime-api/src/config/logger.js similarity index 100% rename from fems-realtime-api/src/config/logger.js rename to plm-realtime-api/src/config/logger.js diff --git a/fems-realtime-api/src/controllers/data.controller.js b/plm-realtime-api/src/controllers/data.controller.js similarity index 100% rename from fems-realtime-api/src/controllers/data.controller.js rename to plm-realtime-api/src/controllers/data.controller.js diff --git a/fems-realtime-api/src/middleware/apiKey.middleware.js b/plm-realtime-api/src/middleware/apiKey.middleware.js similarity index 100% rename from fems-realtime-api/src/middleware/apiKey.middleware.js rename to plm-realtime-api/src/middleware/apiKey.middleware.js diff --git a/fems-realtime-api/src/models/SensorData.js b/plm-realtime-api/src/models/SensorData.js similarity index 100% rename from fems-realtime-api/src/models/SensorData.js rename to plm-realtime-api/src/models/SensorData.js diff --git a/fems-realtime-api/src/services/mainBackend.service.js b/plm-realtime-api/src/services/mainBackend.service.js similarity index 100% rename from fems-realtime-api/src/services/mainBackend.service.js rename to plm-realtime-api/src/services/mainBackend.service.js diff --git a/fems-realtime-api/src/services/mqtt.service.js b/plm-realtime-api/src/services/mqtt.service.js similarity index 100% rename from fems-realtime-api/src/services/mqtt.service.js rename to plm-realtime-api/src/services/mqtt.service.js diff --git a/fems-realtime-api/yarn.lock b/plm-realtime-api/yarn.lock similarity index 100% rename from fems-realtime-api/yarn.lock rename to plm-realtime-api/yarn.lock diff --git a/fems-timescaledb/Dockerfile b/plm-timescaledb/Dockerfile similarity index 100% rename from fems-timescaledb/Dockerfile rename to plm-timescaledb/Dockerfile diff --git a/fems-timescaledb/init-scripts/00-init-user.sh b/plm-timescaledb/init-scripts/00-init-user.sh old mode 100755 new mode 100644 similarity index 100% rename from fems-timescaledb/init-scripts/00-init-user.sh rename to plm-timescaledb/init-scripts/00-init-user.sh diff --git a/fems-timescaledb/pg_hba.conf b/plm-timescaledb/pg_hba.conf similarity index 100% rename from fems-timescaledb/pg_hba.conf rename to plm-timescaledb/pg_hba.conf diff --git a/fems-timescaledb/postgresql.conf b/plm-timescaledb/postgresql.conf similarity index 100% rename from fems-timescaledb/postgresql.conf rename to plm-timescaledb/postgresql.conf diff --git a/fems-timescaledb/yarn.lock b/plm-timescaledb/yarn.lock similarity index 100% rename from fems-timescaledb/yarn.lock rename to plm-timescaledb/yarn.lock diff --git a/windows_start-dev-full.bat b/windows_start-dev-full.bat index ac20788..963698e 100644 --- a/windows_start-dev-full.bat +++ b/windows_start-dev-full.bat @@ -1,5 +1,5 @@ :: Windows용 BAT 스크립트 -echo Starting FEMS Development Environment... +echo Starting plm Development Environment... :: 환경 변수 파일 로드 if exist .env.development (