Squashed commit message
Some checks failed
Telegram Mini App Shop Builder / Compute version metadata (push) Has been cancelled
Telegram Mini App Shop Builder / Run Frontend tests (push) Has been cancelled
Telegram Mini App Shop Builder / Run Backend tests (push) Has been cancelled
Telegram Mini App Shop Builder / Run PHP_CodeSniffer (push) Has been cancelled
Telegram Mini App Shop Builder / Build module. (push) Has been cancelled
Telegram Mini App Shop Builder / release (push) Has been cancelled

This commit is contained in:
2026-03-11 22:08:41 +03:00
commit f329bfa9d9
585 changed files with 65605 additions and 0 deletions

34
scripts/build_phar.sh Executable file
View File

@@ -0,0 +1,34 @@
#!/bin/sh
set -e
SRC_PATH="/app"
BUILD_PATH="/build"
MODULE_NAME="oc_telegram_shop"
PHAR_PATH="${BUILD_PATH}/${MODULE_NAME}.phar"
echo "PHP Obfuscation: framework"
yakpro-po --config-file /usr/local/yakpro-po/config.php ${SRC_PATH}/framework -o /tmp/obfuscated
rm -rf ${SRC_PATH}/framework
mv /tmp/obfuscated/yakpro-po/obfuscated ${SRC_PATH}/framework
echo "PHP Obfuscation: src"
yakpro-po --config-file /usr/local/yakpro-po/config.php ${SRC_PATH}/src -o /tmp/obfuscated
rm -rf ${SRC_PATH}/src
mv /tmp/obfuscated/yakpro-po/obfuscated ${SRC_PATH}/src
echo "PHP Obfuscation: bastion"
yakpro-po --config-file /usr/local/yakpro-po/config.php ${SRC_PATH}/bastion -o /tmp/obfuscated
rm -rf ${SRC_PATH}/bastion
mv /tmp/obfuscated/yakpro-po/obfuscated ${SRC_PATH}/bastion
echo "📜 Creating Phar archive..."
rm -rf "${BUILD_PATH}/extracted"
mkdir -p "${BUILD_PATH}"
echo "Source path: ${SRC_PATH}"
echo "Destination: ${PHAR_PATH}"
php -d phar.readonly=0 /scripts/ci/create-phar.php "${SRC_PATH}" "${PHAR_PATH}"
echo "Extracting ..."
php -d phar.readonly=0 /scripts/ci/extract-phar.php "${PHAR_PATH}" "${BUILD_PATH}/extracted"

157
scripts/ci/build.sh Executable file
View File

