diff --git a/.github/workflows/ncc_workflow.yml b/.github/workflows/ncc_workflow.yml
new file mode 100644
index 0000000..83ec6dc
--- /dev/null
+++ b/.github/workflows/ncc_workflow.yml
@@ -0,0 +1,430 @@
+name: CI
+
+on:
+ push:
+ branches:
+ - '**'
+ release:
+ types: [created]
+ workflow_dispatch:
+
+jobs:
+ release:
+ runs-on: ubuntu-latest
+ container:
+ image: php:8.3
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ run: |
+ apt update -yqq
+ apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
+
+ - name: Install phive
+ run: |
+ wget -O phive.phar https://phar.io/releases/phive.phar
+ wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
+ gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
+ gpg --verify phive.phar.asc phive.phar
+ chmod +x phive.phar
+ mv phive.phar /usr/local/bin/phive
+
+ - name: Install phab
+ run: |
+ phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
+
+ - name: Install latest version of NCC
+ run: |
+ git clone https://git.n64.cc/nosial/ncc.git
+ cd ncc
+ make redist
+ NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
+ if [ -z "$NCC_DIR" ]; then
+ echo "NCC build directory not found"
+ exit 1
+ fi
+ php "$NCC_DIR/INSTALL" --auto
+ cd .. && rm -rf ncc
+
+ - name: Build project
+ run: |
+ ncc build --config release --build-source --log-level debug
+
+ - name: Upload build artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: release
+ path: build/release/net.nosial.file_server.ncc
+ debug:
+ runs-on: ubuntu-latest
+ container:
+ image: php:8.3
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ run: |
+ apt update -yqq
+ apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
+
+ - name: Install phive
+ run: |
+ wget -O phive.phar https://phar.io/releases/phive.phar
+ wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
+ gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
+ gpg --verify phive.phar.asc phive.phar
+ chmod +x phive.phar
+ mv phive.phar /usr/local/bin/phive
+
+ - name: Install phab
+ run: |
+ phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
+
+ - name: Install latest version of NCC
+ run: |
+ git clone https://git.n64.cc/nosial/ncc.git
+ cd ncc
+ make redist
+ NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
+ if [ -z "$NCC_DIR" ]; then
+ echo "NCC build directory not found"
+ exit 1
+ fi
+ php "$NCC_DIR/INSTALL" --auto
+ cd .. && rm -rf ncc
+
+ - name: Build project
+ run: |
+ ncc build --config debug --build-source --log-level debug
+
+ - name: Upload build artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: debug
+ path: build/debug/net.nosial.file_server.ncc
+ release_executable:
+ runs-on: ubuntu-latest
+ container:
+ image: php:8.3
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ run: |
+ apt update -yqq
+ apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
+
+ - name: Install phive
+ run: |
+ wget -O phive.phar https://phar.io/releases/phive.phar
+ wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
+ gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
+ gpg --verify phive.phar.asc phive.phar
+ chmod +x phive.phar
+ mv phive.phar /usr/local/bin/phive
+
+ - name: Install phab
+ run: |
+ phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
+
+ - name: Install latest version of NCC
+ run: |
+ git clone https://git.n64.cc/nosial/ncc.git
+ cd ncc
+ make redist
+ NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
+ if [ -z "$NCC_DIR" ]; then
+ echo "NCC build directory not found"
+ exit 1
+ fi
+ php "$NCC_DIR/INSTALL" --auto
+ cd .. && rm -rf ncc
+
+ - name: Build project
+ run: |
+ ncc build --config release_executable --build-source --log-level debug
+
+ - name: Upload build artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: release_executable
+ path: build/release/FileServer
+ debug_executable:
+ runs-on: ubuntu-latest
+ container:
+ image: php:8.3
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ run: |
+ apt update -yqq
+ apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
+
+ - name: Install phive
+ run: |
+ wget -O phive.phar https://phar.io/releases/phive.phar
+ wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
+ gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
+ gpg --verify phive.phar.asc phive.phar
+ chmod +x phive.phar
+ mv phive.phar /usr/local/bin/phive
+
+ - name: Install phab
+ run: |
+ phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
+
+ - name: Install latest version of NCC
+ run: |
+ git clone https://git.n64.cc/nosial/ncc.git
+ cd ncc
+ make redist
+ NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
+ if [ -z "$NCC_DIR" ]; then
+ echo "NCC build directory not found"
+ exit 1
+ fi
+ php "$NCC_DIR/INSTALL" --auto
+ cd .. && rm -rf ncc
+
+ - name: Build project
+ run: |
+ ncc build --config debug_executable --build-source --log-level debug
+
+ - name: Upload build artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: debug_executable
+ path: build/debug/FileServer
+
+
+ # Checking for phpunit.xml
+ check-phpunit:
+ runs-on: ubuntu-latest
+ outputs:
+ phpunit-exists: ${{ steps.check.outputs.phpunit-exists }}
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - name: Check for phpunit.xml
+ id: check
+ run: |
+ if [ -f phpunit.xml ]; then
+ echo "phpunit-exists=true" >> $GITHUB_OUTPUT
+ else
+ echo "phpunit-exists=false" >> $GITHUB_OUTPUT
+ fi
+ # Checking for phpdoc.dist.xml
+ check-phpdoc:
+ runs-on: ubuntu-latest
+ outputs:
+ phpdoc-exists: ${{ steps.check.outputs.phpdoc-exists }}
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - name: Check for phpdoc.dist.xml
+ id: check
+ run: |
+ if [ -f phpdoc.dist.xml ]; then
+ echo "phpdoc-exists=true" >> $GITHUB_OUTPUT
+ else
+ echo "phpdoc-exists=false" >> $GITHUB_OUTPUT
+ fi
+ generate-phpdoc:
+ needs: [release, check-phpdoc]
+ runs-on: ubuntu-latest
+ container:
+ image: php:8.3
+ if: needs.check-phpdoc.outputs.phpdoc-exists == 'true'
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ run: |
+ apt update -yqq
+ apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
+
+ - name: Download PHPDocumentor
+ run: |
+ wget https://phpdoc.org/phpDocumentor.phar
+ chmod +x phpDocumentor.phar
+
+ - name: Generate PHPDoc
+ run: |
+ php phpDocumentor.phar -d src -t docs
+
+ - name: Archive PHPDoc
+ run: |
+ zip -r docs.zip docs
+
+ - name: Upload PHPDoc
+ uses: actions/upload-artifact@v4
+ with:
+ name: documentation
+ path: docs.zip
+
+ test:
+ needs: [release, debug, release_executable, debug_executable, check-phpunit]
+ runs-on: ubuntu-latest
+ container:
+ image: php:8.3
+ if: needs.check-phpunit.outputs.phpunit-exists == 'true'
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Download build artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: release
+ path: release
+
+ - name: Install dependencies
+ run: |
+ apt update -yqq
+ apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
+ curl -sSLf -o /usr/local/bin/install-php-extensions https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions
+ chmod +x /usr/local/bin/install-php-extensions
+ install-php-extensions zip
+
+ - name: Install phive
+ run: |
+ wget -O phive.phar https://phar.io/releases/phive.phar
+ wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
+ gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
+ gpg --verify phive.phar.asc phive.phar
+ chmod +x phive.phar
+ mv phive.phar /usr/local/bin/phive
+
+ - name: Install phab
+ run: |
+ phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C
+
+ - name: Install latest version of NCC
+ run: |
+ git clone https://git.n64.cc/nosial/ncc.git
+ cd ncc
+ make redist
+ NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
+ if [ -z "$NCC_DIR" ]; then
+ echo "NCC build directory not found"
+ exit 1
+ fi
+ php "$NCC_DIR/INSTALL" --auto
+ cd .. && rm -rf ncc
+
+ - name: Install NCC packages
+ run: |
+ ncc package install --package="release/net.nosial.file_server.ncc" --build-source --reinstall -y --log-level debug
+
+ - name: Run PHPUnit tests
+ run: |
+ wget https://phar.phpunit.de/phpunit-11.3.phar
+ php phpunit-11.3.phar --configuration phpunit.xml --log-junit reports/junit.xml --log-teamcity reports/teamcity --testdox-html reports/testdox.html --testdox-text reports/testdox.txt
+
+ - name: Upload test reports
+ uses: actions/upload-artifact@v4
+ with:
+ name: reports
+ path: reports
+
+
+ release-documentation:
+ needs: generate-phpdoc
+ permissions: write-all
+ runs-on: ubuntu-latest
+ container:
+ image: php:8.3
+ if: github.event_name == 'release'
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Download documentation artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: documentation
+ path: documentation
+
+ - name: Upload documentation artifact
+ uses: softprops/action-gh-release@v1
+ with:
+ files: |
+ documentation/*
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+
+ release-artifacts:
+ needs: [release, debug, release_executable, debug_executable]
+ permissions: write-all
+ runs-on: ubuntu-latest
+ container:
+ image: php:8.3
+ if: github.event_name == 'release'
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Download release artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: release
+ path: release
+ - name: Upload release artifact to release
+ uses: softprops/action-gh-release@v1
+ with:
+ files: |
+ release/*
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Download debug artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: debug
+ path: debug
+ - name: Upload debug artifact to release
+ uses: softprops/action-gh-release@v1
+ with:
+ files: |
+ debug/*
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Download release_executable artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: release_executable
+ path: release_executable
+ - name: Upload release_executable artifact to release
+ uses: softprops/action-gh-release@v1
+ with:
+ files: |
+ release_executable/*
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Download debug_executable artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: debug_executable
+ path: debug_executable
+ - name: Upload debug_executable artifact to release
+ uses: softprops/action-gh-release@v1
+ with:
+ files: |
+ debug_executable/*
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/FileServer.iml b/.idea/FileServer.iml
new file mode 100644
index 0000000..4348106
--- /dev/null
+++ b/.idea/FileServer.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..0ebf8ae
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/php.xml b/.idea/php.xml
new file mode 100644
index 0000000..57a5904
--- /dev/null
+++ b/.idea/php.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..8306744
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..19fe18d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,29 @@
+# Variables
+DEFAULT_CONFIGURATION ?= release
+LOG_LEVEL = debug
+
+# Default Target
+all: release debug release_executable debug_executable
+
+# Build Steps
+release:
+ ncc build --config=release --log-level $(LOG_LEVEL)
+debug:
+ ncc build --config=debug --log-level $(LOG_LEVEL)
+release_executable:
+ ncc build --config=release_executable --log-level $(LOG_LEVEL)
+debug_executable:
+ ncc build --config=debug_executable --log-level $(LOG_LEVEL)
+
+
+install: release
+ ncc package install --package=build/release/net.nosial.file_server.ncc --skip-dependencies --build-source --reinstall -y --log-level $(LOG_LEVEL)
+
+test: release
+ [ -f phpunit.xml ] || { echo "phpunit.xml not found"; exit 1; }
+ phpunit
+
+clean:
+ rm -rf build
+
+.PHONY: all install test clean release debug release_executable debug_executable
\ No newline at end of file
diff --git a/bootstrap.php b/bootstrap.php
new file mode 100644
index 0000000..d95ac22
--- /dev/null
+++ b/bootstrap.php
@@ -0,0 +1,3 @@
+