vkashti-bots / menu.js
menu.js
Raw
import dotenv from 'dotenv'
import axios from 'axios'
import path from 'path'
import fs from 'fs'

dotenv.config()

const categoriesPath = path.resolve('categories.json')
const barsyApiUrl = 'https://vkashtibar.barsyonline.com/endpoints/json/'
const barsyUser = process.env.BARSY_USER
const barsyPassword = process.env.BARSY_PASSWORD

// Fetch categories from the Barsy API
const fetchCategories = async () => {
  try {
    const response = await axios.post(
      `${barsyApiUrl}Categories_getlist`,
      {},
      {
        auth: {
          username: barsyUser,
          password: barsyPassword,
        },
        headers: {
          'Content-Type': 'application/json',
        },
      }
    )

    return response.data || []
  } catch (error) {
    console.error('Error fetching categories:', error)
    return []
  }
}

// Fetch articles for a specific category
const fetchArticlesByCategory = async (categoryId) => {
  try {
    const response = await axios.post(
      `${barsyApiUrl}Articles_getlistobject`,
      {
        action_type: 'values',
        filters: {
          single_cat_id: categoryId,
        },
        columns: [
          'article_id',
          'article_name',
          'actual_price',
        ],
      },
      {
        auth: {
          username: barsyUser,
          password: barsyPassword,
        },
        headers: {
          'Content-Type': 'application/json',
        },
      }
    )

    return response.data.list || []
  } catch (error) {
    console.error(
      `Error fetching articles for category ID ${categoryId}:`,
      error
    )
    return []
  }
}

// Save categories with articles to a file
const saveCategoriesToFile = (categories) => {
  try {
    // Include only the required fields for each category
    const sanitizedCategories = categories.map((category) => ({
      cat_id: category.cat_id,
      parent_id: category.parent_id,
      cat_name: category.cat_name,
      articles: category.articles.map((article) => ({
        article_id: article.article_id,
        article_name: article.article_name,
        actual_price: article.actual_price,
      })),
    }))

    fs.writeFileSync(
      categoriesPath,
      JSON.stringify(sanitizedCategories, null, 2)
    )
    console.log('Categories with articles saved to categories.json')
  } catch (error) {
    console.error('Error saving categories to file:', error)
  }
}

// Main function to fetch categories and their articles
const fetchCategoriesWithArticles = async () => {
  const categories = await fetchCategories()

  if (categories.length === 0) {
    console.log('No categories found.')
    return
  }

  for (const category of categories) {
    const articles = await fetchArticlesByCategory(category.cat_id)
    category.articles = articles.map((article) => ({
      article_id: article.article_id,
      article_name: article.article_name,
      actual_price: article.actual_price,
      amount_type_name_short: article.amount_type_name_short,
      article_name_public: article.article_name_public,
    }))
  }

  saveCategoriesToFile(categories)
}

// Execute the main function
fetchCategoriesWithArticles()