Initial commit of the Asset Management System, including project structure, Docker configuration, database migrations, and core application files. Added user authentication, asset management features, and basic UI components.
This commit is contained in:
58
config/config.php
Normal file
58
config/config.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
/**
|
||||
* Application Configuration
|
||||
*/
|
||||
|
||||
// Database configuration
|
||||
define('DB_HOST', $_ENV['DB_HOST'] ?? 'localhost');
|
||||
define('DB_PORT', $_ENV['DB_PORT'] ?? 3306);
|
||||
define('DB_NAME', $_ENV['DB_NAME'] ?? 'inventory');
|
||||
define('DB_USER', $_ENV['DB_USER'] ?? 'root');
|
||||
define('DB_PASS', $_ENV['DB_PASS'] ?? '');
|
||||
|
||||
// Application settings
|
||||
define('APP_ENV', $_ENV['APP_ENV'] ?? 'production');
|
||||
define('APP_URL', $_ENV['APP_URL'] ?? 'http://localhost:8080');
|
||||
define('APP_DEBUG', $_ENV['APP_DEBUG'] ?? false);
|
||||
define('APP_KEY', $_ENV['APP_KEY'] ?? 'base64:default-key-change-in-production');
|
||||
|
||||
// Session settings
|
||||
define('SESSION_SECURE', $_ENV['SESSION_SECURE'] ?? false);
|
||||
define('SESSION_LIFETIME', $_ENV['SESSION_LIFETIME'] ?? 3600);
|
||||
|
||||
// File upload settings
|
||||
define('UPLOAD_MAX_SIZE', $_ENV['UPLOAD_MAX_SIZE'] ?? '50M');
|
||||
define('ALLOWED_FILE_TYPES', $_ENV['ALLOWED_FILE_TYPES'] ?? 'pdf,jpg,jpeg,png,gif,doc,docx,xls,xlsx');
|
||||
|
||||
// Security settings
|
||||
define('CSRF_TOKEN_LIFETIME', $_ENV['CSRF_TOKEN_LIFETIME'] ?? 3600);
|
||||
define('PASSWORD_MIN_LENGTH', $_ENV['PASSWORD_MIN_LENGTH'] ?? 8);
|
||||
define('LOGIN_MAX_ATTEMPTS', $_ENV['LOGIN_MAX_ATTEMPTS'] ?? 5);
|
||||
define('LOGIN_LOCKOUT_TIME', $_ENV['LOGIN_LOCKOUT_TIME'] ?? 900);
|
||||
|
||||
// Paths
|
||||
define('ROOT_PATH', dirname(__DIR__));
|
||||
define('APP_PATH', ROOT_PATH . '/app');
|
||||
define('CONFIG_PATH', ROOT_PATH . '/config');
|
||||
define('STORAGE_PATH', ROOT_PATH . '/storage');
|
||||
define('PUBLIC_PATH', ROOT_PATH . '/public');
|
||||
define('LANG_PATH', ROOT_PATH . '/lang');
|
||||
|
||||
// Error reporting
|
||||
if (APP_DEBUG) {
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
} else {
|
||||
error_reporting(0);
|
||||
ini_set('display_errors', 0);
|
||||
}
|
||||
|
||||
// Set timezone
|
||||
date_default_timezone_set('Europe/Berlin');
|
||||
|
||||
// Configure session
|
||||
ini_set('session.cookie_httponly', 1);
|
||||
ini_set('session.cookie_secure', SESSION_SECURE ? 1 : 0);
|
||||
ini_set('session.cookie_samesite', 'Strict');
|
||||
ini_set('session.use_strict_mode', 1);
|
||||
ini_set('session.gc_maxlifetime', SESSION_LIFETIME);
|
||||
123
config/routes.php
Normal file
123
config/routes.php
Normal file
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
/**
|
||||
* Application Routes
|
||||
*/
|
||||
|
||||
use App\Core\Router;
|
||||
use App\Controllers\AuthController;
|
||||
use App\Controllers\DashboardController;
|
||||
use App\Controllers\AssetController;
|
||||
use App\Controllers\InventoryController;
|
||||
use App\Controllers\ReportController;
|
||||
use App\Controllers\UserController;
|
||||
use App\Controllers\CategoryController;
|
||||
use App\Controllers\LocationController;
|
||||
use App\Controllers\DepartmentController;
|
||||
use App\Controllers\FileController;
|
||||
use App\Controllers\ExportController;
|
||||
use App\Controllers\ImportController;
|
||||
|
||||
$router = Router::getInstance();
|
||||
|
||||
// Authentication routes
|
||||
$router->get('/login', [AuthController::class, 'showLogin']);
|
||||
$router->post('/login', [AuthController::class, 'login']);
|
||||
$router->post('/logout', [AuthController::class, 'logout']);
|
||||
$router->get('/password/forgot', [AuthController::class, 'showForgotPassword']);
|
||||
$router->post('/password/forgot', [AuthController::class, 'forgotPassword']);
|
||||
$router->get('/password/reset', [AuthController::class, 'showResetPassword']);
|
||||
$router->post('/password/reset', [AuthController::class, 'resetPassword']);
|
||||
|
||||
// Protected routes (require authentication)
|
||||
$router->group(['middleware' => 'auth'], function($router) {
|
||||
// Dashboard
|
||||
$router->get('/', [DashboardController::class, 'index']);
|
||||
$router->get('/dashboard', [DashboardController::class, 'index']);
|
||||
|
||||
// Assets
|
||||
$router->get('/assets', [AssetController::class, 'index']);
|
||||
$router->get('/assets/create', [AssetController::class, 'create']);
|
||||
$router->post('/assets', [AssetController::class, 'store']);
|
||||
$router->get('/assets/{id}', [AssetController::class, 'show']);
|
||||
$router->get('/assets/{id}/edit', [AssetController::class, 'edit']);
|
||||
$router->post('/assets/{id}', [AssetController::class, 'update']);
|
||||
$router->post('/assets/{id}/delete', [AssetController::class, 'delete']);
|
||||
$router->post('/assets/{id}/assign', [AssetController::class, 'assign']);
|
||||
$router->post('/assets/{id}/checkout', [AssetController::class, 'checkout']);
|
||||
$router->post('/assets/{id}/checkin', [AssetController::class, 'checkin']);
|
||||
|
||||
// Asset files
|
||||
$router->post('/assets/{id}/files', [FileController::class, 'upload']);
|
||||
$router->get('/files/{id}/download', [FileController::class, 'download']);
|
||||
$router->post('/files/{id}/delete', [FileController::class, 'delete']);
|
||||
|
||||
// Inventory
|
||||
$router->get('/inventories', [InventoryController::class, 'index']);
|
||||
$router->get('/inventories/create', [InventoryController::class, 'create']);
|
||||
$router->post('/inventories', [InventoryController::class, 'store']);
|
||||
$router->get('/inventories/{id}', [InventoryController::class, 'show']);
|
||||
$router->post('/inventories/{id}/close', [InventoryController::class, 'close']);
|
||||
$router->post('/inventories/{id}/scan', [InventoryController::class, 'scan']);
|
||||
$router->get('/inventories/{id}/report', [InventoryController::class, 'report']);
|
||||
|
||||
// Reports
|
||||
$router->get('/reports', [ReportController::class, 'index']);
|
||||
$router->get('/reports/assets', [ReportController::class, 'assets']);
|
||||
$router->get('/reports/warranty', [ReportController::class, 'warranty']);
|
||||
$router->get('/reports/retired', [ReportController::class, 'retired']);
|
||||
$router->get('/reports/location', [ReportController::class, 'location']);
|
||||
$router->get('/reports/category', [ReportController::class, 'category']);
|
||||
|
||||
// Exports
|
||||
$router->get('/exports/csv', [ExportController::class, 'csv']);
|
||||
$router->get('/exports/xlsx', [ExportController::class, 'xlsx']);
|
||||
$router->get('/exports/labels', [ExportController::class, 'labels']);
|
||||
|
||||
// Imports
|
||||
$router->get('/imports/csv', [ImportController::class, 'show']);
|
||||
$router->post('/imports/csv', [ImportController::class, 'import']);
|
||||
|
||||
// Master data
|
||||
$router->get('/categories', [CategoryController::class, 'index']);
|
||||
$router->get('/categories/create', [CategoryController::class, 'create']);
|
||||
$router->post('/categories', [CategoryController::class, 'store']);
|
||||
$router->get('/categories/{id}/edit', [CategoryController::class, 'edit']);
|
||||
$router->post('/categories/{id}', [CategoryController::class, 'update']);
|
||||
$router->post('/categories/{id}/delete', [CategoryController::class, 'delete']);
|
||||
|
||||
$router->get('/locations', [LocationController::class, 'index']);
|
||||
$router->get('/locations/create', [LocationController::class, 'create']);
|
||||
$router->post('/locations', [LocationController::class, 'store']);
|
||||
$router->get('/locations/{id}/edit', [LocationController::class, 'edit']);
|
||||
$router->post('/locations/{id}', [LocationController::class, 'update']);
|
||||
$router->post('/locations/{id}/delete', [LocationController::class, 'delete']);
|
||||
|
||||
$router->get('/departments', [DepartmentController::class, 'index']);
|
||||
$router->get('/departments/create', [DepartmentController::class, 'create']);
|
||||
$router->post('/departments', [DepartmentController::class, 'store']);
|
||||
$router->get('/departments/{id}/edit', [DepartmentController::class, 'edit']);
|
||||
$router->post('/departments/{id}', [DepartmentController::class, 'update']);
|
||||
$router->post('/departments/{id}/delete', [DepartmentController::class, 'delete']);
|
||||
|
||||
// Admin routes
|
||||
$router->group(['middleware' => 'admin'], function($router) {
|
||||
$router->get('/users', [UserController::class, 'index']);
|
||||
$router->get('/users/create', [UserController::class, 'create']);
|
||||
$router->post('/users', [UserController::class, 'store']);
|
||||
$router->get('/users/{id}/edit', [UserController::class, 'edit']);
|
||||
$router->post('/users/{id}', [UserController::class, 'update']);
|
||||
$router->post('/users/{id}/delete', [UserController::class, 'delete']);
|
||||
$router->post('/users/{id}/toggle', [UserController::class, 'toggleStatus']);
|
||||
});
|
||||
});
|
||||
|
||||
// Error routes
|
||||
$router->get('/404', function() {
|
||||
http_response_code(404);
|
||||
require APP_PATH . '/Views/errors/404.php';
|
||||
});
|
||||
|
||||
$router->get('/500', function() {
|
||||
http_response_code(500);
|
||||
require APP_PATH . '/Views/errors/500.php';
|
||||
});
|
||||
Reference in New Issue
Block a user