From dce09cbd234ddae7dc418a7cd4e97d68f6ae25fb Mon Sep 17 00:00:00 2001 From: alireza Date: Thu, 18 Jun 2026 08:47:00 +0330 Subject: [PATCH] Refactor authentication handling across PostDetail, ProfilePage, Radar, and RadarPost components - Replaced localStorage-based authentication checks with context-based checks using useAuth. - Updated login handling in PostDetail to navigate to the login page instead of setting localStorage directly. - Simplified ProfilePage to check for member presence instead of token. - Removed token dependency from InfoTab, PasswordTab, and ContentTab components. - Adjusted Radar and RadarPost components to utilize context for authentication state. --- .dockerignore | 6 +- .gitignore | 40 +- .../page-2026-06-17T09-01-35-435Z.yml | 14 + Dockerfile | 10 +- liara-deploy.md | 229 ++++ liara.json | 4 + panel/.env.example | 22 +- panel/.liaraignore | 9 + panel/db.js | 263 ++-- panel/insert-events.mjs | 18 +- panel/insert-factory.mjs | 18 +- panel/liara.json | 4 + panel/package-lock.json | 1177 +++++++++++------ panel/package.json | 4 +- panel/public/app.js | 615 ++++++--- panel/public/style.css | 89 +- panel/scraper.js | 4 +- panel/seed-content.js | 858 +++--------- panel/seed.js | 11 +- panel/server.js | 708 ++++++---- panel/update-radar-images.mjs | 13 +- public/hero-bg.mp4 | 4 +- public/icons/Design.svg | 3 + public/icons/Group 1.svg | 62 + public/icons/Line 5.svg | 3 + public/icons/Line 6.svg | 3 + public/icons/Line 7.svg | 3 + public/icons/Line 8.svg | 3 + public/icons/Line 9.svg | 3 + public/icons/arrow-left-01-sharp.svg | 3 + public/icons/chevron/down-1.svg | 3 + public/icons/chevron/down.svg | 3 + public/icons/header/Group 1-1.svg | 62 + public/icons/header/Group.svg | 4 + public/icons/header/Vector.svg | 3 + public/icons/header/vuesax/outline/sms.svg | 4 + public/icons/vuesax/linear/arrow-down.svg | 3 + public/icons/vuesax/linear/calendar-tick.svg | 11 + public/icons/vuesax/linear/calendar.svg | 12 + public/icons/vuesax/linear/export.svg | 5 + public/icons/vuesax/linear/location.svg | 4 + public/icons/vuesax/outline/buildings.svg | 9 + public/icons/vuesax/outline/search-normal.svg | 4 + public/icons/vuesax/outline/security-safe.svg | 5 + public/world-map.webp | Bin 0 -> 384032 bytes public/اندیشکده فولاد آینده_icon.zip | Bin 0 -> 29001 bytes src/app/layout/Footer.tsx | 3 +- src/components/ui/world-map.tsx | 2 + src/content/factoryReports.ts | 55 +- src/content/posts.ts | 41 + src/context/AuthContext.tsx | 40 +- src/data/media.ts | 4 + src/main.tsx | 3 +- src/pages/About/About.tsx | 6 +- src/pages/AtAGlance/AtAGlance.tsx | 4 +- src/pages/Events/Events.tsx | 497 ++++++- src/pages/Experts/Experts.tsx | 12 +- src/pages/Home/sections/HeroSection.tsx | 136 +- src/pages/Home/sections/SpreadFeatures.tsx | 392 +----- .../Home/sections/VideocastPodcastSection.tsx | 260 ++-- src/pages/Podcast/Podcast.tsx | 1057 +++++++++++---- src/pages/PostDetail/PostDetail.tsx | 16 +- src/pages/Profile/ProfilePage.tsx | 35 +- src/pages/Radar/Radar.tsx | 4 +- src/pages/RadarPost/RadarPost.tsx | 14 +- 65 files changed, 4200 insertions(+), 2716 deletions(-) create mode 100644 .playwright-mcp/page-2026-06-17T09-01-35-435Z.yml create mode 100644 liara-deploy.md create mode 100644 liara.json create mode 100644 panel/.liaraignore create mode 100644 panel/liara.json create mode 100644 public/icons/Design.svg create mode 100644 public/icons/Group 1.svg create mode 100644 public/icons/Line 5.svg create mode 100644 public/icons/Line 6.svg create mode 100644 public/icons/Line 7.svg create mode 100644 public/icons/Line 8.svg create mode 100644 public/icons/Line 9.svg create mode 100644 public/icons/arrow-left-01-sharp.svg create mode 100644 public/icons/chevron/down-1.svg create mode 100644 public/icons/chevron/down.svg create mode 100644 public/icons/header/Group 1-1.svg create mode 100644 public/icons/header/Group.svg create mode 100644 public/icons/header/Vector.svg create mode 100644 public/icons/header/vuesax/outline/sms.svg create mode 100644 public/icons/vuesax/linear/arrow-down.svg create mode 100644 public/icons/vuesax/linear/calendar-tick.svg create mode 100644 public/icons/vuesax/linear/calendar.svg create mode 100644 public/icons/vuesax/linear/export.svg create mode 100644 public/icons/vuesax/linear/location.svg create mode 100644 public/icons/vuesax/outline/buildings.svg create mode 100644 public/icons/vuesax/outline/search-normal.svg create mode 100644 public/icons/vuesax/outline/security-safe.svg create mode 100644 public/world-map.webp create mode 100644 public/اندیشکده فولاد آینده_icon.zip diff --git a/.dockerignore b/.dockerignore index 6943949..9b2ab89 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,6 +9,9 @@ dist-ssr build .cache +# The admin panel is a separate app — not part of the frontend build +panel + # Dependencies (reinstalled in the image) node_modules npm-debug.log* @@ -29,8 +32,7 @@ Thumbs.db .env.* !.env.example -# Docker -Dockerfile +# Docker — keep Dockerfile in the context (Liara builds from it) docker-compose.yml .dockerignore diff --git a/.gitignore b/.gitignore index 88963d2..fa974b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -<<<<<<< HEAD # Logs logs *.log @@ -13,6 +12,14 @@ dist dist-ssr *.local +# Secrets / env — never commit (keep the example template) +.env +.env.* +!.env.example +*.pem +*.key +secrets/ + # Editor directories and files .vscode/* !.vscode/extensions.json @@ -28,34 +35,3 @@ dist-ssr /[0-9]*.png brand_pages/ /موکاپ*.jpg -======= -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? -# Root-level temp images (not website assets) -/[0-9]*.jpg -/[0-9]*.png -brand_pages/ -/موکاپ*.jpg ->>>>>>> space/main diff --git a/.playwright-mcp/page-2026-06-17T09-01-35-435Z.yml b/.playwright-mcp/page-2026-06-17T09-01-35-435Z.yml new file mode 100644 index 0000000..70a42a4 --- /dev/null +++ b/.playwright-mcp/page-2026-06-17T09-01-35-435Z.yml @@ -0,0 +1,14 @@ +- iframe [ref=e2]: + - generic [active] [ref=f3e1]: + - generic [ref=f3e5]: "502" + - generic [ref=f3e6]: + - list [ref=f3e7]: + - listitem [ref=f3e8]: شاید پورتی که برنامه‌ی شما به آن listen می‌کند را اشتباه وارد کرده‌اید. + - listitem [ref=f3e9]: لازم است که برنامه‌ی شما حتما روی آدرس 0.0.0.0 اجرا شود. + - listitem [ref=f3e10]: از صفحه‌ی برنامک‌ها، وضعیت آخرین استقرار خود را بررسی کنید. + - listitem [ref=f3e11]: و یا ممکن است هیچ مشکلی وجود نداشته باشد و صرفا باید کمی صبر کنید تا سرویس‌تان آماده شود. + - link "مشاهده‌ی لاگ‌ها" [ref=f3e13] [cursor=pointer]: + - /url: https://console.liara.ir/apps + - contentinfo [ref=f3e14]: + - link [ref=f3e15] [cursor=pointer]: + - /url: https://liara.ir \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 471360c..035ac0f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ # ===================================================================== # Stage 1 — Build the Vite/React app # ===================================================================== -FROM node:22-alpine AS builder +FROM docker-mirror.liara.ir/library/node:22-alpine AS builder WORKDIR /app @@ -13,7 +13,11 @@ WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --no-audit --no-fund --legacy-peer-deps -# Build the static bundle +# Build the static bundle. +# VITE_PANEL_API is inlined into the bundle at build time (Vite reads it during +# `npm run build`), so it must be present as an env var here — not at runtime. +ARG VITE_PANEL_API=https://cms-steelforesight.liara.run +ENV VITE_PANEL_API=$VITE_PANEL_API COPY . . RUN npm run build @@ -23,7 +27,7 @@ RUN npm run build # ===================================================================== # nginx-unprivileged runs as uid 101 by default — required by HF Spaces, # which forbids running as root. -FROM nginxinc/nginx-unprivileged:alpine AS runner +FROM docker-mirror.liara.ir/nginxinc/nginx-unprivileged:alpine AS runner # SPA-aware server config that listens on 7860 (HF Spaces default port) COPY --chown=nginx:nginx nginx.conf /etc/nginx/conf.d/default.conf diff --git a/liara-deploy.md b/liara-deploy.md new file mode 100644 index 0000000..5ada0d1 --- /dev/null +++ b/liara-deploy.md @@ -0,0 +1,229 @@ +# Liara Deployment Playbook (عمومی) + +راهنمای عمومی دیپلوی روی Liara — جمع‌بندی مشکلات رایج و راه‌حل‌هاشون. +برای **هر پروژه‌ای** قابل استفاده‌ست. جای `<...>`ها مقدار پروژه‌ی خودت رو بذار. + +> قرارداد نام‌گذاری در این سند: +> `` = اسم اپ، `` = اپ فرانت، `` = اپ بک‌اند/پنل، +> `` = هاست داخلی دیتابیس، `` = API token لیارا، +> `` = پورتی که اپ روش گوش می‌ده (Docker static: معمولاً 7860، Node: 3000). + +--- + +## ۱) CLI — احراز هویت + +**مشکل:** دستورها با `Authentication failed` رد می‌شن، حتی بعد از `liara login` (توکن بین شل‌ها/محیط‌ها share نمی‌شه). + +**راه‌حل:** روی **هر** دستور `--api-token` بده: +```bash +liara deploy --app --api-token "" +``` +توکن از داشبورد Liara → API. + +--- + +## ۲) `liara deploy` روی prompt پورت هنگ می‌کنه + +**مشکل:** دیپلوی روی `Enter the port your app listens to:` گیر می‌کنه و چیزی به Liara نمی‌رسه (مخصوصاً در حالت غیرتعاملی). + +**راه‌حل:** پورت رو صریح بده — هم فلگ، هم `liara.json`: +```bash +liara deploy --app --port ... +``` +```json +{ "platform": "docker", "port": } +``` +اپ هم باید روی `process.env.PORT` گوش بده (Liara اون رو inject می‌کنه). + +--- + +## ۳) `Dockerfile cannot be empty` + +**علت:** `.dockerignore` خود `Dockerfile` رو exclude کرده. + +**راه‌حل:** `Dockerfile` رو از `.dockerignore` **بردار** — Liara باید Dockerfile رو توی آرشیو ببینه. + +--- + +## ۴) Docker Hub از ایران بلاکه (مهم‌ترین برای Docker) + +**مشکل:** `FROM ` با `Get "https://registry-1.docker.io/...": Client.Timeout exceeded` تایم‌اوت می‌خوره. + +**راه‌حل:** image پایه رو از **میرور Liara** بکش: +```dockerfile +# ایمیج رسمی (node, nginx, postgres, python, ...): +FROM docker-mirror.liara.ir/library/: +# ایمیج یوزر/سازمان: +FROM docker-mirror.liara.ir//: +``` + +میرورهای دیگر Liara (در صورت نیاز داخل build): +| نوع | میرور | +|---|---| +| Docker Hub | `docker-mirror.liara.ir` | +| Alpine (apk) | `https://linux-mirror.liara.ir/repository/alpine/` | +| npm | `https://package-mirror.liara.ir/repository/npm/` | + +> `npm ci`/`pip install` معمولاً از ایران بدون میرور کار می‌کنن؛ فقط Docker Hub همیشه مشکل‌سازه. +> اگه داخل build `apk add` داری، میرور apk رو هم ست کن. + +--- + +## ۵) لوکیشن build + +**نکته‌ی کلیدی:** **لوکیشن build ≠ لوکیشن میزبانی.** اپ همیشه روی منطقه‌ی خودش سرو می‌شه؛ `--build-location` فقط می‌گه image کجا کامپایل شه. + +- build ایران + میرورهای بالا → سریع و بدون تحریم: + ```bash + liara deploy --app --build-location iran ... + ``` +- اگه از میرور استفاده نمی‌کنی، build ایران به Docker Hub نمی‌رسه (از مورد ۴ استفاده کن). + +--- + +## ۶) متغیرهای build-time در فرانت (Vite / CRA / Next static) + +**مشکل:** متغیر API URL رو به‌عنوان env روی اپ ست کردی ولی فرانت بهش وصل نشد. + +**علت:** باندلرها متغیرهای `VITE_*` / `REACT_APP_*` / `NEXT_PUBLIC_*` رو **موقع build داخل باندل می‌نویسن** — env runtime روی کانتینر استاتیک بی‌اثره. + +**راه‌حل:** توی Dockerfile قبل از build: +```dockerfile +ARG VITE_API_URL=https://.liara.run +ENV VITE_API_URL=$VITE_API_URL +RUN npm run build +``` + +--- + +## ۷) اتصال اپ به دیتابیس (Private Network) + +**مشکل‌ها:** +- آدرس داخلی دیتابیس → `getaddrinfo ENOTFOUND `. +- آدرس عمومی دیتابیس از داخل اپ Liara → `ECONNREFUSED`. + +**علت:** اپ‌های Liara به endpoint عمومی DB وصل نمی‌شن؛ و هاست داخلی فقط وقتی resolve می‌شه که اپ و DB **روی یک Private Network مشترک** باشن. + +**راه‌حل:** +1. هم دیتابیس هم اپ رو به **یک Private Network** وصل کن. +2. **connection string کاملِ** داخلی (نه فقط host:port): + ``` + DATABASE_URL=postgresql://:@:5432/ + ``` +3. روی شبکه‌ی داخلی TLS لازم نیست (برعکس endpoint عمومی که TLS می‌خواد). + +--- + +## ۸) اپ موقع بوت کرش می‌کنه چون env ست نیست + +**نشانه:** کانتینر `unhealthy` / `exit 255` و لاگ مثل `FATAL: is not set`. + +**راه‌حل:** env های حیاتی رو **قبل** از انتظارِ سالم‌بودن ست کن. تغییر env خودش ری‌استارت می‌کنه. +ست با CLI (به‌جای داشبورد): +```bash +liara env:set "KEY=VALUE" "KEY2=VALUE2" --app --force --api-token "" +``` +> اگه کد بدون یه env حیاتی `process.exit` می‌کنه، تا ست نشه اصلاً بالا نمیاد. + +--- + +## ۹) فایل‌سیستم Ephemeral + +**مشکل‌ها:** دیتابیس فایلی (SQLite) و پوشه‌ی آپلود با هر ری‌دیپلوی پاک می‌شن؛ نوشتن/`mkdir` روی مسیرهای read-only کرش می‌کنه. + +**راه‌حل:** +- دیتای دائمی → **دیتابیس مدیریت‌شده**. +- فایل/مدیا → **Object Storage** (مورد ۱۰). +- اگه واقعاً دیسک لازمه → یه **Disk** بساز و mount کن؛ مسیر رو **env-based** کن. +- هر نوشتن روی دیسک رو دفاعی بنویس که موقع بوت کرش نکنه: + ```js + const dir = process.env.UPLOADS_DIR || path.join(__dirname, 'uploads'); + try { if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); } catch {} + ``` + +--- + +## ۱۰) Object Storage (S3) برای مدیا + +- S3-compatible؛ endpoint مثل `storage.iran.liara.site` + bucket + access key + secret key. +- در کد: SDK اس‌تری (`@aws-sdk/client-s3`)، `forcePathStyle: true`، endpoint = `https://`. +- URL عمومی فایل: `https://./`. +- **باکت رو public کن** وگرنه فایل‌ها 403 می‌شن. + +--- + +## ۱۱) پلتفرم اپ ثابته + +نمی‌شه پلتفرم یه اپ رو عوض کرد (Node↔Docker↔Static). اگه اشتباه ساختی، **پاک و با پلتفرم درست دوباره بساز** (env و اتصال شبکه‌ی خصوصی رو هم از نو ست کن). + +--- + +## ۱۲) CORS + +**مشکل:** بک‌اند درخواست‌ها رو با `Not allowed by CORS` رد می‌کنه (حتی origin خودش). + +**راه‌حل:** allow-list رو شامل **دامنه‌ی خود اپ + دامنه‌ی فرانت** کن: +``` +ALLOWED_ORIGINS=https://.liara.run,https://.liara.run +``` + +--- + +## ۱۳) Seed / یوزر ادمین + +دیتابیس تازه خالیه → لاگین «رمز اشتباه». seed رو از Console اپ بزن. اگه اسکریپت seed یوزر موجود رو رد می‌کنه و رمز عوض نمی‌شه، از **upsert** استفاده کن. +نکته‌ی مهم برای اسکریپت‌های seed: آدرس و رمز رو **env-based** کن تا هم لوکال هم روی Liara کار کنه: +```js +const BASE = process.env.SEED_BASE || `http://localhost:${process.env.PORT || 3000}`; +``` +> روش بدون TLS-dependency: اسکریپت seed که فقط `fetch` می‌زنه رو می‌تونی از ماشین خودت با `SEED_BASE=https://.liara.run` اجرا کنی. + +--- + +## ۱۴) همگام‌سازی lockfile + +بعد از هر تغییر وابستگی‌ها، **لوکال `npm install`** بزن تا `package-lock.json` به‌روز شه، بعد دیپلوی — وگرنه `npm ci` روی Liara به‌خاطر mismatch خطا می‌ده. `node_modules` رو پوش نکن (`.liaraignore` / `.dockerignore`). + +--- + +## ۱۵) لاگ و exit code گمراه‌کننده + +- `liara deploy` گاهی با `exit code 2` تموم می‌شه ولی واقعاً **موفق** بوده (خطا فقط مرحله‌ی خوندن لاگ بعد از دیپلوی). +- `liara logs` گاهی لاگ **کش‌شده** می‌ده. + +**راه‌حل:** وضعیت واقعی رو از خروجی کامل دیپلوی (`√ Release created` / `Deployment finished successfully`) و یه **درخواست HTTP واقعی به دامنه** بگیر؛ به exit code تنها اعتماد نکن. + +--- + +## فایل‌های پایه‌ی هر اپ + +`liara.json` (Docker): +```json +{ "platform": "docker", "port": } +``` +`liara.json` (Node): +```json +{ "platform": "node" } +``` +`.liaraignore`: +``` +node_modules +.env +*.db +uploads +``` + +--- + +## چک‌لیست دیپلوی (ترتیب درست) + +1. **دیتابیس** بساز → Private Network روشن. +2. **اپ بک‌اند** بساز → به همون Private Network وصلش کن. +3. env های بک‌اند رو ست کن (`DATABASE_URL` داخلیِ کامل، سکرت‌ها، `ALLOWED_ORIGINS`، کلیدهای Object Storage، `NODE_ENV=production`). +4. `package-lock.json` رو لوکال sync کن. +5. (Docker) Dockerfile: میرور `docker-mirror.liara.ir` + `ARG` برای متغیرهای build-time. `.dockerignore` نباید `Dockerfile` رو حذف کنه. +6. `liara deploy --app --port --build-location iran --api-token ""`. +7. سلامت رو با درخواست HTTP به دامنه چک کن (نه فقط exit code). +8. **seed محتوا/ادمین** (قبل از دیپلوی فرانت، تا سایت خالی نباشه). +9. باکت Object Storage رو public کن. +10. **فرانت** رو با متغیر build-time = دامنه‌ی بک‌اند دیپلوی کن؛ `ALLOWED_ORIGINS` بک‌اند رو شامل دامنه‌ی فرانت کن. diff --git a/liara.json b/liara.json new file mode 100644 index 0000000..a6b6e7a --- /dev/null +++ b/liara.json @@ -0,0 +1,4 @@ +{ + "platform": "docker", + "port": 7860 +} diff --git a/panel/.env.example b/panel/.env.example index fd1eca5..59819e0 100644 --- a/panel/.env.example +++ b/panel/.env.example @@ -1,5 +1,12 @@ # Copy this file to ".env" and fill in real values. +# PostgreSQL connection — REQUIRED. Copy from the Liara database dashboard. +# Format: postgresql://root:@.liara.cloud:/ +DATABASE_URL=postgresql://root:password@localhost:5432/andishkade +# Set to "disable" only when connecting over Liara's internal private network (no TLS). +# Leave unset (TLS on) for the public connection string. +DATABASE_SSL= + # JWT signing secret — REQUIRED. Must be 32+ random chars. Never commit the real value. # Generate: node -e "console.log(require('crypto').randomBytes(48).toString('hex'))" JWT_SECRET=replace-with-64-random-hex-chars @@ -17,9 +24,20 @@ PUBLIC_ORIGIN=http://localhost:3001 # Comma-separated origins allowed to call the API (your frontend URL) ALLOWED_ORIGINS=http://localhost:5173 -# Contact form recipients (comma-separated) -MAIL_TO=alirezaameria2@gmail.com, mtdemne@gmail.com +# Contact form recipients (comma-separated) — REQUIRED for the contact form to send +MAIL_TO=recipient@example.com, second@example.com # Gmail credentials for contact form emails MAIL_USER=your-gmail@gmail.com MAIL_PASS=your-gmail-app-password + +# Local uploads dir — on Liara point this at a mounted Disk (e.g. /var/lib/uploads). +# Ignored when object storage (below) is configured. +UPLOADS_DIR= + +# Object storage (Liara / S3-compatible). When all four are set, image + video +# uploads go to the bucket instead of local disk. Bucket must allow public reads. +LIARA_ENDPOINT=storage.iran.liara.site +LIARA_BUCKET=your-bucket-name +LIARA_ACCESS_KEY=your-access-key +LIARA_SECRET_KEY=your-secret-key diff --git a/panel/.liaraignore b/panel/.liaraignore new file mode 100644 index 0000000..ca4002e --- /dev/null +++ b/panel/.liaraignore @@ -0,0 +1,9 @@ +node_modules +.env +*.db +*.db-journal +*.db-wal +*.db-shm +uploads +.DS_Store +npm-debug.log* diff --git a/panel/db.js b/panel/db.js index 57d3bdf..f8abfc7 100644 --- a/panel/db.js +++ b/panel/db.js @@ -1,26 +1,103 @@ -import Database from 'better-sqlite3'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; +import pg from 'pg'; -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const dbPath = path.join(__dirname, 'data.db'); +const { Pool } = pg; -export const db = new Database(dbPath); -db.pragma('journal_mode = WAL'); -db.pragma('foreign_keys = ON'); +if (!process.env.DATABASE_URL) { + console.error('FATAL: DATABASE_URL is not set. Point it at your Liara PostgreSQL connection string.'); + process.exit(1); +} -// safe migrations — ignore if column already exists -for (const sql of [ - "ALTER TABLE articles ADD COLUMN status TEXT DEFAULT 'published'", - "ALTER TABLE articles ADD COLUMN key_data TEXT", -]) { try { db.exec(sql) } catch {} } +// Liara managed Postgres requires TLS when reached over the public endpoint. +// Set DATABASE_SSL=disable only when connecting over the internal private network. +const pool = new Pool({ + connectionString: process.env.DATABASE_URL, + ssl: process.env.DATABASE_SSL === 'disable' ? false : { rejectUnauthorized: false }, +}); +export { pool }; -db.exec(` +// pg dates come back as JS Date objects; the API historically returned ISO-ish +// strings from SQLite. Coerce timestamp/date OIDs back to the raw string pg sends. +pg.types.setTypeParser(1114, (v) => v); // timestamp without time zone +pg.types.setTypeParser(1184, (v) => v); // timestamptz + +/** + * Translate a better-sqlite3-style statement into a pg query. + * - named params (`@name`) when a single plain-object arg is passed + * - positional params (`?`) otherwise + * Returns { text, values } for pool.query. + */ +function buildQuery(sql, args) { + const isNamed = + args.length === 1 && + args[0] != null && + typeof args[0] === 'object' && + !Array.isArray(args[0]) && + /@\w+/.test(sql); + + if (isNamed) { + const obj = args[0]; + const values = []; + const text = sql.replace(/@(\w+)/g, (_, name) => { + values.push(name in obj ? obj[name] : null); + return '$' + values.length; + }); + return { text, values }; + } + + let i = 0; + const text = sql.replace(/\?/g, () => '$' + ++i); + return { text, values: args.flat() }; +} + +/** + * better-sqlite3-shaped async facade over pg. + * db.prepare(sql).get(params) -> first row | undefined + * db.prepare(sql).all(params) -> rows[] + * db.prepare(sql).run(params) -> { changes, lastInsertRowid, rows } + * NOTE: every method returns a Promise — callers MUST await. + * For INSERTs that need the new id, append `RETURNING id` to the SQL; + * run() exposes it as `lastInsertRowid`. + */ +export const db = { + prepare(sql) { + return { + async get(...args) { + const { text, values } = buildQuery(sql, args); + const res = await pool.query(text, values); + return res.rows[0]; + }, + async all(...args) { + const { text, values } = buildQuery(sql, args); + const res = await pool.query(text, values); + return res.rows; + }, + async run(...args) { + const { text, values } = buildQuery(sql, args); + const res = await pool.query(text, values); + return { + changes: res.rowCount, + lastInsertRowid: res.rows[0]?.id, + rows: res.rows, + }; + }, + }; + }, + async exec(sql) { + await pool.query(sql); + }, + async query(text, params) { + return pool.query(text, params); + }, +}; + +// ── schema (idempotent) — runs once at import via top-level await ── +await pool.query(` CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, + id SERIAL PRIMARY KEY, username TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, - created_at TEXT NOT NULL DEFAULT (datetime('now')) + role TEXT NOT NULL DEFAULT 'admin', + created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS articles ( @@ -40,10 +117,11 @@ db.exec(` cover_image TEXT, tags TEXT, featured INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + status TEXT DEFAULT 'published', + key_data TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); - CREATE INDEX IF NOT EXISTS idx_articles_created ON articles(created_at DESC); CREATE INDEX IF NOT EXISTS idx_articles_featured ON articles(featured); @@ -54,10 +132,9 @@ db.exec(` date TEXT, level TEXT NOT NULL CHECK (level IN ('critical','high','medium','low','opportunity')), sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); - CREATE INDEX IF NOT EXISTS idx_risks_sort ON risk_signals(sort_order, created_at); CREATE TABLE IF NOT EXISTS events ( @@ -78,8 +155,8 @@ db.exec(` description_en TEXT, registration_open INTEGER DEFAULT 1, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_events_sort ON events(sort_order, created_at DESC); @@ -91,8 +168,8 @@ db.exec(` desc_fa TEXT, desc_en TEXT, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_vision_sort ON vision_items(sort_order, created_at DESC); @@ -103,8 +180,8 @@ db.exec(` role_fa TEXT, role_en TEXT, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_advisory_sort ON advisory_board(sort_order, created_at DESC); @@ -129,8 +206,8 @@ db.exec(` twitter TEXT, website TEXT, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_team_sort ON team_members(sort_order, created_at DESC); @@ -148,8 +225,8 @@ db.exec(` cta_fa TEXT, cta_en TEXT, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_plans_sort ON plans(sort_order); @@ -162,12 +239,16 @@ db.exec(` title_fa TEXT, date_fa TEXT, excerpt_fa TEXT, + body_fa TEXT, + analysis_fa TEXT, title_en TEXT, date_en TEXT, excerpt_en TEXT, + body_en TEXT, + analysis_en TEXT, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_radar_sort ON radar_items(sort_order, created_at DESC); @@ -191,8 +272,8 @@ db.exec(` banner_desc_en TEXT, banner_book_img TEXT, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_radar_pages_sort ON radar_pages(sort_order); @@ -211,8 +292,8 @@ db.exec(` position TEXT DEFAULT 'hero', active INTEGER DEFAULT 1, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_banners_active ON banners(active, sort_order); @@ -229,8 +310,8 @@ db.exec(` excerpt_en TEXT, scroll_dir TEXT CHECK(scroll_dir IN ('left','right','up')) DEFAULT 'up', sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_factory_reports_sort ON factory_reports(sort_order, created_at DESC); @@ -243,8 +324,8 @@ db.exec(` grid_col INTEGER DEFAULT 1, grid_row INTEGER DEFAULT 1, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_integrations_sort ON integrations(sort_order, created_at DESC); @@ -255,8 +336,8 @@ db.exec(` value INTEGER DEFAULT 0, suffix_fa TEXT, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_institute_stats_sort ON institute_stats(sort_order); @@ -269,8 +350,8 @@ db.exec(` change_percent REAL DEFAULT 0, trend TEXT CHECK(trend IN ('up','down','flat')) DEFAULT 'flat', sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_market_prices_sort ON market_prices(sort_order); @@ -281,8 +362,8 @@ db.exec(` value REAL DEFAULT 0, meta TEXT, sort_order INTEGER DEFAULT 0, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_chart_points_series ON market_chart_points(series, sort_order); @@ -294,42 +375,53 @@ db.exec(` change_value REAL, change_pct REAL, source_url TEXT, - fetched_at TEXT NOT NULL DEFAULT (datetime('now')) + fetched_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS members ( - id INTEGER PRIMARY KEY AUTOINCREMENT, + id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, phone TEXT, avatar TEXT, is_active INTEGER NOT NULL DEFAULT 1, - created_at TEXT NOT NULL DEFAULT (datetime('now')), - updated_at TEXT NOT NULL DEFAULT (datetime('now')) + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_members_email ON members(email); CREATE TABLE IF NOT EXISTS purchases ( - id INTEGER PRIMARY KEY AUTOINCREMENT, + id SERIAL PRIMARY KEY, member_id INTEGER NOT NULL REFERENCES members(id) ON DELETE CASCADE, article_id TEXT NOT NULL REFERENCES articles(id) ON DELETE CASCADE, amount INTEGER NOT NULL DEFAULT 0, - purchased_at TEXT NOT NULL DEFAULT (datetime('now')), + purchased_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(member_id, article_id) ); CREATE INDEX IF NOT EXISTS idx_purchases_member ON purchases(member_id, purchased_at DESC); `); -/* idempotent column migrations for already-created tables */ -function ensureColumn(table, col, def) { - const cols = db.prepare(`PRAGMA table_info(${table})`).all(); - if (!cols.some((c) => c.name === col)) { - db.exec(`ALTER TABLE ${table} ADD COLUMN ${col} ${def}`); - } +// idempotent column adds (Postgres supports IF NOT EXISTS on ADD COLUMN) +for (const sql of [ + "ALTER TABLE articles ADD COLUMN IF NOT EXISTS status TEXT DEFAULT 'published'", + 'ALTER TABLE articles ADD COLUMN IF NOT EXISTS key_data TEXT', + 'ALTER TABLE radar_items ADD COLUMN IF NOT EXISTS body_fa TEXT', + 'ALTER TABLE radar_items ADD COLUMN IF NOT EXISTS body_en TEXT', + 'ALTER TABLE radar_items ADD COLUMN IF NOT EXISTS analysis_fa TEXT', + 'ALTER TABLE radar_items ADD COLUMN IF NOT EXISTS analysis_en TEXT', + 'ALTER TABLE banners ADD COLUMN IF NOT EXISTS overline_fa TEXT', + 'ALTER TABLE banners ADD COLUMN IF NOT EXISTS overline_en TEXT', + "ALTER TABLE users ADD COLUMN IF NOT EXISTS role TEXT NOT NULL DEFAULT 'admin'", +]) { + await pool.query(sql); +} + +// promote the founding admin (lowest id) to owner if none exists yet +const { rows: ownerRows } = await pool.query("SELECT 1 FROM users WHERE role = 'owner' LIMIT 1"); +if (ownerRows.length === 0) { + await pool.query("UPDATE users SET role = 'owner' WHERE id = (SELECT id FROM users ORDER BY id LIMIT 1)"); } -ensureColumn('banners', 'overline_fa', 'TEXT'); -ensureColumn('banners', 'overline_en', 'TEXT'); export function rowToPrice(row) { if (!row) return null; @@ -345,27 +437,28 @@ export function rowToPrice(row) { }; } -export function upsertPrice(p) { - db.prepare(` - INSERT INTO prices (symbol, name, value, unit, change_value, change_pct, source_url, fetched_at) - VALUES (@symbol, @name, @value, @unit, @change_value, @change_pct, @source_url, datetime('now')) - ON CONFLICT(symbol) DO UPDATE SET - name = excluded.name, - value = excluded.value, - unit = excluded.unit, - change_value = excluded.change_value, - change_pct = excluded.change_pct, - source_url = excluded.source_url, - fetched_at = excluded.fetched_at - `).run({ - symbol: p.symbol, - name: p.name, - value: p.value ?? null, - unit: p.unit ?? null, - change_value: p.changeValue ?? null, - change_pct: p.changePct ?? null, - source_url: p.sourceUrl ?? null, - }); +export async function upsertPrice(p) { + await pool.query( + `INSERT INTO prices (symbol, name, value, unit, change_value, change_pct, source_url, fetched_at) + VALUES ($1, $2, $3, $4, $5, $6, $7, now()) + ON CONFLICT(symbol) DO UPDATE SET + name = EXCLUDED.name, + value = EXCLUDED.value, + unit = EXCLUDED.unit, + change_value = EXCLUDED.change_value, + change_pct = EXCLUDED.change_pct, + source_url = EXCLUDED.source_url, + fetched_at = EXCLUDED.fetched_at`, + [ + p.symbol, + p.name, + p.value ?? null, + p.unit ?? null, + p.changeValue ?? null, + p.changePct ?? null, + p.sourceUrl ?? null, + ], + ); } export function rowToEvent(row) { @@ -576,9 +669,13 @@ export function rowToRadarItem(row) { titleFa: row.title_fa, dateFa: row.date_fa, excerptFa: row.excerpt_fa, + bodyFa: row.body_fa || null, + analysisFa: row.analysis_fa || null, titleEn: row.title_en, dateEn: row.date_en, excerptEn: row.excerpt_en, + bodyEn: row.body_en || null, + analysisEn: row.analysis_en || null, sortOrder: row.sort_order, createdAt: row.created_at, updatedAt: row.updated_at, diff --git a/panel/insert-events.mjs b/panel/insert-events.mjs index ec13092..4db071d 100644 --- a/panel/insert-events.mjs +++ b/panel/insert-events.mjs @@ -1,9 +1,4 @@ -import Database from 'better-sqlite3'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const db = new Database(path.join(__dirname, 'data.db')); +import { db, pool } from './db.js'; // Gregorian ISO → Jalali parts using Intl (same engine the site's calendar uses) function jalali(iso) { @@ -75,7 +70,7 @@ const events = [ ]; // replace the old mock events with the real future ones -db.prepare('DELETE FROM events').run(); +await db.prepare('DELETE FROM events').run(); const stmt = db.prepare(` INSERT INTO events @@ -88,9 +83,10 @@ const stmt = db.prepare(` @registration_open, @sort_order) `); -events.forEach((e, i) => { +for (let i = 0; i < events.length; i++) { + const e = events[i]; const j = jalali(e.iso); - stmt.run({ + await stmt.run({ id: e.id, title_fa: e.titleFa, title_en: e.titleEn, date_fa: j.day, date_en: j.day, @@ -103,6 +99,8 @@ events.forEach((e, i) => { registration_open: 1, sort_order: i, }); console.log(`✓ ${e.id} → ${j.day} ${j.monthFa} ${j.year}`); -}); +} console.log(`\nDone: ${events.length} events inserted`); + +await pool.end(); diff --git a/panel/insert-factory.mjs b/panel/insert-factory.mjs index 7d4d6c4..f22c2c5 100644 --- a/panel/insert-factory.mjs +++ b/panel/insert-factory.mjs @@ -1,9 +1,4 @@ -import Database from 'better-sqlite3'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const db = new Database(path.join(__dirname, 'data.db')); +import { db, pool } from './db.js'; // Real issues of Mobarakeh Steel's "ماهنامه تحلیلی کارخانه" (titles/descriptions/images // taken from msc.ir). The listing page itself is WAF-gated, so only the latest 3 issues @@ -36,7 +31,7 @@ const reports = [ }, ]; -db.prepare('DELETE FROM factory_reports').run(); +await db.prepare('DELETE FROM factory_reports').run(); const stmt = db.prepare(` INSERT INTO factory_reports @@ -45,8 +40,9 @@ const stmt = db.prepare(` (@id, @img, @tag_fa, @tag_en, @title_fa, @title_en, @date_fa, @date_en, @excerpt_fa, @excerpt_en, @scroll_dir, @sort_order) `); -reports.forEach((r, i) => { - stmt.run({ +for (let i = 0; i < reports.length; i++) { + const r = reports[i]; + await stmt.run({ id: r.id, img: r.img, tag_fa: 'ماهنامه تحلیلی کارخانه', tag_en: 'Factory Analysis', title_fa: r.titleFa, title_en: r.titleEn, @@ -55,6 +51,8 @@ reports.forEach((r, i) => { scroll_dir: r.dir, sort_order: i, }); console.log(`✓ ${r.id} → ${r.titleFa}`); -}); +} console.log(`\nDone: ${reports.length} factory reports inserted`); + +await pool.end(); diff --git a/panel/liara.json b/panel/liara.json new file mode 100644 index 0000000..a5a6dc1 --- /dev/null +++ b/panel/liara.json @@ -0,0 +1,4 @@ +{ + "platform": "node", + "port": 3000 +} diff --git a/panel/package-lock.json b/panel/package-lock.json index 572d41b..9d67090 100644 --- a/panel/package-lock.json +++ b/panel/package-lock.json @@ -9,13 +9,14 @@ "version": "1.0.0", "dependencies": { "@anthropic-ai/sdk": "^0.104.1", + "@aws-sdk/client-s3": "^3.700.0", "bcryptjs": "^2.4.3", - "better-sqlite3": "^11.3.0", "cheerio": "^1.2.0", "cookie-parser": "^1.4.7", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.0", + "express-async-errors": "^3.1.1", "express-rate-limit": "^7.5.0", "helmet": "^8.0.0", "jsonwebtoken": "^9.0.2", @@ -24,6 +25,7 @@ "nodemailer": "^8.0.10", "openai": "^6.42.0", "pdf-parse": "^2.4.5", + "pg": "^8.13.1", "sharp": "^0.35.1" }, "engines": { @@ -51,6 +53,436 @@ } } }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/checksums": { + "version": "3.1000.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/checksums/-/checksums-3.1000.6.tgz", + "integrity": "sha512-RMCrCteiUwYTEv2G9zfP/BEuKHv57665vVieJyp9cf8VgilWxP/KrWVtMdfdDlIH8nFhvu3rIMc29z3ebGEZ1w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.1070.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1070.0.tgz", + "integrity": "sha512-B/OUiCqGQ4Zr7v9gFFyiuitKN2c0PIgvOlQb5bYg1SM2y0F8a5JQ7FNsjRcl+d2PqYWLHwHx12CvZDyLn4KxIw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/credential-provider-node": "^3.972.56", + "@aws-sdk/middleware-flexible-checksums": "^3.974.31", + "@aws-sdk/middleware-sdk-s3": "^3.972.52", + "@aws-sdk/signature-v4-multi-region": "^3.996.35", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/fetch-http-handler": "^5.4.6", + "@smithy/node-http-handler": "^4.7.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.974.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.21.tgz", + "integrity": "sha512-P5JAHvn4dTi96UsAGS67LVOqqpUNNRhnfFXqzCYtdBIGZtqBue4CXvRr9YenOO7PALj/Pn8uuyw53FBCiCYw8w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.13", + "@aws-sdk/xml-builder": "^3.972.30", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/core": "^3.24.6", + "@smithy/signature-v4": "^5.4.6", + "@smithy/types": "^4.14.3", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.47", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.47.tgz", + "integrity": "sha512-3YoPwJczcc+MtX2xxXaYaOOWO6xKUJr1ZIIDIFuninr51BYONVVcF/CP8K2xfVRC/PztJjqKWxNGFH7BWQAw1Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.49", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.49.tgz", + "integrity": "sha512-2UtGUPy+x3lqyceHrtC1uEuVxBZbDalPF6KAFqBwYgm4edWdBrZKNnCqzDs7KynWUvEC6mrR+ojRk+ZgQz9C2w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/fetch-http-handler": "^5.4.6", + "@smithy/node-http-handler": "^4.7.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.54", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.54.tgz", + "integrity": "sha512-Hx4gO4YRjFwitf3MVl3cDwYe1aryJthC4txVl9b+JAURovA50M2ywf9r8j1E/Q6SCTPT4qQpjOAbKYIC9CG+Vw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/credential-provider-env": "^3.972.47", + "@aws-sdk/credential-provider-http": "^3.972.49", + "@aws-sdk/credential-provider-login": "^3.972.53", + "@aws-sdk/credential-provider-process": "^3.972.47", + "@aws-sdk/credential-provider-sso": "^3.972.53", + "@aws-sdk/credential-provider-web-identity": "^3.972.53", + "@aws-sdk/nested-clients": "^3.997.21", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/credential-provider-imds": "^4.3.7", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.53", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.53.tgz", + "integrity": "sha512-+71sluhkgPqdhbbD3UDwUpj24GCkng9HQx6z7qoBFb8dwkF4ktpOcVKDeHpgg8PvBgLYwAnUYLTEGRC/PniCiQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/nested-clients": "^3.997.21", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.56", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.56.tgz", + "integrity": "sha512-iI+4o0dvQQ4NHel4FMDiFy5q2gaU/ryLK3niOsoPccAt9WLFRkV4XTYPWRr9XvmBUqEzXG73S4p/8gm0Lu/W3A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.47", + "@aws-sdk/credential-provider-http": "^3.972.49", + "@aws-sdk/credential-provider-ini": "^3.972.54", + "@aws-sdk/credential-provider-process": "^3.972.47", + "@aws-sdk/credential-provider-sso": "^3.972.53", + "@aws-sdk/credential-provider-web-identity": "^3.972.53", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/credential-provider-imds": "^4.3.7", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.47", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.47.tgz", + "integrity": "sha512-tAizPm9IFo/PHn06c+LQJlzfY2AGOlyF0CUljFejrU6LcZBjnk8pmbZK3/xoIDdnIzjEdbClfvY3mXfr818ZEg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.53", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.53.tgz", + "integrity": "sha512-pUXE3fu4tfEDV8BksIgf4dXvuIH10FhwHMl/wu8rBD5T1sMpryQWFVitH3kdPS90wlgrGYJQ/meQTSPacyZfeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/nested-clients": "^3.997.21", + "@aws-sdk/token-providers": "3.1069.0", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.53", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.53.tgz", + "integrity": "sha512-JmMGlhVvSj8uSG9CpeDkJAXT35H89tc6v84iMgEIE75q4yp1MKVVKvopv6Gg28HJIR7hMNkojRF8H2m5W44wyg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/nested-clients": "^3.997.21", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.974.31", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.31.tgz", + "integrity": "sha512-Yzj6NRYVZdBaCp7o1BwHGyeDBfixdeToLIAMprshIITEdl9wKVSiidVOfeaiH8FyeC1hBmBfDZFvs/aH1Y3xpw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/checksums": "^3.1000.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.52", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.52.tgz", + "integrity": "sha512-rerjP08onRqkBh0AcCqip6GkKvESapmLoTgi1xysZ4C6a1xMrIMtTBcEbUb6EY71oeajnigeUD4KwZjtIO+aWQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/signature-v4-multi-region": "^3.996.35", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.997.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.21.tgz", + "integrity": "sha512-eC7Vl7Qom/BGhZjG9GEqPwdQ/fk45hg1t5LP4EUxG5d1fdshLbaxCiwh/tszUzDX/4mW40mu2QsbeJJRPBbqUw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/signature-v4-multi-region": "^3.996.35", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/fetch-http-handler": "^5.4.6", + "@smithy/node-http-handler": "^4.7.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.35", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.35.tgz", + "integrity": "sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.13", + "@smithy/signature-v4": "^5.4.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.1069.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1069.0.tgz", + "integrity": "sha512-ks4X+kngC3PA5howV7Qu1TgG4bfC4jPykKdvw3nmBSXR9yZxRJouBholFSNQ5kY3L+Fgwyw+LCjzQmNi+KR91g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.21", + "@aws-sdk/nested-clients": "^3.997.21", + "@aws-sdk/types": "^3.973.13", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.13.tgz", + "integrity": "sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.8.tgz", + "integrity": "sha512-uUbMs1cBZPafD0ohUj6EwNf0fPZ534NvBxHox4hjX+0Rxq5paSYUem7+hi833pYrzrcnBATKIYpR02MDXT5M9g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.30", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.30.tgz", + "integrity": "sha512-StElZPEoBquWwNqw1AcfpzEyZqJvFxouG+mpDNYlcH6ZOrqd2CuIryv+8LV8gNHZUOyKyJF3Dq9vxaXEmDR9TQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.3", + "fast-xml-parser": "5.7.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", @@ -754,6 +1186,138 @@ "node": ">= 10" } }, + "node_modules/@nodable/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@smithy/core": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.25.0.tgz", + "integrity": "sha512-TTD6el7tvKyafkXBf7XO3jLOE+qVxOTrLjp/fEGiV3BMfUHK/LfdYlQO9YgZvzxC7kqA3H/IhJXNqQgnbgjb7A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.15.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.0.tgz", + "integrity": "sha512-pPQmNdEvMJttv9z2kdYxoui83p/nr32zjMf0aMfmzmGmFEgKXUfy0vXiNg0fx4R5XLQzmJBLM9Wg0guEq2/q8A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.25.0", + "@smithy/types": "^4.15.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.5.0.tgz", + "integrity": "sha512-OG8kBYAgX7lf32+xLzgirvuLffn1KNoszaSiButt45i2cRa5irk8LQXLYQ5Smij1SBTN4KMNcBsRwRrLPfIGyA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.25.0", + "@smithy/types": "^4.15.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.8.0.tgz", + "integrity": "sha512-Mq7TNt/VhlEWiYRLQGpzUWeUxh899UGpjKh7Ru0WVIDIjnE+cTRAn0NYlFQ6bWfsQnKnpCbWJj86HzmcG0qEdg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.25.0", + "@smithy/types": "^4.15.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.5.0.tgz", + "integrity": "sha512-vW6UdK7e7gV2wU/tXRsPq4pMQMusb8VymdVOyIFNA1FtyRmEClRFkYDtYI8UcO/HM0wK3qqjvvQs3HOlbgMbdg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.25.0", + "@smithy/types": "^4.15.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.15.0.tgz", + "integrity": "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@stablelib/base64": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz", @@ -773,6 +1337,18 @@ "node": ">= 0.6" } }, + "node_modules/anynum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.0.tgz", + "integrity": "sha512-xjR9/zBVnUOP6ztMIIgShjsxui80nQUQH+5xJnvrYLs+90bF25/KJqaAi8mk+B4RDtX1Nspi6fmp4YTEts8SfA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", @@ -785,77 +1361,12 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", "license": "MIT" }, - "node_modules/better-sqlite3": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz", - "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/body-parser": { "version": "1.20.5", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", @@ -898,29 +1409,11 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", @@ -1025,12 +1518,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", @@ -1155,30 +1642,6 @@ "ms": "2.0.0" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1325,15 +1788,6 @@ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -1391,15 +1845,6 @@ "node": ">= 0.6" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, "node_modules/express": { "version": "4.22.2", "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", @@ -1446,6 +1891,15 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-async-errors": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/express-async-errors/-/express-async-errors-3.1.1.tgz", + "integrity": "sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng==", + "license": "ISC", + "peerDependencies": { + "express": "^4.16.2" + } + }, "node_modules/express-rate-limit": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", @@ -1467,11 +1921,42 @@ "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==", "license": "Unlicense" }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT" + "node_modules/fast-xml-builder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", + "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.7", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } }, "node_modules/finalhandler": { "version": "1.3.2", @@ -1509,12 +1994,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -1561,12 +2040,6 @@ "node": ">= 0.4" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1678,38 +2151,12 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -1898,18 +2345,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -1931,12 +2366,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1980,12 +2409,6 @@ "node": "^18 || >=20" } }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -1995,18 +2418,6 @@ "node": ">= 0.6" } }, - "node_modules/node-abi": { - "version": "3.92.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", - "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/nodemailer": { "version": "8.0.11", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.11.tgz", @@ -2061,15 +2472,6 @@ "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/openai": { "version": "6.42.0", "resolved": "https://registry.npmjs.org/openai/-/openai-6.42.0.tgz", @@ -2146,6 +2548,21 @@ "node": ">= 0.8" } }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-to-regexp": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", @@ -2184,31 +2601,132 @@ "@napi-rs/canvas": "^0.1.80" } }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "node_modules/pg": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", + "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", "license": "MIT", "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" + "pg-connection-string": "^2.13.0", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.14.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" }, "engines": { - "node": ">=10" + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.4.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz", + "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.13.0.tgz", + "integrity": "sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz", + "integrity": "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/process-nextick-args": { @@ -2230,16 +2748,6 @@ "node": ">= 0.10" } }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/qs": { "version": "6.15.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", @@ -2291,21 +2799,6 @@ "node": ">=0.10.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -2532,49 +3025,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" } }, "node_modules/standardwebhooks": { @@ -2619,55 +3076,19 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "node_modules/strnum": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.0.tgz", + "integrity": "sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "anynum": "^1.0.0" } }, "node_modules/toidentifier": { @@ -2689,20 +3110,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } + "license": "0BSD" }, "node_modules/type-is": { "version": "1.6.18", @@ -2787,11 +3195,20 @@ "node": ">=18" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } }, "node_modules/xtend": { "version": "4.0.2", diff --git a/panel/package.json b/panel/package.json index 889b46d..f83ff3b 100644 --- a/panel/package.json +++ b/panel/package.json @@ -12,13 +12,14 @@ }, "dependencies": { "@anthropic-ai/sdk": "^0.104.1", + "@aws-sdk/client-s3": "^3.700.0", "bcryptjs": "^2.4.3", - "better-sqlite3": "^11.3.0", "cheerio": "^1.2.0", "cookie-parser": "^1.4.7", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.0", + "express-async-errors": "^3.1.1", "express-rate-limit": "^7.5.0", "helmet": "^8.0.0", "jsonwebtoken": "^9.0.2", @@ -27,6 +28,7 @@ "nodemailer": "^8.0.10", "openai": "^6.42.0", "pdf-parse": "^2.4.5", + "pg": "^8.13.1", "sharp": "^0.35.1" }, "engines": { diff --git a/panel/public/app.js b/panel/public/app.js index d6611b8..f45d143 100644 --- a/panel/public/app.js +++ b/panel/public/app.js @@ -1,6 +1,21 @@ const $ = (sel, root = document) => root.querySelector(sel); const root = $('#app'); +const TAB_GROUPS = [ + { label: 'محتوا', tabs: ['articles', 'events', 'radar', 'radarPages', 'factoryReports'] }, + { label: 'داده', tabs: ['risks', 'mprices', 'stats', 'charts', 'integrations'] }, + { label: 'سایت', tabs: ['vision', 'advisory', 'team', 'experts', 'plans', 'banners'] }, + { label: 'ابزار', tabs: ['pdfAnalyze', 'import', 'users'] }, +]; +const TAB_LABELS = { + articles: 'مطالب', risks: 'ریسک‌ها', events: 'رویدادها', + radar: 'رادار', radarPages: 'صفحات رادار', factoryReports: 'گزارش کارخانه', + integrations: 'منابع داده', stats: 'آمار', mprices: 'قیمت‌ها', + charts: 'نمودارها', vision: 'چشم‌انداز', advisory: 'شورای مشورتی', + team: 'تیم', experts: 'خبرگان', plans: 'پلان‌ها', banners: 'بنرها', + pdfAnalyze: '📄 PDF', import: '⬇️ ایمپورت', users: 'کاربران', +}; + const CATEGORIES = [ 'بازار جهانی', 'سیاست‌گذاری', 'انرژی و ESG', 'صادرات', 'تولید داخلی', 'ریسک و بحران', @@ -18,6 +33,25 @@ const TYPES = [ { value: 'radar', label: 'رادار آینده' }, ]; +const CONTENT_TYPES = [ + { key: 'report', label: 'گزارش تحلیلی', icon: '📊', desc: 'گزارش فصلی، فلش یا ویژه با تحلیل بازار', defaultType: 'quarterly', defaultCategory: '' }, + { key: 'news', label: 'خبر', icon: '📰', desc: 'اخبار صنعت فولاد', defaultType: 'news', defaultCategory: 'اخبار صنعت' }, + { key: 'video', label: 'ویدیوکست', icon: '🎬', desc: 'ویدیوی تحلیلی یا مصاحبه', defaultType: 'video', defaultCategory: '' }, + { key: 'podcast', label: 'پادکست', icon: '🎙️', desc: 'اپیزود پادکست صوتی', defaultType: 'podcast', defaultCategory: '' }, + { key: 'factory', label: 'گزارش کارخانه', icon: '🏭', desc: 'گزارش تولید و عملیات کارخانه', defaultType: 'factoryReport', defaultCategory: 'گزارش کارخانه' }, + { key: 'radar', label: 'رادار آینده', icon: '🔭', desc: 'از تب «رادار» در منوی بالا مدیریت می‌شود', defaultType: '', defaultCategory: '', externalTab: 'radar' }, +]; + +function inferContentType(a) { + if (!a) return 'report'; + if (a.type === 'video') return 'video'; + if (a.type === 'podcast') return 'podcast'; + if (a.type === 'radar') return 'radar'; + if (a.type === 'factoryReport' || a.category === 'گزارش کارخانه') return 'factory'; + if (a.type === 'news') return 'news'; + return 'report'; +} + const EVENT_TYPES = [ { value: 'conference', label: 'کنگره' }, { value: 'exhibition', label: 'نمایشگاه' }, @@ -111,7 +145,6 @@ function renderLogin(errorMsg = '') { method: 'POST', body: { username: fd.get('username'), password: fd.get('password') }, }); - if (data.token) sessionStorage.setItem('sf_token', data.token); renderList(); } catch { renderLogin('نام کاربری یا رمز عبور اشتباه است'); @@ -120,34 +153,24 @@ function renderLogin(errorMsg = '') { } function topbarHtml(active, primaryLabel) { + const activeGroup = TAB_GROUPS.find(g => g.tabs.includes(active)) || TAB_GROUPS[0]; + const groupBtns = TAB_GROUPS.map(g => ` + + `).join(''); + const subTabs = activeGroup.tabs.map(t => ` + + `).join(''); return `
-
پنل اندیشکده فولاد
- -
- - +
+
پنل اندیشکده فولاد
+ +
+ + +
+
`; } @@ -187,20 +210,28 @@ async function renderList() { ${topbarHtml('articles', '+ مطلب جدید')}

مطالب

+
+ + ${CATEGORIES.map(c => ``).join('')} +

در حال بارگذاری…

`; wireTabs(); $('#newBtn').addEventListener('click', () => renderEditor(null)); - try { - const items = await api('/api/articles?limit=200'); - if (!items.length) { - $('#list').innerHTML = `

هنوز مطلبی ثبت نشده است.

`; + let allItems = []; + let activeCat = ''; + + const safeCoverUrl = (u) => /^\/uploads\/[a-zA-Z0-9._-]+$/.test(String(u || '')) ? u : ''; + + function renderItems() { + const filtered = activeCat ? allItems.filter(a => a.category === activeCat) : allItems; + if (!filtered.length) { + $('#list').innerHTML = `

مطلبی در این دسته‌بندی یافت نشد.

`; return; } - const safeCoverUrl = (u) => /^\/uploads\/[a-zA-Z0-9._-]+$/.test(String(u || '')) ? u : ''; - $('#list').innerHTML = items.map((a) => ` + $('#list').innerHTML = filtered.map((a) => `
@@ -218,164 +249,284 @@ async function renderList() {
`).join(''); + } - $('#list').addEventListener('click', async (e) => { - const btn = e.target.closest('button[data-action]'); - if (!btn) return; - const row = btn.closest('.row'); - const id = row.dataset.id; - if (btn.dataset.action === 'edit') { - const a = await api(`/api/articles/${id}`); - renderEditor(a); - } else if (btn.dataset.action === 'delete') { - if (!confirm('این مطلب حذف شود؟')) return; - await api(`/api/articles/${id}`, { method: 'DELETE' }); - renderList(); - } - }); + $('#cat-bar').addEventListener('click', (e) => { + const btn = e.target.closest('.cat-btn'); + if (!btn) return; + activeCat = btn.dataset.cat; + document.querySelectorAll('.cat-btn').forEach(b => b.classList.toggle('active', b === btn)); + renderItems(); + }); + + $('#list').addEventListener('click', async (e) => { + const btn = e.target.closest('button[data-action]'); + if (!btn) return; + const row = btn.closest('.row'); + const id = row.dataset.id; + if (btn.dataset.action === 'edit') { + const a = await api(`/api/articles/${id}`); + renderEditor(a); + } else if (btn.dataset.action === 'delete') { + if (!confirm('این مطلب حذف شود؟')) return; + await api(`/api/articles/${id}`, { method: 'DELETE' }); + renderList(); + } + }); + + try { + allItems = await api('/api/articles?limit=500'); + if (!allItems.length) { + $('#list').innerHTML = `

هنوز مطلبی ثبت نشده است.

`; + return; + } + renderItems(); } catch (err) { console.error(err); $('#list').innerHTML = `

خطا در بارگذاری مطالب.

`; } } +function renderTypeSelector() { + root.innerHTML = ` +
+
+
مطلب جدید
+ +
+ +
+
+
+
+
+

چه نوع محتوایی می‌خواهید منتشر کنید؟

+
+ ${CONTENT_TYPES.map(ct => ` + + `).join('')} +
+
+ `; + $('#backBtn').addEventListener('click', () => renderList()); + document.querySelectorAll('.type-card').forEach(btn => { + btn.addEventListener('click', () => { + const ct = CONTENT_TYPES.find(c => c.key === btn.dataset.ctype); + if (ct.externalTab === 'radar') { renderRadarList(); return; } + renderEditor(null, { contentType: ct.key, type: ct.defaultType, category: ct.defaultCategory }); + }); + }); +} + function renderEditor(article, draft = {}) { + if (!article && !draft.contentType) { + renderTypeSelector(); + return; + } + + const contentType = draft.contentType || inferContentType(article); + const ctInfo = CONTENT_TYPES.find(c => c.key === contentType) || CONTENT_TYPES[0]; + const isEdit = !!article; const a = article || { - title: draft.title || '', category: draft.category || '', type: draft.type || '', + title: '', category: draft.category || ctInfo.defaultCategory, + type: draft.type || ctInfo.defaultType, author: '', authorRole: '', authorInitial: '', publishDate: '', pages: 0, price: 0, isFree: true, - summary: draft.summary || '', body: '', - coverImage: '', tags: [], featured: false, + summary: '', body: '', coverImage: '', tags: [], featured: false, }; - const isEdit = !!article; + + const REPORT_TYPES = TYPES.filter(t => ['quarterly','flash','special','risk','free'].includes(t.value)); + const hasCover = ['report','news','video','podcast','factory'].includes(contentType); + const hasCategory = ['report','news'].includes(contentType); + const hasAuthor = ['report','video','podcast'].includes(contentType); + const hasPages = ['report','factory'].includes(contentType); + const hasPrice = contentType === 'report'; + const hasBody = ['report','news','factory'].includes(contentType); + const hasMediaLink = ['video','podcast'].includes(contentType); + const hasReportType = contentType === 'report'; root.innerHTML = `
-
${isEdit ? 'ویرایش مطلب' : 'مطلب جدید'}
-
- +
+
${ctInfo.icon} ${isEdit ? 'ویرایش' : 'ایجاد'} — ${ctInfo.label}
+ +
+ +
+
+
+ ${hasCategory ? ` + ` : ``} -
`; $('#backBtn').addEventListener('click', () => renderList()); + document.getElementById('changeTypeBtn')?.addEventListener('click', () => renderTypeSelector()); - $('#coverFile').addEventListener('change', async (e) => { - const file = e.target.files?.[0]; - if (!file) return; - const fd = new FormData(); - fd.append('file', file); - try { - const { url } = await api('/api/uploads', { method: 'POST', body: fd, isForm: true }); - $('input[name="coverImage"]').value = url; - $('#coverPreview').src = url; - } catch (err) { - alert('آپلود ناموفق بود: ' + err.message); - } - }); + const coverFile = document.getElementById('coverFile'); + if (coverFile) { + coverFile.addEventListener('change', async (e) => { + const file = e.target.files?.[0]; + if (!file) return; + const fd = new FormData(); + fd.append('file', file); + try { + const { url } = await api('/api/uploads', { method: 'POST', body: fd, isForm: true }); + $('input[name="coverImage"]').value = url; + const prev = document.getElementById('coverPreview'); + prev.src = url; prev.style.display = ''; + } catch (err) { alert('آپلود ناموفق بود: ' + err.message); } + }); + } + + // video / podcast media file → object storage (fills the media URL field) + const mediaFile = document.getElementById('mediaFile'); + if (mediaFile) { + mediaFile.addEventListener('change', async (e) => { + const file = e.target.files?.[0]; + if (!file) return; + const status = document.getElementById('mediaStatus'); + if (status) status.textContent = 'در حال آپلود فایل… (بسته به حجم چند لحظه طول می‌کشد)'; + const fd = new FormData(); + fd.append('file', file); + try { + const { url } = await api('/api/uploads/raw', { method: 'POST', body: fd, isForm: true }); + document.getElementById('mediaUrl').value = url; + if (status) status.textContent = '✓ آپلود شد و در آبجکت استوریج ذخیره شد'; + } catch (err) { + if (status) status.textContent = ''; + alert('آپلود فایل ناموفق بود: ' + err.message); + } + }); + } $('#editorForm').addEventListener('submit', async (e) => { e.preventDefault(); const fd = new FormData(e.target); const tagsRaw = String(fd.get('tags') || '').split(/[,،]/).map(s => s.trim()).filter(Boolean); + const isFreeVal = fd.get('isFree'); const payload = { - title: fd.get('title'), - category: fd.get('category') || null, - type: fd.get('type') || null, - author: fd.get('author') || null, - authorRole: fd.get('authorRole') || null, - authorInitial: fd.get('authorInitial') || null, - publishDate: fd.get('publishDate') || null, - pages: Number(fd.get('pages') || 0), - price: Number(fd.get('price') || 0), - isFree: fd.get('isFree') === 'on', - featured: fd.get('featured') === 'on', - summary: fd.get('summary') || null, - body: fd.get('body') || null, - coverImage: fd.get('coverImage') || null, + title: fd.get('title'), + category: fd.get('category') || null, + type: fd.get('type') || null, + author: fd.get('author') || null, + authorRole: fd.get('authorRole') || null, + authorInitial:fd.get('authorInitial') || null, + publishDate: fd.get('publishDate') || null, + pages: Number(fd.get('pages') || 0), + price: Number(fd.get('price') || 0), + isFree: isFreeVal === 'on' || isFreeVal === 'true', + featured: fd.get('featured') === 'on', + summary: fd.get('summary') || null, + body: fd.get('body') || null, + coverImage: fd.get('coverImage') || null, tags: tagsRaw, }; try { @@ -385,9 +536,7 @@ function renderEditor(article, draft = {}) { await api('/api/articles', { method: 'POST', body: payload }); } renderList(); - } catch (err) { - alert('ذخیره ناموفق بود: ' + err.message); - } + } catch (err) { alert('ذخیره ناموفق بود: ' + err.message); } }); } @@ -952,26 +1101,50 @@ function renderPlanEditor(plan) { // ═══════════════════════════════════════════════ // RADAR (رادار آینده) // ═══════════════════════════════════════════════ +// section pages on the site → which raw categories feed them +const RADAR_PAGE_SLUGS = [ + { slug: 'foresight', label: 'آینده‌پژوهی و رصد هوشمند', cats: ['market','tech','commodity','geo','energy'] }, + { slug: 'market', label: 'بازار و زنجیره فولاد', cats: ['market','commodity'] }, + { slug: 'sustainability', label: 'پایداری و فولاد سبز', cats: ['energy','commodity'] }, + { slug: 'geopolitics', label: 'ژئوپلیتیک و اقتصاد جهانی', cats: ['geo','market'] }, + { slug: 'technology', label: 'فناوری و نوآوری', cats: ['tech'] }, +]; + +function sectionLabelsForCategory(cat) { + return RADAR_PAGE_SLUGS.filter(s => s.cats.includes(cat)).map(s => s.label); +} + async function renderRadarList() { root.innerHTML = ` - ${topbarHtml('radar', '+ سیگنال جدید')} + ${topbarHtml('radar', '+ مطلب رادار جدید')}

رادار آینده

+
+ + ${RADAR_PAGE_SLUGS.map(s => ``).join('')} +

در حال بارگذاری…

`; wireTabs(); $('#newBtn').addEventListener('click', () => renderRadarEditor(null)); - try { - const items = await api('/api/radar?limit=200'); - if (!items.length) { $('#list').innerHTML = `

هنوز سیگنالی ثبت نشده.

`; return; } - const safeImgUrl = (u) => /^(\/uploads\/[a-zA-Z0-9._-]+|\/[a-zA-Z0-9._\/-]+)$/.test(String(u || '')) ? u : ''; - $('#list').innerHTML = items.map(r => ` + + let allItems = []; + let activeSlug = ''; + + const safeImgUrl = (u) => /^(\/uploads\/[a-zA-Z0-9._-]+|\/[a-zA-Z0-9._\/-]+)$/.test(String(u || '')) ? u : ''; + + function renderItems() { + const activePage = RADAR_PAGE_SLUGS.find(s => s.slug === activeSlug); + const filtered = activePage ? allItems.filter(r => activePage.cats.includes(r.category)) : allItems; + if (!filtered.length) { $('#list').innerHTML = `

مطلبی در این بخش یافت نشد.

`; return; } + $('#list').innerHTML = filtered.map(r => { + const sections = sectionLabelsForCategory(r.category); + return `
- ${r.category ? `${escapeHtml(RADAR_CATEGORIES.find(c=>c.value===r.category)?.label||r.category)}` : ''} - ${r.authorName ? `${escapeHtml(r.authorName)}` : ''} + ${sections.map(s => `${escapeHtml(s)}`).join('')} ${r.dateFa ? `${escapeHtml(r.dateFa)}` : ''}

${escapeHtml(r.titleFa||'')}

@@ -981,51 +1154,147 @@ async function renderRadarList() {
-
`).join(''); - $('#list').addEventListener('click', async ev => { - const btn = ev.target.closest('button[data-action]'); if (!btn) return; - const id = btn.closest('.row').dataset.id; - if (btn.dataset.action === 'edit') renderRadarEditor(await api(`/api/radar/${id}`)); - else if (btn.dataset.action === 'delete') { - if (!confirm('این سیگنال حذف شود؟')) return; - await api(`/api/radar/${id}`, { method: 'DELETE' }); - renderRadarList(); - } - }); + `; + }).join(''); + } + + $('#section-bar').addEventListener('click', e => { + const btn = e.target.closest('.cat-btn'); if (!btn) return; + activeSlug = btn.dataset.slug; + document.querySelectorAll('#section-bar .cat-btn').forEach(b => b.classList.toggle('active', b === btn)); + renderItems(); + }); + + $('#list').addEventListener('click', async ev => { + const btn = ev.target.closest('button[data-action]'); if (!btn) return; + const id = btn.closest('.row').dataset.id; + if (btn.dataset.action === 'edit') renderRadarEditor(await api(`/api/radar/${id}`)); + else if (btn.dataset.action === 'delete') { + if (!confirm('این مطلب حذف شود؟')) return; + await api(`/api/radar/${id}`, { method: 'DELETE' }); + renderRadarList(); + } + }); + + try { + allItems = await api('/api/radar?limit=500'); + if (!allItems.length) { $('#list').innerHTML = `

هنوز مطلبی ثبت نشده.

`; return; } + renderItems(); } catch (err) { $('#list').innerHTML = `

خطا: ${escapeHtml(err.message)}

`; } } function renderRadarEditor(item) { const r = item || { category:'', img:'', authorName:'', authorAvatar:'', - titleFa:'', dateFa:'', excerptFa:'', titleEn:'', dateEn:'', excerptEn:'', sortOrder:0 }; + titleFa:'', dateFa:'', excerptFa:'', bodyFa:'', analysisFa:'', + titleEn:'', dateEn:'', excerptEn:'', bodyEn:'', analysisEn:'', sortOrder:0 }; const isEdit = !!item; + + function sectionBadges(cat) { + const labels = sectionLabelsForCategory(cat); + if (!labels.length) return ''; + return labels.map(l => `${escapeHtml(l)}`).join(' '); + } + root.innerHTML = `
-
${isEdit?'ویرایش سیگنال':'سیگنال جدید'}
-
+
+
🔭 ${isEdit?'ویرایش':'مطلب جدید'} — رادار آینده
+ +
+
+
- - - - + +
+ +
+ نمایش در بخش‌های سایت: + ${sectionBadges(r.category)} +
+
+ +
+ +
+ +
+ فارسی +
+ +
+ +
+ - -
- - -
-
-
+
+ +
+
+ +
+
+ +
+ +
+ English +
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ + + +
+ +
`; + $('#backBtn').addEventListener('click', () => renderRadarList()); + + document.getElementById('catSelect').addEventListener('change', e => { + const cat = e.target.value; + const badgesEl = document.getElementById('sectionBadges'); + badgesEl.innerHTML = `نمایش در بخش‌های سایت: ${sectionBadges(cat)}`; + }); + + document.getElementById('radarCoverFile').addEventListener('change', async e => { + const file = e.target.files?.[0]; if (!file) return; + const fd = new FormData(); fd.append('file', file); + try { + const { url } = await api('/api/uploads', { method: 'POST', body: fd, isForm: true }); + $('input[name="img"]').value = url; + const prev = document.getElementById('radarCoverPreview'); + prev.src = url; prev.style.display = ''; + } catch (err) { alert('آپلود ناموفق: ' + err.message); } + }); + $('#editorForm').addEventListener('submit', async ev => { ev.preventDefault(); const fd = new FormData(ev.target); @@ -1033,9 +1302,12 @@ function renderRadarEditor(item) { titleFa: fd.get('titleFa'), titleEn: fd.get('titleEn')||null, category: fd.get('category')||null, img: fd.get('img')||null, - authorName: fd.get('authorName')||null, authorAvatar: fd.get('authorAvatar')||null, + authorName: fd.get('authorName')||null, + authorAvatar: r.authorAvatar || null, dateFa: fd.get('dateFa')||null, dateEn: fd.get('dateEn')||null, excerptFa: fd.get('excerptFa')||null, excerptEn: fd.get('excerptEn')||null, + bodyFa: fd.get('bodyFa')||null, bodyEn: fd.get('bodyEn')||null, + analysisFa: fd.get('analysisFa')||null, analysisEn: fd.get('analysisEn')||null, sortOrder: Number(fd.get('sortOrder')||0), }; try { @@ -1046,17 +1318,6 @@ function renderRadarEditor(item) { }); } -// ═══════════════════════════════════════════════ -// RADAR PAGES (صفحات رادار — hero + banner per category) -// ═══════════════════════════════════════════════ -const RADAR_PAGE_SLUGS = [ - { slug: 'foresight', label: 'آینده‌پژوهی و رصد هوشمند' }, - { slug: 'market', label: 'بازار و زنجیره فولاد' }, - { slug: 'sustainability', label: 'پایداری و فولاد سبز' }, - { slug: 'geopolitics', label: 'ژئوپلیتیک و اقتصاد جهانی' }, - { slug: 'technology', label: 'فناوری و نوآوری' }, -]; - async function renderRadarPagesList() { root.innerHTML = ` ${topbarHtml('radarPages', '')} @@ -1958,9 +2219,7 @@ function renderImport() { statusEl.innerHTML = ''; try { - const res = await apiFetch('/api/admin/import', { method:'POST', body: JSON.stringify(data) }); - if (!res.ok) { const e = await res.json(); throw new Error(e.error || res.status); } - const result = await res.json(); + const result = await api('/api/admin/import', { method:'POST', body: data }); resultEl.innerHTML = `
@@ -2023,10 +2282,10 @@ function renderPdfAnalyze() { reader.onerror = reject; reader.readAsDataURL(file); }); - const _token = sessionStorage.getItem('sf_token') || ''; + // session travels in the HttpOnly cookie (credentials:'include'); no token in JS const _res = await fetch('/api/pdf-analyze', { method: 'POST', credentials: 'include', - headers: { 'Content-Type': 'application/json', ...(_token ? { 'Authorization': 'Bearer ' + _token } : {}) }, + headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ base64 }), }); if (!_res.ok) { @@ -2079,11 +2338,11 @@ function renderPdfAnalyze() { async function runGenerate(textSrc, titleSrc, catKey) { const gr = $('#generateResult'); gr.innerHTML = '

در حال تولید محتوا... ⏳

'; - const _token = sessionStorage.getItem('sf_token') || ''; + // session travels in the HttpOnly cookie (credentials:'include'); no token in JS try { const r = await fetch('/api/pdf-generate', { method: 'POST', credentials: 'include', - headers: { 'Content-Type': 'application/json', ...(_token ? { 'Authorization': 'Bearer ' + _token } : {}) }, + headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: textSrc, category: SECTION_LABELS[catKey] || catKey }), }); const d = await r.json(); @@ -2190,11 +2449,11 @@ function renderPdfAnalyze() { $('#generateContentBtn').addEventListener('click', async () => { const gr = $('#generateResult'); gr.innerHTML = '

در حال تولید محتوا... ⏳

'; - const _token = sessionStorage.getItem('sf_token') || ''; + // session travels in the HttpOnly cookie (credentials:'include'); no token in JS try { const r = await fetch('/api/pdf-generate', { method: 'POST', credentials: 'include', - headers: { 'Content-Type': 'application/json', ...(_token ? { 'Authorization': 'Bearer ' + _token } : {}) }, + headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: data.excerpt + '\n\n' + (data.text || '').slice(0, 5000), category: c.label }), }); const d = await r.json(); diff --git a/panel/public/style.css b/panel/public/style.css index f75b1ea..7d477a7 100644 --- a/panel/public/style.css +++ b/panel/public/style.css @@ -104,21 +104,43 @@ textarea { resize: vertical; min-height: 80px; } .card button { width: 100%; margin-top: 20px; } .topbar { + background: white; + border-bottom: 1px solid var(--rule); + position: sticky; + top: 0; + z-index: 10; +} +.topbar-row { display: flex; justify-content: space-between; align-items: center; - padding: 16px 32px; - background: white; + padding: 12px 32px; border-bottom: 1px solid var(--rule); } .topbar .brand { font-weight: 900; font-size: 15px; letter-spacing: -.3px; } .topbar .actions { display: flex; gap: 10px; } -.tabs { +.groups { display: flex; gap: 4px; - flex: 1; - justify-content: center; +} +.groups .group-btn { + border: 1px solid var(--rule); + background: transparent; + color: var(--ink-3); + font-size: 13px; + font-weight: 700; + padding: 6px 16px; + border-radius: 20px; +} +.groups .group-btn:hover { background: var(--rule); color: var(--ink); } +.groups .group-btn.group-active { background: var(--ink); color: var(--paper); border-color: var(--ink); } + +.tabs { + display: flex; + gap: 0; + padding: 0 32px; + background: white; } .tabs button { border: none; @@ -126,18 +148,12 @@ textarea { resize: vertical; min-height: 80px; } color: var(--ink-3); font-size: 13px; font-weight: 700; - padding: 8px 18px; + padding: 10px 16px; border-bottom: 2px solid transparent; border-radius: 0; } -.tabs button:hover { - background: transparent; - color: var(--ink); -} -.tabs button.tab-active { - color: var(--ink); - border-bottom-color: var(--red); -} +.tabs button:hover { background: transparent; color: var(--ink); } +.tabs button.tab-active { color: var(--ink); border-bottom-color: var(--red); } .risk-row { grid-template-columns: 1fr auto; } .risk-row .row-meta strong { font-size: 13px; } @@ -149,7 +165,50 @@ textarea { resize: vertical; min-height: 80px; } .pill.level-opportunity { background: #1e40af; color: white; } .page { max-width: 1100px; margin: 0 auto; padding: 32px; } -.page h2 { font-size: 22px; letter-spacing: -.5px; margin: 0 0 24px; } +.page h2 { font-size: 22px; letter-spacing: -.5px; margin: 0 0 16px; } + +.cat-bar { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-bottom: 20px; +} +.cat-btn { + padding: 4px 12px; + border-radius: 20px; + border: 1px solid var(--rule); + background: transparent; + color: var(--fg); + font-size: 12px; + cursor: pointer; + transition: background .15s, color .15s; +} +.cat-btn:hover { background: var(--rule); } +.cat-btn.active { background: var(--accent, #2563eb); color: #fff; border-color: transparent; } + +.type-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 16px; + margin-top: 8px; +} +.type-card { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 6px; + padding: 20px 20px 18px; + border: 1px solid var(--rule); + border-radius: 4px; + background: white; + cursor: pointer; + text-align: right; + transition: border-color .15s, box-shadow .15s; +} +.type-card:hover { border-color: var(--ink); box-shadow: 0 2px 8px rgba(0,0,0,.08); background: white; color: var(--ink); } +.type-icon { font-size: 28px; line-height: 1; } +.type-card strong { font-size: 15px; font-weight: 800; } +.type-desc { font-size: 12px; color: var(--ink-5); font-weight: 400; line-height: 1.4; } .list { display: flex; diff --git a/panel/scraper.js b/panel/scraper.js index b75bc9a..98e3aba 100644 --- a/panel/scraper.js +++ b/panel/scraper.js @@ -136,8 +136,8 @@ export async function scrapeOnce() { // At least one source returned — replace the rows from those sources only. // This way a temporary failure of one page doesn't wipe the other's data. for (const { src, items } of successful) { - db.prepare('DELETE FROM prices WHERE source_url = ?').run(src.url); - for (const it of items) upsertPrice(it); + await db.prepare('DELETE FROM prices WHERE source_url = ?').run(src.url); + for (const it of items) await upsertPrice(it); } return successful.reduce((s, x) => s + x.items.length, 0); } diff --git a/panel/seed-content.js b/panel/seed-content.js index 3ba0a2a..1262cee 100644 --- a/panel/seed-content.js +++ b/panel/seed-content.js @@ -1,702 +1,184 @@ -/** - * One-shot content seeder — run once: - * node panel/seed-content.js - * - * Inserts (or replaces) all hardcoded frontend content into the panel DB. - * Safe to re-run; uses INSERT OR REPLACE throughout. - */ -import { db } from './db.js'; +// panel/seed-content.js +// Run: node panel/seed-content.js +// Seeds all hardcoded frontend content into the panel DB via the REST API. +// Idempotent: skips any endpoint that already has data. -const seed = db.transaction(() => { +const BASE = process.env.SEED_BASE || `http://localhost:${process.env.PORT || 3000}`; +const USERNAME = process.env.ADMIN_USERNAME || 'admin'; +const PASSWORD = process.env.ADMIN_PASSWORD || 'Andishkade1403'; - /* ─── REPORTS → articles table ─────────────────────────────── */ - const upsertArticle = db.prepare(` - INSERT OR REPLACE INTO articles - (id, title, category, type, author, author_role, author_initial, - publish_date, pages, price, is_free, summary, tags, featured, - created_at, updated_at) - VALUES - (@id, @title, @category, @type, @author, @author_role, @author_initial, - @publish_date, @pages, @price, @is_free, @summary, @tags, @featured, - datetime('now'), datetime('now')) - `); +let cookie = ''; - const reports = [ - { - id: 'iran-steel-global-trade-scenarios-1404', - title: 'ایران در نقشه جدید تجارت فولاد جهان: چهار سناریو برای ۱۴۰۴', - category: 'بازار جهانی', type: 'special', - author: 'دکتر علی محمدی', author_role: 'مدیر ارشد پژوهش', author_initial: 'م', - publish_date: 'بهمن ۱۴۰۳', pages: 84, price: 850000, is_free: 0, featured: 1, - summary: 'این گزارش ویژه با تحلیل روندهای کلان اقتصاد جهانی، چهار سناریوی محتمل برای جایگاه صادرات فولاد ایران در سال ۱۴۰۴ را بررسی می‌کند. مدل‌سازی کمی بر اساس داده‌های تجارت ۱۵ کشور رقیب انجام شده و توصیه‌های سیاست‌گذاری مشخص ارائه می‌دهد.', - tags: JSON.stringify(['تجارت جهانی', 'سناریوسازی', 'صادرات', 'سیاست‌گذاری', '۱۴۰۴']), - }, - { - id: 'steel-energy-consumption-efficiency-1403', - title: 'مصرف انرژی در فولادسازی ایران: مقایسه با استانداردهای جهانی', - category: 'انرژی و ESG', type: 'free', - author: 'مهندس سارا رضایی', author_role: 'پژوهشگر ارشد انرژی', author_initial: 'ر', - publish_date: 'دی ۱۴۰۳', pages: 28, price: 0, is_free: 1, featured: 0, - summary: 'این گزارش رایگان مصرف انرژی واحدهای فولادسازی ایران را با میانگین جهانی و استانداردهای IEA مقایسه می‌کند. شکاف بهره‌وری انرژی در کوره‌های قوس الکتریکی و کنورتور شناسایی شده است.', - tags: JSON.stringify(['انرژی', 'بهره‌وری', 'ESG', 'کوره قوس الکتریکی', 'استاندارد جهانی']), - }, - { - id: 'global-steel-market-q3-1403', - title: 'گزارش فصلی بازار جهانی فولاد: پاییز ۱۴۰۳', - category: 'بازار جهانی', type: 'quarterly', - author: 'دکتر حسین کریمی', author_role: 'تحلیلگر ارشد بازار', author_initial: 'ک', - publish_date: 'آذر ۱۴۰۳', pages: 52, price: 450000, is_free: 0, featured: 0, - summary: 'تحلیل جامع قیمت‌ها، تقاضا و عرضه در بازار جهانی فولاد طی فصل پاییز ۱۴۰۳. روند کاهش تقاضای چین و افزایش ظرفیت تولید هند به‌تفصیل بررسی شده است. چشم‌انداز قیمتی برای زمستان ۱۴۰۳ نیز ارائه می‌شود.', - tags: JSON.stringify(['بازار جهانی', 'قیمت‌گذاری', 'چین', 'هند', 'پاییز ۱۴۰۳']), - }, - { - id: 'iran-steel-export-sanctions-impact-1403', - title: 'اثر تحریم‌های جدید بر مسیرهای صادراتی فولاد ایران', - category: 'صادرات', type: 'risk', - author: 'دکتر فاطمه احمدی', author_role: 'مدیر تحقیقات ریسک', author_initial: 'ا', - publish_date: 'آذر ۱۴۰۳', pages: 36, price: 380000, is_free: 0, featured: 0, - summary: 'این گزارش اثرات بسته تحریمی اخیر بر کانال‌های صادرات فولاد ایران به بازارهای منطقه‌ای را ارزیابی می‌کند. ریسک‌های لجستیکی، بانکی و قراردادی مستند شده است.', - tags: JSON.stringify(['تحریم', 'صادرات', 'ریسک', 'لجستیک', 'بازارهای منطقه‌ای']), - }, - { - id: 'flash-iron-ore-price-surge-1403', - title: 'فلش: جهش قیمت سنگ‌آهن و تأثیر بر هزینه تمام‌شده فولاد ایران', - category: 'بازار جهانی', type: 'flash', - author: 'مهندس رضا توکلی', author_role: 'تحلیلگر بازار کامودیتی', author_initial: 'ت', - publish_date: 'آبان ۱۴۰۳', pages: 12, price: 120000, is_free: 0, featured: 0, - summary: 'گزارش فوری درباره افزایش ۱۸ درصدی قیمت سنگ‌آهن در بورس دالیان و اثر فوری آن بر هزینه تمام‌شده تولید فولاد در ایران. برآورد اثر بر حاشیه سود کارخانه‌های داخلی ارائه شده است.', - tags: JSON.stringify(['سنگ‌آهن', 'قیمت', 'هزینه تمام‌شده', 'فوری']), - }, - { - id: 'domestic-production-dri-outlook-1403', - title: 'چشم‌انداز تولید آهن احیای مستقیم ایران تا افق ۱۴۰۵', - category: 'تولید داخلی', type: 'quarterly', - author: 'دکتر علی محمدی', author_role: 'مدیر ارشد پژوهش', author_initial: 'م', - publish_date: 'مهر ۱۴۰۳', pages: 44, price: 420000, is_free: 0, featured: 0, - summary: 'ایران با بیش از ۳۰ میلیون تن ظرفیت DRI، رتبه اول جهان را دارد؛ این گزارش مسیر توسعه این صنعت تا ۱۴۰۵ را مدل‌سازی می‌کند. بررسی پروژه‌های در دست احداث و موانع تأمین گاز به‌تفصیل آمده است.', - tags: JSON.stringify(['DRI', 'آهن احیای مستقیم', 'ظرفیت', 'تولید', 'گاز طبیعی']), - }, - { - id: 'esg-carbon-emissions-steel-iran-1403', - title: 'کربن‌زدایی در صنعت فولاد ایران: الزامات و فرصت‌ها', - category: 'انرژی و ESG', type: 'special', - author: 'مهندس سارا رضایی', author_role: 'پژوهشگر ارشد انرژی', author_initial: 'ر', - publish_date: 'شهریور ۱۴۰۳', pages: 58, price: 520000, is_free: 0, featured: 0, - summary: 'الزامات آینده CBAM اتحادیه اروپا و اثر آن بر رقابت‌پذیری صادرات فولاد ایران تحلیل شده است. مسیرهای فناوری کربن‌زدایی شامل هیدروژن سبز و CCS برای شرایط ایران ارزیابی شده‌اند.', - tags: JSON.stringify(['ESG', 'کربن', 'CBAM', 'هیدروژن سبز', 'محیط زیست']), - }, - { - id: 'policy-steel-pricing-reform-1403', - title: 'اصلاح ساختار قیمت‌گذاری فولاد: درس‌هایی از تجربه ترکیه و هند', - category: 'سیاست‌گذاری', type: 'quarterly', - author: 'دکتر فاطمه احمدی', author_role: 'مدیر تحقیقات ریسک', author_initial: 'ا', - publish_date: 'مرداد ۱۴۰۳', pages: 46, price: 390000, is_free: 0, featured: 0, - summary: 'مقایسه تطبیقی ساختار قیمت‌گذاری فولاد در ایران، ترکیه و هند با تمرکز بر نقش دولت و مکانیسم‌های بازار. اثربخشی سیاست‌های قیمت‌گذاری دستوری در حفظ تعادل عرضه-تقاضا ارزیابی شده است.', - tags: JSON.stringify(['سیاست‌گذاری', 'قیمت‌گذاری', 'ترکیه', 'هند', 'اصلاح ساختار']), - }, - { - id: 'flash-china-steel-overcapacity-1403', - title: 'فلش: مازاد ظرفیت فولاد چین و موج صادراتی به آسیای غربی', - category: 'بازار جهانی', type: 'flash', - author: 'دکتر حسین کریمی', author_role: 'تحلیلگر ارشد بازار', author_initial: 'ک', - publish_date: 'تیر ۱۴۰۳', pages: 10, price: 110000, is_free: 0, featured: 0, - summary: 'چین در نیمه اول ۲۰۲۴ رکورد صادرات فولاد را با ۵۴ میلیون تن شکست. این گزارش فوری تأثیر مستقیم این موج صادراتی بر بازارهای ایران، عراق و امارات را تحلیل می‌کند.', - tags: JSON.stringify(['چین', 'مازاد ظرفیت', 'صادرات', 'آسیای غربی', 'رقابت']), - }, - { - id: 'risk-geopolitical-middle-east-steel-1403', - title: 'ریسک‌های ژئوپلیتیک خاورمیانه و زنجیره تأمین فولاد ایران', - category: 'ریسک و بحران', type: 'risk', - author: 'دکتر فاطمه احمدی', author_role: 'مدیر تحقیقات ریسک', author_initial: 'ا', - publish_date: 'خرداد ۱۴۰۳', pages: 40, price: 360000, is_free: 0, featured: 0, - summary: 'تحلیل ریسک ژئوپلیتیک منطقه خاورمیانه بر امنیت زنجیره تأمین فولاد ایران از زاویه واردات مواد اولیه و صادرات محصول نهایی. سناریوهای بحران در مسیرهای دریایی خلیج فارس و دریای سرخ مدل‌سازی شده‌اند.', - tags: JSON.stringify(['ژئوپلیتیک', 'خاورمیانه', 'زنجیره تأمین', 'ریسک', 'دریای سرخ']), - }, - { - id: 'export-iraq-market-analysis-1403', - title: 'تحلیل بازار فولاد عراق: فرصت‌های صادراتی ایران', - category: 'صادرات', type: 'quarterly', - author: 'مهندس رضا توکلی', author_role: 'تحلیلگر بازار کامودیتی', author_initial: 'ت', - publish_date: 'اردیبهشت ۱۴۰۳', pages: 38, price: 340000, is_free: 0, featured: 0, - summary: 'عراق با تقاضای سالانه بیش از ۵ میلیون تن فولاد، مهم‌ترین بازار صادراتی ایران است. این گزارش رقابت‌پذیری فولاد ایران در برابر رقبای ترکیه، چین و اوکراین در بازار عراق را ارزیابی می‌کند.', - tags: JSON.stringify(['عراق', 'صادرات', 'بازار', 'رقابت‌پذیری', 'میلگرد']), - }, - { - id: 'domestic-capacity-utilization-1402', - title: 'ظرفیت بهره‌برداری واحدهای فولادسازی ایران: آسیب‌شناسی و راهکار', - category: 'تولید داخلی', type: 'quarterly', - author: 'دکتر علی محمدی', author_role: 'مدیر ارشد پژوهش', author_initial: 'م', - publish_date: 'فروردین ۱۴۰۳', pages: 50, price: 410000, is_free: 0, featured: 0, - summary: 'میانگین ضریب بهره‌برداری کارخانه‌های فولادسازی ایران به ۶۸ درصد رسیده که پایین‌تر از میانگین جهانی ۷۶ درصد است. این گزارش موانع عملیاتی، تأمین مواد اولیه و بازار را شناسایی کرده است.', - tags: JSON.stringify(['ظرفیت', 'بهره‌برداری', 'کارایی', 'تولید', 'کارخانه']), - }, - { - id: 'flash-rebar-demand-construction-1402', - title: 'فلش: کاهش تقاضای میلگرد در بخش ساختمانی و اثر بر کارخانه‌ها', - category: 'تولید داخلی', type: 'flash', - author: 'مهندس سارا رضایی', author_role: 'پژوهشگر ارشد انرژی', author_initial: 'ر', - publish_date: 'اسفند ۱۴۰۲', pages: 14, price: 115000, is_free: 0, featured: 0, - summary: 'رکود در بازار مسکن منجر به کاهش ۱۲ درصدی تقاضای میلگرد در زمستان ۱۴۰۲ شده است. این گزارش فوری اثر این کاهش بر درآمد و برنامه تولید کارخانه‌های میلگردساز را ارزیابی می‌کند.', - tags: JSON.stringify(['میلگرد', 'ساختمان', 'تقاضا', 'رکود', 'تولید داخلی']), - }, - { - id: 'policy-privatization-steel-companies-1402', - title: 'واگذاری شرکت‌های فولادی دولتی: ارزیابی تجربه یک دهه خصوصی‌سازی', - category: 'سیاست‌گذاری', type: 'special', - author: 'دکتر حسین کریمی', author_role: 'تحلیلگر ارشد بازار', author_initial: 'ک', - publish_date: 'بهمن ۱۴۰۲', pages: 62, price: 560000, is_free: 0, featured: 0, - summary: 'ارزیابی جامع نتایج خصوصی‌سازی شرکت‌های فولادی بزرگ ایران در یک دهه گذشته با شاخص‌های بهره‌وری، اشتغال و سرمایه‌گذاری. الگوی بهینه مشارکت دولتی-خصوصی در صنعت فولاد پیشنهاد می‌شود.', - tags: JSON.stringify(['خصوصی‌سازی', 'سیاست‌گذاری', 'دولت', 'مدیریت', 'بهره‌وری']), - }, - { - id: 'risk-water-scarcity-steel-industry-1402', - title: 'بحران آب و تهدیدات پایداری صنعت فولاد ایران', - category: 'ریسک و بحران', type: 'risk', - author: 'مهندس سارا رضایی', author_role: 'پژوهشگر ارشد انرژی', author_initial: 'ر', - publish_date: 'دی ۱۴۰۲', pages: 42, price: 370000, is_free: 0, featured: 0, - summary: 'استرس آبی در کلاستر فولادسازی اصفهان-یزد-خراسان به نقطه بحرانی رسیده است. این گزارش ریسک تعطیلی یا کاهش تولید ناشی از کمبود آب را برای ۱۴ واحد تولیدی ارزیابی می‌کند.', - tags: JSON.stringify(['آب', 'بحران', 'پایداری', 'اصفهان', 'ریسک محیط زیستی']), - }, - { - id: 'global-market-q1-1402', - title: 'گزارش فصلی بازار جهانی فولاد: بهار ۱۴۰۲', - category: 'بازار جهانی', type: 'quarterly', - author: 'دکتر علی محمدی', author_role: 'مدیر ارشد پژوهش', author_initial: 'م', - publish_date: 'تیر ۱۴۰۲', pages: 54, price: 440000, is_free: 0, featured: 0, - summary: 'بررسی روندهای بازار جهانی فولاد در بهار ۱۴۰۲ با تمرکز بر بازگشایی اقتصاد چین و اثرات آن بر قیمت‌ها. تأثیر افزایش نرخ بهره فدرال رزرو بر سرمایه‌گذاری در ساختمان و زیرساخت تحلیل شده است.', - tags: JSON.stringify(['بازار جهانی', 'چین', 'نرخ بهره', 'تقاضا', 'بهار ۱۴۰۲']), - }, - { - id: 'export-africa-emerging-markets-1402', - title: 'فرصت‌های صادرات فولاد ایران به بازارهای نوظهور آفریقا', - category: 'صادرات', type: 'special', - author: 'دکتر فاطمه احمدی', author_role: 'مدیر تحقیقات ریسک', author_initial: 'ا', - publish_date: 'آبان ۱۴۰۲', pages: 48, price: 480000, is_free: 0, featured: 0, - summary: 'آفریقا با رشد سالانه ۶ درصد در تقاضای فولاد، بازار استراتژیک بلندمدت برای صادرکنندگان ایران محسوب می‌شود. این گزارش ۸ بازار هدف اولویت‌دار آفریقایی را با تحلیل ریسک و فرصت معرفی می‌کند.', - tags: JSON.stringify(['آفریقا', 'بازارهای نوظهور', 'صادرات', 'تنوع‌سازی', 'بلندمدت']), - }, - { - id: 'flash-gas-price-hike-steel-cost-1403', - title: 'فلش: اثر افزایش قیمت گاز بر قیمت تمام‌شده فولاد ایران', - category: 'انرژی و ESG', type: 'flash', - author: 'مهندس رضا توکلی', author_role: 'تحلیلگر بازار کامودیتی', author_initial: 'ت', - publish_date: 'شهریور ۱۴۰۳', pages: 11, price: 105000, is_free: 0, featured: 0, - summary: 'افزایش ۳۰ درصدی قیمت گاز صنعتی در مهر ۱۴۰۳ هزینه تولید هر تن DRI را حدود ۱۲۰۰ تومان افزایش می‌دهد. این گزارش فوری اثر این شوک هزینه‌ای بر حاشیه سود تولیدکنندگان DRI و فولاد را محاسبه می‌کند.', - tags: JSON.stringify(['گاز', 'انرژی', 'هزینه تولید', 'DRI', 'قیمت‌گذاری']), - }, - ]; +async function req(path, { method = 'GET', body } = {}) { + const headers = { 'Content-Type': 'application/json' }; + if (cookie) headers['Cookie'] = cookie; + const res = await fetch(`${BASE}${path}`, { + method, headers, + body: body ? JSON.stringify(body) : undefined, + }); + const text = await res.text(); + if (!res.ok) throw new Error(`${method} ${path} → ${res.status}: ${text}`); + const sc = res.headers.get('set-cookie'); + if (sc) cookie = sc.split(';')[0]; + return text ? JSON.parse(text) : null; +} - for (const r of reports) { - upsertArticle.run(r); +async function seedIfEmpty(label, checkPath, items, postFn) { + const existing = await req(checkPath); + if (Array.isArray(existing) && existing.length > 0) { + console.log(` SKIP ${label} (${existing.length} records exist)`); + return; } - console.log(` ✓ ${reports.length} گزارش وارد شد`); - - /* ─── EVENTS ────────────────────────────────────────────────── */ - const upsertEvent = db.prepare(` - INSERT OR REPLACE INTO events - (id, title_fa, date_fa, month_fa, year, type, - location_fa, city_fa, description_fa, registration_open, sort_order, - created_at, updated_at) - VALUES - (@id, @title_fa, @date_fa, @month_fa, @year, @type, - @location_fa, @city_fa, @description_fa, @registration_open, @sort_order, - datetime('now'), datetime('now')) - `); - - const events = [ - { - id: 'iran-steel-congress-1403', - title_fa: 'کنگره بین‌المللی فولاد ایران ۱۴۰۳', - date_fa: '12', month_fa: 'اسفند', year: '1403', - type: 'conference', - location_fa: 'مرکز همایش‌های بین‌المللی تهران', city_fa: 'تهران', - description_fa: 'بزرگ‌ترین گردهمایی سالانه متخصصان، سیاست‌گذاران و فعالان صنعت فولاد ایران با حضور ۱۲۰۰ نفر شرکت‌کننده از ۲۵ کشور.', - registration_open: 1, sort_order: 1, - }, - { - id: 'middle-east-steel-metals-2024', - title_fa: 'Middle East Steel & Metals 2024', - date_fa: '25', month_fa: 'اسفند', year: '1403', - type: 'exhibition', - location_fa: 'مرکز نمایشگاهی دبی ورلد ترید سنتر', city_fa: 'دبی', - description_fa: 'نمایشگاه تخصصی فولاد و فلزات خاورمیانه با حضور بیش از ۳۰۰ شرکت از ۴۰ کشور؛ فرصتی برای معرفی ظرفیت‌های صادراتی صنعت فولاد ایران.', - registration_open: 1, sort_order: 2, - }, - { - id: 'steel-policy-seminar-1404', - title_fa: 'نشست تخصصی سیاست‌گذاری فولاد ۱۴۰۴', - date_fa: '8', month_fa: 'فروردین', year: '1404', - type: 'seminar', - location_fa: 'پژوهشکده توسعه صنعتی ایران', city_fa: 'تهران', - description_fa: 'نشست تخصصی با حضور نمایندگان وزارت صمت، سازمان ایمیدرو و انجمن‌های تخصصی برای بررسی سیاست‌های سال ۱۴۰۴ در صنعت فولاد.', - registration_open: 1, sort_order: 3, - }, - { - id: 'world-steel-forum-2025', - title_fa: 'World Steel Forum 2025', - date_fa: '20', month_fa: 'فروردین', year: '1404', - type: 'international', - location_fa: 'مرکز کنفرانس برلین', city_fa: 'برلین', - description_fa: 'اجلاس سالانه انجمن جهانی فولاد با تمرکز بر کربن‌زدایی، تجارت جهانی و تحولات ساختاری صنعت فولاد تا افق ۲۰۳۰.', - registration_open: 0, sort_order: 4, - }, - { - id: 'iran-metallurgy-expo-1404', - title_fa: 'نمایشگاه متالورژی ایران', - date_fa: '15', month_fa: 'اردیبهشت', year: '1404', - type: 'exhibition', - location_fa: 'نمایشگاه بین‌المللی اصفهان', city_fa: 'اصفهان', - description_fa: 'نمایشگاه تخصصی متالورژی، فولاد و فلزات غیرآهنی ایران با محوریت فناوری‌های نوین تولید و تجهیزات صنعتی.', - registration_open: 0, sort_order: 5, - }, - { - id: 'oecd-steel-summit-2025', - title_fa: 'اجلاس OECD فولاد', - date_fa: '3', month_fa: 'خرداد', year: '1404', - type: 'international', - location_fa: 'دفتر مرکزی OECD', city_fa: 'پاریس', - description_fa: 'نشست سالانه کمیته فولاد OECD برای بررسی مازاد ظرفیت جهانی، سیاست‌های تجاری و استانداردهای پایداری در صنعت فولاد.', - registration_open: 0, sort_order: 6, - }, - ]; - - for (const e of events) { - upsertEvent.run(e); + console.log(` SEED ${label} (${items.length} items)...`); + for (const item of items) { + try { await postFn(item); } + catch (e) { console.warn(` WARN ${label}:`, e.message); } } - console.log(` ✓ ${events.length} رویداد وارد شد`); + console.log(` OK ${label}`); +} - /* ─── TEAM MEMBERS ──────────────────────────────────────────── */ - const upsertTeam = db.prepare(` - INSERT OR REPLACE INTO team_members - (id, name_fa, role_fa, initial, bio_fa, expertise, - email, report_count, is_expert, sort_order, - created_at, updated_at) - VALUES - (@id, @name_fa, @role_fa, @initial, @bio_fa, @expertise, - @email, @report_count, @is_expert, @sort_order, - datetime('now'), datetime('now')) - `); +// ── DATA ────────────────────────────────────────────────────────────────────── - const team = [ - { - id: 'ali-mohammadi', - name_fa: 'دکتر علی محمدی', role_fa: 'مدیر ارشد پژوهش', initial: 'م', - bio_fa: 'دکتری اقتصاد صنعتی از دانشگاه تهران با بیش از ۱۸ سال تجربه در تحلیل بازارهای فولاد و فلزات. پیش از پیوستن به اندیشکده، مشاور ارشد سازمان توسعه و نوسازی معادن و صنایع معدنی ایران (ایمیدرو) بوده است. بیش از ۵۰ گزارش تحلیلی و ۱۲ مقاله علمی در حوزه اقتصاد فولاد منتشر کرده است.', - expertise: JSON.stringify(['اقتصاد صنعتی', 'تحلیل بازار فولاد', 'سیاست‌گذاری صنعتی', 'مدل‌سازی اقتصادی', 'تجارت بین‌الملل']), - email: 'mohammadi@andishkade-foolad.ir', - report_count: 52, is_expert: 0, sort_order: 1, - }, - { - id: 'fateme-ahmadi', - name_fa: 'دکتر فاطمه احمدی', role_fa: 'مدیر تحقیقات ریسک', initial: 'ا', - bio_fa: 'دکتری مدیریت ریسک از دانشگاه علم و صنعت ایران با تخصص در ارزیابی ریسک‌های ژئوپلیتیک و زنجیره تأمین. سابقه مشاوره به چندین شرکت بزرگ فولادی کشور در حوزه مدیریت ریسک تجاری و قراردادی را دارد. نویسنده کتاب «مدیریت ریسک در صنایع معدنی و فلزی» است.', - expertise: JSON.stringify(['مدیریت ریسک', 'تحریم‌پژوهی', 'ژئوپلیتیک انرژی', 'تأمین مالی پروژه', 'مذاکرات تجاری']), - email: 'ahmadi@andishkade-foolad.ir', - report_count: 38, is_expert: 0, sort_order: 2, - }, - { - id: 'hosein-karimi', - name_fa: 'دکتر حسین کریمی', role_fa: 'تحلیلگر ارشد بازار', initial: 'ک', - bio_fa: 'دکتری مهندسی مواد از دانشگاه صنعتی اصفهان با تخصص ترکیبی در متالورژی و اقتصاد بازار کامودیتی‌ها. پنج سال سابقه کار در واحد پژوهش و توسعه فولاد مبارکه اصفهان دارد. به‌طور منظم گزارش‌های فصلی بازار جهانی فولاد را تهیه و منتشر می‌کند.', - expertise: JSON.stringify(['بازار جهانی فولاد', 'قیمت‌گذاری کامودیتی', 'متالورژی صنعتی', 'پیش‌بینی تقاضا', 'بازارهای آسیایی']), - email: 'karimi@andishkade-foolad.ir', - report_count: 41, is_expert: 0, sort_order: 3, - }, - { - id: 'sara-rezaei', - name_fa: 'مهندس سارا رضایی', role_fa: 'پژوهشگر ارشد انرژی', initial: 'ر', - bio_fa: 'کارشناسی ارشد مهندسی انرژی از دانشگاه شریف با تمرکز بر بهینه‌سازی مصرف انرژی در صنایع سنگین. تجربه عملیاتی در حسابرسی انرژی کارخانه‌های فولادی در اصفهان، خراسان و هرمزگان دارد.', - expertise: JSON.stringify(['انرژی صنعتی', 'ESG و پایداری', 'کربن‌زدایی', 'بهره‌وری انرژی', 'مقررات زیست‌محیطی']), - email: 'rezaei@andishkade-foolad.ir', - report_count: 29, is_expert: 0, sort_order: 4, - }, - { - id: 'reza-tavakoli', - name_fa: 'مهندس رضا توکلی', role_fa: 'تحلیلگر بازار کامودیتی', initial: 'ت', - bio_fa: 'کارشناسی ارشد اقتصاد از دانشگاه تهران با تخصص در تحلیل بنیادی و تکنیکال بازارهای کامودیتی. سابقه فعالیت در کارگزاری‌های بورس کالا و تهیه گزارش‌های فوری برای معامله‌گران فولاد را دارد.', - expertise: JSON.stringify(['بورس کالا', 'تحلیل تکنیکال', 'بازارهای آتی', 'قیمت‌گذاری سنگ‌آهن', 'بازار داخلی فولاد']), - email: 'tavakoli@andishkade-foolad.ir', - report_count: 34, is_expert: 0, sort_order: 5, - }, - { - id: 'maryam-hosseini', - name_fa: 'دکتر مریم حسینی', role_fa: 'پژوهشگر ارشد صادرات', initial: 'ح', - bio_fa: 'دکتری بازاریابی بین‌الملل از دانشگاه الزهرا با تجربه گسترده در مطالعات بازارهای صادراتی آسیا، آفریقا و اروپای شرقی. پیش از این در اتاق بازرگانی ایران و کمیته فولاد آن مشغول به فعالیت بوده است.', - expertise: JSON.stringify(['بازاریابی بین‌الملل', 'توسعه صادرات', 'بازار آفریقا و آسیا', 'استراتژی بازار', 'مذاکرات تجاری']), - email: 'hosseini@andishkade-foolad.ir', - report_count: 22, is_expert: 0, sort_order: 6, - }, - ]; +const EVENTS = [ + { titleFa: 'کنگره بین‌المللی فولاد ایران ۱۴۰۳', titleEn: 'Iran International Steel Congress 1403', dateFa: '12', dateEn: '12', monthFa: 'اسفند', monthEn: 'March', year: 1403, type: 'conference', locationFa: 'مرکز همایش‌های بین‌المللی تهران', locationEn: 'Tehran International Conference Centre', cityFa: 'تهران', cityEn: 'Tehran', descriptionFa: 'بزرگ‌ترین گردهمایی سالانه متخصصان، سیاست‌گذاران و فعالان صنعت فولاد ایران با حضور ۱۲۰۰ نفر شرکت‌کننده از ۲۵ کشور.', descriptionEn: 'The largest annual gathering of Iran steel industry specialists — 1,200 participants from 25 countries.', registrationOpen: 1, sortOrder: 1 }, + { titleFa: 'Middle East Steel & Metals 2024', titleEn: 'Middle East Steel & Metals 2024', dateFa: '25', dateEn: '25', monthFa: 'اسفند', monthEn: 'March', year: 1403, type: 'exhibition', locationFa: 'مرکز نمایشگاهی دبی ورلد ترید سنتر', locationEn: 'Dubai World Trade Centre', cityFa: 'دبی', cityEn: 'Dubai', descriptionFa: 'نمایشگاه تخصصی فولاد و فلزات خاورمیانه با حضور بیش از ۳۰۰ شرکت از ۴۰ کشور.', descriptionEn: 'Middle East steel and metals exhibition — 300+ companies from 40 countries.', registrationOpen: 1, sortOrder: 2 }, + { titleFa: 'نشست تخصصی سیاست‌گذاری فولاد ۱۴۰۴', titleEn: 'Steel Policy Seminar 1404', dateFa: '8', dateEn: '8', monthFa: 'فروردین', monthEn: 'April', year: 1404, type: 'seminar', locationFa: 'پژوهشکده توسعه صنعتی ایران', locationEn: 'Iran Industrial Development Research Institute', cityFa: 'تهران', cityEn: 'Tehran', descriptionFa: 'نشست تخصصی با حضور نمایندگان وزارت صمت، سازمان ایمیدرو و انجمن‌های تخصصی.', descriptionEn: 'Expert session with representatives from MIMT, IMIDRO and industry associations.', registrationOpen: 1, sortOrder: 3 }, + { titleFa: 'World Steel Forum 2025', titleEn: 'World Steel Forum 2025', dateFa: '20', dateEn: '20', monthFa: 'فروردین', monthEn: 'April', year: 1404, type: 'international', locationFa: 'مرکز کنفرانس برلین', locationEn: 'Berlin Conference Centre', cityFa: 'برلین', cityEn: 'Berlin', descriptionFa: 'اجلاس سالانه انجمن جهانی فولاد با تمرکز بر کربن‌زدایی، تجارت جهانی و تحولات ساختاری.', descriptionEn: 'World Steel Association annual summit on decarbonisation, global trade and structural change.', registrationOpen: 0, sortOrder: 4 }, + { titleFa: 'نمایشگاه متالورژی ایران', titleEn: 'Iran Metallurgy Expo', dateFa: '15', dateEn: '15', monthFa: 'اردیبهشت', monthEn: 'May', year: 1404, type: 'exhibition', locationFa: 'نمایشگاه بین‌المللی اصفهان', locationEn: 'Isfahan International Exhibition', cityFa: 'اصفهان', cityEn: 'Isfahan', descriptionFa: 'نمایشگاه تخصصی متالورژی، فولاد و فلزات غیرآهنی ایران با فناوری‌های نوین تولید.', descriptionEn: 'Specialised Iran metallurgy, steel and non-ferrous metals exhibition.', registrationOpen: 0, sortOrder: 5 }, + { titleFa: 'اجلاس OECD فولاد', titleEn: 'OECD Steel Summit', dateFa: '3', dateEn: '3', monthFa: 'خرداد', monthEn: 'June', year: 1404, type: 'international', locationFa: 'دفتر مرکزی OECD', locationEn: 'OECD Headquarters', cityFa: 'پاریس', cityEn: 'Paris', descriptionFa: 'نشست سالانه کمیته فولاد OECD برای بررسی مازاد ظرفیت جهانی و استانداردهای پایداری.', descriptionEn: 'OECD Steel Committee annual session on global overcapacity and sustainability standards.', registrationOpen: 0, sortOrder: 6 }, +]; - for (const m of team) { - upsertTeam.run(m); +const TEAM = [ + { nameFa: 'دکتر علی محمدی', nameEn: 'Dr. Ali Mohammadi', roleFa: 'مدیر ارشد پژوهش', roleEn: 'Chief Research Officer', initial: 'م', bioFa: 'دکتری اقتصاد صنعتی از دانشگاه تهران با بیش از ۱۸ سال تجربه در تحلیل بازارهای فولاد و فلزات.', bioEn: 'PhD in Industrial Economics from University of Tehran, 18+ years in steel/metals market analysis.', expertise: ['اقتصاد صنعتی','تحلیل بازار فولاد','سیاست‌گذاری صنعتی','مدل‌سازی اقتصادی','تجارت بین‌الملل'], reportCount: 52, email: 'mohammadi@andishkade-foolad.ir', isExpert: 0, sortOrder: 1 }, + { nameFa: 'دکتر فاطمه احمدی', nameEn: 'Dr. Fatemeh Ahmadi', roleFa: 'مدیر تحقیقات ریسک', roleEn: 'Risk Research Director', initial: 'ا', bioFa: 'دکتری مدیریت ریسک از دانشگاه علم و صنعت ایران با تخصص در ارزیابی ریسک‌های ژئوپلیتیک.', bioEn: 'PhD in Risk Management from IUST, specialising in geopolitical and supply-chain risk.', expertise: ['مدیریت ریسک','تحریم‌پژوهی','ژئوپلیتیک انرژی','تأمین مالی پروژه','مذاکرات تجاری'], reportCount: 38, email: 'ahmadi@andishkade-foolad.ir', isExpert: 0, sortOrder: 2 }, + { nameFa: 'دکتر حسین کریمی', nameEn: 'Dr. Hossein Karimi', roleFa: 'تحلیلگر ارشد بازار', roleEn: 'Senior Market Analyst', initial: 'ک', bioFa: 'دکتری مهندسی مواد از دانشگاه صنعتی اصفهان با تخصص در متالورژی و اقتصاد بازار کامودیتی‌ها.', bioEn: 'PhD in Materials Engineering from Isfahan UT, combined expertise in metallurgy and commodity economics.', expertise: ['بازار جهانی فولاد','قیمت‌گذاری کامودیتی','متالورژی صنعتی','پیش‌بینی تقاضا','بازارهای آسیایی'], reportCount: 41, email: 'karimi@andishkade-foolad.ir', isExpert: 0, sortOrder: 3 }, + { nameFa: 'مهندس سارا رضایی', nameEn: 'Eng. Sara Rezaei', roleFa: 'پژوهشگر ارشد انرژی', roleEn: 'Senior Energy Researcher', initial: 'ر', bioFa: 'کارشناسی ارشد مهندسی انرژی از دانشگاه شریف با تمرکز بر بهینه‌سازی مصرف انرژی در صنایع سنگین.', bioEn: 'MSc in Energy Engineering from Sharif UT, focusing on energy optimisation in heavy industry.', expertise: ['انرژی صنعتی','ESG و پایداری','کربن‌زدایی','بهره‌وری انرژی','مقررات زیست‌محیطی'], reportCount: 29, email: 'rezaei@andishkade-foolad.ir', isExpert: 0, sortOrder: 4 }, + { nameFa: 'مهندس رضا توکلی', nameEn: 'Eng. Reza Tavakoli', roleFa: 'تحلیلگر بازار کامودیتی', roleEn: 'Commodity Market Analyst', initial: 'ت', bioFa: 'کارشناسی ارشد اقتصاد از دانشگاه تهران با تخصص در تحلیل بنیادی و تکنیکال بازارهای کامودیتی.', bioEn: 'MSc in Economics from University of Tehran, specialising in fundamental and technical commodity analysis.', expertise: ['بورس کالا','تحلیل تکنیکال','بازارهای آتی','قیمت‌گذاری سنگ‌آهن','بازار داخلی فولاد'], reportCount: 34, email: 'tavakoli@andishkade-foolad.ir', isExpert: 0, sortOrder: 5 }, + { nameFa: 'دکتر مریم حسینی', nameEn: 'Dr. Maryam Hosseini', roleFa: 'پژوهشگر ارشد صادرات', roleEn: 'Senior Export Researcher', initial: 'ح', bioFa: 'دکتری بازاریابی بین‌الملل از دانشگاه الزهرا با تجربه گسترده در بازارهای صادراتی آسیا، آفریقا و اروپای شرقی.', bioEn: 'PhD in International Marketing from Alzahra University, extensive experience in Asia, Africa and Eastern Europe export markets.', expertise: ['بازاریابی بین‌الملل','توسعه صادرات','بازار آفریقا و آسیا','استراتژی بازار','مذاکرات تجاری'], reportCount: 22, email: 'hosseini@andishkade-foolad.ir', isExpert: 0, sortOrder: 6 }, +]; + +const PLANS = [ + { nameFa: 'فردی', nameEn: 'Individual', price: 350000, periodFa: 'ماهانه', periodEn: 'Monthly', features: ['دسترسی به تمام گزارش‌های پایه','دانلود ۵ گزارش در ماه','دریافت خبرنامه هفتگی','دسترسی به داده‌های قیمت لحظه‌ای','آرشیو ۱۲ ماه گذشته'], isFeatured: 0, ctaFa: 'شروع اشتراک', ctaEn: 'Start subscription', sortOrder: 1 }, + { nameFa: 'سازمانی', nameEn: 'Organisational', price: 1200000, periodFa: 'ماهانه', periodEn: 'Monthly', features: ['دسترسی کامل به تمام گزارش‌ها','دانلود نامحدود گزارش','دسترسی برای ۵ کاربر همزمان','گزارش‌های ویژه و تحلیل‌های فوری','آرشیو کامل از ابتدای تأسیس','مشاوره تلفنی ماهانه با تحلیلگران','داشبورد اختصاصی تحلیل بازار'], badgeFa: 'پرطرفدار', badgeEn: 'Popular', isFeatured: 1, ctaFa: 'شروع اشتراک', ctaEn: 'Start subscription', sortOrder: 2 }, + { nameFa: 'وزارتخانه', nameEn: 'Ministry', price: 0, periodFa: 'سالانه', periodEn: 'Annual', features: ['دسترسی نامحدود برای تمام کارکنان','سفارش گزارش‌های تحلیلی اختصاصی','نشست‌های تخصصی حضوری با تیم پژوهشی','پشتیبانی اولویت‌دار ۲۴/۷','داشبورد تصمیم‌گیری یکپارچه','API اتصال به سیستم‌های داخلی','آموزش و کارگاه‌های تخصصی دوره‌ای','گزارش‌دهی سفارشی برای سیاست‌گذاران'], isFeatured: 0, ctaFa: 'درخواست مشاوره', ctaEn: 'Request consultation', sortOrder: 3 }, +]; + +const BANNERS = [ + { position: 'featured', active: 1, image: '/Horizontal_Book_Mockup_6 1.webp', ctaUrl: '', overlineFa: 'ماهنامه شماره ۱۲ منتشر شد...', titleFa: 'دیپلماسی معدنی در عصر انسدادهای ژئوپلیتیک', subtitleFa: 'Mineral Diplomacy in the Era of Geopolitical Blockades', ctaLabelFa: 'دانلود گزارش', overlineEn: 'Monthly issue #12 is out...', titleEn: 'Mineral Diplomacy in the Era of Geopolitical Blockades', subtitleEn: 'دیپلماسی معدنی در عصر انسدادهای ژئوپلیتیک', ctaLabelEn: 'Download report', sortOrder: 1 }, +]; + +const VISION_ITEMS = [ + { icon: 'FlaskConical', titleFa: 'پیشرو در پژوهش', titleEn: 'Research Leadership', descFa: 'تولید تحلیل‌های راهبردی و گزارش‌های تخصصی در حوزه صنعت فولاد', descEn: 'Producing strategic analyses and specialised reports in the steel industry', sortOrder: 1 }, + { icon: 'Network', titleFa: 'شبکه‌سازی خبرگان', titleEn: 'Expert Networking', descFa: 'ایجاد پیوند میان متخصصان، سیاست‌گذاران و فعالان صنعتی', descEn: 'Building connections between specialists, policymakers, and industry practitioners', sortOrder: 2 }, + { icon: 'Leaf', titleFa: 'فولاد سبز', titleEn: 'Green Steel', descFa: 'ترویج رویکردهای پایدار و کاهش اثرات زیست‌محیطی در زنجیره فولاد', descEn: 'Promoting sustainable approaches and reducing environmental impacts across the steel chain', sortOrder: 3 }, + { icon: 'Telescope', titleFa: 'آینده‌پژوهی', titleEn: 'Futures Research', descFa: 'رصد هوشمند تحولات جهانی و ارائه نقشه راه برای صنعت ایران', descEn: "Smart monitoring of global developments and providing roadmaps for Iran's industry", sortOrder: 4 }, +]; + +const ADVISORY_BOARD = [ + { nameFa: 'دکتر علیرضا اکبریان', nameEn: 'Dr. Alireza Akbarian', roleFa: 'مدیر اندیشکده', roleEn: 'Institute Director', sortOrder: 1 }, + { nameFa: 'مهندس سارا محمدی', nameEn: 'Eng. Sara Mohammadi', roleFa: 'پژوهشگر ارشد فولاد سبز', roleEn: 'Senior Green Steel Researcher', sortOrder: 2 }, + { nameFa: 'دکتر محمد جلالی', nameEn: 'Dr. Mohammad Jalali', roleFa: 'تحلیلگر بازارهای جهانی', roleEn: 'Global Markets Analyst', sortOrder: 3 }, + { nameFa: 'دکتر فاطمه رضایی', nameEn: 'Dr. Fatemeh Rezaei', roleFa: 'متخصص ژئوپلیتیک صنعتی', roleEn: 'Industrial Geopolitics Specialist', sortOrder: 4 }, + { nameFa: 'مهندس رضا کریمی', nameEn: 'Eng. Reza Karimi', roleFa: 'کارشناس فناوری و نوآوری', roleEn: 'Technology & Innovation Expert', sortOrder: 5 }, + { nameFa: 'دکتر نیلوفر حسینی', nameEn: 'Dr. Niloofar Hosseini', roleFa: 'پژوهشگر آینده‌پژوهی', roleEn: 'Futures Research Specialist', sortOrder: 6 }, +]; + +const VIDEOS = [ + { title: 'نگاهی به آن سوی مرزهای تولید', author: 'مهندس سیامک فجری', summary: 'فراتر از داده‌های خام قیمت و تناژ، به سراغ مهندسی تغییر و معماری آینده صنعت می‌رویم.', type: 'video', category: 'تولید داخلی', publishDate: '۲۵ خرداد ۱۴۰۵', coverImage: '/news/photo-1504307651254-35680f356dfd.jpg', isFree: true, tags: ['EP.12','ویدیوکست'] }, + { title: 'تحلیل بازار جهانی فلزات پایه', author: 'دکتر نیلوفر احمدی', summary: 'نوسانات قیمت مس، آلومینیوم و روی و تأثیر آن بر زنجیره ارزش فولاد.', type: 'video', category: 'بازار جهانی', publishDate: '۱۸ خرداد ۱۴۰۵', coverImage: '/news/photo-1558618666-fcd25c85cd64.jpg', isFree: true, tags: ['EP.11','ویدیوکست'] }, + { title: 'ژئوپلیتیک و صادرات فولاد ایران', author: 'مهندس فرید تهرانی', summary: 'تأثیر تحولات منطقه‌ای بر بازارهای صادراتی فولاد ایران و فرصت‌های پیش رو.', type: 'video', category: 'صادرات', publishDate: '۱۱ خرداد ۱۴۰۵', coverImage: '/news/photo-1504328345606-18bbc8c9d7d1.jpg', isFree: true, tags: ['EP.10','ویدیوکست'] }, + { title: 'سرمایه‌گذاری در زنجیره ارزش فولاد', author: 'دکتر آرش کریمی', summary: 'فرصت‌ها و چالش‌های سرمایه‌گذاری در بخش‌های مختلف زنجیره ارزش فولاد.', type: 'video', category: 'بازار جهانی', publishDate: '۴ خرداد ۱۴۰۵', coverImage: '/news/photo-1611273426858-450d8e3c9fce.jpg', isFree: true, tags: ['EP.09','ویدیوکست'] }, + { title: 'آینده فولاد سبز در ایران', author: 'مهندس کاوه رستمی', summary: 'مسیر گذار به فولاد کم‌کربن در ایران؛ چالش‌ها، فرصت‌ها و ضرورت سرمایه‌گذاری.', type: 'video', category: 'انرژی و ESG', publishDate: '۲۸ اردیبهشت ۱۴۰۵', coverImage: '/news/photo-1566873535350-6586b0b7a1f2.jpg', isFree: true, tags: ['EP.08','ویدیوکست'] }, + { title: 'هوش مصنوعی و تحول کارخانه‌های فولاد', author: 'دکتر رضا محمدی', summary: 'چگونه یادگیری ماشین کارایی خطوط تولید فولاد را متحول می‌کند.', type: 'video', category: 'تولید داخلی', publishDate: '۲۱ اردیبهشت ۱۴۰۵', coverImage: '/news/photo-1578662996442-48f60103fc96.jpg', isFree: true, tags: ['EP.07','ویدیوکست'] }, +]; + +const PODCASTS = [ + { title: 'کالبدشکافی عقلانی پیچیدگی‌های صنعتی', author: 'مهندس سیامک شجاعی', summary: 'صنعت فولاد در عصر حاضر، در پیچیده‌ترین چرخه حیات خود قرار گرفته است؛ جایی که همگرایی هوش مصنوعی، الزامات زیست‌محیطی و تنش‌های ژئواکونومیک، قواعد کلاسیک تولید و تجارت را به‌کلی بازنویسی کرده‌اند.', type: 'podcast', category: 'تولید داخلی', publishDate: '۲۵ / خرداد / ۱۴۰۵', coverImage: '/news/photo-1540575467063-178a50c2df87.jpg', isFree: true, tags: ['اپیزود ۷۷','پادکست'] }, + { title: 'آزمایشگاه کوره؛ فناوری‌های نوین فولادسازی', author: 'دکتر رضا محمدی', summary: 'در این اپیزود با نگاهی موشکافانه به چالش‌های فنی گذار از کوره‌های بلند به فولادسازی پاک می‌پردازیم.', type: 'podcast', category: 'تولید داخلی', publishDate: '۱۸ / خرداد / ۱۴۰۵', coverImage: '/news/photo-1566873535350-6586b0b7a1f2.jpg', isFree: true, tags: ['اپیزود ۷۶','پادکست'] }, + { title: 'معمار فولاد؛ رهبری در عصر تحول', author: 'مهندس کاوه رستمی', summary: 'داستان ساختن فولاد فردا؛ روایت رهبرانی که مدل‌های سنتی کسب‌وکار را به چالش کشیده‌اند.', type: 'podcast', category: 'تولید داخلی', publishDate: '۱۱ / خرداد / ۱۴۰۵', coverImage: '/news/photo-1578662996442-48f60103fc96.jpg', isFree: true, tags: ['اپیزود ۷۵','پادکست'] }, + { title: 'فولاد سبز؛ رویا یا واقعیت؟', author: 'دکتر نیلوفر احمدی', summary: 'بررسی مسیر دشوار و پرهزینه گذار به تولید فولاد با کمترین انتشار کربن و آنچه صنعت ایران باید بداند.', type: 'podcast', category: 'انرژی و ESG', publishDate: '۴ / خرداد / ۱۴۰۵', coverImage: '/news/photo-1504328345606-18bbc8c9d7d1.jpg', isFree: true, tags: ['اپیزود ۷۴','پادکست'] }, + { title: 'بازی بزرگ؛ چین، هند و آینده بازار فولاد', author: 'مهندس فرید تهرانی', summary: 'چگونه رقابت دو غول آسیایی مسیر بازار جهانی فولاد را در دهه پیش رو تغییر خواهد داد.', type: 'podcast', category: 'بازار جهانی', publishDate: '۲۸ / اردیبهشت / ۱۴۰۵', coverImage: '/news/photo-1558618666-fcd25c85cd64.jpg', isFree: true, tags: ['اپیزود ۷۳','پادکست'] }, + { title: 'هوش مصنوعی در خط تولید فولاد', author: 'دکتر آرش کریمی', summary: 'کاربردهای عملی یادگیری ماشین در بهینه‌سازی فرآیند ذوب، کنترل کیفیت و نگهداری پیش‌گیرانه.', type: 'podcast', category: 'تولید داخلی', publishDate: '۲۱ / اردیبهشت / ۱۴۰۵', coverImage: '/news/photo-1611273426858-450d8e3c9fce.jpg', isFree: true, tags: ['اپیزود ۷۲','پادکست'] }, +]; + +const RADAR_ITEMS = [ + { category: 'commodity', img: '/news/photo-1611273426858-450d8e3c9fce.jpg', authorName: 'دکتر سارا احمدی', authorAvatar: '/news/photo-1494790108377-be9c29b29330.jpg', titleFa: 'پیش‌بینی بازار با هوش مصنوعی', dateFa: '۱۴ اردیبهشت ۱۴۰۵', excerptFa: 'مدل‌های یادگیری ماشین تقاضای لیتیوم و فلزات باتری را در افق ۲۰۳۵ بازتعریف می‌کنند.', titleEn: 'AI-Powered Market Forecasting', dateEn: 'May 4, 2026', excerptEn: 'Machine-learning models are redefining lithium and battery-metal demand on the 2035 horizon.', sortOrder: 1 }, + { category: 'tech', img: '/news/photo-1581092160607-ee22731c9b4e.jpg', authorName: 'مهندس رضا کریمی', authorAvatar: '/news/photo-1500648767791-00dcc994a43e.jpg', titleFa: 'تحول دیجیتال در زنجیره ارزش فولاد', dateFa: '۱۴ اردیبهشت ۱۴۰۵', excerptFa: 'تحول دیجیتال و اتوماسیون هوشمند در حال تغییر بنیادین زنجیره ارزش فولاد هستند.', titleEn: 'Digital Transformation in Steel Value Chain', dateEn: 'May 4, 2026', excerptEn: 'Digital transformation and smart automation are fundamentally reshaping the steel value chain.', sortOrder: 2 }, + { category: 'market', img: '/news/photo-1504307651254-35680f356dfd.jpg', authorName: 'دکتر مریم رضایی', authorAvatar: '/news/photo-1438761681033-6461ffad8d80.jpg', titleFa: 'تأثیر نوسانات طلا بر سرمایه‌گذاری فولاد', dateFa: '۱۴ اردیبهشت ۱۴۰۵', excerptFa: 'تحلیل روند قیمت طلا و فلزات گران‌بها و اثر آن بر سرمایه‌گذاری در زنجیره فولاد.', titleEn: 'Gold Volatility Impact on Steel Investment', dateEn: 'May 4, 2026', excerptEn: 'Gold and precious-metal price trends and their effect on steel-chain investment.', sortOrder: 3 }, + { category: 'geo', img: '/news/photo-1518770660439-4636190af475.jpg', authorName: 'دکتر علی موسوی', authorAvatar: '/news/photo-1472099645785-5658abf4ff4e.jpg', titleFa: 'ژئوپلیتیک و بازارهای صادراتی فولاد ایران', dateFa: '۱۴ اردیبهشت ۱۴۰۵', excerptFa: 'هندسه قدرت جهانی و اثر تحولات ژئوپلیتیک بر بازارهای صادراتی فولاد ایران.', titleEn: "Geopolitics and Iran's Steel Export Markets", dateEn: 'May 4, 2026', excerptEn: "Global power geometry and the impact of geopolitics on Iran's steel export markets.", sortOrder: 4 }, + { category: 'energy', img: '/news/photo-1466611653911-95081537e5b7.jpg', authorName: 'مهندس نازنین حسینی', authorAvatar: '/news/photo-1544005313-94ddf0286df2.jpg', titleFa: 'گذار انرژی و فولاد سبز', dateFa: '۱۲ اردیبهشت ۱۴۰۵', excerptFa: 'هیدروژن سبز و برق تجدیدپذیر مسیر کربن‌زدایی صنعت فولاد را شتاب می‌دهند.', titleEn: 'Energy Transition & Green Steel', dateEn: 'May 2, 2026', excerptEn: 'Green hydrogen and renewable power are accelerating steel decarbonization.', sortOrder: 5 }, + { category: 'tech', img: '/news/photo-1567789884554-0b844b597180.jpg', authorName: 'دکتر سارا احمدی', authorAvatar: '/news/photo-1494790108377-be9c29b29330.jpg', titleFa: 'اتوماسیون خطوط نورد', dateFa: '۱۰ اردیبهشت ۱۴۰۵', excerptFa: 'سیستم‌های کنترل هوشمند بهره‌وری خطوط نورد را تا ۲۲٪ افزایش داده‌اند.', titleEn: 'Rolling Line Automation', dateEn: 'Apr 30, 2026', excerptEn: 'Smart control systems have boosted rolling-line productivity by up to 22%.', sortOrder: 6 }, + { category: 'commodity', img: '/news/photo-1570168007204-dfb528c6958f.jpg', authorName: 'مهندس رضا کریمی', authorAvatar: '/news/photo-1500648767791-00dcc994a43e.jpg', titleFa: 'زنجیره تأمین سنگ‌آهن', dateFa: '۸ اردیبهشت ۱۴۰۵', excerptFa: 'نوسانات عرضه سنگ‌آهن استرالیا و برزیل و پیامد آن برای تولیدکنندگان منطقه.', titleEn: 'Iron Ore Supply Chain', dateEn: 'Apr 28, 2026', excerptEn: 'Australian and Brazilian iron-ore supply swings and their regional fallout.', sortOrder: 7 }, + { category: 'market', img: '/news/photo-1540575467063-178a50c2df87.jpg', authorName: 'دکتر مریم رضایی', authorAvatar: '/news/photo-1438761681033-6461ffad8d80.jpg', titleFa: 'تحلیل بازار جهانی فولاد', dateFa: '۶ اردیبهشت ۱۴۰۵', excerptFa: 'سیل صادرات فولاد چین و فشار قیمتی بر بازارهای هدف صادراتی ایران.', titleEn: 'Global Steel Market Analysis', dateEn: 'Apr 26, 2026', excerptEn: "China's steel export flood and price pressure on Iran's target export markets.", sortOrder: 8 }, +]; + +const FACTORY_REPORTS = [ + { img: '/news/photo-1504307651254-35680f356dfd.jpg', scrollDir: 'left', tagFa: 'تولید و صادرات', titleFa: 'تحلیل عملکرد تولید و صادرات', dateFa: 'بهمن ۱۴۰۳', excerptFa: 'بررسی آمار تولید ماهانه، مقایسه با بودجه سالانه و روند صادرات فولاد تخت در بازارهای منطقه‌ای.', tagEn: 'Output & Exports', titleEn: 'Production & Export Performance', dateEn: 'Feb 2025', excerptEn: 'Monthly output vs. annual budget and the flat-steel export trend across regional markets.', sortOrder: 1 }, + { img: '/news/photo-1581092160607-ee22731c9b4e.jpg', scrollDir: 'left', tagFa: 'بازار و قیمت', titleFa: 'وضعیت بازار و قیمت‌گذاری', dateFa: 'دی ۱۴۰۳', excerptFa: 'تحلیل نوسانات قیمت فولاد تخت در بازار داخلی و اثر نرخ ارز بر چشم‌انداز زمستان.', tagEn: 'Market & Price', titleEn: 'Market & Pricing Outlook', dateEn: 'Jan 2025', excerptEn: 'Flat-steel price swings in the domestic market and the FX effect on the winter outlook.', sortOrder: 2 }, + { img: '/news/photo-1518770660439-4636190af475.jpg', scrollDir: 'left', tagFa: 'فناوری', titleFa: 'دیجیتال‌سازی خطوط تولید', dateFa: 'آذر ۱۴۰۳', excerptFa: 'گزارشی از پیاده‌سازی سامانه‌های کنترل هوشمند و اثر آن بر بهره‌وری خطوط نورد.', tagEn: 'Technology', titleEn: 'Production Line Digitalization', dateEn: 'Dec 2024', excerptEn: 'Rolling-out smart control systems and their impact on rolling-line productivity.', sortOrder: 3 }, + { img: '/news/photo-1567789884554-0b844b597180.jpg', scrollDir: 'up', tagFa: 'نیروی انسانی', titleFa: 'تحلیل نیروی انسانی و بهره‌وری', dateFa: 'آبان ۱۴۰۳', excerptFa: 'شاخص‌های بهره‌وری نیروی کار، آموزش‌های ماهانه و آمار ایمنی شغلی.', tagEn: 'Workforce', titleEn: 'Workforce & Productivity', dateEn: 'Nov 2024', excerptEn: 'Labor productivity indicators, monthly training and occupational-safety statistics.', sortOrder: 4 }, + { img: '/news/photo-1466611653911-95081537e5b7.jpg', scrollDir: 'up', tagFa: 'پایداری', titleFa: 'گزارش پایداری و محیط زیست', dateFa: 'آذر ۱۴۰۳', excerptFa: 'شاخص‌های زیست‌محیطی ماهانه؛ مصرف انرژی، کاهش انتشار کربن و بازچرخانی پساب صنعتی.', tagEn: 'Sustainability', titleEn: 'Sustainability & Environment', dateEn: 'Dec 2024', excerptEn: 'Monthly environmental metrics: energy use, carbon reduction and industrial water recycling.', sortOrder: 5 }, + { img: '/news/photo-1570168007204-dfb528c6958f.jpg', scrollDir: 'up', tagFa: 'زنجیره تأمین', titleFa: 'تأمین مواد اولیه و لجستیک', dateFa: 'مهر ۱۴۰۳', excerptFa: 'وضعیت تأمین سنگ‌آهن و قراضه، موجودی انبار و تحلیل ریسک زنجیره تأمین.', tagEn: 'Supply Chain', titleEn: 'Raw Materials & Logistics', dateEn: 'Oct 2024', excerptEn: 'Iron-ore and scrap supply, inventory levels and supply-chain risk analysis.', sortOrder: 6 }, + { img: '/news/photo-1611273426858-450d8e3c9fce.jpg', scrollDir: 'right', tagFa: 'سرمایه‌گذاری', titleFa: 'طرح‌های توسعه و سرمایه‌گذاری', dateFa: 'شهریور ۱۴۰۳', excerptFa: 'پیشرفت طرح‌های توسعه ظرفیت و تحلیل بازده سرمایه‌گذاری پروژه‌های جاری.', tagEn: 'Investment', titleEn: 'Expansion & Investment Plans', dateEn: 'Sep 2024', excerptEn: 'Capacity-expansion progress and ROI analysis of ongoing projects.', sortOrder: 7 }, + { img: '/news/photo-1485827404703-89b55fcc595e.jpg', scrollDir: 'right', tagFa: 'کیفیت', titleFa: 'کنترل کیفیت با هوش مصنوعی', dateFa: 'مرداد ۱۴۰۳', excerptFa: 'کاربرد بینایی ماشین در تشخیص عیوب سطحی و کاهش نرخ ضایعات تولید.', tagEn: 'Quality', titleEn: 'AI-Driven Quality Control', dateEn: 'Aug 2024', excerptEn: 'Machine vision for surface-defect detection and lower production scrap rates.', sortOrder: 8 }, + { img: '/news/photo-1613665813446-82a78c468a1d.jpg', scrollDir: 'right', tagFa: 'انرژی', titleFa: 'تحلیل مصرف انرژی و بهینه‌سازی', dateFa: 'تیر ۱۴۰۳', excerptFa: 'الگوی مصرف برق و گاز، فرصت‌های بهینه‌سازی و اثر آن بر بهای تمام‌شده.', tagEn: 'Energy', titleEn: 'Energy Use & Optimization', dateEn: 'Jul 2024', excerptEn: 'Electricity and gas usage patterns, optimization opportunities and cost impact.', sortOrder: 9 }, +]; + +const INTEGRATIONS = [ + { name: 'London Metal Exchange', icon: 'exchange', accent: '#CD9E53', gridCol: 6, gridRow: 1, sortOrder: 1 }, + { name: 'Shanghai Futures Exchange', icon: 'trending', accent: '#c0392b', gridCol: 4, gridRow: 2, sortOrder: 2 }, + { name: 'S&P Global Platts', icon: 'chart', accent: '#2471a3', gridCol: 6, gridRow: 2, sortOrder: 3 }, + { name: 'Reuters', icon: 'newspaper', accent: '#e67e22', gridCol: 3, gridRow: 3, sortOrder: 4 }, + { name: 'Fastmarkets', icon: 'activity', accent: '#1e8449', gridCol: 5, gridRow: 3, sortOrder: 5 }, + { name: 'World Steel Association', icon: 'building', accent: '#7d3c98', gridCol: 4, gridRow: 4, sortOrder: 6 }, + { name: 'Mysteel', icon: 'database', accent: '#16a085', gridCol: 6, gridRow: 4, sortOrder: 7 }, + { name: 'CME Group', icon: 'coins', accent: '#2980b9', gridCol: 5, gridRow: 5, sortOrder: 8 }, + { name: 'Dalian Commodity Exchange', icon: 'globe', accent: '#d35400', gridCol: 3, gridRow: 5, sortOrder: 9 }, +]; + +// ── MAIN ────────────────────────────────────────────────────────────────────── + +async function main() { + console.log('Logging in...'); + await req('/api/auth/login', { method: 'POST', body: { username: USERNAME, password: PASSWORD } }); + console.log('OK. Seeding...\n'); + + await seedIfEmpty('Events', '/api/events?limit=1', EVENTS, i => req('/api/events', { method: 'POST', body: i })); + await seedIfEmpty('Team', '/api/team?limit=1', TEAM, i => req('/api/team', { method: 'POST', body: i })); + await seedIfEmpty('Plans', '/api/plans?limit=1', PLANS, i => req('/api/plans', { method: 'POST', body: i })); + await seedIfEmpty('Banners', '/api/banners?limit=1', BANNERS, i => req('/api/banners', { method: 'POST', body: i })); + await seedIfEmpty('Vision Items', '/api/vision-items?limit=1', VISION_ITEMS, i => req('/api/vision-items', { method: 'POST', body: i })); + await seedIfEmpty('Advisory Board', '/api/advisory-board?limit=1', ADVISORY_BOARD, i => req('/api/advisory-board', { method: 'POST', body: i })); + await seedIfEmpty('Radar Items', '/api/radar?limit=1', RADAR_ITEMS, i => req('/api/radar', { method: 'POST', body: i })); + await seedIfEmpty('Factory Reports','/api/factory-reports?limit=1', FACTORY_REPORTS,i => req('/api/factory-reports', { method: 'POST', body: i })); + await seedIfEmpty('Integrations', '/api/integrations?limit=1', INTEGRATIONS, i => req('/api/integrations', { method: 'POST', body: i })); + + // Videos + Podcasts live in /api/articles — check by type + const existingVideos = await req('/api/articles?type=video&limit=1'); + if (Array.isArray(existingVideos) && existingVideos.length > 0) { + console.log(` SKIP Videos (records exist)`); + } else { + console.log(` SEED Videos (${VIDEOS.length} items)...`); + for (const v of VIDEOS) { + try { await req('/api/articles', { method: 'POST', body: v }); } + catch (e) { console.warn(' WARN Video:', e.message); } + } + console.log(' OK Videos'); } - console.log(` ✓ ${team.length} عضو تیم وارد شد`); - /* ─── PLANS ─────────────────────────────────────────────────── */ - const upsertPlan = db.prepare(` - INSERT OR REPLACE INTO plans - (id, name_fa, price, period_fa, features, badge_fa, is_featured, cta_fa, sort_order, - created_at, updated_at) - VALUES - (@id, @name_fa, @price, @period_fa, @features, @badge_fa, @is_featured, @cta_fa, @sort_order, - datetime('now'), datetime('now')) - `); - - const plans = [ - { - id: 'individual', - name_fa: 'فردی', price: 350000, period_fa: 'ماهانه', - features: JSON.stringify([ - 'دسترسی به تمام گزارش‌های پایه', - 'دانلود ۵ گزارش در ماه', - 'دریافت خبرنامه هفتگی', - 'دسترسی به داده‌های قیمت لحظه‌ای', - 'آرشیو ۱۲ ماه گذشته', - ]), - badge_fa: null, is_featured: 0, cta_fa: 'شروع اشتراک', sort_order: 1, - }, - { - id: 'organizational', - name_fa: 'سازمانی', price: 1200000, period_fa: 'ماهانه', - features: JSON.stringify([ - 'دسترسی کامل به تمام گزارش‌ها', - 'دانلود نامحدود گزارش', - 'دسترسی برای ۵ کاربر همزمان', - 'گزارش‌های ویژه و تحلیل‌های فوری', - 'آرشیو کامل از ابتدای تأسیس', - 'مشاوره تلفنی ماهانه با تحلیلگران', - 'داشبورد اختصاصی تحلیل بازار', - ]), - badge_fa: 'پرطرفدار', is_featured: 1, cta_fa: 'شروع اشتراک', sort_order: 2, - }, - { - id: 'ministry', - name_fa: 'وزارتخانه', price: 0, period_fa: 'سالانه', - features: JSON.stringify([ - 'دسترسی نامحدود برای تمام کارکنان', - 'سفارش گزارش‌های تحلیلی اختصاصی', - 'نشست‌های تخصصی حضوری با تیم پژوهشی', - 'پشتیبانی اولویت‌دار ۲۴/۷', - 'داشبورد تصمیم‌گیری یکپارچه', - 'API اتصال به سیستم‌های داخلی', - 'آموزش و کارگاه‌های تخصصی دوره‌ای', - 'گزارش‌دهی سفارشی برای سیاست‌گذاران', - ]), - badge_fa: null, is_featured: 0, cta_fa: 'درخواست مشاوره', sort_order: 3, - }, - ]; - - for (const p of plans) { - upsertPlan.run(p); + const existingPodcasts = await req('/api/articles?type=podcast&limit=1'); + if (Array.isArray(existingPodcasts) && existingPodcasts.length > 0) { + console.log(` SKIP Podcasts (records exist)`); + } else { + console.log(` SEED Podcasts (${PODCASTS.length} items)...`); + for (const p of PODCASTS) { + try { await req('/api/articles', { method: 'POST', body: p }); } + catch (e) { console.warn(' WARN Podcast:', e.message); } + } + console.log(' OK Podcasts'); } - console.log(` ✓ ${plans.length} پلن اشتراک وارد شد`); - /* ─── RISK SIGNALS ──────────────────────────────────────────── */ - const upsertRisk = db.prepare(` - INSERT OR REPLACE INTO risk_signals - (id, quote, name, date, level, sort_order, created_at, updated_at) - VALUES - (@id, @quote, @name, @date, @level, @sort_order, - datetime('now'), datetime('now')) - `); + console.log('\nDone. Panel DB seeded.'); +} - const risks = [ - { - id: 'china-export-pressure-1404', - quote: 'فشار صادراتی فولاد چین در ۵ ماه اول ۲۰۲۵ به ۵۴ میلیون تن رسید — ۱۸٪ بیشتر از سال قبل. بازارهای هدف ایران در عراق، امارات و آفریقا در معرض فشار قیمتی شدید هستند.', - name: 'فشار صادرات چین', date: 'اردیبهشت ۱۴۰۴', - level: 'high', sort_order: 1, - }, - { - id: 'domestic-gas-restriction-1404', - quote: 'محدودیت‌های گاز صنعتی در زمستان ۱۴۰۳ ظرفیت تولید واحدهای DRI را تا ۳۵٪ کاهش داد. احتمال تکرار این محدودیت در زمستان ۱۴۰۴ با توجه به کمبود زیرساخت انتقال گاز بالاست.', - name: 'محدودیت انرژی داخلی', date: 'فروردین ۱۴۰۴', - level: 'medium', sort_order: 2, - }, - { - id: 'iraq-market-opportunity-1404', - quote: 'کاهش صادرات فولاد ترکیه به عراق در اثر تضعیف لیر ترکیه، فرصت تصاحب ۱۲٪ از سهم بازار را برای صادرکنندگان ایرانی ایجاد کرده است.', - name: 'فرصت بازار عراق', date: 'اردیبهشت ۱۴۰۴', - level: 'opportunity', sort_order: 3, - }, - ]; - - for (const r of risks) { - upsertRisk.run(r); - } - console.log(` ✓ ${risks.length} سیگنال ریسک وارد شد`); - - /* ─── RADAR ITEMS ───────────────────────────────────────────── */ - const upsertRadar = db.prepare(` - INSERT OR REPLACE INTO radar_items - (id, category, img, author_name, author_avatar, - title_fa, date_fa, excerpt_fa, title_en, date_en, excerpt_en, sort_order, - created_at, updated_at) - VALUES - (@id, @category, @img, @author_name, @author_avatar, - @title_fa, @date_fa, @excerpt_fa, @title_en, @date_en, @excerpt_en, @sort_order, - datetime('now'), datetime('now')) - `); - - const radar = [ - { id: 'r1', category: 'commodity', img: '/news/photo-1611273426858-450d8e3c9fce.jpg', - author_name: 'دکتر سارا احمدی', author_avatar: '/news/photo-1494790108377-be9c29b29330.jpg', - title_fa: 'پیش‌بینی بازار با هوش مصنوعی', date_fa: '۱۴ اردیبهشت ۱۴۰۵', - excerpt_fa: 'مدل‌های یادگیری ماشین تقاضای لیتیوم و فلزات باتری را در افق ۲۰۳۵ بازتعریف می‌کنند.', - title_en: 'AI-Powered Market Forecasting', date_en: 'May 4, 2026', - excerpt_en: 'Machine-learning models are redefining lithium and battery-metal demand on the 2035 horizon.', sort_order: 1 }, - { id: 'r2', category: 'tech', img: '/news/photo-1581092160607-ee22731c9b4e.jpg', - author_name: 'مهندس رضا کریمی', author_avatar: '/news/photo-1500648767791-00dcc994a43e.jpg', - title_fa: 'پیش‌بینی بازار با هوش مصنوعی', date_fa: '۱۴ اردیبهشت ۱۴۰۵', - excerpt_fa: 'تحول دیجیتال و اتوماسیون هوشمند در حال تغییر بنیادین زنجیره ارزش فولاد هستند.', - title_en: 'AI-Powered Market Forecasting', date_en: 'May 4, 2026', - excerpt_en: 'Digital transformation and smart automation are fundamentally reshaping the steel value chain.', sort_order: 2 }, - { id: 'r3', category: 'market', img: '/news/photo-1504307651254-35680f356dfd.jpg', - author_name: 'دکتر مریم رضایی', author_avatar: '/news/photo-1438761681033-6461ffad8d80.jpg', - title_fa: 'پیش‌بینی بازار با هوش مصنوعی', date_fa: '۱۴ اردیبهشت ۱۴۰۵', - excerpt_fa: 'تحلیل روند قیمت طلا و فلزات گران‌بها و اثر آن بر سرمایه‌گذاری در زنجیره فولاد.', - title_en: 'AI-Powered Market Forecasting', date_en: 'May 4, 2026', - excerpt_en: 'Gold and precious-metal price trends and their effect on steel-chain investment.', sort_order: 3 }, - { id: 'r4', category: 'geo', img: '/news/photo-1518770660439-4636190af475.jpg', - author_name: 'دکتر علی موسوی', author_avatar: '/news/photo-1472099645785-5658abf4ff4e.jpg', - title_fa: 'پیش‌بینی بازار با هوش مصنوعی', date_fa: '۱۴ اردیبهشت ۱۴۰۵', - excerpt_fa: 'هندسه قدرت جهانی و اثر تحولات ژئوپلیتیک بر بازارهای صادراتی فولاد ایران.', - title_en: 'AI-Powered Market Forecasting', date_en: 'May 4, 2026', - excerpt_en: "Global power geometry and the impact of geopolitics on Iran's steel export markets.", sort_order: 4 }, - { id: 'r5', category: 'energy', img: '/news/photo-1466611653911-95081537e5b7.jpg', - author_name: 'مهندس نازنین حسینی', author_avatar: '/news/photo-1544005313-94ddf0286df2.jpg', - title_fa: 'گذار انرژی و فولاد سبز', date_fa: '۱۲ اردیبهشت ۱۴۰۵', - excerpt_fa: 'هیدروژن سبز و برق تجدیدپذیر مسیر کربن‌زدایی صنعت فولاد را شتاب می‌دهند.', - title_en: 'Energy Transition & Green Steel', date_en: 'May 2, 2026', - excerpt_en: 'Green hydrogen and renewable power are accelerating steel decarbonization.', sort_order: 5 }, - { id: 'r6', category: 'tech', img: '/news/photo-1567789884554-0b844b597180.jpg', - author_name: 'دکتر سارا احمدی', author_avatar: '/news/photo-1494790108377-be9c29b29330.jpg', - title_fa: 'اتوماسیون خطوط نورد', date_fa: '۱۰ اردیبهشت ۱۴۰۵', - excerpt_fa: 'سیستم‌های کنترل هوشمند بهره‌وری خطوط نورد را تا ۲۲٪ افزایش داده‌اند.', - title_en: 'Rolling Line Automation', date_en: 'Apr 30, 2026', - excerpt_en: 'Smart control systems have boosted rolling-line productivity by up to 22%.', sort_order: 6 }, - { id: 'r7', category: 'commodity', img: '/news/photo-1570168007204-dfb528c6958f.jpg', - author_name: 'مهندس رضا کریمی', author_avatar: '/news/photo-1500648767791-00dcc994a43e.jpg', - title_fa: 'زنجیره تأمین سنگ‌آهن', date_fa: '۸ اردیبهشت ۱۴۰۵', - excerpt_fa: 'نوسانات عرضه سنگ‌آهن استرالیا و برزیل و پیامد آن برای تولیدکنندگان منطقه.', - title_en: 'Iron Ore Supply Chain', date_en: 'Apr 28, 2026', - excerpt_en: 'Australian and Brazilian iron-ore supply swings and their regional fallout.', sort_order: 7 }, - { id: 'r8', category: 'market', img: '/news/photo-1540575467063-178a50c2df87.jpg', - author_name: 'دکتر مریم رضایی', author_avatar: '/news/photo-1438761681033-6461ffad8d80.jpg', - title_fa: 'تحلیل بازار جهانی فولاد', date_fa: '۶ اردیبهشت ۱۴۰۵', - excerpt_fa: 'سیل صادرات فولاد چین و فشار قیمتی بر بازارهای هدف صادراتی ایران.', - title_en: 'Global Steel Market Analysis', date_en: 'Apr 26, 2026', - excerpt_en: "China's steel export flood and price pressure on Iran's target markets.", sort_order: 8 }, - ]; - for (const r of radar) { upsertRadar.run(r); } - console.log(` ✓ ${radar.length} سیگنال رادار وارد شد`); - - /* ─── FACTORY REPORTS ───────────────────────────────────────── */ - const upsertFactoryReport = db.prepare(` - INSERT OR REPLACE INTO factory_reports - (id, img, tag_fa, tag_en, title_fa, title_en, date_fa, date_en, - excerpt_fa, excerpt_en, scroll_dir, sort_order, created_at, updated_at) - VALUES - (@id, @img, @tag_fa, @tag_en, @title_fa, @title_en, @date_fa, @date_en, - @excerpt_fa, @excerpt_en, @scroll_dir, @sort_order, datetime('now'), datetime('now')) - `); - const factoryReports = [ - { id: 'fr1', img: '/news/photo-1504307651254-35680f356dfd.jpg', scroll_dir: 'left', sort_order: 1, - tag_fa: 'تولید و صادرات', title_fa: 'تحلیل عملکرد تولید و صادرات', date_fa: 'بهمن ۱۴۰۳', - excerpt_fa: 'بررسی آمار تولید ماهانه، مقایسه با بودجه سالانه و روند صادرات فولاد تخت در بازارهای منطقه‌ای.', - tag_en: 'Output & Exports', title_en: 'Production & Export Performance', date_en: 'Feb 2025', - excerpt_en: 'Monthly output vs. annual budget and the flat-steel export trend across regional markets.' }, - { id: 'fr2', img: '/news/photo-1581092160607-ee22731c9b4e.jpg', scroll_dir: 'left', sort_order: 2, - tag_fa: 'بازار و قیمت', title_fa: 'وضعیت بازار و قیمت‌گذاری', date_fa: 'دی ۱۴۰۳', - excerpt_fa: 'تحلیل نوسانات قیمت فولاد تخت در بازار داخلی و اثر نرخ ارز بر چشم‌انداز زمستان.', - tag_en: 'Market & Price', title_en: 'Market & Pricing Outlook', date_en: 'Jan 2025', - excerpt_en: 'Flat-steel price swings in the domestic market and the FX effect on the winter outlook.' }, - { id: 'fr3', img: '/news/photo-1518770660439-4636190af475.jpg', scroll_dir: 'left', sort_order: 3, - tag_fa: 'فناوری', title_fa: 'دیجیتال‌سازی خطوط تولید', date_fa: 'آذر ۱۴۰۳', - excerpt_fa: 'گزارشی از پیاده‌سازی سامانه‌های کنترل هوشمند و اثر آن بر بهره‌وری خطوط نورد.', - tag_en: 'Technology', title_en: 'Production Line Digitalization', date_en: 'Dec 2024', - excerpt_en: 'Rolling-out smart control systems and their impact on rolling-line productivity.' }, - { id: 'fr4', img: '/news/photo-1567789884554-0b844b597180.jpg', scroll_dir: 'up', sort_order: 4, - tag_fa: 'نیروی انسانی', title_fa: 'تحلیل نیروی انسانی و بهره‌وری', date_fa: 'آبان ۱۴۰۳', - excerpt_fa: 'شاخص‌های بهره‌وری نیروی کار، آموزش‌های ماهانه و آمار ایمنی شغلی.', - tag_en: 'Workforce', title_en: 'Workforce & Productivity', date_en: 'Nov 2024', - excerpt_en: 'Labor productivity indicators, monthly training and occupational-safety statistics.' }, - { id: 'fr5', img: '/news/photo-1466611653911-95081537e5b7.jpg', scroll_dir: 'up', sort_order: 5, - tag_fa: 'پایداری', title_fa: 'گزارش پایداری و محیط زیست', date_fa: 'آذر ۱۴۰۳', - excerpt_fa: 'شاخص‌های زیست‌محیطی ماهانه؛ مصرف انرژی، کاهش انتشار کربن و بازچرخانی پساب صنعتی.', - tag_en: 'Sustainability', title_en: 'Sustainability & Environment', date_en: 'Dec 2024', - excerpt_en: 'Monthly environmental metrics: energy use, carbon reduction and industrial water recycling.' }, - { id: 'fr6', img: '/news/photo-1570168007204-dfb528c6958f.jpg', scroll_dir: 'up', sort_order: 6, - tag_fa: 'زنجیره تأمین', title_fa: 'تأمین مواد اولیه و لجستیک', date_fa: 'مهر ۱۴۰۳', - excerpt_fa: 'وضعیت تأمین سنگ‌آهن و قراضه، موجودی انبار و تحلیل ریسک زنجیره تأمین.', - tag_en: 'Supply Chain', title_en: 'Raw Materials & Logistics', date_en: 'Oct 2024', - excerpt_en: 'Iron-ore and scrap supply, inventory levels and supply-chain risk analysis.' }, - { id: 'fr7', img: '/news/photo-1611273426858-450d8e3c9fce.jpg', scroll_dir: 'right', sort_order: 7, - tag_fa: 'سرمایه‌گذاری', title_fa: 'طرح‌های توسعه و سرمایه‌گذاری', date_fa: 'شهریور ۱۴۰۳', - excerpt_fa: 'پیشرفت طرح‌های توسعه ظرفیت و تحلیل بازده سرمایه‌گذاری پروژه‌های جاری.', - tag_en: 'Investment', title_en: 'Expansion & Investment Plans', date_en: 'Sep 2024', - excerpt_en: 'Capacity-expansion progress and ROI analysis of ongoing projects.' }, - { id: 'fr8', img: '/news/photo-1485827404703-89b55fcc595e.jpg', scroll_dir: 'right', sort_order: 8, - tag_fa: 'کیفیت', title_fa: 'کنترل کیفیت با هوش مصنوعی', date_fa: 'مرداد ۱۴۰۳', - excerpt_fa: 'کاربرد بینایی ماشین در تشخیص عیوب سطحی و کاهش نرخ ضایعات تولید.', - tag_en: 'Quality', title_en: 'AI-Driven Quality Control', date_en: 'Aug 2024', - excerpt_en: 'Machine vision for surface-defect detection and lower production scrap rates.' }, - { id: 'fr9', img: '/news/photo-1613665813446-82a78c468a1d.jpg', scroll_dir: 'right', sort_order: 9, - tag_fa: 'انرژی', title_fa: 'تحلیل مصرف انرژی و بهینه‌سازی', date_fa: 'تیر ۱۴۰۳', - excerpt_fa: 'الگوی مصرف برق و گاز، فرصت‌های بهینه‌سازی و اثر آن بر بهای تمام‌شده.', - tag_en: 'Energy', title_en: 'Energy Use & Optimization', date_en: 'Jul 2024', - excerpt_en: 'Electricity and gas usage patterns, optimization opportunities and cost impact.' }, - ]; - for (const r of factoryReports) { upsertFactoryReport.run(r); } - console.log(` ✓ ${factoryReports.length} گزارش کارخانه وارد شد`); - - /* ─── INTEGRATIONS ──────────────────────────────────────────── */ - const upsertIntegration = db.prepare(` - INSERT OR REPLACE INTO integrations - (id, name, icon, logo, accent, grid_col, grid_row, sort_order, created_at, updated_at) - VALUES - (@id, @name, @icon, @logo, @accent, @grid_col, @grid_row, @sort_order, datetime('now'), datetime('now')) - `); - const integrations = [ - { id: 'lme', name: 'London Metal Exchange', icon: 'exchange', logo: null, accent: '#CD9E53', grid_col: 6, grid_row: 1, sort_order: 1 }, - { id: 'shfe', name: 'Shanghai Futures Exchange', icon: 'trending', logo: null, accent: '#c0392b', grid_col: 4, grid_row: 2, sort_order: 2 }, - { id: 'platts', name: 'S&P Global Platts', icon: 'chart', logo: null, accent: '#2471a3', grid_col: 6, grid_row: 2, sort_order: 3 }, - { id: 'reuters', name: 'Reuters', icon: 'newspaper', logo: null, accent: '#e67e22', grid_col: 3, grid_row: 3, sort_order: 4 }, - { id: 'fastmarkets', name: 'Fastmarkets', icon: 'activity', logo: null, accent: '#1e8449', grid_col: 5, grid_row: 3, sort_order: 5 }, - { id: 'worldsteel', name: 'World Steel Association', icon: 'building', logo: null, accent: '#7d3c98', grid_col: 4, grid_row: 4, sort_order: 6 }, - { id: 'mysteel', name: 'Mysteel', icon: 'database', logo: null, accent: '#16a085', grid_col: 6, grid_row: 4, sort_order: 7 }, - { id: 'cme', name: 'CME Group', icon: 'coins', logo: null, accent: '#2980b9', grid_col: 5, grid_row: 5, sort_order: 8 }, - { id: 'dce', name: 'Dalian Commodity Exchange', icon: 'globe', logo: null, accent: '#d35400', grid_col: 3, grid_row: 5, sort_order: 9 }, - ]; - for (const it of integrations) { upsertIntegration.run(it); } - console.log(` ✓ ${integrations.length} منبع داده وارد شد`); - - /* ─── INSTITUTE STATS ───────────────────────────────────────── */ - const upsertStat = db.prepare(` - INSERT OR REPLACE INTO institute_stats - (id, label_fa, label_en, value, suffix_fa, sort_order, created_at, updated_at) - VALUES - (@id, @label_fa, @label_en, @value, @suffix_fa, @sort_order, datetime('now'), datetime('now')) - `); - const instituteStats = [ - { id: 'total-reports', label_fa: 'گزارش منتشرشده', label_en: 'Published Reports', value: 280, suffix_fa: '+', sort_order: 1 }, - { id: 'years', label_fa: 'سال تجربه', label_en: 'Years of Experience', value: 12, suffix_fa: null, sort_order: 2 }, - { id: 'experts', label_fa: 'کارشناس', label_en: 'Experts', value: 45, suffix_fa: null, sort_order: 3 }, - { id: 'member-orgs', label_fa: 'سازمان عضو', label_en: 'Member Organizations', value: 60, suffix_fa: '+', sort_order: 4 }, - { id: 'subscribers', label_fa: 'مشترک', label_en: 'Subscribers', value: 2800, suffix_fa: '+', sort_order: 5 }, - ]; - for (const s of instituteStats) { upsertStat.run(s); } - console.log(` ✓ ${instituteStats.length} آمار وارد شد`); - - /* ─── MARKET PRICES ─────────────────────────────────────────── */ - const upsertMarketPrice = db.prepare(` - INSERT OR REPLACE INTO market_prices - (id, name, value, unit, change, change_percent, trend, sort_order, created_at, updated_at) - VALUES - (@id, @name, @value, @unit, @change, @change_percent, @trend, @sort_order, datetime('now'), datetime('now')) - `); - const marketPrices = [ - { id: 'steel-billet', name: 'شمش فولاد', value: 18400, unit: 'تومان/کیلو', change: 220, change_percent: 1.2, trend: 'up', sort_order: 1 }, - { id: 'rebar-a3', name: 'میلگرد A3', value: 17800, unit: 'تومان/کیلو', change: -90, change_percent: -0.5, trend: 'down', sort_order: 2 }, - { id: 'beam-14', name: 'تیرآهن ۱۴', value: 16900, unit: 'تومان/کیلو', change: 135, change_percent: 0.8, trend: 'up', sort_order: 3 }, - { id: 'scrap-iron', name: 'آهن قراضه', value: 550, unit: 'دلار/تن', change: -11, change_percent: -2.0, trend: 'down', sort_order: 4 }, - { id: 'cold-rolled-sheet', name: 'ورق سرد', value: 22100, unit: 'تومان/کیلو', change: 66, change_percent: 0.3, trend: 'up', sort_order: 5 }, - { id: 'angle-bar-80', name: 'نبشی ۸۰', value: 15600, unit: 'تومان/کیلو', change: -172, change_percent: -1.1, trend: 'down', sort_order: 6 }, - { id: 'mobarakeh-steel', name: 'فولاد مبارکه', value: 12840, unit: 'ریال', change: -143, change_percent: -1.1, trend: 'down', sort_order: 7 }, - ]; - for (const p of marketPrices) { upsertMarketPrice.run(p); } - console.log(` ✓ ${marketPrices.length} قیمت بازار وارد شد`); - - /* ─── MARKET CHART POINTS ───────────────────────────────────── */ - const upsertChartPoint = db.prepare(` - INSERT OR REPLACE INTO market_chart_points - (id, series, label, value, meta, sort_order, created_at, updated_at) - VALUES - (@id, @series, @label, @value, @meta, @sort_order, datetime('now'), datetime('now')) - `); - const priceHistory = [ - { label: 'خرداد ۱۴۰۳', value: 15200 }, { label: 'تیر ۱۴۰۳', value: 15600 }, - { label: 'مرداد ۱۴۰۳', value: 16100 }, { label: 'شهریور ۱۴۰۳', value: 15800 }, - { label: 'مهر ۱۴۰۳', value: 16400 }, { label: 'آبان ۱۴۰۳', value: 17000 }, - { label: 'آذر ۱۴۰۳', value: 17500 }, { label: 'دی ۱۴۰۳', value: 17200 }, - { label: 'بهمن ۱۴۰۳', value: 17800 }, { label: 'اسفند ۱۴۰۳', value: 18100 }, - { label: 'فروردین ۱۴۰۴', value: 18600 }, { label: 'اردیبهشت ۱۴۰۴', value: 18400 }, - ]; - priceHistory.forEach((p, i) => upsertChartPoint.run({ id: `history-${i + 1}`, series: 'history', label: p.label, value: p.value, meta: null, sort_order: i + 1 })); - const monthlyExport = [ - { label: 'خرداد ۱۴۰۳', value: 285000 }, { label: 'تیر ۱۴۰۳', value: 310000 }, - { label: 'مرداد ۱۴۰۳', value: 295000 }, { label: 'شهریور ۱۴۰۳', value: 320000 }, - { label: 'مهر ۱۴۰۳', value: 350000 }, { label: 'آبان ۱۴۰۳', value: 375000 }, - { label: 'آذر ۱۴۰۳', value: 390000 }, { label: 'دی ۱۴۰۳', value: 360000 }, - { label: 'بهمن ۱۴۰۳', value: 415000 }, { label: 'اسفند ۱۴۰۳', value: 420000 }, - { label: 'فروردین ۱۴۰۴', value: 400000 }, { label: 'اردیبهشت ۱۴۰۴', value: 410000 }, - ]; - monthlyExport.forEach((p, i) => upsertChartPoint.run({ id: `export-${i + 1}`, series: 'export', label: p.label, value: p.value, meta: null, sort_order: i + 1 })); - const globalComparison = [ - { label: 'ایران', value: 18400, meta: { flag: '🇮🇷', currency: 'IRR', unit: 'تومان/کیلو' } }, - { label: 'ترکیه', value: 530, meta: { flag: '🇹🇷', currency: 'USD', unit: 'دلار/تن' } }, - { label: 'هند', value: 510, meta: { flag: '🇮🇳', currency: 'USD', unit: 'دلار/تن' } }, - { label: 'چین', value: 460, meta: { flag: '🇨🇳', currency: 'USD', unit: 'دلار/تن' } }, - { label: 'روسیه', value: 485, meta: { flag: '🇷🇺', currency: 'USD', unit: 'دلار/تن' } }, - ]; - globalComparison.forEach((p, i) => upsertChartPoint.run({ id: `comparison-${i + 1}`, series: 'comparison', label: p.label, value: p.value, meta: JSON.stringify(p.meta), sort_order: i + 1 })); - console.log(` ✓ ${priceHistory.length + monthlyExport.length + globalComparison.length} نقطه نمودار وارد شد`); - - /* ─── VISION ITEMS ──────────────────────────────────────────── */ - const upsertVision = db.prepare(` - INSERT OR REPLACE INTO vision_items - (id, icon, title_fa, title_en, desc_fa, desc_en, sort_order, created_at, updated_at) - VALUES - (@id, @icon, @title_fa, @title_en, @desc_fa, @desc_en, @sort_order, datetime('now'), datetime('now')) - `); - const visionItems = [ - { id:'research-leadership', icon:'FlaskConical', title_fa:'پیشرو در پژوهش', title_en:'Research Leadership', desc_fa:'تولید تحلیل‌های راهبردی و گزارش‌های تخصصی در حوزه صنعت فولاد', desc_en:'Producing strategic analyses and specialized reports in the steel industry', sort_order:0 }, - { id:'expert-networking', icon:'Network', title_fa:'شبکه‌سازی خبرگان', title_en:'Expert Networking', desc_fa:'ایجاد پیوند میان متخصصان، سیاست‌گذاران و فعالان صنعتی', desc_en:'Building connections between specialists, policymakers, and industry practitioners', sort_order:1 }, - { id:'green-steel', icon:'Leaf', title_fa:'فولاد سبز', title_en:'Green Steel', desc_fa:'ترویج رویکردهای پایدار و کاهش اثرات زیست‌محیطی در زنجیره فولاد', desc_en:'Promoting sustainable approaches and reducing environmental impacts across the steel chain', sort_order:2 }, - { id:'futures-research', icon:'Telescope', title_fa:'آینده‌پژوهی', title_en:'Futures Research', desc_fa:'رصد هوشمند تحولات جهانی و ارائه نقشه راه برای صنعت ایران', desc_en:"Smart monitoring of global developments and providing roadmaps for Iran's industry", sort_order:3 }, - ]; - for (const v of visionItems) { upsertVision.run(v); } - console.log(` ✓ ${visionItems.length} آیتم چشم‌انداز وارد شد`); - - /* ─── ADVISORY BOARD ────────────────────────────────────────── */ - const upsertAdvisory = db.prepare(` - INSERT OR REPLACE INTO advisory_board - (id, name_fa, name_en, role_fa, role_en, sort_order, created_at, updated_at) - VALUES - (@id, @name_fa, @name_en, @role_fa, @role_en, @sort_order, datetime('now'), datetime('now')) - `); - const advisoryBoard = [ - { id:'alireza-akbarian', name_fa:'دکتر علیرضا اکبریان', name_en:'Dr. Alireza Akbarian', role_fa:'مدیر اندیشکده', role_en:'Institute Director', sort_order:0 }, - { id:'sara-mohammadi', name_fa:'مهندس سارا محمدی', name_en:'Eng. Sara Mohammadi', role_fa:'پژوهشگر ارشد فولاد سبز', role_en:'Senior Green Steel Researcher', sort_order:1 }, - { id:'mohammad-jalali', name_fa:'دکتر محمد جلالی', name_en:'Dr. Mohammad Jalali', role_fa:'تحلیلگر بازارهای جهانی', role_en:'Global Markets Analyst', sort_order:2 }, - { id:'fatemeh-rezaei', name_fa:'دکتر فاطمه رضایی', name_en:'Dr. Fatemeh Rezaei', role_fa:'متخصص ژئوپلیتیک صنعتی', role_en:'Industrial Geopolitics Specialist', sort_order:3 }, - { id:'reza-karimi', name_fa:'مهندس رضا کریمی', name_en:'Eng. Reza Karimi', role_fa:'کارشناس فناوری و نوآوری', role_en:'Technology & Innovation Expert', sort_order:4 }, - { id:'niloofar-hosseini', name_fa:'دکتر نیلوفر حسینی', name_en:'Dr. Niloofar Hosseini', role_fa:'پژوهشگر آینده‌پژوهی', role_en:'Futures Research Specialist', sort_order:5 }, - ]; - for (const m of advisoryBoard) { upsertAdvisory.run(m); } - console.log(` ✓ ${advisoryBoard.length} عضو شورای مشورتی وارد شد`); - - /* ─── VIDEOCAST / PODCAST (reuse articles) ──────────────────── */ - const upsertMediaArticle = db.prepare(` - INSERT OR REPLACE INTO articles - (id, title, category, type, author, publish_date, cover_image, summary, is_free, tags, pages, price, featured, created_at, updated_at) - VALUES - (@id, @title, @category, @type, @author, @publish_date, @cover_image, @summary, 1, '[]', 0, 0, 0, datetime('now'), datetime('now')) - `); - const mediaArticles = [ - { id:'video-1', type:'video', category:'اخبار صنعت', title:'نگاهی به آن سوی مرزهای تولید', author:'گفتگو با مهندس سیامک فجری', publish_date:'۲۵ خرداد ۱۴۰۵', cover_image:'/news/photo-1504307651254-35680f356dfd.jpg', summary:'در ویدیوکست «Steel Horizon»، فراتر از داده‌های خام قیمت و تناژ، به سراغ مهندسی تغییر و معماری آینده صنعت می‌رویم.' }, - { id:'video-2', type:'video', category:'بازار جهانی', title:'تحلیل بازار جهانی فلزات پایه', author:'گفتگو با کارشناسان بازار', publish_date:'۱۸ خرداد ۱۴۰۵', cover_image:'/news/photo-1558618666-fcd25c85cd64.jpg', summary:'نوسانات قیمت مس، آلومینیوم و روی و تأثیر آن بر زنجیره فولاد را با تحلیل‌گران بازار بررسی می‌کنیم.' }, - { id:'video-3', type:'video', category:'صادرات', title:'ژئوپلیتیک و صادرات فولاد', author:'گفتگو با تحلیل‌گران ژئواکونومی', publish_date:'۱۱ خرداد ۱۴۰۵', cover_image:'/news/photo-1504328345606-18bbc8c9d7d1.jpg', summary:'تأثیر تحولات منطقه‌ای بر بازارهای صادراتی فولاد ایران و فرصت‌های پیش رو.' }, - { id:'video-4', type:'video', category:'تولید داخلی', title:'سرمایه‌گذاری در صنعت فولاد', author:'گفتگو با مدیران سرمایه‌گذاری', publish_date:'۴ خرداد ۱۴۰۵', cover_image:'/news/photo-1611273426858-450d8e3c9fce.jpg', summary:'فرصت‌ها و چالش‌های سرمایه‌گذاری در بخش‌های مختلف زنجیره ارزش فولاد.' }, - { id:'podcast-1', type:'podcast', category:'اخبار صنعت', title:'کالبدشکافی عقلانی پیچیدگی‌های صنعتی', author:'مهندس سیامک شجاعی', publish_date:'۲۵ / خرداد / ۱۴۰۵', cover_image:'/news/photo-1540575467063-178a50c2df87.jpg', summary:'صنعت فولاد در عصر حاضر در پیچیده‌ترین چرخه حیات خود قرار گرفته است؛ جایی که همگرایی هوش مصنوعی، الزامات زیست‌محیطی و تنش‌های ژئواکونومیک قواعد کلاسیک تولید و تجارت را بازنویسی کرده‌اند.' }, - { id:'podcast-2', type:'podcast', category:'اخبار صنعت', title:'آزمایشگاه کوره', author:'کارشناسان بازار', publish_date:'۱۸ / خرداد / ۱۴۰۵', cover_image:'/news/photo-1566873535350-6586b0b7a1f2.jpg', summary:'«The Foundry Lab» محلی برای کالبدشکافی دقیق تحولات فناورانه و مدل‌های نوین فولادسازی است.' }, - { id:'podcast-3', type:'podcast', category:'اخبار صنعت', title:'معمار فولاد', author:'رهبران صنعت', publish_date:'۱۱ خرداد ۱۴۰۵', cover_image:'/news/photo-1578662996442-48f60103fc96.jpg', summary:'در «Steel Architect» به سراغ داستان ساختن فولاد فردا می‌رویم؛ روایت رهبرانی که مدل‌های سنتی کسب‌وکار را به چالش کشیده‌اند.' }, - ]; - for (const a of mediaArticles) { upsertMediaArticle.run(a); } - console.log(` ✓ ${mediaArticles.length} ویدیوکست/پادکست وارد شد`); -}); - -console.log('\n⏳ در حال وارد کردن محتوا به پایگاه داده...\n'); -seed(); -console.log('\n✅ همه محتوا با موفقیت در CMS وارد شد.\n'); +main().catch(err => { console.error('FATAL:', err.message); process.exit(1); }); diff --git a/panel/seed.js b/panel/seed.js index e586b99..4c04756 100644 --- a/panel/seed.js +++ b/panel/seed.js @@ -1,6 +1,6 @@ import 'dotenv/config'; import bcrypt from 'bcryptjs'; -import { db } from './db.js'; +import { db, pool } from './db.js'; const username = process.env.ADMIN_USERNAME || 'admin'; const password = process.env.ADMIN_PASSWORD; @@ -9,16 +9,19 @@ if (!password || password.length < 12) { process.exit(1); } -const existing = db.prepare('SELECT id FROM users WHERE username = ?').get(username); +const existing = await db.prepare('SELECT id FROM users WHERE username = ?').get(username); if (existing) { console.log(`User "${username}" already exists (id=${existing.id}). Skipping.`); + await pool.end(); process.exit(0); } const hash = bcrypt.hashSync(password, 10); -const info = db - .prepare('INSERT INTO users (username, password_hash) VALUES (?, ?)') +const info = await db + .prepare("INSERT INTO users (username, password_hash, role) VALUES (?, ?, 'owner') RETURNING id") .run(username, hash); console.log(`Created admin user "${username}" (id=${info.lastInsertRowid}).`); console.log(`Login with the password from your .env (ADMIN_PASSWORD).`); + +await pool.end(); diff --git a/panel/server.js b/panel/server.js index f663a31..83dba88 100644 --- a/panel/server.js +++ b/panel/server.js @@ -1,3 +1,4 @@ +import 'express-async-errors'; import 'dotenv/config'; import express from 'express'; import cors from 'cors'; @@ -5,6 +6,7 @@ import cookieParser from 'cookie-parser'; import rateLimit from 'express-rate-limit'; import helmet from 'helmet'; import multer from 'multer'; +import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'; import sharp from 'sharp'; import bcrypt from 'bcryptjs'; import jwt from 'jsonwebtoken'; @@ -24,8 +26,16 @@ if (!JWT_SECRET || JWT_SECRET.length < 32) { } const PUBLIC_ORIGIN = process.env.PUBLIC_ORIGIN || `http://localhost:${PORT}`; -const uploadsDir = path.join(__dirname, 'uploads'); -if (!fs.existsSync(uploadsDir)) fs.mkdirSync(uploadsDir, { recursive: true }); +// On Liara, set UPLOADS_DIR to a mounted Disk path (e.g. /var/lib/uploads) so +// uploaded images survive redeploys. Defaults to a local folder for dev. +const uploadsDir = process.env.UPLOADS_DIR || path.join(__dirname, 'uploads'); +// Only needed for local-disk fallback. On Liara uploads go to object storage and +// the app dir may be read-only — never let a failed mkdir crash startup. +try { + if (!fs.existsSync(uploadsDir)) fs.mkdirSync(uploadsDir, { recursive: true }); +} catch (e) { + console.warn(`[uploads] could not create ${uploadsDir}: ${e.message} (ok when using object storage)`); +} // buffer the upload in memory so we can transcode it to WebP before writing to disk const upload = multer({ @@ -37,7 +47,53 @@ const upload = multer({ }, }); +// raw (non-image) uploads — e.g. videos — streamed straight to object storage. +const uploadRaw = multer({ + storage: multer.memoryStorage(), + limits: { fileSize: 200 * 1024 * 1024 }, + fileFilter: (_req, file, cb) => { + if (/^(video\/(mp4|webm|ogg|quicktime|x-matroska)|audio\/(mpeg|mp3|wav|x-wav|ogg|webm|aac|x-m4a|mp4)|application\/pdf)$/.test(file.mimetype)) cb(null, true); + else cb(new Error('Only video, audio, or pdf uploads are allowed')); + }, +}); + +// ── Object storage (Liara / any S3-compatible) ── +// Enabled when all LIARA_* env vars are set; otherwise uploads fall back to the local disk. +const S3_ENABLED = !!( + process.env.LIARA_ENDPOINT && + process.env.LIARA_BUCKET && + process.env.LIARA_ACCESS_KEY && + process.env.LIARA_SECRET_KEY +); +const s3Host = (process.env.LIARA_ENDPOINT || '').replace(/^https?:\/\//, '').replace(/\/+$/, ''); +const s3 = S3_ENABLED + ? new S3Client({ + region: 'default', + endpoint: `https://${s3Host}`, + credentials: { + accessKeyId: process.env.LIARA_ACCESS_KEY, + secretAccessKey: process.env.LIARA_SECRET_KEY, + }, + forcePathStyle: true, + }) + : null; + +// upload a buffer to the bucket and return its public URL (bucket must allow public reads) +async function putObject(key, body, contentType) { + await s3.send(new PutObjectCommand({ + Bucket: process.env.LIARA_BUCKET, + Key: key, + Body: body, + ContentType: contentType, + })); + return `https://${process.env.LIARA_BUCKET}.${s3Host}/${key}`; +} + const app = express(); +app.set('trust proxy', 1); // honor X-Forwarded-Proto from the reverse proxy +// Send the session cookie with Secure whenever the request actually arrived over HTTPS, +// so a forgotten NODE_ENV can't downgrade the cookie to plaintext behind a TLS proxy. +const cookieSecure = (req) => req.secure || req.headers['x-forwarded-proto'] === 'https'; const ALLOWED_ORIGINS = (process.env.ALLOWED_ORIGINS || 'http://localhost:5173') .split(',').map(s => s.trim()); app.use(cors({ @@ -98,13 +154,26 @@ function authRequired(req, res, next) { } } -function memberRequired(req, res, next) { - const auth = req.headers['authorization']; - const token = (auth?.startsWith('Bearer ') ? auth.slice(7) : null) ?? req.query.token ?? null; +// only an 'owner' admin may manage other admin accounts +function ownerRequired(req, res, next) { + if (req.user?.role !== 'owner') return res.status(403).json({ error: 'forbidden' }); + next(); +} + +async function memberRequired(req, res, next) { + // accept the HttpOnly member cookie first, then a Bearer header — never a URL query param + let token = req.cookies?.member_session; + if (!token) { + const auth = req.headers['authorization']; + if (auth?.startsWith('Bearer ')) token = auth.slice(7); + } if (!token) return res.status(401).json({ error: 'unauthorized' }); try { const payload = jwt.verify(token, JWT_SECRET); if (payload.role !== 'member') return res.status(403).json({ error: 'forbidden' }); + // a 30-day token must not outlive a deactivated account — verify per request + const acct = await db.prepare('SELECT is_active FROM members WHERE id = ?').get(payload.sub); + if (!acct || !acct.is_active) return res.status(403).json({ error: 'حساب کاربری غیرفعال است' }); req.member = payload; next(); } catch { @@ -112,28 +181,39 @@ function memberRequired(req, res, next) { } } -app.post('/api/auth/login', loginLimiter, (req, res) => { +// member session cookie options — cross-site capable when served over HTTPS +function memberCookieOpts(req) { + const secure = cookieSecure(req); + return { + httpOnly: true, + secure, + sameSite: secure ? 'none' : 'lax', + maxAge: 30 * 24 * 60 * 60 * 1000, + path: '/', + }; +} + +app.post('/api/auth/login', loginLimiter, async (req, res) => { const { username, password } = req.body || {}; if (!username || !password) return res.status(400).json({ error: 'username_password_required' }); - const row = db.prepare('SELECT id, username, password_hash FROM users WHERE username = ?').get(username); + const row = await db.prepare('SELECT id, username, password_hash, role FROM users WHERE username = ?').get(username); if (!row || !bcrypt.compareSync(password, row.password_hash)) { return res.status(401).json({ error: 'bad_credentials' }); } - const token = jwt.sign({ sub: row.id, username: row.username }, JWT_SECRET, { expiresIn: '24h' }); - const isProd = process.env.NODE_ENV === 'production'; + const token = jwt.sign({ sub: row.id, username: row.username, role: row.role }, JWT_SECRET, { expiresIn: '24h' }); res.cookie('session', token, { httpOnly: true, - secure: isProd, + secure: cookieSecure(req), sameSite: 'strict', maxAge: 24 * 60 * 60 * 1000, path: '/', }); - res.json({ user: { id: row.id, username: row.username }, token }); + // token is delivered only via the HttpOnly cookie — never in the body (XSS can't read it) + res.json({ user: { id: row.id, username: row.username, role: row.role } }); }); -app.post('/api/auth/logout', (_req, res) => { - const isProd = process.env.NODE_ENV === 'production'; - res.clearCookie('session', { httpOnly: true, secure: isProd, sameSite: 'strict', path: '/' }); +app.post('/api/auth/logout', (req, res) => { + res.clearCookie('session', { httpOnly: true, secure: cookieSecure(req), sameSite: 'strict', path: '/' }); res.json({ ok: true }); }); @@ -147,7 +227,7 @@ const PUBLIC_FIELDS = ` tags, featured, created_at, updated_at `; -app.get('/api/articles', (req, res) => { +app.get('/api/articles', async (req, res) => { const limit = Math.min(Number(req.query.limit) || 50, 200); const { category, type } = req.query; let query = `SELECT ${PUBLIC_FIELDS} FROM articles`; @@ -158,12 +238,12 @@ app.get('/api/articles', (req, res) => { if (conditions.length) query += ' WHERE ' + conditions.join(' AND '); query += ' ORDER BY created_at DESC LIMIT ?'; params.push(limit); - const rows = db.prepare(query).all(...params); + const rows = await db.prepare(query).all(...params); res.json(rows.map(rowToArticle)); }); -app.get('/api/articles/:id', (req, res) => { - const row = db.prepare(`SELECT ${PUBLIC_FIELDS} FROM articles WHERE id = ?`).get(req.params.id); +app.get('/api/articles/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${PUBLIC_FIELDS} FROM articles WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToArticle(row)); }); @@ -193,12 +273,20 @@ app.post('/api/uploads', authRequired, upload.single('file'), async (req, res) = .webp({ quality: 80 }).toBuffer(); const filename = `${nanoid(12)}.webp`; - fs.writeFileSync(path.join(uploadsDir, filename), finalBuf); - const relative = `/uploads/${filename}`; + let url, absoluteUrl; + if (s3) { + absoluteUrl = await putObject(filename, finalBuf, 'image/webp'); + url = absoluteUrl; // store the full bucket URL so the frontend loads it directly + } else { + fs.writeFileSync(path.join(uploadsDir, filename), finalBuf); + url = `/uploads/${filename}`; + absoluteUrl = `${PUBLIC_ORIGIN}${url}`; + } + res.json({ - url: relative, - absoluteUrl: `${PUBLIC_ORIGIN}${relative}`, + url, + absoluteUrl, originalSize, size: finalBuf.length, reduction: Math.round((1 - finalBuf.length / originalSize) * 100), @@ -209,6 +297,21 @@ app.post('/api/uploads', authRequired, upload.single('file'), async (req, res) = } }); +// raw file upload (videos / pdf) → object storage. Requires S3 to be configured. +app.post('/api/uploads/raw', authRequired, uploadRaw.single('file'), async (req, res) => { + if (!req.file) return res.status(400).json({ error: 'no_file' }); + if (!s3) return res.status(503).json({ error: 'object_storage_not_configured' }); + try { + const ext = (req.file.originalname.match(/\.[a-z0-9]+$/i)?.[0] || '').toLowerCase(); + const key = `${nanoid(12)}${ext}`; + const url = await putObject(key, req.file.buffer, req.file.mimetype); + res.json({ url, absoluteUrl: url, size: req.file.size, contentType: req.file.mimetype }); + } catch (err) { + console.error('[upload:raw] failed:', err.message); + res.status(500).json({ error: 'upload_failed' }); + } +}); + function normalizeArticleBody(b) { return { title: String(b.title || '').trim(), @@ -229,11 +332,11 @@ function normalizeArticleBody(b) { }; } -app.post('/api/articles', authRequired, (req, res) => { +app.post('/api/articles', authRequired, async (req, res) => { const a = normalizeArticleBody(req.body || {}); if (!a.title) return res.status(400).json({ error: 'title_required' }); const id = nanoid(14); - db.prepare(` + await db.prepare(` INSERT INTO articles ( id, title, category, type, author, author_role, author_initial, publish_date, pages, price, is_free, summary, body, cover_image, @@ -244,31 +347,31 @@ app.post('/api/articles', authRequired, (req, res) => { @tags, @featured ) `).run({ id, ...a }); - const row = db.prepare(`SELECT ${PUBLIC_FIELDS} FROM articles WHERE id = ?`).get(id); + const row = await db.prepare(`SELECT ${PUBLIC_FIELDS} FROM articles WHERE id = ?`).get(id); res.status(201).json(rowToArticle(row)); }); -app.put('/api/articles/:id', authRequired, (req, res) => { - const existing = db.prepare('SELECT id FROM articles WHERE id = ?').get(req.params.id); +app.put('/api/articles/:id', authRequired, async (req, res) => { + const existing = await db.prepare('SELECT id FROM articles WHERE id = ?').get(req.params.id); if (!existing) return res.status(404).json({ error: 'not_found' }); const a = normalizeArticleBody(req.body || {}); if (!a.title) return res.status(400).json({ error: 'title_required' }); - db.prepare(` + await db.prepare(` UPDATE articles SET title = @title, category = @category, type = @type, author = @author, author_role = @author_role, author_initial = @author_initial, publish_date = @publish_date, pages = @pages, price = @price, is_free = @is_free, summary = @summary, body = @body, cover_image = @cover_image, tags = @tags, featured = @featured, - updated_at = datetime('now') + updated_at = now() WHERE id = @id `).run({ id: req.params.id, ...a }); - const row = db.prepare(`SELECT ${PUBLIC_FIELDS} FROM articles WHERE id = ?`).get(req.params.id); + const row = await db.prepare(`SELECT ${PUBLIC_FIELDS} FROM articles WHERE id = ?`).get(req.params.id); res.json(rowToArticle(row)); }); -app.delete('/api/articles/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM articles WHERE id = ?').run(req.params.id); +app.delete('/api/articles/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM articles WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -295,7 +398,7 @@ function deepSanitize(v) { return v; } -app.post('/api/admin/import', authRequired, (req, res) => { +app.post('/api/admin/import', authRequired, async (req, res) => { const { report, radar_items = [], fa_summary_long, key_data } = deepSanitize(req.body || {}); if (!report?.title) return res.status(400).json({ error: 'report.title required' }); @@ -307,13 +410,20 @@ app.post('/api/admin/import', authRequired, (req, res) => { ? (key_data ? fa_summary_long + '\n\n---KEY_DATA---\n' + JSON.stringify(key_data, null, 2) : fa_summary_long) : (key_data ? JSON.stringify(key_data, null, 2) : null); - db.prepare(` - INSERT OR REPLACE INTO articles + await db.prepare(` + INSERT INTO articles (id, title, category, type, author, author_role, author_initial, publish_date, pages, price, is_free, summary, body, tags, cover_image, featured, status) VALUES (@id, @title, @category, @type, @author, @author_role, @author_initial, @publish_date, @pages, @price, @is_free, @summary, @body, @tags, @cover_image, @featured, 'published') + ON CONFLICT (id) DO UPDATE SET + title = EXCLUDED.title, category = EXCLUDED.category, type = EXCLUDED.type, + author = EXCLUDED.author, author_role = EXCLUDED.author_role, author_initial = EXCLUDED.author_initial, + publish_date = EXCLUDED.publish_date, pages = EXCLUDED.pages, price = EXCLUDED.price, + is_free = EXCLUDED.is_free, summary = EXCLUDED.summary, body = EXCLUDED.body, + tags = EXCLUDED.tags, cover_image = EXCLUDED.cover_image, featured = EXCLUDED.featured, + status = EXCLUDED.status, updated_at = now() `).run({ id: articleId, title: report.title, @@ -336,13 +446,18 @@ app.post('/api/admin/import', authRequired, (req, res) => { // upsert radar items const insertRadar = db.prepare(` - INSERT OR REPLACE INTO radar_items + INSERT INTO radar_items (id, category, img, title_fa, excerpt_fa, date_fa, author_name, sort_order) VALUES (@id, @category, @img, @title_fa, @excerpt_fa, @date_fa, @author_name, @sort_order) + ON CONFLICT (id) DO UPDATE SET + category = EXCLUDED.category, img = EXCLUDED.img, title_fa = EXCLUDED.title_fa, + excerpt_fa = EXCLUDED.excerpt_fa, date_fa = EXCLUDED.date_fa, author_name = EXCLUDED.author_name, + sort_order = EXCLUDED.sort_order, updated_at = now() `); - radar_items.forEach((item, i) => { + for (let i = 0; i < radar_items.length; i++) { + const item = radar_items[i]; const rid = item.id || nanoid(12); - insertRadar.run({ + await insertRadar.run({ id: rid, category: item.category || 'market', img: item.img || item.image || report.coverImage || '', @@ -353,7 +468,7 @@ app.post('/api/admin/import', authRequired, (req, res) => { sort_order: i, }); results.radar.push(rid); - }); + } res.json({ ok: true, ...results }); }); @@ -363,14 +478,14 @@ const EVENT_FIELDS = `id, title_fa, title_en, date_fa, date_en, month_fa, month_ location_fa, location_en, city_fa, city_en, description_fa, description_en, registration_open, sort_order, created_at, updated_at`; -app.get('/api/events', (req, res) => { +app.get('/api/events', async (req, res) => { const limit = Math.min(Number(req.query.limit) || 100, 500); - const rows = db.prepare(`SELECT ${EVENT_FIELDS} FROM events ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); + const rows = await db.prepare(`SELECT ${EVENT_FIELDS} FROM events ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); res.json(rows.map(rowToEvent)); }); -app.get('/api/events/:id', (req, res) => { - const row = db.prepare(`SELECT ${EVENT_FIELDS} FROM events WHERE id = ?`).get(req.params.id); +app.get('/api/events/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${EVENT_FIELDS} FROM events WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToEvent(row)); }); @@ -391,49 +506,50 @@ function normalizeEventBody(b) { }; } -app.post('/api/events', authRequired, (req, res) => { +app.post('/api/events', authRequired, async (req, res) => { const e = normalizeEventBody(req.body || {}); if (!e.title_fa) return res.status(400).json({ error: 'title_fa_required' }); const id = nanoid(14); - db.prepare(`INSERT INTO events (id,title_fa,title_en,date_fa,date_en,month_fa,month_en,year,type, + await db.prepare(`INSERT INTO events (id,title_fa,title_en,date_fa,date_en,month_fa,month_en,year,type, location_fa,location_en,city_fa,city_en,description_fa,description_en,registration_open,sort_order) VALUES (@id,@title_fa,@title_en,@date_fa,@date_en,@month_fa,@month_en,@year,@type, @location_fa,@location_en,@city_fa,@city_en,@description_fa,@description_en,@registration_open,@sort_order) `).run({ id, ...e }); - res.status(201).json(rowToEvent(db.prepare(`SELECT ${EVENT_FIELDS} FROM events WHERE id = ?`).get(id))); + res.status(201).json(rowToEvent(await db.prepare(`SELECT ${EVENT_FIELDS} FROM events WHERE id = ?`).get(id))); }); -app.put('/api/events/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM events WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/events/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM events WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const e = normalizeEventBody(req.body || {}); if (!e.title_fa) return res.status(400).json({ error: 'title_fa_required' }); - db.prepare(`UPDATE events SET title_fa=@title_fa,title_en=@title_en,date_fa=@date_fa,date_en=@date_en, + await db.prepare(`UPDATE events SET title_fa=@title_fa,title_en=@title_en,date_fa=@date_fa,date_en=@date_en, month_fa=@month_fa,month_en=@month_en,year=@year,type=@type,location_fa=@location_fa,location_en=@location_en, city_fa=@city_fa,city_en=@city_en,description_fa=@description_fa,description_en=@description_en, - registration_open=@registration_open,sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + registration_open=@registration_open,sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...e }); - res.json(rowToEvent(db.prepare(`SELECT ${EVENT_FIELDS} FROM events WHERE id = ?`).get(req.params.id))); + res.json(rowToEvent(await db.prepare(`SELECT ${EVENT_FIELDS} FROM events WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/events/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM events WHERE id = ?').run(req.params.id); +app.delete('/api/events/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM events WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); // ---------- radar ---------- const RADAR_FIELDS = `id, category, img, author_name, author_avatar, - title_fa, date_fa, excerpt_fa, title_en, date_en, excerpt_en, + title_fa, date_fa, excerpt_fa, body_fa, analysis_fa, + title_en, date_en, excerpt_en, body_en, analysis_en, sort_order, created_at, updated_at`; -app.get('/api/radar', (req, res) => { +app.get('/api/radar', async (req, res) => { const limit = Math.min(Number(req.query.limit) || 50, 500); - const rows = db.prepare(`SELECT ${RADAR_FIELDS} FROM radar_items ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); + const rows = await db.prepare(`SELECT ${RADAR_FIELDS} FROM radar_items ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); res.json(rows.map(rowToRadarItem)); }); -app.get('/api/radar/:id', (req, res) => { - const row = db.prepare(`SELECT ${RADAR_FIELDS} FROM radar_items WHERE id = ?`).get(req.params.id); +app.get('/api/radar/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${RADAR_FIELDS} FROM radar_items WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToRadarItem(row)); }); @@ -447,39 +563,47 @@ function normalizeRadarBody(b) { title_fa: String(b.titleFa || '').trim(), date_fa: b.dateFa || null, excerpt_fa: b.excerptFa || null, + body_fa: b.bodyFa || null, + analysis_fa: b.analysisFa || null, title_en: b.titleEn || null, date_en: b.dateEn || null, excerpt_en: b.excerptEn || null, + body_en: b.bodyEn || null, + analysis_en: b.analysisEn || null, sort_order: Number(b.sortOrder) || 0, }; } -app.post('/api/radar', authRequired, (req, res) => { +app.post('/api/radar', authRequired, async (req, res) => { const r = normalizeRadarBody(req.body || {}); if (!r.title_fa) return res.status(400).json({ error: 'title_fa_required' }); const id = nanoid(14); - db.prepare(`INSERT INTO radar_items (id,category,img,author_name,author_avatar, - title_fa,date_fa,excerpt_fa,title_en,date_en,excerpt_en,sort_order) + await db.prepare(`INSERT INTO radar_items (id,category,img,author_name,author_avatar, + title_fa,date_fa,excerpt_fa,body_fa,analysis_fa, + title_en,date_en,excerpt_en,body_en,analysis_en,sort_order) VALUES (@id,@category,@img,@author_name,@author_avatar, - @title_fa,@date_fa,@excerpt_fa,@title_en,@date_en,@excerpt_en,@sort_order) + @title_fa,@date_fa,@excerpt_fa,@body_fa,@analysis_fa, + @title_en,@date_en,@excerpt_en,@body_en,@analysis_en,@sort_order) `).run({ id, ...r }); - res.status(201).json(rowToRadarItem(db.prepare(`SELECT ${RADAR_FIELDS} FROM radar_items WHERE id = ?`).get(id))); + res.status(201).json(rowToRadarItem(await db.prepare(`SELECT ${RADAR_FIELDS} FROM radar_items WHERE id = ?`).get(id))); }); -app.put('/api/radar/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM radar_items WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/radar/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM radar_items WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const r = normalizeRadarBody(req.body || {}); if (!r.title_fa) return res.status(400).json({ error: 'title_fa_required' }); - db.prepare(`UPDATE radar_items SET category=@category,img=@img,author_name=@author_name, + await db.prepare(`UPDATE radar_items SET category=@category,img=@img,author_name=@author_name, author_avatar=@author_avatar,title_fa=@title_fa,date_fa=@date_fa,excerpt_fa=@excerpt_fa, + body_fa=@body_fa,analysis_fa=@analysis_fa, title_en=@title_en,date_en=@date_en,excerpt_en=@excerpt_en, - sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + body_en=@body_en,analysis_en=@analysis_en, + sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...r }); - res.json(rowToRadarItem(db.prepare(`SELECT ${RADAR_FIELDS} FROM radar_items WHERE id = ?`).get(req.params.id))); + res.json(rowToRadarItem(await db.prepare(`SELECT ${RADAR_FIELDS} FROM radar_items WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/radar/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM radar_items WHERE id = ?').run(req.params.id); +app.delete('/api/radar/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM radar_items WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -492,13 +616,13 @@ const RADAR_PAGE_FIELDS = `slug, source_categories, label_fa, label_en, banner_desc_fa, banner_desc_en, banner_book_img, sort_order, created_at, updated_at`; -app.get('/api/radar-pages', (req, res) => { - const rows = db.prepare(`SELECT ${RADAR_PAGE_FIELDS} FROM radar_pages ORDER BY sort_order ASC`).all(); +app.get('/api/radar-pages', async (req, res) => { + const rows = await db.prepare(`SELECT ${RADAR_PAGE_FIELDS} FROM radar_pages ORDER BY sort_order ASC`).all(); res.json(rows.map(rowToRadarPage)); }); -app.get('/api/radar-pages/:slug', (req, res) => { - const row = db.prepare(`SELECT ${RADAR_PAGE_FIELDS} FROM radar_pages WHERE slug = ?`).get(req.params.slug); +app.get('/api/radar-pages/:slug', async (req, res) => { + const row = await db.prepare(`SELECT ${RADAR_PAGE_FIELDS} FROM radar_pages WHERE slug = ?`).get(req.params.slug); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToRadarPage(row)); }); @@ -527,23 +651,23 @@ function normalizeRadarPageBody(b) { } // upsert by slug (slug is the stable key for the 5 fixed pages) -app.put('/api/radar-pages/:slug', authRequired, (req, res) => { +app.put('/api/radar-pages/:slug', authRequired, async (req, res) => { const slug = req.params.slug; const r = normalizeRadarPageBody(req.body || {}); if (!r.label_fa) return res.status(400).json({ error: 'label_fa_required' }); - const exists = db.prepare('SELECT slug FROM radar_pages WHERE slug = ?').get(slug); + const exists = await db.prepare('SELECT slug FROM radar_pages WHERE slug = ?').get(slug); if (exists) { - db.prepare(`UPDATE radar_pages SET source_categories=@source_categories,label_fa=@label_fa,label_en=@label_en, + await db.prepare(`UPDATE radar_pages SET source_categories=@source_categories,label_fa=@label_fa,label_en=@label_en, latest_heading_fa=@latest_heading_fa,latest_heading_en=@latest_heading_en, featured_title_fa=@featured_title_fa,featured_title_en=@featured_title_en, featured_date_fa=@featured_date_fa,featured_date_en=@featured_date_en,featured_img=@featured_img, banner_kicker_fa=@banner_kicker_fa,banner_kicker_en=@banner_kicker_en, banner_title_fa=@banner_title_fa,banner_title_en=@banner_title_en, banner_desc_fa=@banner_desc_fa,banner_desc_en=@banner_desc_en,banner_book_img=@banner_book_img, - sort_order=@sort_order,updated_at=datetime('now') WHERE slug=@slug + sort_order=@sort_order,updated_at=now() WHERE slug=@slug `).run({ slug, ...r }); } else { - db.prepare(`INSERT INTO radar_pages (slug,source_categories,label_fa,label_en, + await db.prepare(`INSERT INTO radar_pages (slug,source_categories,label_fa,label_en, latest_heading_fa,latest_heading_en,featured_title_fa,featured_title_en, featured_date_fa,featured_date_en,featured_img,banner_kicker_fa,banner_kicker_en, banner_title_fa,banner_title_en,banner_desc_fa,banner_desc_en,banner_book_img,sort_order) @@ -553,21 +677,21 @@ app.put('/api/radar-pages/:slug', authRequired, (req, res) => { @banner_desc_fa,@banner_desc_en,@banner_book_img,@sort_order) `).run({ slug, ...r }); } - res.json(rowToRadarPage(db.prepare(`SELECT ${RADAR_PAGE_FIELDS} FROM radar_pages WHERE slug = ?`).get(slug))); + res.json(rowToRadarPage(await db.prepare(`SELECT ${RADAR_PAGE_FIELDS} FROM radar_pages WHERE slug = ?`).get(slug))); }); // ---------- factory reports ---------- const FACTORY_REPORT_FIELDS = `id, img, tag_fa, tag_en, title_fa, title_en, date_fa, date_en, excerpt_fa, excerpt_en, scroll_dir, sort_order, created_at, updated_at`; -app.get('/api/factory-reports', (req, res) => { +app.get('/api/factory-reports', async (req, res) => { const limit = Math.min(Number(req.query.limit) || 50, 200); - const rows = db.prepare(`SELECT ${FACTORY_REPORT_FIELDS} FROM factory_reports ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); + const rows = await db.prepare(`SELECT ${FACTORY_REPORT_FIELDS} FROM factory_reports ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); res.json(rows.map(rowToFactoryReport)); }); -app.get('/api/factory-reports/:id', (req, res) => { - const row = db.prepare(`SELECT ${FACTORY_REPORT_FIELDS} FROM factory_reports WHERE id = ?`).get(req.params.id); +app.get('/api/factory-reports/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${FACTORY_REPORT_FIELDS} FROM factory_reports WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToFactoryReport(row)); }); @@ -585,31 +709,31 @@ function normalizeFactoryReportBody(b) { }; } -app.post('/api/factory-reports', authRequired, (req, res) => { +app.post('/api/factory-reports', authRequired, async (req, res) => { const r = normalizeFactoryReportBody(req.body || {}); if (!r.title_fa) return res.status(400).json({ error: 'title_fa_required' }); const id = nanoid(14); - db.prepare(`INSERT INTO factory_reports (id,img,tag_fa,tag_en,title_fa,title_en,date_fa,date_en, + await db.prepare(`INSERT INTO factory_reports (id,img,tag_fa,tag_en,title_fa,title_en,date_fa,date_en, excerpt_fa,excerpt_en,scroll_dir,sort_order) VALUES (@id,@img,@tag_fa,@tag_en,@title_fa,@title_en,@date_fa,@date_en, @excerpt_fa,@excerpt_en,@scroll_dir,@sort_order) `).run({ id, ...r }); - res.status(201).json(rowToFactoryReport(db.prepare(`SELECT ${FACTORY_REPORT_FIELDS} FROM factory_reports WHERE id = ?`).get(id))); + res.status(201).json(rowToFactoryReport(await db.prepare(`SELECT ${FACTORY_REPORT_FIELDS} FROM factory_reports WHERE id = ?`).get(id))); }); -app.put('/api/factory-reports/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM factory_reports WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/factory-reports/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM factory_reports WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const r = normalizeFactoryReportBody(req.body || {}); if (!r.title_fa) return res.status(400).json({ error: 'title_fa_required' }); - db.prepare(`UPDATE factory_reports SET img=@img,tag_fa=@tag_fa,tag_en=@tag_en,title_fa=@title_fa,title_en=@title_en, + await db.prepare(`UPDATE factory_reports SET img=@img,tag_fa=@tag_fa,tag_en=@tag_en,title_fa=@title_fa,title_en=@title_en, date_fa=@date_fa,date_en=@date_en,excerpt_fa=@excerpt_fa,excerpt_en=@excerpt_en, - scroll_dir=@scroll_dir,sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + scroll_dir=@scroll_dir,sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...r }); - res.json(rowToFactoryReport(db.prepare(`SELECT ${FACTORY_REPORT_FIELDS} FROM factory_reports WHERE id = ?`).get(req.params.id))); + res.json(rowToFactoryReport(await db.prepare(`SELECT ${FACTORY_REPORT_FIELDS} FROM factory_reports WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/factory-reports/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM factory_reports WHERE id = ?').run(req.params.id); +app.delete('/api/factory-reports/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM factory_reports WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -618,14 +742,14 @@ app.delete('/api/factory-reports/:id', authRequired, (req, res) => { const INTEGRATION_FIELDS = `id, name, icon, logo, accent, grid_col, grid_row, sort_order, created_at, updated_at`; const INTEGRATION_ICONS = ['exchange','globe','chart','activity','database','newspaper','building','trending','coins']; -app.get('/api/integrations', (req, res) => { +app.get('/api/integrations', async (req, res) => { const limit = Math.min(Number(req.query.limit) || 50, 200); - const rows = db.prepare(`SELECT ${INTEGRATION_FIELDS} FROM integrations ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); + const rows = await db.prepare(`SELECT ${INTEGRATION_FIELDS} FROM integrations ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); res.json(rows.map(rowToIntegration)); }); -app.get('/api/integrations/:id', (req, res) => { - const row = db.prepare(`SELECT ${INTEGRATION_FIELDS} FROM integrations WHERE id = ?`).get(req.params.id); +app.get('/api/integrations/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${INTEGRATION_FIELDS} FROM integrations WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToIntegration(row)); }); @@ -642,28 +766,28 @@ function normalizeIntegrationBody(b) { }; } -app.post('/api/integrations', authRequired, (req, res) => { +app.post('/api/integrations', authRequired, async (req, res) => { const it = normalizeIntegrationBody(req.body || {}); if (!it.name) return res.status(400).json({ error: 'name_required' }); const id = nanoid(14); - db.prepare(`INSERT INTO integrations (id,name,icon,logo,accent,grid_col,grid_row,sort_order) + await db.prepare(`INSERT INTO integrations (id,name,icon,logo,accent,grid_col,grid_row,sort_order) VALUES (@id,@name,@icon,@logo,@accent,@grid_col,@grid_row,@sort_order) `).run({ id, ...it }); - res.status(201).json(rowToIntegration(db.prepare(`SELECT ${INTEGRATION_FIELDS} FROM integrations WHERE id = ?`).get(id))); + res.status(201).json(rowToIntegration(await db.prepare(`SELECT ${INTEGRATION_FIELDS} FROM integrations WHERE id = ?`).get(id))); }); -app.put('/api/integrations/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM integrations WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/integrations/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM integrations WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const it = normalizeIntegrationBody(req.body || {}); if (!it.name) return res.status(400).json({ error: 'name_required' }); - db.prepare(`UPDATE integrations SET name=@name,icon=@icon,logo=@logo,accent=@accent, - grid_col=@grid_col,grid_row=@grid_row,sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + await db.prepare(`UPDATE integrations SET name=@name,icon=@icon,logo=@logo,accent=@accent, + grid_col=@grid_col,grid_row=@grid_row,sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...it }); - res.json(rowToIntegration(db.prepare(`SELECT ${INTEGRATION_FIELDS} FROM integrations WHERE id = ?`).get(req.params.id))); + res.json(rowToIntegration(await db.prepare(`SELECT ${INTEGRATION_FIELDS} FROM integrations WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/integrations/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM integrations WHERE id = ?').run(req.params.id); +app.delete('/api/integrations/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM integrations WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -671,12 +795,12 @@ app.delete('/api/integrations/:id', authRequired, (req, res) => { // ---------- institute stats ---------- const INSTITUTE_STATS_FIELDS = `id,label_fa,label_en,value,suffix_fa,sort_order,created_at,updated_at`; -app.get('/api/institute-stats', (_req, res) => { - res.json(db.prepare(`SELECT ${INSTITUTE_STATS_FIELDS} FROM institute_stats ORDER BY sort_order ASC`).all().map(rowToInstituteStat)); +app.get('/api/institute-stats', async (_req, res) => { + res.json((await db.prepare(`SELECT ${INSTITUTE_STATS_FIELDS} FROM institute_stats ORDER BY sort_order ASC`).all()).map(rowToInstituteStat)); }); -app.get('/api/institute-stats/:id', (req, res) => { - const row = db.prepare(`SELECT ${INSTITUTE_STATS_FIELDS} FROM institute_stats WHERE id = ?`).get(req.params.id); +app.get('/api/institute-stats/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${INSTITUTE_STATS_FIELDS} FROM institute_stats WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToInstituteStat(row)); }); @@ -691,28 +815,28 @@ function normalizeInstituteStatBody(b) { }; } -app.post('/api/institute-stats', authRequired, (req, res) => { +app.post('/api/institute-stats', authRequired, async (req, res) => { const s = normalizeInstituteStatBody(req.body || {}); if (!s.label_fa) return res.status(400).json({ error: 'label_fa_required' }); const id = (req.body && req.body.id ? String(req.body.id).trim() : '') || nanoid(14); - db.prepare(`INSERT INTO institute_stats (id,label_fa,label_en,value,suffix_fa,sort_order) + await db.prepare(`INSERT INTO institute_stats (id,label_fa,label_en,value,suffix_fa,sort_order) VALUES (@id,@label_fa,@label_en,@value,@suffix_fa,@sort_order) `).run({ id, ...s }); - res.status(201).json(rowToInstituteStat(db.prepare(`SELECT ${INSTITUTE_STATS_FIELDS} FROM institute_stats WHERE id = ?`).get(id))); + res.status(201).json(rowToInstituteStat(await db.prepare(`SELECT ${INSTITUTE_STATS_FIELDS} FROM institute_stats WHERE id = ?`).get(id))); }); -app.put('/api/institute-stats/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM institute_stats WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/institute-stats/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM institute_stats WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const s = normalizeInstituteStatBody(req.body || {}); if (!s.label_fa) return res.status(400).json({ error: 'label_fa_required' }); - db.prepare(`UPDATE institute_stats SET label_fa=@label_fa,label_en=@label_en,value=@value, - suffix_fa=@suffix_fa,sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + await db.prepare(`UPDATE institute_stats SET label_fa=@label_fa,label_en=@label_en,value=@value, + suffix_fa=@suffix_fa,sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...s }); - res.json(rowToInstituteStat(db.prepare(`SELECT ${INSTITUTE_STATS_FIELDS} FROM institute_stats WHERE id = ?`).get(req.params.id))); + res.json(rowToInstituteStat(await db.prepare(`SELECT ${INSTITUTE_STATS_FIELDS} FROM institute_stats WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/institute-stats/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM institute_stats WHERE id = ?').run(req.params.id); +app.delete('/api/institute-stats/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM institute_stats WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -720,12 +844,12 @@ app.delete('/api/institute-stats/:id', authRequired, (req, res) => { // ---------- market prices ---------- const MARKET_PRICE_FIELDS = `id,name,value,unit,change,change_percent,trend,sort_order,created_at,updated_at`; -app.get('/api/market-prices', (_req, res) => { - res.json(db.prepare(`SELECT ${MARKET_PRICE_FIELDS} FROM market_prices ORDER BY sort_order ASC`).all().map(rowToMarketPrice)); +app.get('/api/market-prices', async (_req, res) => { + res.json((await db.prepare(`SELECT ${MARKET_PRICE_FIELDS} FROM market_prices ORDER BY sort_order ASC`).all()).map(rowToMarketPrice)); }); -app.get('/api/market-prices/:id', (req, res) => { - const row = db.prepare(`SELECT ${MARKET_PRICE_FIELDS} FROM market_prices WHERE id = ?`).get(req.params.id); +app.get('/api/market-prices/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${MARKET_PRICE_FIELDS} FROM market_prices WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToMarketPrice(row)); }); @@ -742,28 +866,28 @@ function normalizeMarketPriceBody(b) { }; } -app.post('/api/market-prices', authRequired, (req, res) => { +app.post('/api/market-prices', authRequired, async (req, res) => { const p = normalizeMarketPriceBody(req.body || {}); if (!p.name) return res.status(400).json({ error: 'name_required' }); const id = (req.body && req.body.id ? String(req.body.id).trim() : '') || nanoid(14); - db.prepare(`INSERT INTO market_prices (id,name,value,unit,change,change_percent,trend,sort_order) + await db.prepare(`INSERT INTO market_prices (id,name,value,unit,change,change_percent,trend,sort_order) VALUES (@id,@name,@value,@unit,@change,@change_percent,@trend,@sort_order) `).run({ id, ...p }); - res.status(201).json(rowToMarketPrice(db.prepare(`SELECT ${MARKET_PRICE_FIELDS} FROM market_prices WHERE id = ?`).get(id))); + res.status(201).json(rowToMarketPrice(await db.prepare(`SELECT ${MARKET_PRICE_FIELDS} FROM market_prices WHERE id = ?`).get(id))); }); -app.put('/api/market-prices/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM market_prices WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/market-prices/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM market_prices WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const p = normalizeMarketPriceBody(req.body || {}); if (!p.name) return res.status(400).json({ error: 'name_required' }); - db.prepare(`UPDATE market_prices SET name=@name,value=@value,unit=@unit,change=@change, - change_percent=@change_percent,trend=@trend,sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + await db.prepare(`UPDATE market_prices SET name=@name,value=@value,unit=@unit,change=@change, + change_percent=@change_percent,trend=@trend,sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...p }); - res.json(rowToMarketPrice(db.prepare(`SELECT ${MARKET_PRICE_FIELDS} FROM market_prices WHERE id = ?`).get(req.params.id))); + res.json(rowToMarketPrice(await db.prepare(`SELECT ${MARKET_PRICE_FIELDS} FROM market_prices WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/market-prices/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM market_prices WHERE id = ?').run(req.params.id); +app.delete('/api/market-prices/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM market_prices WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -772,7 +896,7 @@ app.delete('/api/market-prices/:id', authRequired, (req, res) => { const CHART_POINT_FIELDS = `id,series,label,value,meta,sort_order,created_at,updated_at`; const ALLOWED_SERIES = new Set(['history','export','comparison']); -app.get('/api/market-chart-points', (req, res) => { +app.get('/api/market-chart-points', async (req, res) => { const limit = Math.min(Number(req.query.limit) || 200, 1000); const series = ALLOWED_SERIES.has(req.query.series) ? req.query.series : null; let q = `SELECT ${CHART_POINT_FIELDS} FROM market_chart_points`; @@ -780,11 +904,11 @@ app.get('/api/market-chart-points', (req, res) => { if (series) { q += ' WHERE series = ?'; params.push(series); } q += ' ORDER BY series ASC, sort_order ASC LIMIT ?'; params.push(limit); - res.json(db.prepare(q).all(...params).map(rowToMarketChartPoint)); + res.json((await db.prepare(q).all(...params)).map(rowToMarketChartPoint)); }); -app.get('/api/market-chart-points/:id', (req, res) => { - const row = db.prepare(`SELECT ${CHART_POINT_FIELDS} FROM market_chart_points WHERE id = ?`).get(req.params.id); +app.get('/api/market-chart-points/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${CHART_POINT_FIELDS} FROM market_chart_points WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToMarketChartPoint(row)); }); @@ -803,30 +927,30 @@ function normalizeChartPointBody(b) { }; } -app.post('/api/market-chart-points', authRequired, (req, res) => { +app.post('/api/market-chart-points', authRequired, async (req, res) => { const c = normalizeChartPointBody(req.body || {}); if (!c.series) return res.status(400).json({ error: 'series_required' }); if (!c.label) return res.status(400).json({ error: 'label_required' }); const id = (req.body && req.body.id ? String(req.body.id).trim() : '') || nanoid(14); - db.prepare(`INSERT INTO market_chart_points (id,series,label,value,meta,sort_order) + await db.prepare(`INSERT INTO market_chart_points (id,series,label,value,meta,sort_order) VALUES (@id,@series,@label,@value,@meta,@sort_order) `).run({ id, ...c }); - res.status(201).json(rowToMarketChartPoint(db.prepare(`SELECT ${CHART_POINT_FIELDS} FROM market_chart_points WHERE id = ?`).get(id))); + res.status(201).json(rowToMarketChartPoint(await db.prepare(`SELECT ${CHART_POINT_FIELDS} FROM market_chart_points WHERE id = ?`).get(id))); }); -app.put('/api/market-chart-points/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM market_chart_points WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/market-chart-points/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM market_chart_points WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const c = normalizeChartPointBody(req.body || {}); if (!c.series) return res.status(400).json({ error: 'series_required' }); if (!c.label) return res.status(400).json({ error: 'label_required' }); - db.prepare(`UPDATE market_chart_points SET series=@series,label=@label,value=@value,meta=@meta, - sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + await db.prepare(`UPDATE market_chart_points SET series=@series,label=@label,value=@value,meta=@meta, + sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...c }); - res.json(rowToMarketChartPoint(db.prepare(`SELECT ${CHART_POINT_FIELDS} FROM market_chart_points WHERE id = ?`).get(req.params.id))); + res.json(rowToMarketChartPoint(await db.prepare(`SELECT ${CHART_POINT_FIELDS} FROM market_chart_points WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/market-chart-points/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM market_chart_points WHERE id = ?').run(req.params.id); +app.delete('/api/market-chart-points/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM market_chart_points WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -834,14 +958,14 @@ app.delete('/api/market-chart-points/:id', authRequired, (req, res) => { // ---------- vision items (About page) ---------- const VISION_FIELDS = `id, icon, title_fa, title_en, desc_fa, desc_en, sort_order, created_at, updated_at`; -app.get('/api/vision-items', (req, res) => { +app.get('/api/vision-items', async (req, res) => { const limit = Math.min(Number(req.query.limit) || 100, 500); - const rows = db.prepare(`SELECT ${VISION_FIELDS} FROM vision_items ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); + const rows = await db.prepare(`SELECT ${VISION_FIELDS} FROM vision_items ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); res.json(rows.map(rowToVisionItem)); }); -app.get('/api/vision-items/:id', (req, res) => { - const row = db.prepare(`SELECT ${VISION_FIELDS} FROM vision_items WHERE id = ?`).get(req.params.id); +app.get('/api/vision-items/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${VISION_FIELDS} FROM vision_items WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToVisionItem(row)); }); @@ -857,28 +981,28 @@ function normalizeVisionBody(b) { }; } -app.post('/api/vision-items', authRequired, (req, res) => { +app.post('/api/vision-items', authRequired, async (req, res) => { const v = normalizeVisionBody(req.body || {}); if (!v.title_fa) return res.status(400).json({ error: 'title_fa_required' }); const id = nanoid(14); - db.prepare(`INSERT INTO vision_items (id,icon,title_fa,title_en,desc_fa,desc_en,sort_order) + await db.prepare(`INSERT INTO vision_items (id,icon,title_fa,title_en,desc_fa,desc_en,sort_order) VALUES (@id,@icon,@title_fa,@title_en,@desc_fa,@desc_en,@sort_order) `).run({ id, ...v }); - res.status(201).json(rowToVisionItem(db.prepare(`SELECT ${VISION_FIELDS} FROM vision_items WHERE id = ?`).get(id))); + res.status(201).json(rowToVisionItem(await db.prepare(`SELECT ${VISION_FIELDS} FROM vision_items WHERE id = ?`).get(id))); }); -app.put('/api/vision-items/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM vision_items WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/vision-items/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM vision_items WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const v = normalizeVisionBody(req.body || {}); if (!v.title_fa) return res.status(400).json({ error: 'title_fa_required' }); - db.prepare(`UPDATE vision_items SET icon=@icon,title_fa=@title_fa,title_en=@title_en, - desc_fa=@desc_fa,desc_en=@desc_en,sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + await db.prepare(`UPDATE vision_items SET icon=@icon,title_fa=@title_fa,title_en=@title_en, + desc_fa=@desc_fa,desc_en=@desc_en,sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...v }); - res.json(rowToVisionItem(db.prepare(`SELECT ${VISION_FIELDS} FROM vision_items WHERE id = ?`).get(req.params.id))); + res.json(rowToVisionItem(await db.prepare(`SELECT ${VISION_FIELDS} FROM vision_items WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/vision-items/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM vision_items WHERE id = ?').run(req.params.id); +app.delete('/api/vision-items/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM vision_items WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -886,14 +1010,14 @@ app.delete('/api/vision-items/:id', authRequired, (req, res) => { // ---------- advisory board (About page) ---------- const ADVISORY_FIELDS = `id, name_fa, name_en, role_fa, role_en, sort_order, created_at, updated_at`; -app.get('/api/advisory-board', (req, res) => { +app.get('/api/advisory-board', async (req, res) => { const limit = Math.min(Number(req.query.limit) || 100, 500); - const rows = db.prepare(`SELECT ${ADVISORY_FIELDS} FROM advisory_board ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); + const rows = await db.prepare(`SELECT ${ADVISORY_FIELDS} FROM advisory_board ORDER BY sort_order ASC, created_at DESC LIMIT ?`).all(limit); res.json(rows.map(rowToAdvisoryMember)); }); -app.get('/api/advisory-board/:id', (req, res) => { - const row = db.prepare(`SELECT ${ADVISORY_FIELDS} FROM advisory_board WHERE id = ?`).get(req.params.id); +app.get('/api/advisory-board/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${ADVISORY_FIELDS} FROM advisory_board WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToAdvisoryMember(row)); }); @@ -908,28 +1032,28 @@ function normalizeAdvisoryBody(b) { }; } -app.post('/api/advisory-board', authRequired, (req, res) => { +app.post('/api/advisory-board', authRequired, async (req, res) => { const m = normalizeAdvisoryBody(req.body || {}); if (!m.name_fa) return res.status(400).json({ error: 'name_fa_required' }); const id = nanoid(14); - db.prepare(`INSERT INTO advisory_board (id,name_fa,name_en,role_fa,role_en,sort_order) + await db.prepare(`INSERT INTO advisory_board (id,name_fa,name_en,role_fa,role_en,sort_order) VALUES (@id,@name_fa,@name_en,@role_fa,@role_en,@sort_order) `).run({ id, ...m }); - res.status(201).json(rowToAdvisoryMember(db.prepare(`SELECT ${ADVISORY_FIELDS} FROM advisory_board WHERE id = ?`).get(id))); + res.status(201).json(rowToAdvisoryMember(await db.prepare(`SELECT ${ADVISORY_FIELDS} FROM advisory_board WHERE id = ?`).get(id))); }); -app.put('/api/advisory-board/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM advisory_board WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/advisory-board/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM advisory_board WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const m = normalizeAdvisoryBody(req.body || {}); if (!m.name_fa) return res.status(400).json({ error: 'name_fa_required' }); - db.prepare(`UPDATE advisory_board SET name_fa=@name_fa,name_en=@name_en,role_fa=@role_fa, - role_en=@role_en,sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + await db.prepare(`UPDATE advisory_board SET name_fa=@name_fa,name_en=@name_en,role_fa=@role_fa, + role_en=@role_en,sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...m }); - res.json(rowToAdvisoryMember(db.prepare(`SELECT ${ADVISORY_FIELDS} FROM advisory_board WHERE id = ?`).get(req.params.id))); + res.json(rowToAdvisoryMember(await db.prepare(`SELECT ${ADVISORY_FIELDS} FROM advisory_board WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/advisory-board/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM advisory_board WHERE id = ?').run(req.params.id); +app.delete('/api/advisory-board/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM advisory_board WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -938,16 +1062,17 @@ app.delete('/api/advisory-board/:id', authRequired, (req, res) => { const TEAM_FIELDS = `id,name_fa,name_en,role_fa,role_en,bio_fa,bio_en,expertise,email,initial,photo, report_count,is_expert,expert_room_fa,expert_room_en,telegram,linkedin,twitter,website,sort_order,created_at,updated_at`; -app.get('/api/team', (req, res) => { +app.get('/api/team', async (req, res) => { const isExpert = req.query.expert === '1' ? 1 : req.query.expert === '0' ? 0 : null; let query = `SELECT ${TEAM_FIELDS} FROM team_members`; - if (isExpert !== null) query += ` WHERE is_expert = ${isExpert}`; + const params = []; + if (isExpert !== null) { query += ' WHERE is_expert = ?'; params.push(isExpert); } query += ' ORDER BY sort_order ASC, created_at DESC'; - res.json(db.prepare(query).all().map(rowToTeamMember)); + res.json((await db.prepare(query).all(...params)).map(rowToTeamMember)); }); -app.get('/api/team/:id', (req, res) => { - const row = db.prepare(`SELECT ${TEAM_FIELDS} FROM team_members WHERE id = ?`).get(req.params.id); +app.get('/api/team/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${TEAM_FIELDS} FROM team_members WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToTeamMember(row)); }); @@ -969,33 +1094,33 @@ function normalizeTeamBody(b) { }; } -app.post('/api/team', authRequired, (req, res) => { +app.post('/api/team', authRequired, async (req, res) => { const m = normalizeTeamBody(req.body || {}); if (!m.name_fa) return res.status(400).json({ error: 'name_fa_required' }); const id = nanoid(14); - db.prepare(`INSERT INTO team_members (id,name_fa,name_en,role_fa,role_en,bio_fa,bio_en,expertise,email,initial,photo, + await db.prepare(`INSERT INTO team_members (id,name_fa,name_en,role_fa,role_en,bio_fa,bio_en,expertise,email,initial,photo, report_count,is_expert,expert_room_fa,expert_room_en,telegram,linkedin,twitter,website,sort_order) VALUES (@id,@name_fa,@name_en,@role_fa,@role_en,@bio_fa,@bio_en,@expertise,@email,@initial,@photo, @report_count,@is_expert,@expert_room_fa,@expert_room_en,@telegram,@linkedin,@twitter,@website,@sort_order) `).run({ id, ...m }); - res.status(201).json(rowToTeamMember(db.prepare(`SELECT ${TEAM_FIELDS} FROM team_members WHERE id = ?`).get(id))); + res.status(201).json(rowToTeamMember(await db.prepare(`SELECT ${TEAM_FIELDS} FROM team_members WHERE id = ?`).get(id))); }); -app.put('/api/team/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM team_members WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/team/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM team_members WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const m = normalizeTeamBody(req.body || {}); if (!m.name_fa) return res.status(400).json({ error: 'name_fa_required' }); - db.prepare(`UPDATE team_members SET name_fa=@name_fa,name_en=@name_en,role_fa=@role_fa,role_en=@role_en, + await db.prepare(`UPDATE team_members SET name_fa=@name_fa,name_en=@name_en,role_fa=@role_fa,role_en=@role_en, bio_fa=@bio_fa,bio_en=@bio_en,expertise=@expertise,email=@email,initial=@initial,photo=@photo, report_count=@report_count,is_expert=@is_expert,expert_room_fa=@expert_room_fa,expert_room_en=@expert_room_en, telegram=@telegram,linkedin=@linkedin,twitter=@twitter,website=@website, - sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...m }); - res.json(rowToTeamMember(db.prepare(`SELECT ${TEAM_FIELDS} FROM team_members WHERE id = ?`).get(req.params.id))); + res.json(rowToTeamMember(await db.prepare(`SELECT ${TEAM_FIELDS} FROM team_members WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/team/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM team_members WHERE id = ?').run(req.params.id); +app.delete('/api/team/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM team_members WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -1003,12 +1128,12 @@ app.delete('/api/team/:id', authRequired, (req, res) => { // ---------- plans ---------- const PLAN_FIELDS = `id,name_fa,name_en,price,period_fa,period_en,features,badge_fa,badge_en,is_featured,cta_fa,cta_en,sort_order,created_at,updated_at`; -app.get('/api/plans', (req, res) => { - res.json(db.prepare(`SELECT ${PLAN_FIELDS} FROM plans ORDER BY sort_order ASC`).all().map(rowToPlan)); +app.get('/api/plans', async (req, res) => { + res.json((await db.prepare(`SELECT ${PLAN_FIELDS} FROM plans ORDER BY sort_order ASC`).all()).map(rowToPlan)); }); -app.get('/api/plans/:id', (req, res) => { - const row = db.prepare(`SELECT ${PLAN_FIELDS} FROM plans WHERE id = ?`).get(req.params.id); +app.get('/api/plans/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${PLAN_FIELDS} FROM plans WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToPlan(row)); }); @@ -1027,29 +1152,29 @@ function normalizePlanBody(b) { }; } -app.post('/api/plans', authRequired, (req, res) => { +app.post('/api/plans', authRequired, async (req, res) => { const p = normalizePlanBody(req.body || {}); if (!p.name_fa) return res.status(400).json({ error: 'name_fa_required' }); const id = nanoid(14); - db.prepare(`INSERT INTO plans (id,name_fa,name_en,price,period_fa,period_en,features,badge_fa,badge_en,is_featured,cta_fa,cta_en,sort_order) + await db.prepare(`INSERT INTO plans (id,name_fa,name_en,price,period_fa,period_en,features,badge_fa,badge_en,is_featured,cta_fa,cta_en,sort_order) VALUES (@id,@name_fa,@name_en,@price,@period_fa,@period_en,@features,@badge_fa,@badge_en,@is_featured,@cta_fa,@cta_en,@sort_order) `).run({ id, ...p }); - res.status(201).json(rowToPlan(db.prepare(`SELECT ${PLAN_FIELDS} FROM plans WHERE id = ?`).get(id))); + res.status(201).json(rowToPlan(await db.prepare(`SELECT ${PLAN_FIELDS} FROM plans WHERE id = ?`).get(id))); }); -app.put('/api/plans/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM plans WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/plans/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM plans WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const p = normalizePlanBody(req.body || {}); if (!p.name_fa) return res.status(400).json({ error: 'name_fa_required' }); - db.prepare(`UPDATE plans SET name_fa=@name_fa,name_en=@name_en,price=@price,period_fa=@period_fa,period_en=@period_en, + await db.prepare(`UPDATE plans SET name_fa=@name_fa,name_en=@name_en,price=@price,period_fa=@period_fa,period_en=@period_en, features=@features,badge_fa=@badge_fa,badge_en=@badge_en,is_featured=@is_featured,cta_fa=@cta_fa,cta_en=@cta_en, - sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...p }); - res.json(rowToPlan(db.prepare(`SELECT ${PLAN_FIELDS} FROM plans WHERE id = ?`).get(req.params.id))); + res.json(rowToPlan(await db.prepare(`SELECT ${PLAN_FIELDS} FROM plans WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/plans/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM plans WHERE id = ?').run(req.params.id); +app.delete('/api/plans/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM plans WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -1057,16 +1182,16 @@ app.delete('/api/plans/:id', authRequired, (req, res) => { // ---------- risk signals ---------- const RISK_FIELDS = `id, quote, name, date, level, sort_order, created_at, updated_at`; -app.get('/api/risks', (req, res) => { +app.get('/api/risks', async (req, res) => { const limit = Math.min(Number(req.query.limit) || 100, 500); - const rows = db + const rows = await db .prepare(`SELECT ${RISK_FIELDS} FROM risk_signals ORDER BY sort_order ASC, created_at DESC LIMIT ?`) .all(limit); res.json(rows.map(rowToRiskSignal)); }); -app.get('/api/risks/:id', (req, res) => { - const row = db.prepare(`SELECT ${RISK_FIELDS} FROM risk_signals WHERE id = ?`).get(req.params.id); +app.get('/api/risks/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${RISK_FIELDS} FROM risk_signals WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToRiskSignal(row)); }); @@ -1083,93 +1208,94 @@ function normalizeRiskBody(b) { }; } -app.post('/api/risks', authRequired, (req, res) => { +app.post('/api/risks', authRequired, async (req, res) => { const r = normalizeRiskBody(req.body || {}); if (!r.quote || !r.name || !r.level) return res.status(400).json({ error: 'quote_name_level_required' }); const id = nanoid(14); - db.prepare(` + await db.prepare(` INSERT INTO risk_signals (id, quote, name, date, level, sort_order) VALUES (@id, @quote, @name, @date, @level, @sort_order) `).run({ id, ...r }); - const row = db.prepare(`SELECT ${RISK_FIELDS} FROM risk_signals WHERE id = ?`).get(id); + const row = await db.prepare(`SELECT ${RISK_FIELDS} FROM risk_signals WHERE id = ?`).get(id); res.status(201).json(rowToRiskSignal(row)); }); -app.put('/api/risks/:id', authRequired, (req, res) => { - const existing = db.prepare('SELECT id FROM risk_signals WHERE id = ?').get(req.params.id); +app.put('/api/risks/:id', authRequired, async (req, res) => { + const existing = await db.prepare('SELECT id FROM risk_signals WHERE id = ?').get(req.params.id); if (!existing) return res.status(404).json({ error: 'not_found' }); const r = normalizeRiskBody(req.body || {}); if (!r.quote || !r.name || !r.level) return res.status(400).json({ error: 'quote_name_level_required' }); - db.prepare(` + await db.prepare(` UPDATE risk_signals SET quote = @quote, name = @name, date = @date, level = @level, - sort_order = @sort_order, updated_at = datetime('now') + sort_order = @sort_order, updated_at = now() WHERE id = @id `).run({ id: req.params.id, ...r }); - const row = db.prepare(`SELECT ${RISK_FIELDS} FROM risk_signals WHERE id = ?`).get(req.params.id); + const row = await db.prepare(`SELECT ${RISK_FIELDS} FROM risk_signals WHERE id = ?`).get(req.params.id); res.json(rowToRiskSignal(row)); }); -app.delete('/api/risks/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM risk_signals WHERE id = ?').run(req.params.id); +app.delete('/api/risks/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM risk_signals WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); // ---------- users (admin management) ---------- // password_hash is NEVER returned to the client. -app.get('/api/users', authRequired, (_req, res) => { - const rows = db.prepare('SELECT id, username, created_at FROM users ORDER BY id').all(); - res.json(rows.map((r) => ({ id: r.id, username: r.username, createdAt: r.created_at }))); +app.get('/api/users', authRequired, async (_req, res) => { + const rows = await db.prepare('SELECT id, username, role, created_at FROM users ORDER BY id').all(); + res.json(rows.map((r) => ({ id: r.id, username: r.username, role: r.role, createdAt: r.created_at }))); }); -app.post('/api/users', authRequired, (req, res) => { +app.post('/api/users', authRequired, ownerRequired, async (req, res) => { const username = String(req.body?.username || '').trim(); const password = String(req.body?.password || ''); if (username.length < 3) return res.status(400).json({ error: 'username_too_short' }); if (password.length < 8) return res.status(400).json({ error: 'password_too_short' }); - const exists = db.prepare('SELECT 1 FROM users WHERE username = ?').get(username); + const exists = await db.prepare('SELECT 1 FROM users WHERE username = ?').get(username); if (exists) return res.status(409).json({ error: 'username_taken' }); const hash = bcrypt.hashSync(password, 10); - const info = db.prepare('INSERT INTO users (username, password_hash) VALUES (?, ?)').run(username, hash); - res.status(201).json({ id: info.lastInsertRowid, username }); + const role = req.body?.role === 'owner' ? 'owner' : 'admin'; + const info = await db.prepare('INSERT INTO users (username, password_hash, role) VALUES (?, ?, ?) RETURNING id').run(username, hash, role); + res.status(201).json({ id: info.lastInsertRowid, username, role }); }); -app.put('/api/users/:id', authRequired, (req, res) => { +app.put('/api/users/:id', authRequired, async (req, res) => { const id = Number(req.params.id); - const row = db.prepare('SELECT id, username FROM users WHERE id = ?').get(id); + const row = await db.prepare('SELECT id, username FROM users WHERE id = ?').get(id); if (!row) return res.status(404).json({ error: 'not_found' }); const username = req.body?.username != null ? String(req.body.username).trim() : row.username; const password = req.body?.password != null ? String(req.body.password) : ''; if (username.length < 3) return res.status(400).json({ error: 'username_too_short' }); if (username !== row.username) { - const taken = db.prepare('SELECT 1 FROM users WHERE username = ? AND id != ?').get(username, id); + const taken = await db.prepare('SELECT 1 FROM users WHERE username = ? AND id != ?').get(username, id); if (taken) return res.status(409).json({ error: 'username_taken' }); } if (password) { if (password.length < 8) return res.status(400).json({ error: 'password_too_short' }); const hash = bcrypt.hashSync(password, 10); - db.prepare('UPDATE users SET username = ?, password_hash = ? WHERE id = ?').run(username, hash, id); + await db.prepare('UPDATE users SET username = ?, password_hash = ? WHERE id = ?').run(username, hash, id); } else { - db.prepare('UPDATE users SET username = ? WHERE id = ?').run(username, id); + await db.prepare('UPDATE users SET username = ? WHERE id = ?').run(username, id); } res.json({ id, username }); }); -app.delete('/api/users/:id', authRequired, (req, res) => { +app.delete('/api/users/:id', authRequired, ownerRequired, async (req, res) => { const id = Number(req.params.id); if (req.user?.sub === id) return res.status(400).json({ error: 'cannot_delete_self' }); - const count = db.prepare('SELECT COUNT(*) AS n FROM users').get().n; + const count = (await db.prepare('SELECT COUNT(*) AS n FROM users').get()).n; if (count <= 1) return res.status(400).json({ error: 'cannot_delete_last_user' }); - const info = db.prepare('DELETE FROM users WHERE id = ?').run(id); + const info = await db.prepare('DELETE FROM users WHERE id = ?').run(id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); // ---------- prices (scraped from tgju.org every 2 min) ---------- -app.get('/api/prices', (_req, res) => { - const rows = db +app.get('/api/prices', async (_req, res) => { + const rows = await db .prepare('SELECT symbol, name, value, unit, change_value, change_pct, source_url, fetched_at FROM prices ORDER BY name') .all(); res.json(rows.map(rowToPrice)); @@ -1188,16 +1314,16 @@ app.post('/api/prices/refresh', authRequired, async (_req, res) => { // ---------- banners ---------- const BANNER_FIELDS = `id,overline_fa,overline_en,title_fa,title_en,subtitle_fa,subtitle_en,cta_label_fa,cta_label_en,cta_url,image,position,active,sort_order,created_at,updated_at`; -app.get('/api/banners', (req, res) => { +app.get('/api/banners', async (req, res) => { const onlyActive = req.query.active === '1'; let q = `SELECT ${BANNER_FIELDS} FROM banners`; if (onlyActive) q += ' WHERE active = 1'; q += ' ORDER BY sort_order ASC, created_at DESC'; - res.json(db.prepare(q).all().map(rowToBanner)); + res.json((await db.prepare(q).all()).map(rowToBanner)); }); -app.get('/api/banners/:id', (req, res) => { - const row = db.prepare(`SELECT ${BANNER_FIELDS} FROM banners WHERE id = ?`).get(req.params.id); +app.get('/api/banners/:id', async (req, res) => { + const row = await db.prepare(`SELECT ${BANNER_FIELDS} FROM banners WHERE id = ?`).get(req.params.id); if (!row) return res.status(404).json({ error: 'not_found' }); res.json(rowToBanner(row)); }); @@ -1220,29 +1346,29 @@ function normalizeBannerBody(b) { }; } -app.post('/api/banners', authRequired, (req, res) => { +app.post('/api/banners', authRequired, async (req, res) => { const bn = normalizeBannerBody(req.body || {}); if (!bn.title_fa) return res.status(400).json({ error: 'title_fa_required' }); const id = nanoid(14); - db.prepare(`INSERT INTO banners (id,overline_fa,overline_en,title_fa,title_en,subtitle_fa,subtitle_en,cta_label_fa,cta_label_en,cta_url,image,position,active,sort_order) + await db.prepare(`INSERT INTO banners (id,overline_fa,overline_en,title_fa,title_en,subtitle_fa,subtitle_en,cta_label_fa,cta_label_en,cta_url,image,position,active,sort_order) VALUES (@id,@overline_fa,@overline_en,@title_fa,@title_en,@subtitle_fa,@subtitle_en,@cta_label_fa,@cta_label_en,@cta_url,@image,@position,@active,@sort_order) `).run({ id, ...bn }); - res.status(201).json(rowToBanner(db.prepare(`SELECT ${BANNER_FIELDS} FROM banners WHERE id = ?`).get(id))); + res.status(201).json(rowToBanner(await db.prepare(`SELECT ${BANNER_FIELDS} FROM banners WHERE id = ?`).get(id))); }); -app.put('/api/banners/:id', authRequired, (req, res) => { - if (!db.prepare('SELECT id FROM banners WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); +app.put('/api/banners/:id', authRequired, async (req, res) => { + if (!await db.prepare('SELECT id FROM banners WHERE id = ?').get(req.params.id)) return res.status(404).json({ error: 'not_found' }); const bn = normalizeBannerBody(req.body || {}); if (!bn.title_fa) return res.status(400).json({ error: 'title_fa_required' }); - db.prepare(`UPDATE banners SET overline_fa=@overline_fa,overline_en=@overline_en,title_fa=@title_fa,title_en=@title_en,subtitle_fa=@subtitle_fa,subtitle_en=@subtitle_en, + await db.prepare(`UPDATE banners SET overline_fa=@overline_fa,overline_en=@overline_en,title_fa=@title_fa,title_en=@title_en,subtitle_fa=@subtitle_fa,subtitle_en=@subtitle_en, cta_label_fa=@cta_label_fa,cta_label_en=@cta_label_en,cta_url=@cta_url,image=@image, - position=@position,active=@active,sort_order=@sort_order,updated_at=datetime('now') WHERE id=@id + position=@position,active=@active,sort_order=@sort_order,updated_at=now() WHERE id=@id `).run({ id: req.params.id, ...bn }); - res.json(rowToBanner(db.prepare(`SELECT ${BANNER_FIELDS} FROM banners WHERE id = ?`).get(req.params.id))); + res.json(rowToBanner(await db.prepare(`SELECT ${BANNER_FIELDS} FROM banners WHERE id = ?`).get(req.params.id))); }); -app.delete('/api/banners/:id', authRequired, (req, res) => { - const info = db.prepare('DELETE FROM banners WHERE id = ?').run(req.params.id); +app.delete('/api/banners/:id', authRequired, async (req, res) => { + const info = await db.prepare('DELETE FROM banners WHERE id = ?').run(req.params.id); if (info.changes === 0) return res.status(404).json({ error: 'not_found' }); res.status(204).end(); }); @@ -1260,7 +1386,11 @@ app.post('/api/contact', contactLimiter, async (req, res) => { const { name, phone, email } = req.body || {}; if (!name || !phone) return res.status(400).json({ error: 'name and phone required' }); - const mailTo = process.env.MAIL_TO || 'alirezaameria2@gmail.com, mtdemne@gmail.com'; + const mailTo = process.env.MAIL_TO; + if (!mailTo) { + console.error('Mail error: MAIL_TO is not configured'); + return res.status(500).json({ error: 'mail failed' }); + } const transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.MAIL_USER, pass: process.env.MAIL_PASS }, @@ -1339,6 +1469,10 @@ app.post('/api/pdf-analyze', authRequired, async (req, res) => { try { const { base64 } = req.body || {}; if (!base64) return res.status(400).json({ error: 'فایل PDF ارسال نشده' }); + // cap before decode: ~15MB base64 ≈ 11MB PDF — prevents memory DoS + if (typeof base64 !== 'string' || base64.length > 15_000_000) { + return res.status(413).json({ error: 'حجم فایل بیش از حد مجاز است' }); + } const buf = Buffer.from(base64, 'base64'); const { PDFParse } = await import('pdf-parse'); const parser = new PDFParse({ data: buf }); @@ -1411,57 +1545,64 @@ ${text.slice(0, 6000)} // Member auth & profile (public users, not admins) // ────────────────────────────────────────── -app.post('/api/members/register', loginLimiter, (req, res) => { +app.post('/api/members/register', loginLimiter, async (req, res) => { const { name, email, password } = req.body || {}; if (!name || !email || !password) return res.status(400).json({ error: 'همه فیلدها الزامی است' }); if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) return res.status(400).json({ error: 'ایمیل نامعتبر است' }); if (password.length < 6) return res.status(400).json({ error: 'رمز عبور باید حداقل ۶ کاراکتر باشد' }); - const exists = db.prepare('SELECT 1 FROM members WHERE email = ?').get(email); + const exists = await db.prepare('SELECT 1 FROM members WHERE email = ?').get(email); if (exists) return res.status(409).json({ error: 'این ایمیل قبلاً ثبت شده است' }); const hash = bcrypt.hashSync(password, 10); - const info = db.prepare('INSERT INTO members (name, email, password_hash) VALUES (?, ?, ?)').run(name.trim(), email.toLowerCase().trim(), hash); + const info = await db.prepare('INSERT INTO members (name, email, password_hash) VALUES (?, ?, ?) RETURNING id').run(name.trim(), email.toLowerCase().trim(), hash); const token = jwt.sign({ sub: info.lastInsertRowid, email, name: name.trim(), role: 'member' }, JWT_SECRET, { expiresIn: '30d' }); - res.status(201).json({ token, user: { id: info.lastInsertRowid, name: name.trim(), email } }); + res.cookie('member_session', token, memberCookieOpts(req)); + res.status(201).json({ user: { id: info.lastInsertRowid, name: name.trim(), email } }); }); -app.post('/api/members/login', loginLimiter, (req, res) => { +app.post('/api/members/login', loginLimiter, async (req, res) => { const { email, password } = req.body || {}; if (!email || !password) return res.status(400).json({ error: 'ایمیل و رمز عبور الزامی است' }); - const row = db.prepare('SELECT id, name, email, password_hash, is_active FROM members WHERE email = ?').get(email.toLowerCase().trim()); + const row = await db.prepare('SELECT id, name, email, password_hash, is_active FROM members WHERE email = ?').get(email.toLowerCase().trim()); if (!row || !bcrypt.compareSync(password, row.password_hash)) return res.status(401).json({ error: 'ایمیل یا رمز عبور اشتباه است' }); if (!row.is_active) return res.status(403).json({ error: 'حساب کاربری غیرفعال است' }); const token = jwt.sign({ sub: row.id, email: row.email, name: row.name, role: 'member' }, JWT_SECRET, { expiresIn: '30d' }); - res.json({ token, user: { id: row.id, name: row.name, email: row.email } }); + res.cookie('member_session', token, memberCookieOpts(req)); + res.json({ user: { id: row.id, name: row.name, email: row.email } }); }); -app.get('/api/members/me', memberRequired, (req, res) => { - const row = db.prepare('SELECT id, name, email, phone, avatar, created_at FROM members WHERE id = ?').get(req.member.sub); +app.post('/api/members/logout', (req, res) => { + res.clearCookie('member_session', { ...memberCookieOpts(req), maxAge: undefined }); + res.json({ ok: true }); +}); + +app.get('/api/members/me', memberRequired, async (req, res) => { + const row = await db.prepare('SELECT id, name, email, phone, avatar, created_at FROM members WHERE id = ?').get(req.member.sub); if (!row) return res.status(404).json({ error: 'not_found' }); res.json({ id: row.id, name: row.name, email: row.email, phone: row.phone, avatar: row.avatar, createdAt: row.created_at }); }); -app.put('/api/members/me', memberRequired, (req, res) => { +app.put('/api/members/me', memberRequired, async (req, res) => { const { name, phone } = req.body || {}; - const row = db.prepare('SELECT id FROM members WHERE id = ?').get(req.member.sub); + const row = await db.prepare('SELECT id FROM members WHERE id = ?').get(req.member.sub); if (!row) return res.status(404).json({ error: 'not_found' }); const newName = name?.trim() || req.member.name; - db.prepare("UPDATE members SET name = ?, phone = ?, updated_at = datetime('now') WHERE id = ?").run(newName, phone || null, req.member.sub); + await db.prepare("UPDATE members SET name = ?, phone = ?, updated_at = now() WHERE id = ?").run(newName, phone || null, req.member.sub); res.json({ ok: true }); }); -app.put('/api/members/me/password', memberRequired, (req, res) => { +app.put('/api/members/me/password', memberRequired, async (req, res) => { const { currentPassword, newPassword } = req.body || {}; if (!currentPassword || !newPassword) return res.status(400).json({ error: 'فیلدها الزامی است' }); if (newPassword.length < 6) return res.status(400).json({ error: 'رمز جدید باید حداقل ۶ کاراکتر باشد' }); - const row = db.prepare('SELECT password_hash FROM members WHERE id = ?').get(req.member.sub); + const row = await db.prepare('SELECT password_hash FROM members WHERE id = ?').get(req.member.sub); if (!row || !bcrypt.compareSync(currentPassword, row.password_hash)) return res.status(401).json({ error: 'رمز فعلی اشتباه است' }); const hash = bcrypt.hashSync(newPassword, 10); - db.prepare("UPDATE members SET password_hash = ?, updated_at = datetime('now') WHERE id = ?").run(hash, req.member.sub); + await db.prepare("UPDATE members SET password_hash = ?, updated_at = now() WHERE id = ?").run(hash, req.member.sub); res.json({ ok: true }); }); -app.get('/api/members/me/purchases', memberRequired, (req, res) => { - const rows = db.prepare(` +app.get('/api/members/me/purchases', memberRequired, async (req, res) => { + const rows = await db.prepare(` SELECT p.id, p.amount, p.purchased_at, a.id AS article_id, a.title, a.category, a.type, a.cover_image, a.pages, a.summary, a.author, a.publish_date FROM purchases p JOIN articles a ON p.article_id = a.id @@ -1475,30 +1616,31 @@ app.get('/api/members/me/purchases', memberRequired, (req, res) => { }); // admin: grant purchase to a member -app.post('/api/members/:memberId/purchases', authRequired, (req, res) => { +app.post('/api/members/:memberId/purchases', authRequired, async (req, res) => { const { articleId, amount = 0 } = req.body || {}; if (!articleId) return res.status(400).json({ error: 'articleId الزامی است' }); - const member = db.prepare('SELECT id FROM members WHERE id = ?').get(req.params.memberId); + const member = await db.prepare('SELECT id FROM members WHERE id = ?').get(req.params.memberId); if (!member) return res.status(404).json({ error: 'عضو پیدا نشد' }); - const article = db.prepare('SELECT id, cover_image FROM articles WHERE id = ?').get(articleId); + const article = await db.prepare('SELECT id, cover_image FROM articles WHERE id = ?').get(articleId); if (!article) return res.status(404).json({ error: 'مقاله پیدا نشد' }); - try { - db.prepare('INSERT OR IGNORE INTO purchases (member_id, article_id, amount) VALUES (?, ?, ?)').run(req.params.memberId, articleId, amount); - res.status(201).json({ ok: true }); - } catch (e) { - res.status(409).json({ error: 'قبلاً خریداری شده' }); - } + const info = await db.prepare('INSERT INTO purchases (member_id, article_id, amount) VALUES (?, ?, ?) ON CONFLICT (member_id, article_id) DO NOTHING').run(req.params.memberId, articleId, amount); + if (info.changes === 0) return res.status(409).json({ error: 'قبلاً خریداری شده' }); + res.status(201).json({ ok: true }); }); // download purchased article file (cover image for now; swap for PDF path later) -app.get('/api/members/me/purchases/:purchaseId/download', memberRequired, (req, res) => { - const row = db.prepare(` +// auth rides on the HttpOnly member_session cookie sent with the navigation — no token in the URL +app.get('/api/members/me/purchases/:purchaseId/download', memberRequired, async (req, res) => { + const row = await db.prepare(` SELECT a.cover_image, a.title FROM purchases p JOIN articles a ON p.article_id = a.id WHERE p.id = ? AND p.member_id = ? `).get(req.params.purchaseId, req.member.sub); if (!row) return res.status(404).json({ error: 'خرید پیدا نشد' }); - const filePath = row.cover_image ? path.join(__dirname, 'uploads', path.basename(row.cover_image)) : null; - if (!filePath || !fs.existsSync(filePath)) return res.status(404).json({ error: 'فایل موجود نیست' }); + if (!row.cover_image) return res.status(404).json({ error: 'فایل موجود نیست' }); + // object-storage assets are full URLs → redirect; local uploads are served from disk + if (/^https?:\/\//i.test(row.cover_image)) return res.redirect(row.cover_image); + const filePath = path.join(uploadsDir, path.basename(row.cover_image)); + if (!fs.existsSync(filePath)) return res.status(404).json({ error: 'فایل موجود نیست' }); res.download(filePath, row.title + path.extname(filePath)); }); diff --git a/panel/update-radar-images.mjs b/panel/update-radar-images.mjs index b0a9049..a339ffe 100644 --- a/panel/update-radar-images.mjs +++ b/panel/update-radar-images.mjs @@ -1,9 +1,4 @@ -import Database from 'better-sqlite3'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const db = new Database(path.join(__dirname, 'data.db')); +import { db, pool } from './db.js'; // id → image (served from the frontend /public/news folder at /news/...) const radarImages = { @@ -24,7 +19,7 @@ const radarImages = { const stmt = db.prepare('UPDATE radar_items SET img = ? WHERE id = ?'); let updated = 0; for (const [id, img] of Object.entries(radarImages)) { - updated += stmt.run(img, id).changes; + updated += (await stmt.run(img, id)).changes; } console.log(`✓ radar images updated: ${updated}/${Object.keys(radarImages).length}`); @@ -38,6 +33,8 @@ const articleImages = { const aStmt = db.prepare('UPDATE articles SET cover_image = ? WHERE id = ?'); let aUpdated = 0; for (const [id, img] of Object.entries(articleImages)) { - aUpdated += aStmt.run(img, id).changes; + aUpdated += (await aStmt.run(img, id)).changes; } console.log(`✓ article covers updated: ${aUpdated}/${Object.keys(articleImages).length}`); + +await pool.end(); diff --git a/public/hero-bg.mp4 b/public/hero-bg.mp4 index 622b6d3..19c160f 100644 --- a/public/hero-bg.mp4 +++ b/public/hero-bg.mp4 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2bdc556fcfd4cb7885eacb42ae86ead654c893dab6fdabb523b2514f2bac43d4 -size 10328238 +oid sha256:fad463f25da4bce23f467705cbead9df08737c04094ff5a6e98dba6a294ba704 +size 2716385 diff --git a/public/icons/Design.svg b/public/icons/Design.svg new file mode 100644 index 0000000..71de506 --- /dev/null +++ b/public/icons/Design.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/Group 1.svg b/public/icons/Group 1.svg new file mode 100644 index 0000000..b9e0f0c --- /dev/null +++ b/public/icons/Group 1.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/icons/Line 5.svg b/public/icons/Line 5.svg new file mode 100644 index 0000000..59e6550 --- /dev/null +++ b/public/icons/Line 5.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/Line 6.svg b/public/icons/Line 6.svg new file mode 100644 index 0000000..59e6550 --- /dev/null +++ b/public/icons/Line 6.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/Line 7.svg b/public/icons/Line 7.svg new file mode 100644 index 0000000..59e6550 --- /dev/null +++ b/public/icons/Line 7.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/Line 8.svg b/public/icons/Line 8.svg new file mode 100644 index 0000000..59e6550 --- /dev/null +++ b/public/icons/Line 8.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/Line 9.svg b/public/icons/Line 9.svg new file mode 100644 index 0000000..59e6550 --- /dev/null +++ b/public/icons/Line 9.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/arrow-left-01-sharp.svg b/public/icons/arrow-left-01-sharp.svg new file mode 100644 index 0000000..b0503e0 --- /dev/null +++ b/public/icons/arrow-left-01-sharp.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/chevron/down-1.svg b/public/icons/chevron/down-1.svg new file mode 100644 index 0000000..b38c5d7 --- /dev/null +++ b/public/icons/chevron/down-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/chevron/down.svg b/public/icons/chevron/down.svg new file mode 100644 index 0000000..64d4fd8 --- /dev/null +++ b/public/icons/chevron/down.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/header/Group 1-1.svg b/public/icons/header/Group 1-1.svg new file mode 100644 index 0000000..b30de3b --- /dev/null +++ b/public/icons/header/Group 1-1.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/icons/header/Group.svg b/public/icons/header/Group.svg new file mode 100644 index 0000000..9a2a740 --- /dev/null +++ b/public/icons/header/Group.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/header/Vector.svg b/public/icons/header/Vector.svg new file mode 100644 index 0000000..72ddf44 --- /dev/null +++ b/public/icons/header/Vector.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/header/vuesax/outline/sms.svg b/public/icons/header/vuesax/outline/sms.svg new file mode 100644 index 0000000..2505f0b --- /dev/null +++ b/public/icons/header/vuesax/outline/sms.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/vuesax/linear/arrow-down.svg b/public/icons/vuesax/linear/arrow-down.svg new file mode 100644 index 0000000..a6c4947 --- /dev/null +++ b/public/icons/vuesax/linear/arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/vuesax/linear/calendar-tick.svg b/public/icons/vuesax/linear/calendar-tick.svg new file mode 100644 index 0000000..fb762c7 --- /dev/null +++ b/public/icons/vuesax/linear/calendar-tick.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/icons/vuesax/linear/calendar.svg b/public/icons/vuesax/linear/calendar.svg new file mode 100644 index 0000000..62afabd --- /dev/null +++ b/public/icons/vuesax/linear/calendar.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/icons/vuesax/linear/export.svg b/public/icons/vuesax/linear/export.svg new file mode 100644 index 0000000..a0ffc99 --- /dev/null +++ b/public/icons/vuesax/linear/export.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/vuesax/linear/location.svg b/public/icons/vuesax/linear/location.svg new file mode 100644 index 0000000..c1c9d45 --- /dev/null +++ b/public/icons/vuesax/linear/location.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/vuesax/outline/buildings.svg b/public/icons/vuesax/outline/buildings.svg new file mode 100644 index 0000000..73ebcdf --- /dev/null +++ b/public/icons/vuesax/outline/buildings.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/icons/vuesax/outline/search-normal.svg b/public/icons/vuesax/outline/search-normal.svg new file mode 100644 index 0000000..a1f569c --- /dev/null +++ b/public/icons/vuesax/outline/search-normal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/vuesax/outline/security-safe.svg b/public/icons/vuesax/outline/security-safe.svg new file mode 100644 index 0000000..3f63e6e --- /dev/null +++ b/public/icons/vuesax/outline/security-safe.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/world-map.webp b/public/world-map.webp new file mode 100644 index 0000000000000000000000000000000000000000..69d09e9b8cb70ea847e06d44ce2f24f06f64efaa GIT binary patch literal 384032 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%0DjEKh;9l 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

G|JjPs^# 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%0DyP+F8QNW`5bo7C^nl* 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 literal 0 HcmV?d00001 diff --git a/public/اندیشکده فولاد آینده_icon.zip b/public/اندیشکده فولاد آینده_icon.zip new file mode 100644 index 0000000000000000000000000000000000000000..4e5accc3711c05d3eae3b225e6846be2d4802310 GIT binary patch literal 29001 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 HKi>Tx+lgNY literal 0 HcmV?d00001 diff --git a/src/app/layout/Footer.tsx b/src/app/layout/Footer.tsx index e0b06cc..1f36135 100644 --- a/src/app/layout/Footer.tsx +++ b/src/app/layout/Footer.tsx @@ -8,9 +8,8 @@ function scrollToTop() { /* curved top edge with a centered scroll-to-top button (matches the Figma) */ function FooterCurve() { return ( -

+
- {/* white (page) above, navy below, with a smooth dip on the LEFT side */} diff --git a/src/content/factoryReports.ts b/src/content/factoryReports.ts index 093cbee..8956a13 100644 --- a/src/content/factoryReports.ts +++ b/src/content/factoryReports.ts @@ -15,52 +15,27 @@ export type FactoryReport = { en: { tag: string; title: string; date: string; excerpt: string } } -/* TEMP placeholder dataset — swap for panel/API data later. */ export const FACTORY_REPORTS: FactoryReport[] = [ { - id: 'fr1', img: '/news/photo-1504307651254-35680f356dfd.jpg', dir: 'left', - fa: { tag: 'تولید و صادرات', title: 'تحلیل عملکرد تولید و صادرات', date: 'بهمن ۱۴۰۳', excerpt: 'بررسی آمار تولید ماهانه، مقایسه با بودجه سالانه و روند صادرات فولاد تخت در بازارهای منطقه‌ای.' }, - en: { tag: 'Output & Exports', title: 'Production & Export Performance', date: 'Feb 2025', excerpt: 'Monthly output vs. annual budget and the flat-steel export trend across regional markets.' }, + id: 'msc-55', + img: 'https://www.msc.ir/_DouranPortal/Album/Articles/%DB%B5%DB%B5_14050314_083241.jpg', + dir: 'left', + fa: { tag: 'ماهنامه تحلیلی کارخانه', title: 'ماهنامه تحلیلی کارخانه — شماره ۵۵', date: 'خرداد ۱۴۰۵', excerpt: 'راهبرد یکپارچه چگونه انسجام راهبردی و مزیت رقابتی پایدار فولاد مبارکه را تضمین می‌کند؟ هم‌افزایی شش محور استراتژیک، تبدیل ثروت معدنی به قدرت صنعتی، و دوام مزیت‌های نسبی فولاد ایران زیر فشار ناترازی انرژی.' }, + en: { tag: 'Factory Analysis', title: 'Factory Analysis Monthly — No. 55', date: 'May 2026', excerpt: 'Integrated strategy, synergy of six strategic axes, turning mineral wealth into industrial power, and the resilience of Iran\'s steel advantages under energy imbalance.' }, }, { - id: 'fr2', img: '/news/photo-1581092160607-ee22731c9b4e.jpg', dir: 'left', - fa: { tag: 'بازار و قیمت', title: 'وضعیت بازار و قیمت‌گذاری', date: 'دی ۱۴۰۳', excerpt: 'تحلیل نوسانات قیمت فولاد تخت در بازار داخلی و اثر نرخ ارز بر چشم‌انداز زمستان.' }, - en: { tag: 'Market & Price', title: 'Market & Pricing Outlook', date: 'Jan 2025', excerpt: 'Flat-steel price swings in the domestic market and the FX effect on the winter outlook.' }, + id: 'msc-54', + img: 'https://www.msc.ir/_DouranPortal/Album/Articles/;hvohki%2054_14050323_095959.jpg', + dir: 'right', + fa: { tag: 'ماهنامه تحلیلی کارخانه', title: 'ماهنامه تحلیلی کارخانه — شماره ۵۴', date: 'مهر ۱۴۰۴', excerpt: 'شماره ۵۴ ماهنامه تحلیلی راهبردی کارخانه فولاد مبارکه؛ بررسی عملکرد، نوآوری و چشم‌انداز بازار فولاد.' }, + en: { tag: 'Factory Analysis', title: 'Factory Analysis Monthly — No. 54', date: 'Oct 2025', excerpt: 'Issue No. 54 of Mobarakeh Steel\'s strategic factory analysis monthly.' }, }, { - id: 'fr3', img: '/news/photo-1518770660439-4636190af475.jpg', dir: 'left', - fa: { tag: 'فناوری', title: 'دیجیتال‌سازی خطوط تولید', date: 'آذر ۱۴۰۳', excerpt: 'گزارشی از پیاده‌سازی سامانه‌های کنترل هوشمند و اثر آن بر بهره‌وری خطوط نورد.' }, - en: { tag: 'Technology', title: 'Production Line Digitalization', date: 'Dec 2024', excerpt: 'Rolling-out smart control systems and their impact on rolling-line productivity.' }, - }, - { - id: 'fr4', img: '/news/photo-1567789884554-0b844b597180.jpg', dir: 'up', - fa: { tag: 'نیروی انسانی', title: 'تحلیل نیروی انسانی و بهره‌وری', date: 'آبان ۱۴۰۳', excerpt: 'شاخص‌های بهره‌وری نیروی کار، آموزش‌های ماهانه و آمار ایمنی شغلی.' }, - en: { tag: 'Workforce', title: 'Workforce & Productivity', date: 'Nov 2024', excerpt: 'Labor productivity indicators, monthly training and occupational-safety statistics.' }, - }, - { - id: 'fr5', img: '/news/photo-1466611653911-95081537e5b7.jpg', dir: 'up', - fa: { tag: 'پایداری', title: 'گزارش پایداری و محیط زیست', date: 'آذر ۱۴۰۳', excerpt: 'شاخص‌های زیست‌محیطی ماهانه؛ مصرف انرژی، کاهش انتشار کربن و بازچرخانی پساب صنعتی.' }, - en: { tag: 'Sustainability', title: 'Sustainability & Environment', date: 'Dec 2024', excerpt: 'Monthly environmental metrics: energy use, carbon reduction and industrial water recycling.' }, - }, - { - id: 'fr6', img: '/news/photo-1570168007204-dfb528c6958f.jpg', dir: 'up', - fa: { tag: 'زنجیره تأمین', title: 'تأمین مواد اولیه و لجستیک', date: 'مهر ۱۴۰۳', excerpt: 'وضعیت تأمین سنگ‌آهن و قراضه، موجودی انبار و تحلیل ریسک زنجیره تأمین.' }, - en: { tag: 'Supply Chain', title: 'Raw Materials & Logistics', date: 'Oct 2024', excerpt: 'Iron-ore and scrap supply, inventory levels and supply-chain risk analysis.' }, - }, - { - id: 'fr7', img: '/news/photo-1611273426858-450d8e3c9fce.jpg', dir: 'right', - fa: { tag: 'سرمایه‌گذاری', title: 'طرح‌های توسعه و سرمایه‌گذاری', date: 'شهریور ۱۴۰۳', excerpt: 'پیشرفت طرح‌های توسعه ظرفیت و تحلیل بازده سرمایه‌گذاری پروژه‌های جاری.' }, - en: { tag: 'Investment', title: 'Expansion & Investment Plans', date: 'Sep 2024', excerpt: 'Capacity-expansion progress and ROI analysis of ongoing projects.' }, - }, - { - id: 'fr8', img: '/news/photo-1485827404703-89b55fcc595e.jpg', dir: 'right', - fa: { tag: 'کیفیت', title: 'کنترل کیفیت با هوش مصنوعی', date: 'مرداد ۱۴۰۳', excerpt: 'کاربرد بینایی ماشین در تشخیص عیوب سطحی و کاهش نرخ ضایعات تولید.' }, - en: { tag: 'Quality', title: 'AI-Driven Quality Control', date: 'Aug 2024', excerpt: 'Machine vision for surface-defect detection and lower production scrap rates.' }, - }, - { - id: 'fr9', img: '/news/photo-1613665813446-82a78c468a1d.jpg', dir: 'right', - fa: { tag: 'انرژی', title: 'تحلیل مصرف انرژی و بهینه‌سازی', date: 'تیر ۱۴۰۳', excerpt: 'الگوی مصرف برق و گاز، فرصت‌های بهینه‌سازی و اثر آن بر بهای تمام‌شده.' }, - en: { tag: 'Energy', title: 'Energy Use & Optimization', date: 'Jul 2024', excerpt: 'Electricity and gas usage patterns, optimization opportunities and cost impact.' }, + id: 'msc-53', + img: 'https://www.msc.ir/_DouranPortal/Album/Articles/01_20250921_103454.jpg', + dir: 'up', + fa: { tag: 'ماهنامه تحلیلی کارخانه', title: 'ماهنامه تحلیلی کارخانه — شماره ۵۳', date: 'شهریور ۱۴۰۴', excerpt: 'عبور از ملاحظات؛ آیا زمان جراحی نهادی برای تحقق توسعه پایدار صنایع معدنی فرا رسیده است؟' }, + en: { tag: 'Factory Analysis', title: 'Factory Analysis Monthly — No. 53', date: 'Sep 2025', excerpt: 'Beyond considerations: has the time come for institutional surgery to achieve sustainable development of the mining industries?' }, }, ] diff --git a/src/content/posts.ts b/src/content/posts.ts index 88ffd1b..e52520e 100644 --- a/src/content/posts.ts +++ b/src/content/posts.ts @@ -116,3 +116,44 @@ export const POSTS: Post[] = [ export function getPost(id: string): Post | undefined { return POSTS.find(p => p.id === id) || POSTS[0] } + +const PANEL_API = (import.meta as ImportMeta & { env?: Record }).env?.VITE_PANEL_API || '' + +/** + * Replace the static POSTS with articles from the panel. + * The DB article model is monolingual with a single `body` text blob, so we + * split it into paragraph blocks; charts/figures/comments exist only in the + * static mock and are dropped when DB content is present. Falls back to the + * static list when the panel is offline or has no articles. + */ +export async function bootstrapPosts(): Promise { + try { + const res = await fetch(`${PANEL_API}/api/articles`) + if (!res.ok) return + const fetched = await res.json() + if (!Array.isArray(fetched) || fetched.length === 0) return + POSTS.length = 0 + POSTS.push(...fetched.map((a: Record) => { + // drop the KEY_DATA appendix some importers add to the body + const bodyText = String(a.body ?? '').split('---KEY_DATA---')[0] + const body: PostBlock[] = bodyText + .split(/\n{2,}/).map(s => s.trim()).filter(Boolean) + .map(p => ({ type: 'p' as const, fa: p, en: '' })) + const title = String(a.title ?? '') + const author = String(a.author ?? '') + const date = String(a.publishDate ?? '') + const lead = String(a.summary ?? '') + const cat = String(a.category ?? '') + return { + id: String(a.id), + cover: String(a.coverImage ?? '') || IMG('photo-1581092160607-ee22731c9b4e.jpg'), + category: { fa: cat, en: cat }, + fa: { title, author, date, lead }, + en: { title, author, date, lead }, + body, + comments: [], + related: RELATED, + } + })) + } catch { /* panel offline → keep static fallback */ } +} diff --git a/src/context/AuthContext.tsx b/src/context/AuthContext.tsx index 5e209ed..f6f33ae 100644 --- a/src/context/AuthContext.tsx +++ b/src/context/AuthContext.tsx @@ -11,7 +11,6 @@ export interface Member { } interface AuthState { - token: string | null member: Member | null } @@ -24,13 +23,21 @@ interface AuthContextValue extends AuthState { const AuthContext = createContext(null) +// Only ever cache these display fields — never spread an unknown server object into +// localStorage (a future API change must not silently leak extra fields to the client store). +function toMember(u: Partial & { id: number; name: string; email: string }): Member { + return { id: u.id, name: u.name, email: u.email, phone: u.phone, avatar: u.avatar } +} + +// The session itself lives in an HttpOnly cookie (set by the panel) and is never +// readable from JS. We only cache the member's display profile in localStorage so +// the UI can render immediately on reload; it carries no credential. function load(): AuthState { try { - const token = localStorage.getItem('member_token') const raw = localStorage.getItem('member_info') - if (token && raw) return { token, member: JSON.parse(raw) } + if (raw) return { member: JSON.parse(raw) } } catch { /* ignore */ } - return { token: null, member: null } + return { member: null } } export function AuthProvider({ children }: { children: React.ReactNode }) { @@ -39,33 +46,35 @@ export function AuthProvider({ children }: { children: React.ReactNode }) { const login = useCallback(async (email: string, password: string) => { const res = await fetch(`${BASE}/api/members/login`, { method: 'POST', + credentials: 'include', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }), }) const data = await res.json() if (!res.ok) throw new Error(data.error || 'خطا در ورود') - localStorage.setItem('member_token', data.token) - localStorage.setItem('member_info', JSON.stringify(data.user)) - setState({ token: data.token, member: data.user }) + const member = toMember(data.user) + localStorage.setItem('member_info', JSON.stringify(member)) + setState({ member }) }, []) const register = useCallback(async (name: string, email: string, password: string, phone?: string, org?: string) => { const res = await fetch(`${BASE}/api/members/register`, { method: 'POST', + credentials: 'include', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, email, password, phone, org }), }) const data = await res.json() if (!res.ok) throw new Error(data.error || 'خطا در ثبت‌نام') - localStorage.setItem('member_token', data.token) - localStorage.setItem('member_info', JSON.stringify(data.user)) - setState({ token: data.token, member: data.user }) + const member = toMember(data.user) + localStorage.setItem('member_info', JSON.stringify(member)) + setState({ member }) }, []) const logout = useCallback(() => { - localStorage.removeItem('member_token') + fetch(`${BASE}/api/members/logout`, { method: 'POST', credentials: 'include' }).catch(() => {}) localStorage.removeItem('member_info') - setState({ token: null, member: null }) + setState({ member: null }) }, []) const updateMember = useCallback((data: Partial) => { @@ -90,13 +99,16 @@ export function useAuth() { return ctx } -export function authFetch(token: string, path: string, opts: RequestInit = {}) { +// Authenticated calls send the HttpOnly session cookie automatically — no token argument. +export function authFetch(path: string, opts: RequestInit = {}) { return fetch(`${BASE}${path}`, { ...opts, + credentials: 'include', headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${token}`, ...(opts.headers as Record ?? {}), }, }) } + +export { BASE } diff --git a/src/data/media.ts b/src/data/media.ts index fb602e1..55b9686 100644 --- a/src/data/media.ts +++ b/src/data/media.ts @@ -19,6 +19,7 @@ export interface VideoItem { duration: string; date: string; thumb: string; + mediaUrl?: string; } export interface PodcastItem { @@ -30,6 +31,7 @@ export interface PodcastItem { cover: string; fa: MediaLangText & { ep: string }; en: MediaLangText & { ep: string }; + mediaUrl?: string; } export const videos: VideoItem[] = [ @@ -149,6 +151,7 @@ function articleToVideo(a: Record, i: number): VideoItem { duration: '', date: String(a.publishDate ?? ''), thumb: String(a.coverImage ?? '') || '/news/photo-1504307651254-35680f356dfd.jpg', + mediaUrl: String(a.body ?? ''), // panel stores the media URL in the article body field } } @@ -166,6 +169,7 @@ function articleToPodcast(a: Record, i: number): PodcastItem { cover: String(a.coverImage ?? '') || '/news/photo-1540575467063-178a50c2df87.jpg', fa: { title, guest, body, ep }, en: { title, guest, body, ep }, + mediaUrl: String(a.body ?? ''), // panel stores the media URL in the article body field } } diff --git a/src/main.tsx b/src/main.tsx index f140aa1..9e3231d 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -17,11 +17,12 @@ import { bootstrapFactoryReports } from './content/factoryReports' import { bootstrapIntegrations } from './content/integrations' import { bootstrapAbout } from './data/about' import { bootstrapMedia } from './data/media' +import { bootstrapPosts } from './content/posts' await Promise.all([ bootstrapReports(), bootstrapEvents(), bootstrapTeam(), bootstrapRadar(), bootstrapRadarPages(), bootstrapBanners(), bootstrapPlans(), bootstrapRisks(), bootstrapMarket(), - bootstrapFactoryReports(), bootstrapIntegrations(), bootstrapAbout(), bootstrapMedia(), + bootstrapFactoryReports(), bootstrapIntegrations(), bootstrapAbout(), bootstrapMedia(), bootstrapPosts(), ]) createRoot(document.getElementById('root')!).render( diff --git a/src/pages/About/About.tsx b/src/pages/About/About.tsx index 781c5f1..0d084b0 100644 --- a/src/pages/About/About.tsx +++ b/src/pages/About/About.tsx @@ -181,12 +181,12 @@ export default function About() {
-

+

{t.contactTitle}

-

+

{t.contactDesc}

void }) { const isFa = lang === 'fa' const dir = isFa ? 'rtl' : 'ltr' - const isLoggedIn = (() => { try { return localStorage.getItem('sf_logged_in') === '1' } catch { return false } })() + const { member } = useAuth() + const isLoggedIn = member !== null const body = isFa ? card.bodyFa : card.bodyEn return ( diff --git a/src/pages/Events/Events.tsx b/src/pages/Events/Events.tsx index e9e5437..3820552 100644 --- a/src/pages/Events/Events.tsx +++ b/src/pages/Events/Events.tsx @@ -1,80 +1,485 @@ -import { MapPin, Calendar } from 'lucide-react' +import { useState, useEffect } from 'react' +import { ExternalLink, ChevronLeft, ChevronRight } from 'lucide-react' import { useLang } from '@/context/LangContext' import { events } from '@/data/events' const NAVY = '#032340' const GOLD = '#CD9E53' -const TYPE_LABEL: Record = { - conference: { fa: 'کنفرانس', color: '#2471a3' }, - exhibition: { fa: 'نمایشگاه', color: '#1e8449' }, - seminar: { fa: 'نشست تخصصی', color: '#7d3c98' }, - international: { fa: 'بین‌الملل', color: '#c0392b' }, +const TYPE_LABEL: Record = { + conference: { fa: 'کنفرانس', en: 'Conference', color: '#2471a3', bg: '#EAF2FB' }, + exhibition: { fa: 'نمایشگاه', en: 'Exhibition', color: '#1e8449', bg: '#EAFAF1' }, + seminar: { fa: 'نشست تخصصی', en: 'Seminar', color: '#7d3c98', bg: '#F5EEF8' }, + international: { fa: 'بین‌الملل', en: 'International', color: '#c0392b', bg: '#FDEDEC' }, } +const EVENT_IMGS: Record = { + 'iran-steel-congress-1403': '/news/photo-1611273426858-450d8e3c9fce.jpg', + 'middle-east-steel-metals-2024': '/news/photo-1570168007204-dfb528c6958f.jpg', + 'steel-policy-seminar-1404': '/news/photo-1567789884554-0b844b597180.jpg', + 'world-steel-forum-2025': '/news/photo-1504307651254-35680f356dfd.jpg', + 'iran-metallurgy-expo-1404': '/news/photo-1518770660439-4636190af475.jpg', + 'oecd-steel-summit-2025': '/news/photo-1581092160607-ee22731c9b4e.jpg', +} + +/* ── Countdown ─────────────────────────────────────────── */ +const HERO_TARGET = new Date('2026-10-16T09:00:00') +function useCountdown(target: Date) { + const calc = () => { + const diff = Math.max(0, target.getTime() - Date.now()) + return { + days: Math.floor(diff / 86400000), + hours: Math.floor((diff % 86400000) / 3600000), + mins: Math.floor((diff % 3600000) / 60000), + secs: Math.floor((diff % 60000) / 1000), + } + } + const [t, setT] = useState(calc) + useEffect(() => { const id = setInterval(() => setT(calc()), 1000); return () => clearInterval(id) }, []) + return t +} + +/* ── Jalali calendar helpers ────────────────────────────── */ +const WEEKDAYS = ['شنبه', 'یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنج‌شنبه', 'جمعه'] +const J_MONTHS = ['فروردین','اردیبهشت','خرداد','تیر','مرداد','شهریور','مهر','آبان','آذر','دی','بهمن','اسفند'] +const faNum = (n: number) => n.toLocaleString('fa-IR', { useGrouping: false }) + +function jParts(d: Date) { + const p = new Intl.DateTimeFormat('en-US-u-ca-persian', { day:'numeric', month:'numeric', year:'numeric' }).formatToParts(d) + const get = (t: string) => Number(p.find(x => x.type === t)?.value) + return { day: get('day'), month: get('month'), year: get('year') } +} +function buildMonth(anchor: Date) { + const { month, year } = jParts(anchor) + const first = new Date(anchor) + while (jParts(first).day !== 1) first.setDate(first.getDate() - 1) + const days: Date[] = [] + const cur = new Date(first) + while (jParts(cur).month === month && jParts(cur).year === year) { + days.push(new Date(cur)); cur.setDate(cur.getDate() + 1) + } + // Persian week starts Saturday → JS getDay(): Sat=6, Sun=0, Mon=1 … Fri=5 + const dowMap = [1, 2, 3, 4, 5, 6, 0] // Sun→1, Mon→2 … Sat→0 + const firstDow = dowMap[first.getDay()] + return { days, firstDow, month, year } +} + +function MiniCalendar({ anchor, onNav, eventDates, onSelect }: { + anchor: Date; onNav: (d: 1|-1) => void + eventDates: Date[]; onSelect: (d: Date) => void +}) { + const { days, firstDow, month, year } = buildMonth(anchor) + const today = new Date(); const todayJ = jParts(today) + + return ( +
+ {/* تقویم label row */} +
+ تقویم +
+ + {/* month nav */} +
+ + + {J_MONTHS[month - 1]}ماه {faNum(year)} + + +
+ + {/* weekday headers — pill bg #F7F7F7 */} +
+ {WEEKDAYS.map(d => ( +
{d}
+ ))} +
+ + {/* day cells — bg #F7F7F7 */} +
+ {Array.from({ length: firstDow }, (_, i) =>
)} + {days.map(d => { + const jp = jParts(d) + const isToday = jp.day === todayJ.day && jp.month === todayJ.month && jp.year === todayJ.year + const hasEv = eventDates.some(ed => { + const ej = jParts(ed); return ej.day === jp.day && ej.month === jp.month && ej.year === jp.year + }) + return ( + + ) + })} +
+
+ ) +} + +/* ── Countdown box ─────────────────────────────────────── */ +function CBox({ v, label }: { v: number; label: string }) { + return ( +
+
{faNum(v)}
+ {label} +
+ ) +} + +/* ── Main component ────────────────────────────────────── */ export default function Events() { const { lang } = useLang() const isFa = lang === 'fa' + const cd = useCountdown(HERO_TARGET) + + const [calAnchor, setCalAnchor] = useState(new Date()) + const [selEvt, setSelEvt] = useState(events[0]) + const [showAll, setShowAll] = useState(false) + + const handleCalNav = (dir: 1 | -1) => { + const n = new Date(calAnchor); n.setDate(n.getDate() + dir * 30); setCalAnchor(n) + } + + // approximate Gregorian marker dates for each event + const MONTH_OFF: Record = { + فروردین:3, اردیبهشت:4, خرداد:5, تیر:6, مرداد:7, شهریور:8, + مهر:9, آبان:10, آذر:11, دی:12, بهمن:1, اسفند:2, + } + const eventDates = events.map(ev => { + const m = MONTH_OFF[ev.month] ?? 3 + const yr = m < 3 ? 2026 : 2025 + return new Date(yr, m - 1, ev.date) + }) + + const featured = events[0] + const others = events.slice(1) + const visibleOthers = showAll ? others : others.slice(0, 4) + + const selType = TYPE_LABEL[selEvt.type] ?? { fa: selEvt.type, en: selEvt.type, color: GOLD, bg: '#f5f5f5' } + const featType = TYPE_LABEL[featured.type] ?? { fa: featured.type, en: featured.type, color: GOLD, bg: '#f5f5f5' } return ( -
-
-
-
- {isFa ? 'رسانه و رویداد' : 'Media & Events'} +
+ + {/* ═══════════════════════════════════════════════ + HERO BANNER + ═══════════════════════════════════════════════ */} +
+ {/* world map background */} + + {/* overlay + content absolutely on top of the image */} +
+ + {/* ═══════════════════════════════════════════════ + CALENDAR | SELECTED EVENT DETAIL + LTR grid so physical column order: calendar=LEFT, event=RIGHT + ═══════════════════════════════════════════════ */} +
+ {/* Figma: Calendar 409px | gap 37 | Card rest — LTR so calendar LEFT */} +
+ + {/* LEFT — calendar */} +
+ { + const jp = jParts(d) + const hit = events.find(ev => { + const m = MONTH_OFF[ev.month] ?? 3 + const yr = m < 3 ? 2026 : 2025 + const ed = new Date(yr, m - 1, ev.date) + return jParts(ed).day === jp.day && jParts(ed).month === jp.month + }) + if (hit) setSelEvt(hit) + }} + /> +
+ + {/* RIGHT — event card (Figma: white, border #E7E7E7, radius 16, padding 20, gap 20) */} +
-
-
- {events.map((ev) => { - const typeInfo = TYPE_LABEL[ev.type] ?? { fa: ev.type, color: GOLD } + {/* ═══════════════════════════════════════════════ + FEATURED UPCOMING EVENT + ═══════════════════════════════════════════════ */} +
+ {/* heading — gold right border (Figma: border-right 5px solid #CD9E53) */} +
+

+ {isFa ? 'رویداد برجسته پیش رو' : 'Featured Upcoming Event'} +

+
+ + {/* card: image LEFT (1fr) | navy RIGHT (2fr) */} +
+ + {/* IMAGE — gradient overlay + CTA at bottom */} +
+ + {/* bottom gradient overlay */} +
+ {/* bottom: date badge + CTA */} + +
+ + {/* NAVY PANEL */} +
+ {/* gold decorative bar */} +
+ + {/* content */} +
+ {/* ── top block: title + meta + tag | gold bottom border ── */} +
+ {/* title */} +

{featured.title}

+ {/* meta row: location | date | category tag — all right-aligned */} +
+ {/* location */} +
+ + {featured.city} +
+ {/* date */} +
+ + {featured.date} {featured.month} {featured.year} +
+ {/* category tag */} + + {isFa ? featType.fa : featured.type} + +
+
+ + {/* ── bottom block: why + description ── */} +
+

+ {isFa ? 'چرا این رویداد اهمیت دارد؟' : 'Why this event matters?'} +

+

{featured.description}

+
+
+
+
+
+ + {/* ═══════════════════════════════════════════════ + OTHER EVENTS GRID + ═══════════════════════════════════════════════ */} +
+ {/* heading — gold right border */} +
+

+ {isFa ? 'سایر رویدادها' : 'Other Events'} +

+
+ +
+ {visibleOthers.map(ev => { + const t = TYPE_LABEL[ev.type] ?? { fa: ev.type, en: ev.type, color: GOLD, bg: '#f5f5f5' } return (
{ const d = e.currentTarget as HTMLElement; d.style.transform = 'translateY(-3px)'; d.style.boxShadow = '0 12px 32px rgba(7,29,73,0.13)' }} - onMouseLeave={e => { const d = e.currentTarget as HTMLElement; d.style.transform = ''; d.style.boxShadow = '0 2px 16px rgba(7,29,73,0.07)' }} + onMouseEnter={e => { const el = e.currentTarget as HTMLElement; el.style.boxShadow='0 8px 28px rgba(3,35,64,0.13)'; el.style.transform='translateY(-2px)' }} + onMouseLeave={e => { const el = e.currentTarget as HTMLElement; el.style.boxShadow=''; el.style.transform='' }} > -
-
-
- - {ev.date} {ev.month} {ev.year} + {/* IMAGE — left side */} +
+ +
+ + {/* TEXT — right side */} +
+ {/* meta: location + date + category */} +
+
+ + {ev.city}
- - {isFa ? typeInfo.fa : ev.type} +
+ + {ev.date} {ev.month} {ev.year} +
+ + {isFa ? t.fa : ev.type}
- {ev.registrationOpen && ( - - {isFa ? 'ثبت‌نام باز' : 'Open'} - - )} -
-

{ev.title}

-

{ev.description}

-
- - {ev.location} — {ev.city} + + {/* content: title + desc + cta */} +
+

{ev.title}

+

{ev.description}

+ +
) })}
+ + {/* show all / less */} + {others.length > 4 && ( +
+ +
+ )}
) diff --git a/src/pages/Experts/Experts.tsx b/src/pages/Experts/Experts.tsx index 9b2ef49..87075a7 100644 --- a/src/pages/Experts/Experts.tsx +++ b/src/pages/Experts/Experts.tsx @@ -196,10 +196,14 @@ export default function Experts() { return () => clearInterval(interval) }, [isPaused]) + // only allow http(s) destinations — blocks javascript:/data: hrefs once these + // URLs come from the CMS instead of the static seed data + const safeHref = (url?: string) => (url && /^https?:\/\//i.test(url) ? url : undefined) + const renderSocialIcon = (expert: Expert) => (
{expert.telegram && ( - )} {expert.linkedin && ( - )} {expert.twitter && ( - )} {expert.website && ( - { - const id = setInterval(() => setSlideIdx(i => (i + 1) % slides.length), 5000) - return () => clearInterval(id) - }, [slides.length]) - const sectionRef = useRef(null) - const pinRef = useRef(null) - const centerRef = useRef(null) - const overlayRef = useRef(null) + const sectionRef = useRef(null) + const pinRef = useRef(null) + const centerRef = useRef(null) + const overlayRef = useRef(null) const headlineRef = useRef(null) - const hintRef = useRef(null) - const satRefs = useRef<(HTMLDivElement | null)[]>([]) + const hintRef = useRef(null) + const satRefs = useRef<(HTMLDivElement | null)[]>([]) const [isMobile, setIsMobile] = useState(false) useEffect(() => { @@ -91,14 +57,11 @@ export default function HeroSection() { return () => mq.removeEventListener('change', update) }, []) - // GSAP ScrollTrigger scrub timeline — drives the whole de-zoom + scatter off scroll progress. - // Synced to Lenis via the GSAP ticker set up in RootLayout (joinspread.app recipe). useLayoutEffect(() => { const section = sectionRef.current if (!section) return const ctx = gsap.context(() => { - // single scrubbed timeline pinned for the section's scroll length const tl = gsap.timeline({ scrollTrigger: { trigger: section, @@ -108,26 +71,20 @@ export default function HeroSection() { }, }) - // background morph navy → cream tl.fromTo(pinRef.current, { backgroundColor: NAVY }, { backgroundColor: PAPER, ease: 'none' }, 0) - // center image: full-bleed cover (scale 2.55) → centered rounded card tl.fromTo(centerRef.current, { scale: 2.55, borderRadius: 0 }, { scale: 1, borderRadius: 18, ease: 'none' }, 0) - // legibility overlay fades out as the image shrinks tl.fromTo(overlayRef.current, { opacity: 0.42 }, { opacity: 0, ease: 'none', duration: 0.4 }, 0) - // headline lifts + blurs + fades out as the de-zoom begins tl.fromTo(headlineRef.current, { yPercent: 0, opacity: 1, filter: 'blur(0px)' }, { yPercent: -10, opacity: 0, filter: 'blur(8px)', ease: 'none', duration: 0.35 }, 0) - // scroll hint fades immediately tl.fromTo(hintRef.current, { opacity: 1 }, { opacity: 0, ease: 'none', duration: 0.08 }, 0) - // satellites: clustered behind center → fan out to scattered positions with parallax satRefs.current.forEach((el, i) => { if (!el) return const s = SATELLITES[i] @@ -167,7 +124,7 @@ export default function HeroSection() { ) })} - {/* center image — de-zooms from full-bleed cover to a centered card */} + {/* center video — de-zooms from full-bleed cover to a centered card */}
-

+ }} className="max-md:!text-3xl"> {t.title}

{t.desc}

- {/* CTA buttons */} -
- {t.cta1 && ( - - - {t.cta1} - - )} -
- {/* slide dots */} -
- {slides.map((_, i) => ( -
diff --git a/src/pages/Home/sections/SpreadFeatures.tsx b/src/pages/Home/sections/SpreadFeatures.tsx index 4a1f12e..6d095e9 100644 --- a/src/pages/Home/sections/SpreadFeatures.tsx +++ b/src/pages/Home/sections/SpreadFeatures.tsx @@ -1,223 +1,14 @@ -import { useRef, useState, useEffect } from 'react' -import { motion, AnimatePresence, useScroll, useMotionValueEvent } from 'framer-motion' -import { useLang } from '@/context/LangContext' -import { ArrowLeft } from 'lucide-react' -import { Link } from 'react-router-dom' +import { useState, useEffect, useRef } from 'react' +import { motion } from 'framer-motion' -const NAVY = '#032340' const GOLD = '#CD9E53' +const NAVY = '#032340' const EASE = [0.22, 1, 0.36, 1] as const -type Feat = { - img: string - imgSide: 'left' | 'right' - imgPos?: string - fa: { kicker: string; title: string; desc: string; stat: string; statTail: string } - en: { kicker: string; title: string; desc: string; stat: string; statTail: string } -} - -/* Your 3 hero images. As you scroll, they replace each other in place with a fade. */ -const FEATURES: Feat[] = [ - { - img: '/hero%201.webp', imgSide: 'right', imgPos: 'right 35%', - fa: { - kicker: 'اندیشکده فولاد آینده', - title: 'بینشی نو برای توسعه‌ی صنعتی', - desc: '', - stat: '۶ بازار', - statTail: 'رصد ۲۴ ساعته. هشدار در کمتر از ۱۲ ثانیه.', - }, - en: { - kicker: 'Future Steel Institute', - title: 'A New Vision for Industrial Development', - desc: '', - stat: '6 markets', - statTail: 'Scanned 24/7. Alerts in under 12 seconds.', - }, - }, - { - img: '/hero2.webp', imgSide: 'left', imgPos: '100% center', - fa: { - kicker: 'فناوری صنعتی', - title: 'داده، تحلیل، آینده‌نگاری', - desc: 'تصمیم‌سازی هوشمند در جهانی در حال تحول\n+۱۰۰ منبع داده جهانی، رصد ۲۴/۷ بازارها', - stat: '٪۳۸', - statTail: 'میانگین حاشیه سود در هر معامله.', - }, - en: { - kicker: 'Industrial Technology', - title: 'Data, Analysis, Foresight', - desc: 'Smart decision-making in a world in transformation\n100+ global data sources, 24/7 market monitoring', - stat: '38%', - statTail: 'Average margin per deal.', - }, - }, - { - img: '/hero3.webp', imgSide: 'right', imgPos: '100% center', - fa: { - kicker: 'ژئواکونومی', - title: 'آزمون استراتژی در آینده‌ها', - desc: '', - stat: '۲۰ ساعت', - statTail: 'صرفه‌جویی هفتگی نسبت به روش دستی.', - }, - en: { - kicker: 'Geo-Economics', - title: 'Testing Strategy in Futures', - desc: '', - stat: '20 hrs', - statTail: 'Saved per week vs. manual.', - }, - }, -] - -/* fade-up + blur wrapper — fires fast on mount (re-keyed per active slide) */ -function FadeUp({ children, delay = 0 }: { children: React.ReactNode; delay?: number }) { - return ( - - {children} - - ) -} - -const DomeIcon = () => ( - - - - - - - -) - -const GearIcon = () => ( - - - - - - - - -) - -const ChartIcon = () => ( - - - - - - - - -) - -/* the text column for the active slide */ -function TextPanel({ index, feat, lang }: { index: number; feat: Feat; lang: 'fa' | 'en' }) { - const t = feat[lang] - const isSlide2 = index === 1 - const textColor = isSlide2 ? NAVY : GOLD - const descColor = isSlide2 ? 'rgba(3, 35, 64, 0.72)' : 'rgba(255, 255, 255, 0.78)' - - const renderIcon = () => { - if (index === 0) return - if (index === 1) return - return - } - - const buttonText = lang === 'fa' - ? (index === 0 ? 'آشنایی با چشم‌انداز ما' : index === 1 ? 'نبض صنعت' : 'آزمایشگاه آینده') - : (index === 0 ? 'Discover our perspective' : index === 1 ? 'Industry Pulse' : 'The Futures Laboratory') - const buttonHref = index === 0 ? '/about' : index === 1 ? '/pulse' : '/radar' - - return ( -
- -
- {renderIcon()} -
-
- -

- {t.title} -

-
- -

- {t.desc} -

-
- - - - {buttonText} - - -
- ) -} - -/* progress rail */ -function Rail({ active, total }: { active: number; total: number }) { - const inactiveColor = active === 1 ? 'rgba(3, 35, 64, 0.22)' : 'rgba(255, 255, 255, 0.3)' - return ( -
- {Array.from({ length: total }).map((_, i) => ( -
- ))} -
- ) -} - export default function SpreadFeatures() { - const { lang } = useLang() - const containerRef = useRef(null) - const [active, setActive] = useState(0) const [isMobile, setIsMobile] = useState(false) + const [videoSrc, setVideoSrc] = useState(null) + const blobUrl = useRef(null) useEffect(() => { const mq = window.matchMedia('(max-width: 767px)') @@ -227,123 +18,72 @@ export default function SpreadFeatures() { return () => mq.removeEventListener('change', update) }, []) - const { scrollYProgress } = useScroll({ target: containerRef, offset: ['start start', 'end end'] }) - useMotionValueEvent(scrollYProgress, 'change', (v) => { - const next = v < 0.34 ? 0 : v < 0.67 ? 1 : 2 - if (next !== active) setActive(next) - }) + // Fetch video as blob to bypass range-request issues on tunnels/proxies + useEffect(() => { + let cancelled = false + fetch('/hero-bg.mp4') + .then(r => { if (!r.ok) throw new Error('fetch failed'); return r.blob() }) + .then(blob => { + if (cancelled) return + const url = URL.createObjectURL(blob) + blobUrl.current = url + setVideoSrc(url) + }) + .catch(() => { /* keep navy background */ }) + return () => { + cancelled = true + if (blobUrl.current) URL.revokeObjectURL(blobUrl.current) + } + }, []) return ( -
-
+
+ {/* navy fallback — visible until video blob is ready */} +
- {FEATURES.map((f, i) => { - const isActive = i === active - const isTextOnLeft = i === 1 - const leftBg = isTextOnLeft ? GOLD : '#efe9e1' - const rightBg = isTextOnLeft ? '#efe9e1' : NAVY + {/* full-bleed video — src is a local blob URL, no range requests */} + {videoSrc && ( +
) diff --git a/src/pages/Home/sections/VideocastPodcastSection.tsx b/src/pages/Home/sections/VideocastPodcastSection.tsx index b0a1013..43bac69 100644 --- a/src/pages/Home/sections/VideocastPodcastSection.tsx +++ b/src/pages/Home/sections/VideocastPodcastSection.tsx @@ -95,16 +95,47 @@ export default function VideocastPodcastSection({ only }: { only?: 'video' | 'po
- {/* description only — playlist removed */} -
-
+ {/* active video description */} +
+
🎙

{VIDEOS[activeVideo][lang].title}

-

+

{VIDEOS[activeVideo][lang].body}

+ + {/* video playlist — 3 thumbnail cards */} +
+ {VIDEOS.slice(0, 3).map((v, i) => ( + + ))} +
)} @@ -131,208 +162,77 @@ export default function VideocastPodcastSection({ only }: { only?: 'video' | 'po
- {/* ── featured player card (light) ── */} + {/* ── featured player card ── */}
- {/* cover + rating container */} -
- -
- ★★★★★ - {pod.rating} + + {/* cover — full height, flush to right edge */} +
+ + {/* rating badge overlaid at bottom of cover */} +
+ ★★★★★ + {pod.rating}
- {/* player body */} + {/* player body — directly beside cover, no gap */}
- {/* Top Row: Buttons on the far left, Episode number on the right */} -
- {/* Download + Bookmark outline circular buttons */} + {/* buttons row + episode number */} +
- -
- - {/* Episode number */} -
- {pod.epNum} -
+
{pod.epNum}
- {/* Title Row */} -
-

- {pod[lang].title} -

+ {/* title */} +

+ {pod[lang].title} +

+ + {/* date */} +
+ + {pod.date}
- {/* Date Row (directly under Title) */} -
-
- - {pod.date} -
-
+
- {/* Separator line */} -
- - {/* Play button + Waveform row */} -
- {/* Play button */} - - - {/* Waveform container */} -
- ۰۲:۳۱ -
- {[ - 4, 6, 8, 10, 7, 5, 8, 12, 15, 18, 14, 10, 8, 12, 16, 20, 22, 17, 12, 9, - 12, 15, 18, 22, 24, 20, 15, 11, 8, 12, 15, 17, 20, 22, 18, 14, 10, 8, 12, 15, - 19, 21, 16, 12, 9, 11, 14, 18, 20, 16, 11, 8, 6, 9, 12, 15, 17, 13, 9, 7, - 10, 13, 16, 18, 14, 10, 8, 11, 14, 16, 13, 9, 7, 10, 13, 16, 18, 14, 10, 7 - ].map((h, i) => ( - +
+ ۰۲:۳۱ +
+ {[4,6,8,10,7,5,8,12,15,18,14,10,8,12,16,20,22,17,12,9,12,15,18,22,24,20,15,11,8,12,15,17,20,22,18,14,10,8,12,15,19,21,16,12,9,11,14,18,20,16,11,8,6,9,12,15,17,13,9,7,10,13,16,18,14,10,8,11,14,16,13,9,7,10,13,16,18,14,10,7].map((h, i) => ( + ))}
- {pod.duration} + {pod.duration}
@@ -353,7 +253,7 @@ export default function VideocastPodcastSection({ only }: { only?: 'video' | 'po flexDirection: 'column', gap: 16 }}> - {PODCASTS.filter((_, idx) => idx !== activePod).map((p) => { + {PODCASTS.filter((_, idx) => idx !== activePod).slice(0, 2).map((p) => { const originalIndex = PODCASTS.findIndex(item => item.id === p.id); return ( - ) +/* ══ CSS keyframes injected once ══ */ +const STYLE = ` +@keyframes gradSpin { + 0% { background-position: 0% 50% } + 50% { background-position: 100% 50% } + 100% { background-position: 0% 50% } } +@keyframes borderRotate { + 0% { --angle: 0deg } + 100% { --angle: 360deg } +} +@property --angle { + syntax: ''; + initial-value: 0deg; + inherits: false; +} +@keyframes pulse-bar { + 0%, 100% { transform: scaleY(0.3) } + 50% { transform: scaleY(1) } +} +.cover-border-wrap { + --angle: 0deg; + animation: borderRotate 3s linear infinite; + padding: 3px; + border-radius: 4px; + background: conic-gradient(from var(--angle), #7a4f00, #CD9E53, #f0d080, #fff8e1, #CD9E53, #7a4f00); + box-shadow: 0 0 24px #CD9E5366, 0 0 48px #CD9E5322; +} +` + +/* ══ Real waveform audio player ══ */ +function WavePlayer({ episodeKey }: { episodeKey: string | number }) { + const canvasRef = useRef(null) + const animRef = useRef(0) + const audioCtxRef = useRef(null) + const analyserRef = useRef(null) + const sourcesRef = useRef([]) + const gainRef = useRef(null) + + const [playing, setPlaying] = useState(false) + const [muted, setMuted] = useState(false) + const [progress, setProgress] = useState(0) // 0-1 + const [elapsed, setElapsed] = useState(0) // seconds + const startTimeRef = useRef(0) + const pausedAtRef = useRef(0) + const TOTAL = 180 // demo: 3 min + + /* draw waveform from analyser */ + const draw = useCallback(() => { + const canvas = canvasRef.current + const analyser = analyserRef.current + if (!canvas || !analyser) return + const ctx = canvas.getContext('2d')! + const data = new Uint8Array(analyser.frequencyBinCount) + analyser.getByteFrequencyData(data) + + const W = canvas.width, H = canvas.height + ctx.clearRect(0, 0, W, H) + + const bars = 80 + const step = Math.floor(data.length / bars) + const bw = W / bars + + for (let i = 0; i < bars; i++) { + const val = data[i * step] / 255 + const bh = Math.max(3, val * H * 0.9) + const x = i * bw + const y = (H - bh) / 2 + + // gradient per bar + const g = ctx.createLinearGradient(0, y, 0, y + bh) + g.addColorStop(0, `${GOLD}cc`) + g.addColorStop(0.5, GOLD) + g.addColorStop(1, `${GOLD}44`) + ctx.fillStyle = g + ctx.beginPath() + ctx.roundRect(x + 1, y, bw - 2, bh, 2) + ctx.fill() + } + + animRef.current = requestAnimationFrame(draw) + }, []) + + /* idle waveform (decorative) when paused */ + const drawIdle = useCallback(() => { + const canvas = canvasRef.current + if (!canvas) return + const ctx = canvas.getContext('2d')! + const W = canvas.width, H = canvas.height + ctx.clearRect(0, 0, W, H) + const bars = 80 + const bw = W / bars + for (let i = 0; i < bars; i++) { + const val = 0.08 + 0.12 * Math.sin(i * 0.4) + const bh = Math.max(3, val * H) + const x = i * bw + const y = (H - bh) / 2 + ctx.fillStyle = 'rgba(205,158,83,0.25)' + ctx.beginPath() + ctx.roundRect(x + 1, y, bw - 2, bh, 2) + ctx.fill() + } + }, []) + + /* stop engine */ + const stop = useCallback(() => { + cancelAnimationFrame(animRef.current) + sourcesRef.current.forEach(o => { try { o.stop(); o.disconnect() } catch { /* already stopped */ } }) + sourcesRef.current = [] + gainRef.current?.disconnect() + gainRef.current = null + analyserRef.current?.disconnect() + analyserRef.current = null + drawIdle() + }, [drawIdle]) + + /* start engine — synthesised audio (no file needed) */ + const start = useCallback(() => { + if (!audioCtxRef.current) audioCtxRef.current = new AudioContext() + const actx = audioCtxRef.current + if (actx.state === 'suspended') actx.resume() + + const analyser = actx.createAnalyser() + analyser.fftSize = 256 + analyserRef.current = analyser + + const gain = actx.createGain() + gain.gain.value = muted ? 0 : 0.04 + gainRef.current = gain + + /* layered oscillators for a richer "voice" look */ + const freqs = [120, 240, 480, 960] + const oscs: OscillatorNode[] = freqs.map(f => { + const osc = actx.createOscillator() + osc.type = 'sine' + osc.frequency.value = f + Math.random() * 40 + osc.connect(gain) + osc.start() + return osc + }) + sourcesRef.current = oscs + + gain.connect(analyser) + analyser.connect(actx.destination) + + startTimeRef.current = actx.currentTime - pausedAtRef.current + draw() + }, [draw, muted]) + + /* toggle play */ + const toggle = () => { + if (playing) { + pausedAtRef.current = (audioCtxRef.current?.currentTime ?? 0) - startTimeRef.current + stop() + setPlaying(false) + } else { + start() + setPlaying(true) + } + } + + /* progress ticker */ + useEffect(() => { + if (!playing) return + const id = setInterval(() => { + const t = (audioCtxRef.current?.currentTime ?? 0) - startTimeRef.current + setElapsed(t) + setProgress(Math.min(t / TOTAL, 1)) + if (t >= TOTAL) { stop(); setPlaying(false); setProgress(1) } + }, 200) + return () => clearInterval(id) + }, [playing, stop]) + + /* reset when episode changes */ + useEffect(() => { + stop() + setPlaying(false) + setProgress(0) + setElapsed(0) + pausedAtRef.current = 0 + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [episodeKey]) + + /* mute toggle */ + useEffect(() => { + if (gainRef.current) gainRef.current.gain.value = muted ? 0 : 0.04 + }, [muted]) + + /* initial idle draw */ + useEffect(() => { drawIdle() }, [drawIdle, episodeKey]) + + /* canvas resize */ + useEffect(() => { + const canvas = canvasRef.current + if (!canvas) return + const ro = new ResizeObserver(() => { + canvas.width = canvas.offsetWidth * devicePixelRatio + canvas.height = canvas.offsetHeight * devicePixelRatio + const ctx = canvas.getContext('2d')! + ctx.scale(devicePixelRatio, devicePixelRatio) + drawIdle() + }) + ro.observe(canvas) + return () => ro.disconnect() + }, [drawIdle]) + + const fmt = (s: number) => { + const m = Math.floor(s / 60), sec = Math.floor(s % 60) + return `${m}:${String(sec).padStart(2, '0')}` + } -/* ─── white book cover ─── */ -function BookCard({ pod, lang }: { pod: typeof PODCASTS[0]; lang: 'fa' | 'en' }) { - const epNum = pod.epNum.replace(/[^0-9۰-۹]/g, '') return ( -
-
{epNum}
-
- +
+ {/* waveform canvas */} +
{ + const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect() + const ratio = (e.clientX - rect.left) / rect.width + pausedAtRef.current = ratio * TOTAL + setProgress(ratio) + setElapsed(ratio * TOTAL) + if (playing) { stop(); start() } + }} + > + + {/* progress overlay */} +
+ {/* playhead */} +
-
-
{pod[lang].title}
-
{pod[lang].guest}
-
-
- + + {/* controls */} +
+ + + {fmt(elapsed)} + + {/* track bar */} +
{ + const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect() + const ratio = (e.clientX - rect.left) / rect.width + pausedAtRef.current = ratio * TOTAL + setProgress(ratio) + setElapsed(ratio * TOTAL) + if (playing) { stop(); start() } + }}> +
+
+
+ + {fmt(TOTAL)} + +
) } -/* ─── video list row ─── */ -function VidRow({ vid, lang }: { vid: typeof VIDEOS[0]; lang: 'fa' | 'en' }) { +/* ─── active glow pill ─── */ +function ActivePill({ active }: { active: boolean }) { + return active ? ( + + ) : null +} + +/* ─── episode sidebar item ─── */ +function EpItem({ pod, active, onClick, lang }: { + pod: typeof PODCASTS[0]; active: boolean; onClick: () => void; lang: 'fa' | 'en' +}) { const isFa = lang === 'fa' return ( -
-
- -
-
-
+
+ + {active && ( +
+
+
+ )}
{vid[lang].title}
-
- {vid.date} - {vid.duration} + transition: 'color .2s', + }}>{pod[lang].title}
+
+ + {pod.epNum} + · + {pod.duration}
-
+ ) } @@ -124,216 +363,506 @@ export default function Podcast() { const { lang } = useLang() const t = T[lang] const isFa = lang === 'fa' - const [active, setActive] = useState(0) + const [active, setActive] = useState(0) + const [activeVid, setActiveVid] = useState(0) + const [vidPlaying, setVidPlaying] = useState(false) const pod = PODCASTS[active] - const epNum = pod.epNum.replace(/[^0-9۰-۹]/g, '') + const vid = VIDEOS[activeVid] return ( -
-
+
+ - {/* ══ PODCAST HERO CARD (dark) ══ */} -
+ {/* ══ PODCAST SECTION ══ */} +
+
- {/* dot pattern */} -
- - {/* COL 1 — episode list */} + {/* label */}
+ + {t.podcast} +
+ + {/* main grid */} +
+ + {/* sidebar */}
- {t.otherEps} - -
-
- {PODCASTS.map((p, i) => ( - setActive(i)} lang={lang} /> - ))} -
-
- - {/* COL 2 — center */} -
- {/* meta */} -
- - {pod.date} - - - #{epNum} +
+
{t.episodes}
+
+
+ {PODCASTS.map((p, i) => ( + setActive(i)} lang={lang} /> + ))} +
- {/* title */} -

{pod[lang].title}

+ {/* hero */} +
- {/* guest */} -
{pod[lang].guest}
+ {/* blurred bg */} +
+
- {/* body excerpt */} -

{pod[lang].body}

+ {/* inner grid: text | cover-image */} +
- {/* listen + duration */} -
- - - {pod.duration} - + {/* ── COVER image column ── */} + {/* outer: spinning gradient border */} +
+ + {/* inner: clips image to rounded rect */} +
+ {pod[lang].title} +
+
+
+ + {/* ── text column ── */} +
+ + {/* ep badge */} +
+ {pod.epNum} + + {pod.date} +
+ + {/* title */} +

{pod[lang].title}

+ + {/* guest */} +
+
+ {pod[lang].guest} +
+ + {/* body */} +

{pod[lang].body}

+ + {/* ── AUDIO PLAYER ── */} +
+ {pod.mediaUrl + ?
+ + {/* bottom: rating only */} +
+ + ★ {pod.rating} + +
+ +
+
- - {/* COL 3 — book cover */} -
- -
+
+ + {/* ══ VIDEOCAST SECTION ══ */} +
+
- {/* ══ VIDEOCAST CARD (light) ══ */} -
{/* header */} -
-
-
- +
+
+
+ + {t.videocast}
- {t.videocast}
- {/* grid: featured (left) + list (right) */} -
+ {/* featured hero video */} +
{ if (vid.mediaUrl && !vidPlaying) setVidPlaying(true) }} + onMouseEnter={e => { + const el = e.currentTarget as HTMLDivElement + const img = el.querySelector('img'); if (img) (img as HTMLElement).style.transform = 'scale(1.04)' + const pb = el.querySelector('.play-btn') as HTMLElement | null; if (pb) pb.style.transform = 'translate(-50%,-50%) scale(1.12)' + }} + onMouseLeave={e => { + const el = e.currentTarget as HTMLDivElement + const img = el.querySelector('img'); if (img) (img as HTMLElement).style.transform = 'scale(1)' + const pb = el.querySelector('.play-btn') as HTMLElement | null; if (pb) pb.style.transform = 'translate(-50%,-50%) scale(1)' + }} + > + {vidPlaying && vid.mediaUrl ? ( +

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 <(U~*+8IQ_mn|4B6J_xc( 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