Initial Code commit

This commit is contained in:
nisch.codes 2025-07-22 23:12:41 +02:00
parent f1003b630f
commit c566972160
16 changed files with 618 additions and 31 deletions

View File

@ -3,7 +3,7 @@
namespace Nischcodes\Shiftcalc\App\Controller;
/**
* Controller
* HomeController
*
* main controller for this application
*
@ -19,6 +19,15 @@ namespace Nischcodes\Shiftcalc\App\Controller;
* @link https://projects.nisch.codes/nischcodes/shiftcalc
*/
class Controller extends Nischcodes\ShiftCalc\Controller {
use Nischcodes\Shiftcalc\Attributes\Route;
use Nischcodes\Shiftcalc\MVC\BaseController;
class HomeController extends BaseController {
#[Route('GET', '/')]
public function index() {
echo "Homepage";
}
//TODO
}

37
app/Model/HomeModel.php Normal file
View File

@ -0,0 +1,37 @@
<?php declare(strict_types=1);
namespace Nischcodes\Shiftcalc\App\Model;
/**
* HomeModel
*
* main model for this application
*
* PHP version 8.4 or higher
*
* LICENSE: GPL-3
*
* @package ShiftCalc
* @author nisch.codes <nischcodes@noreply.projects.nisch.codes>
* @copyright 2021 nisch.codes
* @license https://projects.nisch.codes/nischcodes/shiftcalc/src/branch/main/LICENSE GPL-3
* @version 1.0.0
* @link https://projects.nisch.codes/nischcodes/shiftcalc
*/
use Nischcodes\Shiftcalc\MVC\BaseModel;
class HomeModel implements BaseModel {
// implement the init function
public function init() {
echo "HomeModel init";
}
// implement the getAll function
public function getAll() {
return [];
}
public function get($index){}
}

View File

@ -19,6 +19,6 @@
</style>
</head>
<body>
<!-- CONTENT -->
<f:content />
</body>
</html>

31
app/View/HomeView.php Normal file
View File

@ -0,0 +1,31 @@
<?php declare(strict_types=1);
namespace Nischcodes\Shiftcalc\App\View;
/**
* HomeView
*
* main view for this application
*
* PHP version 8.4 or higher
*
* LICENSE: GPL-3
*
* @package ShiftCalc
* @author nisch.codes <nischcodes@noreply.projects.nisch.codes>
* @copyright 2021 nisch.codes
* @license https://projects.nisch.codes/nischcodes/shiftcalc/src/branch/main/LICENSE GPL-3
* @version 1.0.0
* @link https://projects.nisch.codes/nischcodes/shiftcalc
*/
use Nischcodes\Shiftcalc\MVC\BaseView;
class HomeView implements BaseView {
// implement the render function
public function render($data) {
echo "HomeView render";
}
}

View File

@ -5,7 +5,8 @@
"license": "GPL-3.0",
"autoload": {
"psr-4": {
"Nischcodes\\Shiftcalc\\": "src/"
"Nischcodes\\Shiftcalc\\": "src/",
"Nischcodes\\Shiftcalc\\App\\": "app/"
}
},
"authors": [

356
public/.htaccess Normal file
View File

@ -0,0 +1,356 @@
#####
#
# .htaccess file for use with Apache Webserver
#
# This file includes settings for the following configuration options:
#
# - Compression
# - Caching
# - MIME types
# - Cross Origin requests
# - Rewriting and Access
# - Miscellaneous
# - PHP optimisation
#
# Consider adding this file's content to your webserver's configuration directly for speed improvement
#
# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess
#
####
### Begin: Compression ###
# Compressing resource files will save bandwidth and so improve loading speed especially for users
# with slower internet connections compress the .js and .css files.
<FilesMatch "\.js\.gzip$">
AddType "text/javascript" .gzip
</FilesMatch>
<FilesMatch "\.css\.gzip$">
AddType "text/css" .gzip
</FilesMatch>
AddEncoding gzip .gzip
<IfModule mod_deflate.c>
# Force compression for mangled `Accept-Encoding` request headers
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
</IfModule>
</IfModule>
# Compress all output labeled with one of the following media types.
#
# (!) For Apache versions below version 2.3.7 you don't need to
# enable `mod_filter` and can remove the `<IfModule mod_filter.c>`
# and `</IfModule>` lines as `AddOutputFilterByType` is still in
# the core directives.
#
# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/atom+xml \
application/javascript \
application/json \
application/ld+json \
application/manifest+json \
application/rdf+xml \
application/rss+xml \
application/schema+json \
application/vnd.geo+json \
application/vnd.ms-fontobject \
application/x-font-ttf \
application/x-javascript \
application/x-web-app-manifest+json \
application/xhtml+xml \
application/xml \
font/eot \
font/opentype \
image/bmp \
image/svg+xml \
image/vnd.microsoft.icon \
image/x-icon \
text/cache-manifest \
text/css \
text/html \
text/javascript \
text/plain \
text/vcard \
text/vnd.rim.location.xloc \
text/vtt \
text/x-component \
text/x-cross-domain-policy \
text/xml
</IfModule>
<IfModule mod_mime.c>
AddEncoding gzip svgz
</IfModule>
</IfModule>
### End: Compression ###
### Begin: Browser caching of resource files ###
# This affects Frontend and Backend and increases performance.
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/ld+json "access plus 0 seconds"
ExpiresByType application/schema+json "access plus 0 seconds"
ExpiresByType application/vnd.geo+json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType image/vnd.microsoft.icon "access plus 1 week"
ExpiresByType image/x-icon "access plus 1 week"
ExpiresByType text/x-component "access plus 1 month"
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType application/x-javascript "access plus 1 year"
ExpiresByType text/javascript "access plus 1 year"
ExpiresByType application/manifest+json "access plus 1 week"
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rdf+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType font/eot "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 month"
ExpiresByType font/woff "access plus 1 month"
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType text/x-cross-domain-policy "access plus 1 week"
</IfModule>
### End: Browser caching of resource files ###
### Begin: MIME types ###
# Proper MIME types for all files
<IfModule mod_mime.c>
# Data interchange
AddType application/atom+xml atom
AddType application/json json map topojson
AddType application/ld+json jsonld
AddType application/rss+xml rss
AddType application/vnd.geo+json geojson
AddType application/xml rdf xml
# JavaScript
AddType application/javascript js
# Manifest files
AddType application/manifest+json webmanifest
AddType application/x-web-app-manifest+json webapp
AddType text/cache-manifest appcache
# Media files
AddType audio/mp4 f4a f4b m4a
AddType audio/ogg oga ogg opus
AddType image/bmp bmp
AddType image/svg+xml svg svgz
AddType image/webp webp
AddType video/mp4 f4v f4p m4v mp4
AddType video/ogg ogv
AddType video/webm webm
AddType video/x-flv flv
AddType image/x-icon cur ico
# Web fonts
AddType application/font-woff woff
AddType application/font-woff2 woff2
AddType application/vnd.ms-fontobject eot
AddType application/x-font-ttf ttc ttf
AddType font/opentype otf
# Other
AddType application/octet-stream safariextz
AddType application/x-bb-appworld bbaw
AddType application/x-chrome-extension crx
AddType application/x-opera-extension oex
AddType application/x-xpinstall xpi
AddType text/vcard vcard vcf
AddType text/vnd.rim.location.xloc xloc
AddType text/vtt vtt
AddType text/x-component htc
</IfModule>
# UTF-8 encoding
AddDefaultCharset utf-8
<IfModule mod_mime.c>
AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml
</IfModule>
### End: MIME types ###
### Begin: Cross Origin ###
# Send the CORS header for images when browsers request it.
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
<FilesMatch "\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$">
SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=IS_CORS
</FilesMatch>
</IfModule>
</IfModule>
# Allow cross-origin access to web fonts.
<IfModule mod_headers.c>
<FilesMatch "\.(eot|otf|tt[cf]|woff2?)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
### End: Cross Origin ###
### Begin: Rewriting and Access ###
<IfModule mod_rewrite.c>
# Enable URL rewriting
RewriteEngine On
# Store the current location in an environment variable CWD to use
# mod_rewrite in .htaccess files without knowing the RewriteBase
RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$
RewriteRule ^.*$ - [E=CWD:%2]
# Rules to set ApplicationContext based on hostname
#RewriteCond %{HTTP_HOST} ^dev\.example\.com$
#RewriteRule .? - [E=WORKBENCH_CONTEXT:Development]
#RewriteCond %{HTTP_HOST} ^staging\.example\.com$
#RewriteRule .? - [E=WORKBENCH_CONTEXT:Production/Staging]
#RewriteCond %{HTTP_HOST} ^www\.example\.com$
#RewriteRule .? - [E=WORKBENCH_CONTEXT:Production]
# Rule for versioned static files, configured through:
# IMPORTANT: This rule has to be the very first RewriteCond in order to work!
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ %{ENV:CWD}$1.$3 [L]
# Block access to all hidden files and directories with the exception of
# the visible content from within the `/.well-known/` hidden directory (RFC 5785).
RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule (?:^|/)\. - [F]
# Stop rewrite processing, if we are in known directories
# NOTE: Add your additional local storages here
RewriteRule ^(?:assets/|files/|uploads/|favicon\.ico) - [L]
# If the file/symlink/directory does not exist => Redirect to index.php.
# For httpd.conf, you need to prefix each '%{REQUEST_FILENAME}' with '%{DOCUMENT_ROOT}'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]
</IfModule>
# Access block for files
# Apache < 2.3
<IfModule !mod_authz_core.c>
<FilesMatch "(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|db|tsconfig|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sqlite(?:\..*)?|sw[op]|git.*|rc)|.*~)$">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
</IfModule>
# Apache ≥ 2.3
<IfModule mod_authz_core.c>
<If "%{REQUEST_URI} =~ m#(?i:/\.|/\x23.*\x23|/(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|/composer\.(?:json|lock)|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|db|tsconfig|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sqlite(?:\..*)?|sw[op]|git.*|rc)|.*~)$#">
Require all denied
</If>
</IfModule>
# Block access to vcs directories
<IfModule mod_alias.c>
RedirectMatch 404 /\.(?:git|svn|hg)/
</IfModule>
### End: Rewriting and Access ###
### Begin: Miscellaneous ###
# 404 error prevention for non-existing redirected folders
Options -MultiViews
# Make sure that directory listings are disabled.
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>
<IfModule mod_headers.c>
# Force IE to render pages in the highest available mode
Header set X-UA-Compatible "IE=edge"
<FilesMatch "\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$">
Header unset X-UA-Compatible
</FilesMatch>
# Reducing MIME type security risks
Header set X-Content-Type-Options "nosniff"
</IfModule>
# ETag removal
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
### End: Miscellaneous ###
<FilesMatch "\.pdf$">
header set x-robots-tag: noindex
</FilesMatch>
### Security Settings ###
### Content Security Policy - CSP-HEADER
Header set Content-Security-Policy "default-src 'self' data: 'unsafe-inline'; frame-src 'self'; font-src 'self'; img-src 'self' data: 'unsafe-inline'; object-src 'self'; script-src 'self' data: 'unsafe-inline' 'unsafe-eval'; style-src 'self' data: 'unsafe-inline';"
### X-Content-Type-Options
# Header always set X-Content-Type-Options "nosniff"
# Already set, see above
### X-Frame-Options
Header always set X-Frame-Options "SAMEORIGIN"
### X-Xss-Protection
Header always set X-Xss-Protection "1; mode=block"
### Referrer-Policy
Header set Referrer-Policy "strict-origin"

View File

@ -20,9 +20,16 @@ namespace Nischcodes\Shiftcalc;
*/
use Nischcodes\Shiftcalc\DotEnv;
use Nischcodes\Shiftcalc\Router;
use Nischcodes\Shiftcalc\Request;
class Application {
static $router;
static $basenamespace = "Nischcodes\\Shiftcalc\\App\\";
static $controllernamespace = "Nischcodes\\Shiftcalc\\App\\Controller\\";
static function init() {
// get the current root directory
@ -36,11 +43,49 @@ class Application {
// load .env file
DotEnv::load("$projectRoot/.env");
}
// initilise the router object
self::$router = new Router();
// get all controller from the application directory
$appControllers = glob("$projectRoot/app/Controller/*.php");
// iterate over all application controller and register the routes with model
foreach($appControllers as $appController) {
// extract the class name
$controllerClassName = basename($appController, '.php');
// construct the namespaces
$controllerFQN = self::$controllernamespace.$controllerClassName;
$modelFQN = str_replace("Controller", "Model", $controllerFQN);
$viewFQN = str_replace("Controller", "View", $controllerFQN);
// check if classes exists
$controllerClass = (class_exists($controllerFQN) ? $controllerFQN : false);
$modelClass = (class_exists($modelFQN) ? $modelFQN : '');
$viewClass = (class_exists($viewFQN) ? $viewFQN : '');
// check if the current classname is loaded
if($controllerClass) {
// register controller for routing with model
self::$router->registerRoutesFromController(
$controllerClass,
$modelClass,
$viewClass
);
}
}
}
static function run() {
//echo "run application";
// call the route for the requested path
self::$router->dispatch(
Request::uri(),
Request::method(),
Request::parameters()
);
}
@ -61,6 +106,6 @@ class Application {
$dir = $parent;
}
throw new RuntimeException('Project root folder not found.');
throw new \RuntimeException('Project root folder not found.');
}
}

33
src/Attributes/Route.php Normal file
View File

@ -0,0 +1,33 @@
<?php declare(strict_types=1);
namespace Nischcodes\Shiftcalc\Attributes;
/**
* Attributes interface
*
* wraps routing info into a attribute for methods
*
* PHP version 8.4 or higher
*
* LICENSE: GPL-3
*
* @package ShiftCalc
* @author nisch.codes <nischcodes@noreply.projects.nisch.codes>
* @copyright 2021 nisch.codes
* @license https://projects.nisch.codes/nischcodes/shiftcalc/src/branch/main/LICENSE GPL-3
* @version 1.0.0
* @link https://projects.nisch.codes/nischcodes/shiftcalc
*/
use Attribute;
#[Attribute(Attribute::TARGET_METHOD)]
class Route {
public function __construct(
public string $method,
public string $path,
public array $middleware = []
) {}
}

View File

@ -21,7 +21,7 @@ namespace Nischcodes\Shiftcalc;
class HTTP {
static function fetch(string $url, ?Array $headers = []): Mixed {
static function fetch(string $url, ?Array $headers = []): string|bool {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if(!empty($headers)) curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
@ -31,7 +31,7 @@ class HTTP {
curl_close($ch);
if(curl_errno($ch)) {
throw new Exception('Curl-Error: ' . curl_error($ch));
throw new \Exception('Curl-Error: ' . curl_error($ch));
exit;
}
// returns the raw response of the curl request

View File

@ -1,11 +1,9 @@
<?php declare(strict_types=1);
namespace Nischcodes\Shiftcalc\App\Model;
namespace Nischcodes\Shiftcalc\MVC;
/**
* Repository
*
* main model for this application
* Base Controller
*
* PHP version 8.4 or higher
*
@ -19,6 +17,14 @@ namespace Nischcodes\Shiftcalc\App\Model;
* @link https://projects.nisch.codes/nischcodes/shiftcalc
*/
class Repository extends Nischcodes\ShiftCalc\Controller {
//TODO
class BaseController {
public function __construct(
protected BaseModel $model,
protected BaseView $view
) {
// initilise the model
$model->init();
}
}

View File

@ -1,11 +1,9 @@
<?php declare(strict_types=1);
namespace Nischcodes\Shiftcalc;
namespace Nischcodes\Shiftcalc\MVC;
/**
* Controller
*
* base controller
* Base Model
*
* PHP version 8.4 or higher
*
@ -19,9 +17,8 @@ namespace Nischcodes\Shiftcalc;
* @link https://projects.nisch.codes/nischcodes/shiftcalc
*/
class Controller {
function init($repository) {
}
interface BaseModel {
public function init();
public function getAll();
public function get($index);
}

View File

@ -1,11 +1,9 @@
<?php declare(strict_types=1);
namespace Nischcodes\Shiftcalc;
namespace Nischcodes\Shiftcalc\MVC;
/**
* Controller
*
* base repository
* Base View
*
* PHP version 8.4 or higher
*
@ -19,9 +17,8 @@ namespace Nischcodes\Shiftcalc;
* @link https://projects.nisch.codes/nischcodes/shiftcalc
*/
class Repository {
interface BaseView {
public function render($data);
function init() {
}
}

View File

35
src/Request.php Normal file
View File

@ -0,0 +1,35 @@
<?php declare(strict_types=1);
namespace Nischcodes\Shiftcalc;
/**
* Request interface
*
* wraps the client requests object into an simple interface
*
* PHP version 8.4 or higher
*
* LICENSE: GPL-3
*
* @package ShiftCalc
* @author nisch.codes <nischcodes@noreply.projects.nisch.codes>
* @copyright 2021 nisch.codes
* @license https://projects.nisch.codes/nischcodes/shiftcalc/src/branch/main/LICENSE GPL-3
* @version 1.0.0
* @link https://projects.nisch.codes/nischcodes/shiftcalc
*/
class Request {
public static function uri(): Mixed {
return parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
}
public static function method(): string {
return $_SERVER['REQUEST_METHOD'];
}
public static function parameters(): array {
return $_REQUEST ?? [];
}
}

40
src/Router.php Normal file
View File

@ -0,0 +1,40 @@
<?php declare(strict_types=1);
namespace Nischcodes\Shiftcalc;
/**
* Router interface
*
* wraps routing into an simple interface
*
* PHP version 8.4 or higher
*
* LICENSE: GPL-3
*
* @package ShiftCalc
* @author nisch.codes <nischcodes@noreply.projects.nisch.codes>
* @copyright 2021 nisch.codes
* @license https://projects.nisch.codes/nischcodes/shiftcalc/src/branch/main/LICENSE GPL-3
* @version 1.0.0
* @link https://projects.nisch.codes/nischcodes/shiftcalc
*/
class Router {
protected array $routes = [];
public function dispatch(string $uri, string $method, ?array $parameter = []) {
//TODO
var_dump($uri);
var_dump($method);
var_dump($parameter);
}
public function registerRoutesFromController(string $controller, string $model = '', string $view = '') {
var_dump($controller);
var_dump($model);
var_dump($view);
}
}