From 1b08727cb2f1872aab1a40a373fc3a9299395a60 Mon Sep 17 00:00:00 2001 From: Adelili Date: Thu, 6 Nov 2025 13:41:06 +0800 Subject: [PATCH] initial project --- .dockerignore | 10 + .gitignore | 126 + Dockerfile | 51 + LICENSE | 22 + README.md | 68 + app/.htaccess | 6 + app/Common.php | 15 + app/Config/App.php | 203 ++ app/Config/Autoload.php | 95 + app/Config/Boot/development.php | 34 + app/Config/Boot/production.php | 25 + app/Config/Boot/testing.php | 38 + app/Config/CURLRequest.php | 20 + app/Config/Cache.php | 162 ++ app/Config/Constants.php | 115 + app/Config/ContentSecurityPolicy.php | 176 ++ app/Config/Cookie.php | 107 + app/Config/Cors.php | 105 + app/Config/Database.php | 203 ++ app/Config/DocTypes.php | 43 + app/Config/Email.php | 121 + app/Config/Encryption.php | 92 + app/Config/Events.php | 55 + app/Config/Exceptions.php | 106 + app/Config/Feature.php | 37 + app/Config/Filters.php | 109 + app/Config/ForeignCharacters.php | 12 + app/Config/Format.php | 64 + app/Config/Generators.php | 44 + app/Config/Honeypot.php | 42 + app/Config/Images.php | 31 + app/Config/Kint.php | 63 + app/Config/Logger.php | 150 ++ app/Config/Migrations.php | 50 + app/Config/Mimes.php | 534 ++++ app/Config/Modules.php | 82 + app/Config/Optimize.php | 30 + app/Config/Pager.php | 37 + app/Config/Paths.php | 75 + app/Config/Publisher.php | 28 + app/Config/Routes.php | 46 + app/Config/Routing.php | 140 ++ app/Config/Security.php | 86 + app/Config/Services.php | 71 + app/Config/Session.php | 127 + app/Config/Toolbar.php | 122 + app/Config/UserAgents.php | 252 ++ app/Config/Validation.php | 44 + app/Config/View.php | 62 + .../Backend/CustomerController.php | 1386 +++++++++++ .../Backend/CustomerDashboardController.php | 274 +++ .../Backend/DashboardController.php | 278 +++ app/Controllers/Backend/DeliverySetting.php | 100 + app/Controllers/Backend/Home.php | 13 + app/Controllers/Backend/LoginController.php | 170 ++ app/Controllers/Backend/MenuController.php | 1189 +++++++++ app/Controllers/Backend/OptionController.php | 248 ++ app/Controllers/Backend/OrderController.php | 581 +++++ app/Controllers/Backend/OutletController.php | 863 +++++++ .../Backend/PromoSettingController.php | 542 +++++ app/Controllers/Backend/PwpController.php | 205 ++ app/Controllers/Backend/SettingController.php | 879 +++++++ .../Backend/StoreDiscountController.php | 147 ++ app/Controllers/Backend/TagController.php | 167 ++ app/Controllers/Backend/TopupController.php | 173 ++ .../Backend/TopupSettingController.php | 112 + app/Controllers/Backend/UserController.php | 327 +++ .../Backend/UserRegisterController.php | 86 + app/Controllers/Backend/VoucherController.php | 1002 ++++++++ app/Controllers/BaseController.php | 58 + app/Controllers/BranchCategoryController.php | 76 + app/Controllers/BranchDetailsController.php | 85 + app/Controllers/CustomerDetailsController.php | 79 + app/Controllers/Frontend/AuthController.php | 277 +++ app/Controllers/Frontend/CartController.php | 600 +++++ .../Frontend/CustomerController.php | 1125 +++++++++ app/Controllers/Frontend/GrabController.php | 33 + .../Frontend/LalamoveController.php | 39 + .../Frontend/MenuItemController.php | 240 ++ app/Controllers/Frontend/OrderController.php | 748 ++++++ .../Frontend/PaymentController.php | 97 + .../Frontend/SlideshowController.php | 48 + app/Controllers/Frontend/TopupController.php | 345 +++ .../Frontend/TopupSettingController.php | 33 + .../Frontend/VoucherController.php | 508 ++++ app/Controllers/InvoiceController.php | 91 + app/Controllers/InvoiceItemController.php | 79 + app/Controllers/InvoiceTypeController.php | 76 + app/Controllers/LetterheadController.php | 78 + app/Controllers/PaymentMethodController.php | 76 + app/Controllers/PlatformController.php | 76 + app/Controllers/PositionController.php | 76 + app/Controllers/ProductBrandController.php | 94 + app/Controllers/ProductCategoryController.php | 76 + app/Controllers/ProductController.php | 91 + .../ProductDescriptionController.php | 76 + app/Controllers/ProductImeiController.php | 76 + app/Controllers/StaffDetailsController.php | 120 + app/Controllers/StockController.php | 76 + app/Controllers/SupplierDetailsController.php | 76 + app/Controllers/ZeoniqController.php | 724 ++++++ app/Database/Migrations/.gitkeep | 0 .../2025-11-05-031041_CreateProductBrand.php | 26 + ...025-11-05-031042_CreateProductCategory.php | 27 + ...-11-05-031042_CreateProductDescription.php | 27 + .../2025-11-05-031042_CreateProductImei.php | 28 + ...025-11-05-031042_CreateSupplierDetails.php | 39 + .../2025-11-05-031043_CreateInvoiceItem.php | 28 + .../2025-11-05-031043_CreatePlatform.php | 27 + .../2025-11-05-031043_CreateProduct.php | 39 + .../2025-11-05-031043_CreateStock.php | 29 + ...2025-11-05-031044_CreateBranchCategory.php | 27 + ...025-11-05-031044_CreateCustomerDetails.php | 44 + .../2025-11-05-031044_CreateInvoice.php | 41 + .../2025-11-05-031044_CreateInvoiceType.php | 27 + .../2025-11-05-031044_CreatePaymentMethod.php | 27 + .../2025-11-05-031045_CreateBranchDetails.php | 43 + .../2025-11-05-031045_CreateLetterhead.php | 33 + .../2025-11-05-031045_CreatePosition.php | 28 + .../2025-11-05-031045_CreateStaffDetails.php | 38 + app/Database/Seeds/.gitkeep | 0 app/Filters/.gitkeep | 0 app/Filters/AuthFilter.php | 101 + app/Filters/CustomerAuthFilter.php | 80 + app/Helpers/.gitkeep | 0 app/Helpers/cart_helper.php | 14 + app/Helpers/general_helper.php | 85 + app/Helpers/image_helper.php | 39 + app/Helpers/menu_helper.php | 198 ++ app/Helpers/order_helper.php | 338 +++ app/Helpers/outlet_helper.php | 32 + app/Helpers/promo_helper.php | 82 + app/Helpers/voucher_helper.php | 27 + app/Language/.gitkeep | 0 app/Language/en/Validation.php | 4 + app/Libraries/.gitkeep | 0 app/Libraries/Fiuu.php | 238 ++ app/Libraries/Grab.php | 522 ++++ app/Libraries/Lalamove.php | 292 +++ app/Libraries/Wato.php | 28 + app/Models/.gitkeep | 0 app/Models/BranchCategory.php | 56 + app/Models/BranchDetails.php | 69 + app/Models/CustomerDetails.php | 72 + app/Models/Invoice.php | 66 + app/Models/InvoiceItem.php | 56 + app/Models/InvoiceType.php | 56 + app/Models/Letterhead.php | 62 + app/Models/PaymentMethod.php | 56 + app/Models/Platform.php | 56 + app/Models/Position.php | 57 + app/Models/Product.php | 63 + app/Models/ProductBrand.php | 52 + app/Models/ProductCategory.php | 54 + app/Models/ProductDescription.php | 55 + app/Models/ProductImei.php | 57 + app/Models/StaffDetails.php | 65 + app/Models/Stock.php | 57 + app/Models/SupplierDetails.php | 70 + app/Services/CalculateService.php | 689 ++++++ app/Services/CartService.php | 426 ++++ app/Services/PromoService.php | 452 ++++ app/Services/VoucherService.php | 35 + app/ThirdParty/.gitkeep | 0 app/Views/errors/cli/error_404.php | 7 + app/Views/errors/cli/error_exception.php | 65 + app/Views/errors/cli/production.php | 5 + app/Views/errors/html/debug.css | 194 ++ app/Views/errors/html/debug.js | 116 + app/Views/errors/html/error_400.php | 84 + app/Views/errors/html/error_404.php | 84 + app/Views/errors/html/error_exception.php | 429 ++++ app/Views/errors/html/production.php | 25 + app/Views/welcome_message.php | 331 +++ app/index.html | 11 + builds | 125 + composer.json | 44 + composer.lock | 2137 +++++++++++++++++ docker-compose.prod.yml | 31 + docker/nginx/codeigniter.conf | 26 + docker/php/opcache.ini | 8 + phpunit.xml.dist | 63 + preload.php | 109 + public/.htaccess | 49 + public/favicon.ico | Bin 0 -> 5430 bytes public/index.php | 73 + public/robots.txt | 2 + spark | 87 + tests/.htaccess | 6 + tests/README.md | 118 + .../2020-02-22-222222_example_migration.php | 37 + .../_support/Database/Seeds/ExampleSeeder.php | 41 + tests/_support/Libraries/ConfigReader.php | 19 + tests/_support/Models/ExampleModel.php | 24 + tests/database/ExampleDatabaseTest.php | 46 + tests/index.html | 11 + tests/session/ExampleSessionTest.php | 17 + tests/unit/CalculateServiceTest.php | 105 + tests/unit/CustomerAddressTest.php | 832 +++++++ tests/unit/CustomerTest.php | 629 +++++ tests/unit/HealthTest.php | 49 + tests/unit/OutletTest.php | 445 ++++ tests/unit/UserTest.php | 288 +++ writable/.htaccess | 6 + writable/cache/index.html | 11 + writable/index.html | 11 + writable/logs/index.html | 11 + writable/session/index.html | 11 + writable/uploads/index.html | 11 + 209 files changed, 31602 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app/.htaccess create mode 100644 app/Common.php create mode 100644 app/Config/App.php create mode 100644 app/Config/Autoload.php create mode 100644 app/Config/Boot/development.php create mode 100644 app/Config/Boot/production.php create mode 100644 app/Config/Boot/testing.php create mode 100644 app/Config/CURLRequest.php create mode 100644 app/Config/Cache.php create mode 100644 app/Config/Constants.php create mode 100644 app/Config/ContentSecurityPolicy.php create mode 100644 app/Config/Cookie.php create mode 100644 app/Config/Cors.php create mode 100644 app/Config/Database.php create mode 100644 app/Config/DocTypes.php create mode 100644 app/Config/Email.php create mode 100644 app/Config/Encryption.php create mode 100644 app/Config/Events.php create mode 100644 app/Config/Exceptions.php create mode 100644 app/Config/Feature.php create mode 100644 app/Config/Filters.php create mode 100644 app/Config/ForeignCharacters.php create mode 100644 app/Config/Format.php create mode 100644 app/Config/Generators.php create mode 100644 app/Config/Honeypot.php create mode 100644 app/Config/Images.php create mode 100644 app/Config/Kint.php create mode 100644 app/Config/Logger.php create mode 100644 app/Config/Migrations.php create mode 100644 app/Config/Mimes.php create mode 100644 app/Config/Modules.php create mode 100644 app/Config/Optimize.php create mode 100644 app/Config/Pager.php create mode 100644 app/Config/Paths.php create mode 100644 app/Config/Publisher.php create mode 100644 app/Config/Routes.php create mode 100644 app/Config/Routing.php create mode 100644 app/Config/Security.php create mode 100644 app/Config/Services.php create mode 100644 app/Config/Session.php create mode 100644 app/Config/Toolbar.php create mode 100644 app/Config/UserAgents.php create mode 100644 app/Config/Validation.php create mode 100644 app/Config/View.php create mode 100644 app/Controllers/Backend/CustomerController.php create mode 100644 app/Controllers/Backend/CustomerDashboardController.php create mode 100644 app/Controllers/Backend/DashboardController.php create mode 100644 app/Controllers/Backend/DeliverySetting.php create mode 100644 app/Controllers/Backend/Home.php create mode 100644 app/Controllers/Backend/LoginController.php create mode 100644 app/Controllers/Backend/MenuController.php create mode 100644 app/Controllers/Backend/OptionController.php create mode 100644 app/Controllers/Backend/OrderController.php create mode 100644 app/Controllers/Backend/OutletController.php create mode 100644 app/Controllers/Backend/PromoSettingController.php create mode 100644 app/Controllers/Backend/PwpController.php create mode 100644 app/Controllers/Backend/SettingController.php create mode 100644 app/Controllers/Backend/StoreDiscountController.php create mode 100644 app/Controllers/Backend/TagController.php create mode 100644 app/Controllers/Backend/TopupController.php create mode 100644 app/Controllers/Backend/TopupSettingController.php create mode 100644 app/Controllers/Backend/UserController.php create mode 100644 app/Controllers/Backend/UserRegisterController.php create mode 100644 app/Controllers/Backend/VoucherController.php create mode 100644 app/Controllers/BaseController.php create mode 100644 app/Controllers/BranchCategoryController.php create mode 100644 app/Controllers/BranchDetailsController.php create mode 100644 app/Controllers/CustomerDetailsController.php create mode 100644 app/Controllers/Frontend/AuthController.php create mode 100644 app/Controllers/Frontend/CartController.php create mode 100644 app/Controllers/Frontend/CustomerController.php create mode 100644 app/Controllers/Frontend/GrabController.php create mode 100644 app/Controllers/Frontend/LalamoveController.php create mode 100644 app/Controllers/Frontend/MenuItemController.php create mode 100644 app/Controllers/Frontend/OrderController.php create mode 100644 app/Controllers/Frontend/PaymentController.php create mode 100644 app/Controllers/Frontend/SlideshowController.php create mode 100644 app/Controllers/Frontend/TopupController.php create mode 100644 app/Controllers/Frontend/TopupSettingController.php create mode 100644 app/Controllers/Frontend/VoucherController.php create mode 100644 app/Controllers/InvoiceController.php create mode 100644 app/Controllers/InvoiceItemController.php create mode 100644 app/Controllers/InvoiceTypeController.php create mode 100644 app/Controllers/LetterheadController.php create mode 100644 app/Controllers/PaymentMethodController.php create mode 100644 app/Controllers/PlatformController.php create mode 100644 app/Controllers/PositionController.php create mode 100644 app/Controllers/ProductBrandController.php create mode 100644 app/Controllers/ProductCategoryController.php create mode 100644 app/Controllers/ProductController.php create mode 100644 app/Controllers/ProductDescriptionController.php create mode 100644 app/Controllers/ProductImeiController.php create mode 100644 app/Controllers/StaffDetailsController.php create mode 100644 app/Controllers/StockController.php create mode 100644 app/Controllers/SupplierDetailsController.php create mode 100644 app/Controllers/ZeoniqController.php create mode 100644 app/Database/Migrations/.gitkeep create mode 100644 app/Database/Migrations/2025-11-05-031041_CreateProductBrand.php create mode 100644 app/Database/Migrations/2025-11-05-031042_CreateProductCategory.php create mode 100644 app/Database/Migrations/2025-11-05-031042_CreateProductDescription.php create mode 100644 app/Database/Migrations/2025-11-05-031042_CreateProductImei.php create mode 100644 app/Database/Migrations/2025-11-05-031042_CreateSupplierDetails.php create mode 100644 app/Database/Migrations/2025-11-05-031043_CreateInvoiceItem.php create mode 100644 app/Database/Migrations/2025-11-05-031043_CreatePlatform.php create mode 100644 app/Database/Migrations/2025-11-05-031043_CreateProduct.php create mode 100644 app/Database/Migrations/2025-11-05-031043_CreateStock.php create mode 100644 app/Database/Migrations/2025-11-05-031044_CreateBranchCategory.php create mode 100644 app/Database/Migrations/2025-11-05-031044_CreateCustomerDetails.php create mode 100644 app/Database/Migrations/2025-11-05-031044_CreateInvoice.php create mode 100644 app/Database/Migrations/2025-11-05-031044_CreateInvoiceType.php create mode 100644 app/Database/Migrations/2025-11-05-031044_CreatePaymentMethod.php create mode 100644 app/Database/Migrations/2025-11-05-031045_CreateBranchDetails.php create mode 100644 app/Database/Migrations/2025-11-05-031045_CreateLetterhead.php create mode 100644 app/Database/Migrations/2025-11-05-031045_CreatePosition.php create mode 100644 app/Database/Migrations/2025-11-05-031045_CreateStaffDetails.php create mode 100644 app/Database/Seeds/.gitkeep create mode 100644 app/Filters/.gitkeep create mode 100644 app/Filters/AuthFilter.php create mode 100644 app/Filters/CustomerAuthFilter.php create mode 100644 app/Helpers/.gitkeep create mode 100644 app/Helpers/cart_helper.php create mode 100644 app/Helpers/general_helper.php create mode 100644 app/Helpers/image_helper.php create mode 100644 app/Helpers/menu_helper.php create mode 100644 app/Helpers/order_helper.php create mode 100644 app/Helpers/outlet_helper.php create mode 100644 app/Helpers/promo_helper.php create mode 100644 app/Helpers/voucher_helper.php create mode 100644 app/Language/.gitkeep create mode 100644 app/Language/en/Validation.php create mode 100644 app/Libraries/.gitkeep create mode 100644 app/Libraries/Fiuu.php create mode 100644 app/Libraries/Grab.php create mode 100644 app/Libraries/Lalamove.php create mode 100644 app/Libraries/Wato.php create mode 100644 app/Models/.gitkeep create mode 100644 app/Models/BranchCategory.php create mode 100644 app/Models/BranchDetails.php create mode 100644 app/Models/CustomerDetails.php create mode 100644 app/Models/Invoice.php create mode 100644 app/Models/InvoiceItem.php create mode 100644 app/Models/InvoiceType.php create mode 100644 app/Models/Letterhead.php create mode 100644 app/Models/PaymentMethod.php create mode 100644 app/Models/Platform.php create mode 100644 app/Models/Position.php create mode 100644 app/Models/Product.php create mode 100644 app/Models/ProductBrand.php create mode 100644 app/Models/ProductCategory.php create mode 100644 app/Models/ProductDescription.php create mode 100644 app/Models/ProductImei.php create mode 100644 app/Models/StaffDetails.php create mode 100644 app/Models/Stock.php create mode 100644 app/Models/SupplierDetails.php create mode 100644 app/Services/CalculateService.php create mode 100644 app/Services/CartService.php create mode 100644 app/Services/PromoService.php create mode 100644 app/Services/VoucherService.php create mode 100644 app/ThirdParty/.gitkeep create mode 100644 app/Views/errors/cli/error_404.php create mode 100644 app/Views/errors/cli/error_exception.php create mode 100644 app/Views/errors/cli/production.php create mode 100644 app/Views/errors/html/debug.css create mode 100644 app/Views/errors/html/debug.js create mode 100644 app/Views/errors/html/error_400.php create mode 100644 app/Views/errors/html/error_404.php create mode 100644 app/Views/errors/html/error_exception.php create mode 100644 app/Views/errors/html/production.php create mode 100644 app/Views/welcome_message.php create mode 100644 app/index.html create mode 100644 builds create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 docker-compose.prod.yml create mode 100644 docker/nginx/codeigniter.conf create mode 100644 docker/php/opcache.ini create mode 100644 phpunit.xml.dist create mode 100644 preload.php create mode 100644 public/.htaccess create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 spark create mode 100644 tests/.htaccess create mode 100644 tests/README.md create mode 100644 tests/_support/Database/Migrations/2020-02-22-222222_example_migration.php create mode 100644 tests/_support/Database/Seeds/ExampleSeeder.php create mode 100644 tests/_support/Libraries/ConfigReader.php create mode 100644 tests/_support/Models/ExampleModel.php create mode 100644 tests/database/ExampleDatabaseTest.php create mode 100644 tests/index.html create mode 100644 tests/session/ExampleSessionTest.php create mode 100644 tests/unit/CalculateServiceTest.php create mode 100644 tests/unit/CustomerAddressTest.php create mode 100644 tests/unit/CustomerTest.php create mode 100644 tests/unit/HealthTest.php create mode 100644 tests/unit/OutletTest.php create mode 100644 tests/unit/UserTest.php create mode 100644 writable/.htaccess create mode 100644 writable/cache/index.html create mode 100644 writable/index.html create mode 100644 writable/logs/index.html create mode 100644 writable/session/index.html create mode 100644 writable/uploads/index.html diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..93f367e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.git +.gitignore +node_modules +vendor +storage/logs +writable/cache +writable/logs +Dockerfile +docker-compose*.yml +*.md \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e24e7ce --- /dev/null +++ b/.gitignore @@ -0,0 +1,126 @@ +#------------------------- +# Operating Specific Junk Files +#------------------------- + +# OS X +.DS_Store +.AppleDouble +.LSOverride + +# OS X Thumbnails +._* + +# Windows image file caches +Thumbs.db +ehthumbs.db +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# Linux +*~ + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +#------------------------- +# Environment Files +#------------------------- +# These should never be under version control, +# as it poses a security risk. +.env +.vagrant +Vagrantfile + +#------------------------- +# Temporary Files +#------------------------- +writable/cache/* +!writable/cache/index.html + +writable/logs/* +!writable/logs/index.html + +writable/session/* +!writable/session/index.html + +writable/uploads/* +!writable/uploads/index.html + +writable/debugbar/* +!writable/debugbar/.gitkeep + +php_errors.log + +#------------------------- +# User Guide Temp Files +#------------------------- +user_guide_src/build/* +user_guide_src/cilexer/build/* +user_guide_src/cilexer/dist/* +user_guide_src/cilexer/pycilexer.egg-info/* + +#------------------------- +# Test Files +#------------------------- +tests/coverage* + +# Don't save phpunit under version control. +phpunit + +#------------------------- +# Composer +#------------------------- +vendor/ + +#------------------------- +# IDE / Development Files +#------------------------- + +# Modules Testing +_modules/* + +# phpenv local config +.php-version + +# Jetbrains editors (PHPStorm, etc) +.idea/ +*.iml + +# NetBeans +/nbproject/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/nbactions.xml +/nb-configuration.xml +/.nb-gradle/ + +# Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache +*.sublime-workspace +*.sublime-project +.phpintel +/api/ + +# Visual Studio Code +.vscode/ + +/results/ +/phpunit*.xml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..388be85 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,51 @@ +# syntax=docker/dockerfile:1.6 + +###################################### +# 1) PHP-FPM runtime (CodeIgniter) # +###################################### +FROM php:8.2-fpm-alpine AS php +WORKDIR /var/www/html + +# Install OS deps + PHP extensions (incl. intl) +RUN apk add --no-cache icu-dev libzip-dev oniguruma-dev bash curl git unzip \ + && docker-php-ext-configure intl \ + && docker-php-ext-install pdo pdo_mysql mysqli intl zip opcache + +# Opcache tuning +COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/opcache.ini + +# Install Composer (copy from official image) +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +# Copy only composer files first for better caching +COPY composer.json composer.lock ./ + +# Run composer install **after** intl is available +RUN composer install --no-dev --prefer-dist --no-interaction --no-progress + +# Now copy the rest of your app +COPY . . + +# Non-root user +RUN addgroup -g 1000 www \ + && adduser -G www -g www -s /bin/sh -D www \ + && chown -R www:www /var/www/html +USER www + +EXPOSE 9000 +HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD php -v || exit 1 + +###################################### +# 2) Nginx to serve static + proxy # +###################################### +FROM nginx:1.27-alpine AS nginx +WORKDIR /var/www/html + +# Copy app so Nginx can serve assets +COPY --from=php /var/www/html /var/www/html + +# Nginx vhost +COPY docker/nginx/codeigniter.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 +HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD wget -q -O - http://127.0.0.1/ || exit 1 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..24728f6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014-2019 British Columbia Institute of Technology +Copyright (c) 2019-present CodeIgniter Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d14b4c9 --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# CodeIgniter 4 Application Starter + +## What is CodeIgniter? + +CodeIgniter is a PHP full-stack web framework that is light, fast, flexible and secure. +More information can be found at the [official site](https://codeigniter.com). + +This repository holds a composer-installable app starter. +It has been built from the +[development repository](https://github.com/codeigniter4/CodeIgniter4). + +More information about the plans for version 4 can be found in [CodeIgniter 4](https://forum.codeigniter.com/forumdisplay.php?fid=28) on the forums. + +You can read the [user guide](https://codeigniter.com/user_guide/) +corresponding to the latest version of the framework. + +## Installation & updates + +`composer create-project codeigniter4/appstarter` then `composer update` whenever +there is a new release of the framework. + +When updating, check the release notes to see if there are any changes you might need to apply +to your `app` folder. The affected files can be copied or merged from +`vendor/codeigniter4/framework/app`. + +## Setup + +Copy `env` to `.env` and tailor for your app, specifically the baseURL +and any database settings. + +## Important Change with index.php + +`index.php` is no longer in the root of the project! It has been moved inside the *public* folder, +for better security and separation of components. + +This means that you should configure your web server to "point" to your project's *public* folder, and +not to the project root. A better practice would be to configure a virtual host to point there. A poor practice would be to point your web server to the project root and expect to enter *public/...*, as the rest of your logic and the +framework are exposed. + +**Please** read the user guide for a better explanation of how CI4 works! + +## Repository Management + +We use GitHub issues, in our main repository, to track **BUGS** and to track approved **DEVELOPMENT** work packages. +We use our [forum](http://forum.codeigniter.com) to provide SUPPORT and to discuss +FEATURE REQUESTS. + +This repository is a "distribution" one, built by our release preparation script. +Problems with it can be raised on our forum, or as issues in the main repository. + +## Server Requirements + +PHP version 8.1 or higher is required, with the following extensions installed: + +- [intl](http://php.net/manual/en/intl.requirements.php) +- [mbstring](http://php.net/manual/en/mbstring.installation.php) + +> [!WARNING] +> - The end of life date for PHP 7.4 was November 28, 2022. +> - The end of life date for PHP 8.0 was November 26, 2023. +> - If you are still using PHP 7.4 or 8.0, you should upgrade immediately. +> - The end of life date for PHP 8.1 will be December 31, 2025. + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- [mysqlnd](http://php.net/manual/en/mysqlnd.install.php) if you plan to use MySQL +- [libcurl](http://php.net/manual/en/curl.requirements.php) if you plan to use the HTTP\CURLRequest library diff --git a/app/.htaccess b/app/.htaccess new file mode 100644 index 0000000..3462048 --- /dev/null +++ b/app/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + diff --git a/app/Common.php b/app/Common.php new file mode 100644 index 0000000..95f5544 --- /dev/null +++ b/app/Common.php @@ -0,0 +1,15 @@ + + */ + public array $allowedHostnames = []; + + /** + * -------------------------------------------------------------------------- + * Index File + * -------------------------------------------------------------------------- + * + * Typically, this will be your `index.php` file, unless you've renamed it to + * something else. If you have configured your web server to remove this file + * from your site URIs, set this variable to an empty string. + */ + public string $indexPage = 'index.php'; + + /** + * -------------------------------------------------------------------------- + * URI PROTOCOL + * -------------------------------------------------------------------------- + * + * This item determines which server global should be used to retrieve the + * URI string. The default setting of 'REQUEST_URI' works for most servers. + * If your links do not seem to work, try one of the other delicious flavors: + * + * 'REQUEST_URI': Uses $_SERVER['REQUEST_URI'] + * 'QUERY_STRING': Uses $_SERVER['QUERY_STRING'] + * 'PATH_INFO': Uses $_SERVER['PATH_INFO'] + * + * WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded! + */ + public string $uriProtocol = 'REQUEST_URI'; + + /* + |-------------------------------------------------------------------------- + | Allowed URL Characters + |-------------------------------------------------------------------------- + | + | This lets you specify which characters are permitted within your URLs. + | When someone tries to submit a URL with disallowed characters they will + | get a warning message. + | + | As a security measure you are STRONGLY encouraged to restrict URLs to + | as few characters as possible. + | + | By default, only these are allowed: `a-z 0-9~%.:_-` + | + | Set an empty string to allow all characters -- but only if you are insane. + | + | The configured value is actually a regular expression character group + | and it will be used as: '/\A[]+\z/iu' + | + | DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! + | + */ + public string $permittedURIChars = 'a-z 0-9~%.:_\-'; + + /** + * -------------------------------------------------------------------------- + * Default Locale + * -------------------------------------------------------------------------- + * + * The Locale roughly represents the language and location that your visitor + * is viewing the site from. It affects the language strings and other + * strings (like currency markers, numbers, etc), that your program + * should run under for this request. + */ + public string $defaultLocale = 'en'; + + /** + * -------------------------------------------------------------------------- + * Negotiate Locale + * -------------------------------------------------------------------------- + * + * If true, the current Request object will automatically determine the + * language to use based on the value of the Accept-Language header. + * + * If false, no automatic detection will be performed. + */ + public bool $negotiateLocale = false; + + /** + * -------------------------------------------------------------------------- + * Supported Locales + * -------------------------------------------------------------------------- + * + * If $negotiateLocale is true, this array lists the locales supported + * by the application in descending order of priority. If no match is + * found, the first locale will be used. + * + * IncomingRequest::setLocale() also uses this list. + * + * @var list + */ + public array $supportedLocales = ['en']; + + /** + * -------------------------------------------------------------------------- + * Application Timezone + * -------------------------------------------------------------------------- + * + * The default timezone that will be used in your application to display + * dates with the date helper, and can be retrieved through app_timezone() + * + * @see https://www.php.net/manual/en/timezones.php for list of timezones + * supported by PHP. + */ + public string $appTimezone = 'Asia/Kuala_Lumpur'; + + /** + * -------------------------------------------------------------------------- + * Default Character Set + * -------------------------------------------------------------------------- + * + * This determines which character set is used by default in various methods + * that require a character set to be provided. + * + * @see http://php.net/htmlspecialchars for a list of supported charsets. + */ + public string $charset = 'UTF-8'; + + /** + * -------------------------------------------------------------------------- + * Force Global Secure Requests + * -------------------------------------------------------------------------- + * + * If true, this will force every request made to this application to be + * made via a secure connection (HTTPS). If the incoming request is not + * secure, the user will be redirected to a secure version of the page + * and the HTTP Strict Transport Security (HSTS) header will be set. + */ + public bool $forceGlobalSecureRequests = false; + + /** + * -------------------------------------------------------------------------- + * Reverse Proxy IPs + * -------------------------------------------------------------------------- + * + * If your server is behind a reverse proxy, you must whitelist the proxy + * IP addresses from which CodeIgniter should trust headers such as + * X-Forwarded-For or Client-IP in order to properly identify + * the visitor's IP address. + * + * You need to set a proxy IP address or IP address with subnets and + * the HTTP header for the client IP address. + * + * Here are some examples: + * [ + * '10.0.1.200' => 'X-Forwarded-For', + * '192.168.5.0/24' => 'X-Real-IP', + * ] + * + * @var array + */ + public array $proxyIPs = []; + + /** + * -------------------------------------------------------------------------- + * Content Security Policy + * -------------------------------------------------------------------------- + * + * Enables the Response's Content Secure Policy to restrict the sources that + * can be used for images, scripts, CSS files, audio, video, etc. If enabled, + * the Response object will populate default values for the policy from the + * `ContentSecurityPolicy.php` file. Controllers can always add to those + * restrictions at run time. + * + * For a better understanding of CSP, see these documents: + * + * @see http://www.html5rocks.com/en/tutorials/security/content-security-policy/ + * @see http://www.w3.org/TR/CSP/ + */ + public bool $CSPEnabled = false; +} diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php new file mode 100644 index 0000000..bee09c4 --- /dev/null +++ b/app/Config/Autoload.php @@ -0,0 +1,95 @@ +|string> + */ + public $psr4 = [ + APP_NAMESPACE => APPPATH, + ]; + + /** + * ------------------------------------------------------------------- + * Class Map + * ------------------------------------------------------------------- + * The class map provides a map of class names and their exact + * location on the drive. Classes loaded in this manner will have + * slightly faster performance because they will not have to be + * searched for within one or more directories as they would if they + * were being autoloaded through a namespace. + * + * Prototype: + * $classmap = [ + * 'MyClass' => '/path/to/class/file.php' + * ]; + * + * @var array + */ + public $classmap = []; + + /** + * ------------------------------------------------------------------- + * Files + * ------------------------------------------------------------------- + * The files array provides a list of paths to __non-class__ files + * that will be autoloaded. This can be useful for bootstrap operations + * or for loading functions. + * + * Prototype: + * $files = [ + * '/path/to/my/file.php', + * ]; + * + * @var list + */ + public $files = []; + + /** + * ------------------------------------------------------------------- + * Helpers + * ------------------------------------------------------------------- + * Prototype: + * $helpers = [ + * 'form', + * ]; + * + * @var list + */ + public $helpers = [ + 'menu_helper', + 'cart_helper' + ]; +} diff --git a/app/Config/Boot/development.php b/app/Config/Boot/development.php new file mode 100644 index 0000000..a868447 --- /dev/null +++ b/app/Config/Boot/development.php @@ -0,0 +1,34 @@ + + */ + public array $file = [ + 'storePath' => WRITEPATH . 'cache/', + 'mode' => 0640, + ]; + + /** + * ------------------------------------------------------------------------- + * Memcached settings + * ------------------------------------------------------------------------- + * + * Your Memcached servers can be specified below, if you are using + * the Memcached drivers. + * + * @see https://codeigniter.com/user_guide/libraries/caching.html#memcached + * + * @var array + */ + public array $memcached = [ + 'host' => '127.0.0.1', + 'port' => 11211, + 'weight' => 1, + 'raw' => false, + ]; + + /** + * ------------------------------------------------------------------------- + * Redis settings + * ------------------------------------------------------------------------- + * + * Your Redis server can be specified below, if you are using + * the Redis or Predis drivers. + * + * @var array + */ + public array $redis = [ + 'host' => '127.0.0.1', + 'password' => null, + 'port' => 6379, + 'timeout' => 0, + 'database' => 0, + ]; + + /** + * -------------------------------------------------------------------------- + * Available Cache Handlers + * -------------------------------------------------------------------------- + * + * This is an array of cache engine alias' and class names. Only engines + * that are listed here are allowed to be used. + * + * @var array> + */ + public array $validHandlers = [ + 'dummy' => DummyHandler::class, + 'file' => FileHandler::class, + 'memcached' => MemcachedHandler::class, + 'predis' => PredisHandler::class, + 'redis' => RedisHandler::class, + 'wincache' => WincacheHandler::class, + ]; + + /** + * -------------------------------------------------------------------------- + * Web Page Caching: Cache Include Query String + * -------------------------------------------------------------------------- + * + * Whether to take the URL query string into consideration when generating + * output cache files. Valid options are: + * + * false = Disabled + * true = Enabled, take all query parameters into account. + * Please be aware that this may result in numerous cache + * files generated for the same page over and over again. + * ['q'] = Enabled, but only take into account the specified list + * of query parameters. + * + * @var bool|list + */ + public $cacheQueryString = false; +} diff --git a/app/Config/Constants.php b/app/Config/Constants.php new file mode 100644 index 0000000..34c282b --- /dev/null +++ b/app/Config/Constants.php @@ -0,0 +1,115 @@ +|string|null + */ + public $defaultSrc; + + /** + * Lists allowed scripts' URLs. + * + * @var list|string + */ + public $scriptSrc = 'self'; + + /** + * Lists allowed stylesheets' URLs. + * + * @var list|string + */ + public $styleSrc = 'self'; + + /** + * Defines the origins from which images can be loaded. + * + * @var list|string + */ + public $imageSrc = 'self'; + + /** + * Restricts the URLs that can appear in a page's `` element. + * + * Will default to self if not overridden + * + * @var list|string|null + */ + public $baseURI; + + /** + * Lists the URLs for workers and embedded frame contents + * + * @var list|string + */ + public $childSrc = 'self'; + + /** + * Limits the origins that you can connect to (via XHR, + * WebSockets, and EventSource). + * + * @var list|string + */ + public $connectSrc = 'self'; + + /** + * Specifies the origins that can serve web fonts. + * + * @var list|string + */ + public $fontSrc; + + /** + * Lists valid endpoints for submission from `
` tags. + * + * @var list|string + */ + public $formAction = 'self'; + + /** + * Specifies the sources that can embed the current page. + * This directive applies to ``, `