@ -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> |