@@ -0,0 +1,157 @@
#!/bin/bash
set -e
MODULE_NAME="oc_telegram_shop"
CURRENT_DIR="$(dirname "$0")"
echo "Current dir: ${CURRENT_DIR}"
composer --version
node --version
php -v
SRC_PATH="$1"
BUILD_PATH="${GITHUB_WORKSPACE}/build"
mkdir -p "$BUILD_PATH"
echo "🔨 Starting build process..."
echo " Source path: ${SRC_PATH}"
echo " Build path: ${BUILD_PATH}"
if [ -z "$BUILD_PATH" ]; then
echo "❌ Error: BUILD_PATH is required"
exit 1
fi
if [ -z "$SRC_PATH" ]; then
echo "❌ Error: SRC_PATH is required"
exit 1
fi
echo "Build Megapay SPA Frontend..."
cd "${SRC_PATH}/frontend/spa"
npm install
npm run build
echo "Move manifest file"
cp "${SRC_PATH}/module/oc_telegram_shop/upload/image/catalog/tgshopspa/.vite/manifest.json" "${SRC_PATH}/module/oc_telegram_shop/upload/image/catalog/tgshopspa/manifest.json"
rm -rf "${SRC_PATH}/module/oc_telegram_shop/upload/image/catalog/tgshopspa/.vite"
echo "Build Admin Frontend"
cd "${SRC_PATH}/frontend/admin"
npm install
npm run build
echo "Calculate MD5 hash sum"
cd ../../module/oc_telegram_shop/upload/admin/view/javascript/acmeshop
FILES=("acmeshop.css" "acmeshop.js")
HASH=$(cat "${FILES[@]}" | md5sum | awk '{print $1}')
OUTPUT="checksum.hash"
echo "$HASH" > "$OUTPUT"
echo "Checksum in $OUTPUT: $HASH"
cd "$SRC_PATH"
echo "Cleanup frontend"
rm -fv module/oc_telegram_shop/upload/image/catalog/tgshopspa/vite.svg
rm -fv module/oc_telegram_shop/upload/image/catalog/tgshopspa/assets/*.map
rm -fv module/oc_telegram_shop/upload/admin/view/integration.js
rm -fv module/oc_telegram_shop/upload/admin/view/javascript/acmeshop/acmeshop.js.map
rm -fv module/oc_telegram_shop/upload/admin/view/javascript/acmeshop/favicon.ico
echo "Install Composer dependencies."
cd "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop"
composer install \
--prefer-dist \
--no-dev \
--optimize-autoloader \
--no-interaction \
--no-cache
cd "$SRC_PATH"
echo "Copy .env for production"
cp "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/.env.production" \
"${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/.env"
# PHP Obfuscation
# Temporary disabled
#echo "Install PHP Obfuscation lib"
#cd "${GITHUB_WORKSPACE}"
#echo "Download yakpro-po"
#wget https://github.com/pk-fr/yakpro-po/archive/refs/heads/master.zip
#unzip -oq "master.zip"
#rm master.zip
#cd "${GITHUB_WORKSPACE}/yakpro-po-master"
#echo "Download PHP-Parser"
#wget https://github.com/nikic/PHP-Parser/archive/refs/heads/4.x.zip -O parser.zip
#unzip -oq "parser.zip"
#mv PHP-Parser-4.x PHP-Parser
#chmod a+x "${GITHUB_WORKSPACE}/yakpro-po-master/yakpro-po.php"
#
#echo "Version 4.19.4 (2024-09-29)" >> "${GITHUB_WORKSPACE}/yakpro-po-master/PHP-Parser/CHANGELOG.md"
#
#echo "PHP Obfuscation: framework"
#php "${GITHUB_WORKSPACE}/yakpro-po-master/yakpro-po.php" --silent --config-file \
# "${SRC_PATH}/docker/config.php" \
# "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/framework" \
# -o /tmp/obfuscated
#rm -rf "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/framework"
#mv /tmp/obfuscated/yakpro-po/obfuscated "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/framework"
#
#echo "PHP Obfuscation: src"
#php "${GITHUB_WORKSPACE}/yakpro-po-master/yakpro-po.php" --silent --config-file \
# "${SRC_PATH}/docker/config.php" \
# "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/src" \
# -o /tmp/obfuscated
#rm -rf "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/src"
#mv /tmp/obfuscated/yakpro-po/obfuscated "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/src"
#
#echo "PHP Obfuscation: bastion"
#php "${GITHUB_WORKSPACE}/yakpro-po-master/yakpro-po.php" --silent --config-file \
# "${SRC_PATH}/docker/config.php" \
# "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/bastion" \
# -o /tmp/obfuscated
#rm -rf "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/bastion"
#mv /tmp/obfuscated/yakpro-po/obfuscated "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/bastion"
cd "$SRC_PATH"
echo "📜 Creating Phar archive..."
rm -rf \
"${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/tests" \
"${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/phpunit.xml" \
"${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/psalm.xml" \
"${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/psalm-classes.php" \
"${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop/psalm-stubs.php"
php -d phar.readonly=0 scripts/ci/create-phar.php "${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop" "${MODULE_NAME}.phar"
echo "📦 Packaging into .ocmod.zip..."
mkdir -p "${SRC_PATH}/module/oc_telegram_shop/upload/system/library/oc_telegram_shop"
mv "${MODULE_NAME}.phar" "${SRC_PATH}/module/oc_telegram_shop/upload/system/library/oc_telegram_shop"
mv "${SRC_PATH}/module/oc_telegram_shop/upload/cli.php" "${SRC_PATH}/module/oc_telegram_shop/upload/system/library/oc_telegram_shop"
chmod +x "${SRC_PATH}/module/oc_telegram_shop/upload/system/library/oc_telegram_shop/cli.php"
rm -rf \
"${SRC_PATH}/module/oc_telegram_shop/upload/oc_telegram_shop"
cd "${SRC_PATH}/module/oc_telegram_shop/"
echo "List files"
ls -la ./upload
zip -rqq "${MODULE_NAME}.ocmod.zip" .
mv "${MODULE_NAME}.ocmod.zip" "${BUILD_PATH}"
FINAL_FILE="${BUILD_PATH}/${MODULE_NAME}.ocmod.zip"
if [ -f "$FINAL_FILE" ]; then
FILE_SIZE=$(du -h "$FINAL_FILE" | cut -f1)
echo -e "✅ Build completed successfully!"
echo -e "🎉 Created: $FINAL_FILE ($FILE_SIZE)"
else
echo "❌ Error: Final build file not found: $FINAL_FILE"
exit 1
fi
echo -e "🎯 Build artifact ready for installation!"

View File

@@ -0,0 +1,37 @@
<?php
$sourcePath = $argv[1] ?? null;
$pharFile = $argv[2] ?? null;
if (! $sourcePath) {
throw new InvalidArgumentException('Source path must be provided');
}
if (! $pharFile) {
throw new InvalidArgumentException('Phar file must be provided');
}
// Remove old file if exists
if (file_exists($pharFile)) {
unlink($pharFile);
}
// Create new Phar archive
$phar = new Phar($pharFile);
// Start buffering
$phar->startBuffering();
// Add files from source directory
$phar->buildFromDirectory($sourcePath);
// (Optional) Set stub file — main entry point
// $phar->setStub($phar->createDefaultStub('index.php'));
$phar->compressFiles(Phar::GZ);
// Stop buffering and write
$phar->stopBuffering();
echo "Phar created: $pharFile\n";

View File

@@ -0,0 +1,17 @@
<?php
$pharFile = $argv[1] ?? null;
$dstPath = $argv[2] ?? null;
if (! $dstPath) {
throw new InvalidArgumentException('Dst path must be provided');
}
if (! $pharFile) {
throw new InvalidArgumentException('Phar file must be provided');
}
$phar = new Phar($pharFile);
$phar->extractTo($dstPath);
echo "Phar extracted: $pharFile\n";

35
scripts/download_oc_store.sh Executable file
View File

@@ -0,0 +1,35 @@
#!/bin/bash
# The script downloads and unzip ocStore.
# Should be executed from the project root folder.
set -e
OCSTORE_VERSION=v3.0.3.7
CACHE_DIR=.cache
echo "👽 Downloading ocStore ${OCSTORE_VERSION}..."
DOWNLOAD_URL="https://github.com/ocStore/ocStore/archive/refs/tags/$OCSTORE_VERSION.zip"
FILE_PATH="$CACHE_DIR/$OCSTORE_VERSION.zip"
if [ ! -f "$FILE_PATH" ]; then
mkdir -p "$CACHE_DIR"
wget -P "$CACHE_DIR" "$DOWNLOAD_URL"
else
echo "😎 Get file from cache: $FILE_PATH"
fi
echo "🗃 Unzipping..."
rm -rf src/*
unzip -q "$FILE_PATH" -d ./src
SOURCE_DIR=src/ocStore-${OCSTORE_VERSION//v/}
rsync -a $SOURCE_DIR/* ./src
rm -rf $SOURCE_DIR
chmod -R 775 src
echo "✅ Completed."

42
scripts/install_ocstore.sh Executable file
View File

@@ -0,0 +1,42 @@
#!/bin/bash
# The script install ocStore.
# Should be executed from the project root folder.
echo "Setup ocStore..."
set -e
docker compose down -v && docker compose up -d web mysql --remove-orphans
bash ./scripts/wait_for_containers.sh
bash ./scripts/wait_for_mysql.sh
echo "Install composer dependencies..."
docker compose exec web bash -c "cd /web; composer update"
docker compose exec web bash -c '\
cd /web/upload/install; \
php cli_install.php install \
--db_hostname mysql \
--db_username root \
--db_password secret \
--db_database ocstore3 \
--db_driver mysqli \
--db_port 3306 \
--username admin \
--password admin \
--email youremail@example.com \
--http_server https://api.example.com/; exit $?'
docker compose exec web bash -c "cd /web; composer update"
echo "Moving storage folder outside the system."
mv src/upload/system/storage src/
docker compose exec web bash -c "\
sed -i \"s/DIR_SYSTEM \. 'storage\/'/'\/web\/storage\/'/g\" /web/upload/config.php
sed -i \"s/DIR_SYSTEM \. 'storage\/'/'\/web\/storage\/'/g\" /web/upload/admin/config.php"
rm -rf src/upload/install
echo "OcStore successfully installed."

40
scripts/link.php Normal file
View File

@@ -0,0 +1,40 @@
<?php
$module = 'oc_telegram_shop';
$basePath = dirname(__DIR__) . '/';
if ($basePath === '//') {
$basePath = '/';
}
$modulesPath = $basePath . 'module/';
$modulePath = $modulesPath . $module . '/upload/';
$files = [];
$iterator = new RecursiveDirectoryIterator($modulePath);
$recursiveIterator = new RecursiveIteratorIterator($iterator);
/** @var SplFileInfo $file */
foreach ($recursiveIterator as $file) {
if ($file->isFile() && fnmatch($pattern = '*', $file->getFilename())) {
$files[] = $file->getRealPath();
}
}
foreach ($files as $file) {
$link = $basePath . 'web/upload/' . str_replace($modulePath, '', $file);
if (! is_dir(dirname($link))) {
if (!mkdir($concurrentDirectory = dirname($link), 0775, true) && !is_dir($concurrentDirectory)) {
throw new \RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory));
}
}
echo sprintf('%s => %s', $file, $link) . PHP_EOL;
@unlink($link);
symlink($file, $link);
chmod($link, 0777);
}

