| @ -0,0 +1,15 @@ | |||
| composer.phar | |||
| /vendor/ | |||
| node_modules | |||
| .env | |||
| *.log | |||
| rysnc_exclude | |||
| storage/csv/* | |||
| !storage/csv/.gitkeep | |||
| storage/database/* | |||
| !storage/database/.gitkeep | |||
| storage/cache/* | |||
| !storage/cache/.gitkeep | |||
| @ -0,0 +1,28 @@ | |||
| <?php | |||
| namespace App\Flight; | |||
| use Flight; | |||
| /** | |||
| * abstract FlightAbstract get instance of flight engine | |||
| * | |||
| * | |||
| * @author Björn Hase | |||
| * @license http://opensource.org/licenses/MIT The MIT License | |||
| * | |||
| */ | |||
| abstract class FlightAbstract | |||
| { | |||
| /** object of flight */ | |||
| protected $app; | |||
| /** | |||
| * getting object of flight | |||
| * | |||
| */ | |||
| public function __construct() | |||
| { | |||
| $this->app = Flight::app(); | |||
| } | |||
| } | |||
| @ -0,0 +1,42 @@ | |||
| <?php | |||
| /** | |||
| * fake function for blade @inject | |||
| * | |||
| * @param string $class | |||
| * @return object | |||
| */ | |||
| function app($class) | |||
| { | |||
| return new $class(); | |||
| } | |||
| /** | |||
| * function similar to blade asset | |||
| * | |||
| * @param $path | |||
| * @return string | |||
| * | |||
| */ | |||
| function asset($path, $prefix = '/public') | |||
| { | |||
| // get flight | |||
| $app = Flight::app(); | |||
| // getting basePath | |||
| $basePath = $app->get('basePath'); | |||
| // path to mix-manifest | |||
| $file = $app->get('basePath').'mix-manifest.json'; | |||
| if (file_exists($file)) { | |||
| $manifest = file_get_contents($file); | |||
| $files = json_decode($manifest, true); | |||
| if (isset($files[$prefix.$path])) { | |||
| $path = str_replace($prefix, '', $files[$prefix.$path]); | |||
| } | |||
| } | |||
| return $path; | |||
| } | |||
| @ -0,0 +1,27 @@ | |||
| <?php | |||
| namespace App\Http; | |||
| use Rakit\Validation\Validator; | |||
| use App\Flight\FlightAbstract; | |||
| use App\Models\Bucket; | |||
| use Carbon\Carbon; | |||
| /** | |||
| * | |||
| * | |||
| * | |||
| * | |||
| * @author Björn Hase | |||
| * @link https://gitea.tentakelfabrik.de/mITSM/feedback GitHub Repository | |||
| * | |||
| * | |||
| */ | |||
| class Bucket extends FlightAbstract | |||
| { | |||
| public function indexAction() | |||
| { | |||
| } | |||
| } | |||
| @ -0,0 +1,31 @@ | |||
| <?php | |||
| namespace App\Http; | |||
| use Rakit\Validation\Validator; | |||
| use App\Flight\FlightAbstract; | |||
| use App\Models\Bucket; | |||
| use Carbon\Carbon; | |||
| /** | |||
| * | |||
| * | |||
| * | |||
| * | |||
| * @author Björn Hase | |||
| * @link https://gitea.tentakelfabrik.de/mITSM/feedback GitHub Repository | |||
| * | |||
| * | |||
| */ | |||
| class Home extends FlightAbstract | |||
| { | |||
| public function indexAction() | |||
| { | |||
| $this->app->render('index', [ | |||
| ]); | |||
| } | |||
| } | |||
| @ -0,0 +1,26 @@ | |||
| <?php | |||
| namespace App\Models; | |||
| /** | |||
| * Store for Courses | |||
| * | |||
| * | |||
| * @author Björn Hase | |||
| * @link https://gitea.tentakelfabrik.de/mITSM/feedback GitHub Repository | |||
| * | |||
| */ | |||
| class Bucket extends ModelAbstract | |||
| { | |||
| // name of store | |||
| protected $name = 'buckets'; | |||
| public function findByVisiblity($visiblity) | |||
| { | |||
| return $this->store->findBy( | |||
| [ 'visiblity' => $visiblity ], | |||
| [ 'created_at' => 'ASC' ], | |||
| 100 | |||
| ); | |||
| } | |||
| } | |||
| @ -0,0 +1,46 @@ | |||
| <?php | |||
| namespace App\Models; | |||
| use SleekDB\Store; | |||
| use SleekDB\Query; | |||
| /** | |||
| * Abstract Class for Stores | |||
| * | |||
| * | |||
| * @author Björn Hase | |||
| * @link https://gitea.tentakelfabrik.de/mITSM/feedback GitHub Repository | |||
| * | |||
| */ | |||
| class ModelAbstract | |||
| { | |||
| // store of model | |||
| public $store; | |||
| // name of store | |||
| protected $name; | |||
| // configuration of store | |||
| protected $configuration = [ | |||
| 'auto_cache' => true, | |||
| 'cache_lifetime' => null, | |||
| 'timeout' => 120, | |||
| 'primary_key' => '_id', | |||
| 'search' => [ | |||
| 'min_length' => 2, | |||
| 'mode' => 'or', | |||
| 'score_key' => 'scoreKey', | |||
| 'algorithm' => Query::SEARCH_ALGORITHM['hits'] | |||
| ] | |||
| ]; | |||
| /** | |||
| * | |||
| * | |||
| */ | |||
| public function __construct() | |||
| { | |||
| $this->store = new Store($this->name, __DIR__.'/../../storage/database', $this->configuration); | |||
| } | |||
| } | |||
| @ -0,0 +1,17 @@ | |||
| <?php | |||
| namespace App\Models; | |||
| /** | |||
| * Store for Tags | |||
| * | |||
| * | |||
| * @author Björn Hase | |||
| * @link https://gitea.tentakelfabrik.de/mITSM/feedback GitHub Repository | |||
| * | |||
| */ | |||
| class Tag extends ModelAbstract | |||
| { | |||
| // name of store | |||
| protected $name = 'tags'; | |||
| } | |||
| @ -0,0 +1,17 @@ | |||
| <?php | |||
| namespace App\Models; | |||
| /** | |||
| * Store for Users | |||
| * | |||
| * | |||
| * @author Björn Hase | |||
| * @link https://gitea.tentakelfabrik.de/mITSM/feedback GitHub Repository | |||
| * | |||
| */ | |||
| class User extends ModelAbstract | |||
| { | |||
| // name of store | |||
| protected $name = 'users'; | |||
| } | |||
| @ -0,0 +1,31 @@ | |||
| <?php | |||
| // adding functions | |||
| require_once(__DIR__.'/Flight/Functions.php'); | |||
| // adding env | |||
| $env = Dotenv\Dotenv::createImmutable(__DIR__.'/..'); | |||
| $env->load(); | |||
| // display all errors if debug is true | |||
| if (getenv('DEBUG') === true) { | |||
| error_reporting(E_ALL); | |||
| ini_set('display_errors', 1); | |||
| } | |||
| // create app | |||
| $app = Flight::app(); | |||
| // setting view path | |||
| $app->set('flight.views.path', __DIR__.'/../resources/views'); | |||
| // adding blade for templates | |||
| Flight::register('view', 'Jenssegers\Blade\Blade', [ $app->get('flight.views.path'), __DIR__.'/../storage/cache']); | |||
| Flight::map('render', function($view, $data) { | |||
| echo Flight::view()->make($view, $data); | |||
| }); | |||
| // setting path | |||
| $app->set('basePath', __DIR__.'/../'); | |||
| $app->set('publicPath', __DIR__.'/../public'); | |||
| $app->set('storagePath', __DIR__.'/../storage'); | |||
| @ -0,0 +1,16 @@ | |||
| { | |||
| "require": { | |||
| "mikecao/flight": "^1.3", | |||
| "rakibtg/sleekdb": "^2.11", | |||
| "vlucas/phpdotenv": "^5.3", | |||
| "jenssegers/blade": "^1.4", | |||
| "rakit/validation": "^1.4", | |||
| "nesbot/carbon": "^2.49", | |||
| "microweber/screen": "^1.0" | |||
| }, | |||
| "autoload": { | |||
| "psr-4": { | |||
| "App\\": "app/" | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,15 @@ | |||
| <?php | |||
| require __DIR__.'/../vendor/autoload.php'; | |||
| require __DIR__.'/../app/bootstrap.php'; | |||
| $app->route('GET /', array(new App\Controllers\Index, 'indexAction')); | |||
| $app->route('GET /api/bucket', array(new App\Controllers\Bucket, 'indexAction')); | |||
| $app->route('POST /api/bucket', array(new App\Controllers\Bucket, 'createAction')); | |||
| $app->route('POST /api/bucket/[:id]', array(new App\Controllers\Bucket, 'updateAction')); | |||
| $app->route('DELETE /api/bucket/[:id]', array(new App\Controllers\Bucket, 'destroyAction')); | |||
| $app->route('GET /api/note/:bucket_id', array(new App\Controllers\Note, 'indexAction')); | |||
| $app->start(); | |||
| @ -0,0 +1,24 @@ | |||
| @extends('layout') | |||
| @section('main') | |||
| <div class="container"> | |||
| <h2> | |||
| Buckets | |||
| <button class="button"> | |||
| Create | |||
| </button> | |||
| </h2> | |||
| <h3> | |||
| </h3> | |||
| <app-buckets></app-buckets> | |||
| </div> | |||
| @push('scripts') | |||
| <script type="text/javascript" src="js/buckets.js"></script> | |||
| <script type="text/javascript" defer> | |||
| riot.mount('buckets', {!! json_encode([ 'buckets' => $buckets ]) !!}); | |||
| </script> | |||
| @endpush | |||
| @endsection | |||
| @ -0,0 +1,55 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> | |||
| <head> | |||
| <meta charset="utf-8"> | |||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |||
| <title>Nano Buckets</title> | |||
| @yield('head') | |||
| <link rel="stylesheet" href="css/app.css" /> | |||
| </head> | |||
| <body> | |||
| <header class="app-header"> | |||
| <div class="container is-fluid pt-2 pb-2"> | |||
| <nav class="navbar" role="navigation" aria-label="main navigation"> | |||
| <div class="navbar-brand"> | |||
| <a class="navbar-item" href="/"> | |||
| <img class="app-header__logo" src="/logo.svg" alt="Urban Filehub" /> | |||
| <span class="app-header__title ml-2"> | |||
| Filehub<strong>.Freifunk Minden</strong> | |||
| </span> | |||
| </a> | |||
| </div> | |||
| <div class="navbar-menu"> | |||
| <div class="navbar-start"> | |||
| <a class="navbar-item"> | |||
| Dashboard | |||
| </a> | |||
| </div> | |||
| </div> | |||
| </nav> | |||
| </div> | |||
| </header> | |||
| <section class="section"> | |||
| <div class="container is-fluid mt-3 mb-4"> | |||
| <urban-accordion> | |||
| <div title="Send me a Link"> | |||
| <urban-login-email></urban-login-email> | |||
| </div> | |||
| <div title="Login with Password"> | |||
| <urban-login-password></urban-login-password> | |||
| </div> | |||
| </urban-accordion> | |||
| </div> | |||
| </section> | |||
| <main> | |||
| @yield('main') | |||
| </main> | |||
| <script type="text/javascript" src="js/app.js"></script> | |||
| @stack('scripts') | |||
| </body> | |||
| </html> | |||