Files
evo-sync/run/vk/delete-products.sh
mguschin 053fa62395 v1.
2026-02-02 19:52:58 +03:00

93 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
source $SCRIPT_DIR/constants.sh
source $ROOT_DIR/run/evo/constants.sh
source $SCRIPT_DIR/functions.sh
# Setup logging
setup_logging
# Trap signals to ensure proper cleanup
trap 'cleanup 1' HUP INT QUIT TERM
# Delete products from vk which were deleted from evo.
# loop across vk products.
vkPath=$VK_PRODUCTS_PATH/$VK_API_GROUP_ID
vkFileName=`ls $vkPath -Art | tail -1`
vkFilePath=$vkPath/$vkFileName
evoPath=$EVO_PRODUCTS_PATH/$EVO_API_STORE_ID
evoFileName=`ls $evoPath -Art | tail -1`
evoFilePath=$evoPath/$evoFileName
hasEvoItems=`yq '. | has("items")' $evoFilePath`
if ! $hasEvoItems; then
cleanup 1
fi
# Build associative array of EVO product names (transformed)
declare -A evoNames
while IFS= read -r line; do
if [[ -n "$line" ]]; then
item_name=$(echo "$line" | yq -r '.name')
if [[ -n "$item_name" && "$item_name" != "null" ]]; then
transformed_name=$(echo "$item_name" | xargs)
transformed_name="${transformed_name//;/,}"
evoNames["$transformed_name"]=1
fi
fi
done < <(yq -o=j -I=0 '.items[]' $evoFilePath)
# Build associative array of VK items by name (transformed)
declare -A vkItemsByName
readarray vkItems < <(yq -o=j -I=0 '.response.items[]' $vkFilePath )
for vkItem in "${vkItems[@]}"; do
vkItemName=$(echo $vkItem | yq .title | xargs)
vkItemName="${vkItemName//;/,}"
vkItemId=$(echo $vkItem | yq .id)
# Store VK item IDs by name (append to comma-separated list)
if [[ -n "${vkItemsByName[$vkItemName]}" ]]; then
vkItemsByName[$vkItemName]="${vkItemsByName[$vkItemName]},$vkItemId"
else
vkItemsByName[$vkItemName]="$vkItemId"
fi
done
# For each VK name, check if it exists in EVO
for vkName in "${!vkItemsByName[@]}"; do
IFS=',' read -ra ids <<< "${vkItemsByName[$vkName]}"
if [[ -n "${evoNames[$vkName]}" ]]; then
# If multiple VK items for this name, keep the oldest (first), delete the rest
if (( ${#ids[@]} > 1 )); then
for ((i=1; i<${#ids[@]}; i++)); do
vkItemId="${ids[$i]}"
echo "$(timestamp) [REQUEST] Deleting duplicate product: $vkName (id=$vkItemId)" >> "$LOG_FILE"
response=$(curl -s -w "%{http_code}" -H "Authorization: Bearer $VK_API_USER_TOKEN" \
-F owner_id=$VK_API_PARAM_OWNER_ID \
-F item_id=$vkItemId \
$VK_API_DELETE_PRODUCT)
http_code=${response: -3}
response_body=${response:0:-3}
echo "$(timestamp) [RESPONSE] code=$http_code body=$response_body" >> "$LOG_FILE"
done
fi
else
# If VK name not in EVO, delete all VK items for this name
for vkItemId in "${ids[@]}"; do
echo "$(timestamp) [REQUEST] Deleting product not in EVO: $vkName (id=$vkItemId)" >> "$LOG_FILE"
response=$(curl -s -w "%{http_code}" -H "Authorization: Bearer $VK_API_USER_TOKEN" \
-F owner_id=$VK_API_PARAM_OWNER_ID \
-F item_id=$vkItemId \
$VK_API_DELETE_PRODUCT)
http_code=${response: -3}
response_body=${response:0:-3}
echo "$(timestamp) [RESPONSE] code=$http_code body=$response_body" >> "$LOG_FILE"
done
fi
done
# Use the cleanup function instead of directly exiting
cleanup 0