28
scripts/wait_for_containers.sh Executable file
View File

@@ -0,0 +1,28 @@
#!/bin/bash
SERVICES=("web" "mysql")
function check_containers {
for service in "${SERVICES[@]}"; do
if ! docker compose ps $service | grep "Up" > /dev/null; then
return 1
fi
done
return 0
}
echo "Waiting for docker containers..."
MAX_WAIT_TIME=60
WAIT_TIME=0
while ! check_containers; do
if [ $WAIT_TIME -ge $MAX_WAIT_TIME ]; then
echo "Containers have not started within $MAX_WAIT_TIME seconds. Exit."
exit 1
fi
sleep 1
WAIT_TIME=$((WAIT_TIME + 1))
done
echo "All docker containers executed."

24
scripts/wait_for_mysql.sh Normal file
View File

@@ -0,0 +1,24 @@
#!/bin/bash
MYSQL_SERVICE="mysql"
function check_mysql {
docker compose exec $MYSQL_SERVICE mysqladmin ping --silent
}
echo "Waiting for MySQL..."
MAX_WAIT_TIME=60
WAIT_TIME=0
while ! check_mysql; do
if [ $WAIT_TIME -ge $MAX_WAIT_TIME ]; then
echo "MySQL has not been available for $MAX_WAIT_TIME secods. Exit."
exit 1
fi
sleep 1
WAIT_TIME=$((WAIT_TIME + 1))
done
sleep 5
echo "MySQL ready."