items website
Made by Shirito and Revingly Original repo: https://dev.sp-tarkov.com/Rev/spt-items-api
This commit is contained in:
parent
61b6c82976
commit
aa9160aed1
15
items/.editorconfig
Normal file
15
items/.editorconfig
Normal file
@ -0,0 +1,15 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.{yml,yaml}]
|
||||
indent_size = 2
|
19
items/.env.example
Normal file
19
items/.env.example
Normal file
@ -0,0 +1,19 @@
|
||||
APP_NAME=Lumen
|
||||
APP_ENV=local
|
||||
APP_KEY=
|
||||
APP_DEBUG=true
|
||||
APP_URL=http://localhost
|
||||
APP_TIMEZONE=UTC
|
||||
|
||||
LOG_CHANNEL=stack
|
||||
LOG_SLACK_WEBHOOK_URL=
|
||||
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=homestead
|
||||
DB_USERNAME=homestead
|
||||
DB_PASSWORD=secret
|
||||
|
||||
CACHE_DRIVER=file
|
||||
QUEUE_CONNECTION=sync
|
7
items/.gitignore
vendored
Normal file
7
items/.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
/vendor
|
||||
/.idea
|
||||
Homestead.json
|
||||
Homestead.yaml
|
||||
.env
|
||||
.phpunit.result.cache
|
||||
*.env.local
|
6
items/.styleci.yml
Normal file
6
items/.styleci.yml
Normal file
@ -0,0 +1,6 @@
|
||||
php:
|
||||
preset: laravel
|
||||
disabled:
|
||||
- unused_use
|
||||
js: true
|
||||
css: true
|
13
items/README.md
Normal file
13
items/README.md
Normal file
@ -0,0 +1,13 @@
|
||||
# SP Tarkov items API
|
||||
|
||||
## How to install
|
||||
|
||||
* Clone the repo
|
||||
* Make sure you have PHP and composer installed on your PC
|
||||
* To verify that you have PHP and composer working, try these commands `php -v` and `composer -v`
|
||||
* Go inside the cloned repo and install the dependencies with this command `composer install`
|
||||
* If you don't have a local server like Apache or Nginx, you can use PHP to start a server with this command in the root folder of the repo `php -S localhost:8000 -t public`
|
||||
|
||||
## How to use
|
||||
|
||||
* Check the `routes/web.php` for the available routes and use whatever utility you are confortable with to call the API endpoints, ex: Postman
|
10
items/app/Config/GiteaConfig.php
Normal file
10
items/app/Config/GiteaConfig.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Config;
|
||||
|
||||
final class GiteaConfig {
|
||||
public const RAW_ITEMS_URL = 'https://dev.sp-tarkov.com/SPT-AKI/Server/raw/branch/development/project/assets/database/templates/items.json';
|
||||
public const RAW_CUSTOMIZATION_URL = 'https://dev.sp-tarkov.com/SPT-AKI/Server/raw/branch/development/project/assets/database/templates/customization.json';
|
||||
public const LOCALES_GLOBAL_URL = 'https://dev.sp-tarkov.com/api/v1/repos/SPT-AKI/Server/contents/project%2Fassets%2Fdatabase%2Flocales%2Fglobal';
|
||||
public const RAW_LOCALES_GLOBAL_BASE_URL = 'https://dev.sp-tarkov.com/SPT-AKI/Server/raw/branch/development/project/assets/database/locales/global/';
|
||||
}
|
0
items/app/Console/Commands/.gitkeep
Normal file
0
items/app/Console/Commands/.gitkeep
Normal file
35
items/app/Console/Commands/RefreshItemsCache.php
Normal file
35
items/app/Console/Commands/RefreshItemsCache.php
Normal file
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Data\ItemsCollection;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class RefreshItemsCache extends Command
|
||||
{
|
||||
/**
|
||||
* The console command name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = "items:refresh";
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = "Refresh all items cache";
|
||||
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @param ItemsCollection $itemsCollection
|
||||
* @return void
|
||||
*/
|
||||
public function handle(ItemsCollection $itemsCollection): void
|
||||
{
|
||||
$itemsCollection->refreshAllCache();
|
||||
}
|
||||
}
|
30
items/app/Console/Kernel.php
Normal file
30
items/app/Console/Kernel.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console;
|
||||
|
||||
use App\Console\Commands\RefreshItemsCache;
|
||||
use Illuminate\Console\Scheduling\Schedule;
|
||||
use Laravel\Lumen\Console\Kernel as ConsoleKernel;
|
||||
|
||||
class Kernel extends ConsoleKernel
|
||||
{
|
||||
/**
|
||||
* The Artisan commands provided by your application.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $commands = [
|
||||
RefreshItemsCache::class,
|
||||
];
|
||||
|
||||
/**
|
||||
* Define the application's command schedule.
|
||||
*
|
||||
* @param \Illuminate\Console\Scheduling\Schedule $schedule
|
||||
* @return void
|
||||
*/
|
||||
protected function schedule(Schedule $schedule)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
174
items/app/Data/ItemsCollection.php
Normal file
174
items/app/Data/ItemsCollection.php
Normal file
@ -0,0 +1,174 @@
|
||||
<?php
|
||||
|
||||
namespace App\Data;
|
||||
|
||||
use App\Exceptions\ItemNotFoundException;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Str;
|
||||
use App\Config\GiteaConfig;
|
||||
|
||||
class ItemsCollection
|
||||
{
|
||||
protected Collection $items;
|
||||
protected Collection $locales;
|
||||
|
||||
private string $items_cache_key = 'items';
|
||||
private string $locales_cache_key = 'locales';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
if (!Cache::has($this->items_cache_key)) {
|
||||
$this->refreshItemsCache();
|
||||
} else {
|
||||
$this->items = Cache::get($this->items_cache_key);
|
||||
}
|
||||
|
||||
if (!Cache::has($this->locales_cache_key)) {
|
||||
$this->refreshLocalesCache();
|
||||
} else {
|
||||
$this->locales = Cache::get($this->locales_cache_key);
|
||||
}
|
||||
}
|
||||
|
||||
public function refreshLocalesCache(): void
|
||||
{
|
||||
$this->locales = collect();
|
||||
$rawLocalesGlobalBaseUrl = GiteaConfig::RAW_LOCALES_GLOBAL_BASE_URL;
|
||||
|
||||
// Getting all locales in project/assets/database/locales/global from the Server development branch repository
|
||||
|
||||
$localesList = collect(Http::withOptions(['verify' => false])->get(GiteaConfig::LOCALES_GLOBAL_URL)->json());
|
||||
foreach ($localesList as $item) {
|
||||
// Extract the json name for the locale
|
||||
preg_match('/([a-z]{2}(-[a-z]{2})?).json/', $item['name'], $currentLocaleName, PREG_OFFSET_CAPTURE);
|
||||
|
||||
// If the name is not supported for any reason, dont add it to the locales
|
||||
if (empty($currentLocaleName) || !$currentLocaleName[1][0]) continue;
|
||||
|
||||
$trimmedCurrentLocaleName = trim($currentLocaleName[1][0]);
|
||||
$currentLocaleJson = Http::withOptions(['verify' => false])
|
||||
->get("${rawLocalesGlobalBaseUrl}/${trimmedCurrentLocaleName}.json")->json();
|
||||
$templateLocale = collect($currentLocaleJson['templates']);
|
||||
$customizationLocale = collect($currentLocaleJson['customization']);
|
||||
$this->locales = $this->locales->merge([$trimmedCurrentLocaleName => $templateLocale->concat($customizationLocale)]);
|
||||
}
|
||||
Cache::put($this->locales_cache_key, $this->locales);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function refreshItemsCache(): void
|
||||
{
|
||||
$this->items = collect(Http::withOptions(['verify' => false])->get(GiteaConfig::RAW_ITEMS_URL)->json());
|
||||
$this->items = $this->items->merge(collect(Http::withOptions(['verify' => false])
|
||||
->get(GiteaConfig::RAW_CUSTOMIZATION_URL)->json()));
|
||||
Cache::put($this->items_cache_key, $this->items);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection
|
||||
*/
|
||||
public function getLocales(): Collection
|
||||
{
|
||||
return $this->locales->keys();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function refreshAllCache(): void
|
||||
{
|
||||
$this->refreshItemsCache();
|
||||
$this->refreshLocalesCache();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the query is in the key
|
||||
* @param string $key
|
||||
* @param string $query
|
||||
* @return bool
|
||||
*/
|
||||
private function contains(string $key, string $query): bool
|
||||
{
|
||||
$key = Str::lower(trim($key));
|
||||
$query = Str::lower(trim($query));
|
||||
|
||||
return Str::contains($key, $query);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $query the content of the query eg. 'AK'
|
||||
* @param string $locale the chosen local. Default to 'en'
|
||||
* @return Collection
|
||||
*/
|
||||
public function findItem(string $query, string $locale): Collection
|
||||
{
|
||||
return $this->items->filter(function ($val, $key) use ($query, $locale) {
|
||||
return $this->contains($val['_id'], $query)
|
||||
|| $this->contains($val['_name'], $query)
|
||||
|| $this->contains($val['_parent'], $query)
|
||||
|| (($this->locales[$locale][$key] ?? false)
|
||||
&& ($this->contains($this->locales[$locale][$key]['Name'], $query) || $this->contains($this->locales[$locale][$key]['ShortName'], $query))
|
||||
);
|
||||
})->map(function ($item) use ($locale) {
|
||||
return [
|
||||
'item' => [
|
||||
'_id' => $item['_id'],
|
||||
'_name' => $item['_name'],
|
||||
],
|
||||
'locale' => $this->locales[$locale][$item['_id']] ?? ''
|
||||
];
|
||||
})->values();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $id the item ID to look for
|
||||
* @param string $locale the chosen local. Default to 'en'
|
||||
* @return array
|
||||
* @throws ItemNotFoundException
|
||||
*/
|
||||
public function getItemById(string $id, string $locale): array
|
||||
{
|
||||
$item = $this->items[$id] ?? throw new ItemNotFoundException('Item not found');
|
||||
return [
|
||||
'item' => $item,
|
||||
'locale' => $this->locales[$locale][$id] ?? ''
|
||||
];
|
||||
}
|
||||
|
||||
public function getHierarchy(string $id, string $locale = 'en'): Collection {
|
||||
// Return 404 if the item does not exist
|
||||
$itemData = $this->items[$id] ?? throw new ItemNotFoundException('Item not found');
|
||||
|
||||
// Initialize the hierarchy with the current item
|
||||
$item = [
|
||||
'item'=> [
|
||||
'_id' => $itemData['_id'],
|
||||
'_name' => $itemData['_name'],
|
||||
'_parent' => $itemData['_parent']
|
||||
],
|
||||
'locale' => $this->locales[$locale][$id] ?? ''
|
||||
];
|
||||
$hierarchy = collect([$id => $item]);
|
||||
|
||||
// Check the whole hierarchy and merge into the return variable
|
||||
while (!empty($item['item']['_parent'] ?? '')) {
|
||||
$itemtId = $item['item']['_parent'];
|
||||
$itemData = $this->items[$itemtId] ?? null;
|
||||
$item = [
|
||||
'item'=> [
|
||||
'_id' => $itemData['_id'],
|
||||
'_name' => $itemData['_name'],
|
||||
'_parent' => $itemData['_parent']
|
||||
],
|
||||
'locale' => $this->locales[$locale][$itemtId] ?? ''
|
||||
];
|
||||
$hierarchy = $hierarchy->merge([$itemtId => $item]);
|
||||
}
|
||||
|
||||
return $hierarchy;
|
||||
}
|
||||
}
|
10
items/app/Events/Event.php
Normal file
10
items/app/Events/Event.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Events;
|
||||
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
abstract class Event
|
||||
{
|
||||
use SerializesModels;
|
||||
}
|
16
items/app/Events/ExampleEvent.php
Normal file
16
items/app/Events/ExampleEvent.php
Normal file
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace App\Events;
|
||||
|
||||
class ExampleEvent extends Event
|
||||
{
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
54
items/app/Exceptions/Handler.php
Normal file
54
items/app/Exceptions/Handler.php
Normal file
@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace App\Exceptions;
|
||||
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Laravel\Lumen\Exceptions\Handler as ExceptionHandler;
|
||||
use Symfony\Component\HttpKernel\Exception\HttpException;
|
||||
use Throwable;
|
||||
|
||||
class Handler extends ExceptionHandler
|
||||
{
|
||||
/**
|
||||
* A list of the exception types that should not be reported.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $dontReport = [
|
||||
AuthorizationException::class,
|
||||
HttpException::class,
|
||||
ModelNotFoundException::class,
|
||||
ValidationException::class,
|
||||
];
|
||||
|
||||
/**
|
||||
* Report or log an exception.
|
||||
*
|
||||
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
|
||||
*
|
||||
* @param \Throwable $exception
|
||||
* @return void
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function report(Throwable $exception)
|
||||
{
|
||||
parent::report($exception);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render an exception into an HTTP response.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Throwable $exception
|
||||
* @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
|
||||
*
|
||||
* @throws \Throwable
|
||||
*/
|
||||
public function render($request, Throwable $exception)
|
||||
{
|
||||
return parent::render($request, $exception);
|
||||
}
|
||||
}
|
10
items/app/Exceptions/ItemNotFoundException.php
Normal file
10
items/app/Exceptions/ItemNotFoundException.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Exceptions;
|
||||
|
||||
use Exception;
|
||||
|
||||
class ItemNotFoundException extends Exception
|
||||
{
|
||||
|
||||
}
|
10
items/app/Http/Controllers/Controller.php
Normal file
10
items/app/Http/Controllers/Controller.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Laravel\Lumen\Routing\Controller as BaseController;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
|
||||
}
|
119
items/app/Http/Controllers/ItemController.php
Normal file
119
items/app/Http/Controllers/ItemController.php
Normal file
@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Data\ItemsCollection;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Throwable;
|
||||
|
||||
class ItemController extends Controller
|
||||
{
|
||||
/**
|
||||
* @var ItemsCollection
|
||||
*/
|
||||
private ItemsCollection $itemsCollection;
|
||||
|
||||
public function __construct(ItemsCollection $itemsCollection)
|
||||
{
|
||||
$this->itemsCollection = $itemsCollection;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function search(Request $request): JsonResponse
|
||||
{
|
||||
$status = Response::HTTP_NO_CONTENT;
|
||||
$result = $this->itemsCollection->findItem($request->input('query'), $request->input('locale') ?? 'en');
|
||||
$response = [];
|
||||
if ($result->isNotEmpty()) {
|
||||
$status = Response::HTTP_OK;
|
||||
$response = [
|
||||
'items' => $result->toArray(),
|
||||
];
|
||||
}
|
||||
return response()->json($response, $status);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function getItem(Request $request): JsonResponse
|
||||
{
|
||||
try {
|
||||
return response()->json(
|
||||
$this->itemsCollection->getItemById(
|
||||
$request->query('id', ''), $request->query('locale', 'en')
|
||||
)
|
||||
);
|
||||
} catch (Throwable $exception) {
|
||||
Log::error($exception->getMessage());
|
||||
Log::error($exception->getTraceAsString());
|
||||
return response()->json([
|
||||
'error' => 'Item not found.',
|
||||
], Response::HTTP_NOT_FOUND);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Request $request The request
|
||||
* @return JsonResponse Either {"error":"item not found"} or an object containing
|
||||
* for each id, an object looking like
|
||||
* {"item":{"_id":"id","_name":"name","_parent":"parent"}, "locale": {"Description":"description", "Name":"name", "ShortName":"shortName"}}
|
||||
*/
|
||||
public function getHierarchy(Request $request): JsonResponse
|
||||
{
|
||||
try {
|
||||
return response()->json(
|
||||
$this->itemsCollection->getHierarchy(
|
||||
$request->query('id'), $request->query('locale', 'en')
|
||||
)
|
||||
);
|
||||
} catch (Throwable $exception) {
|
||||
Log::error($exception->getMessage());
|
||||
Log::error($exception->getTraceAsString());
|
||||
return response()->json([
|
||||
'error' => 'Item not found.',
|
||||
], Response::HTTP_NOT_FOUND);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function getLocales(): JsonResponse
|
||||
{
|
||||
try {
|
||||
return response()->json($this->itemsCollection->getLocales());
|
||||
} catch (Throwable $exception) {
|
||||
Log::error($exception->getMessage());
|
||||
Log::error($exception->getTraceAsString());
|
||||
return response()->json([
|
||||
'error' => 'No locale found.',
|
||||
], Response::HTTP_NOT_FOUND);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function refreshAllCache(): JsonResponse
|
||||
{
|
||||
try {
|
||||
$this->itemsCollection->refreshAllCache();
|
||||
return response()->json([], Response::HTTP_NO_CONTENT);
|
||||
} catch (Throwable $exception) {
|
||||
Log::error($exception->getMessage());
|
||||
Log::error($exception->getTraceAsString());
|
||||
return response()->json([
|
||||
'error' => 'Internal error',
|
||||
], Response::HTTP_INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
44
items/app/Http/Middleware/Authenticate.php
Normal file
44
items/app/Http/Middleware/Authenticate.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\Auth\Factory as Auth;
|
||||
|
||||
class Authenticate
|
||||
{
|
||||
/**
|
||||
* The authentication guard factory instance.
|
||||
*
|
||||
* @var \Illuminate\Contracts\Auth\Factory
|
||||
*/
|
||||
protected $auth;
|
||||
|
||||
/**
|
||||
* Create a new middleware instance.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Auth\Factory $auth
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Auth $auth)
|
||||
{
|
||||
$this->auth = $auth;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @param string|null $guard
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next, $guard = null)
|
||||
{
|
||||
if ($this->auth->guard($guard)->guest()) {
|
||||
return response('Unauthorized.', 401);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
20
items/app/Http/Middleware/ExampleMiddleware.php
Normal file
20
items/app/Http/Middleware/ExampleMiddleware.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
|
||||
class ExampleMiddleware
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
return $next($request);
|
||||
}
|
||||
}
|
26
items/app/Jobs/ExampleJob.php
Normal file
26
items/app/Jobs/ExampleJob.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
|
||||
class ExampleJob extends Job
|
||||
{
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
24
items/app/Jobs/Job.php
Normal file
24
items/app/Jobs/Job.php
Normal file
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
abstract class Job implements ShouldQueue
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Queueable Jobs
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This job base class provides a central location to place any logic that
|
||||
| is shared across all of your jobs. The trait included with the class
|
||||
| provides access to the "queueOn" and "delay" queue helper methods.
|
||||
|
|
||||
*/
|
||||
|
||||
use InteractsWithQueue, Queueable, SerializesModels;
|
||||
}
|
31
items/app/Listeners/ExampleListener.php
Normal file
31
items/app/Listeners/ExampleListener.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Listeners;
|
||||
|
||||
use App\Events\ExampleEvent;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
|
||||
class ExampleListener
|
||||
{
|
||||
/**
|
||||
* Create the event listener.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param \App\Events\ExampleEvent $event
|
||||
* @return void
|
||||
*/
|
||||
public function handle(ExampleEvent $event)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
33
items/app/Models/User.php
Normal file
33
items/app/Models/User.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Auth\Authenticatable;
|
||||
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
|
||||
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Laravel\Lumen\Auth\Authorizable;
|
||||
|
||||
class User extends Model implements AuthenticatableContract, AuthorizableContract
|
||||
{
|
||||
use Authenticatable, Authorizable, HasFactory;
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $fillable = [
|
||||
'name', 'email',
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes excluded from the model's JSON form.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $hidden = [
|
||||
'password',
|
||||
];
|
||||
}
|
28
items/app/Providers/AppServiceProvider.php
Normal file
28
items/app/Providers/AppServiceProvider.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register any application services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Bootstrap any application services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
39
items/app/Providers/AuthServiceProvider.php
Normal file
39
items/app/Providers/AuthServiceProvider.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class AuthServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register any application services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Boot the authentication services for the application.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
// Here you may define how you wish users to be authenticated for your Lumen
|
||||
// application. The callback which receives the incoming request instance
|
||||
// should return either a User instance or null. You're free to obtain
|
||||
// the User instance via an API token or any other method necessary.
|
||||
|
||||
$this->app['auth']->viaRequest('api', function ($request) {
|
||||
if ($request->input('api_token')) {
|
||||
return User::where('api_token', $request->input('api_token'))->first();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
19
items/app/Providers/EventServiceProvider.php
Normal file
19
items/app/Providers/EventServiceProvider.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
|
||||
|
||||
class EventServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* The event listener mappings for the application.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $listen = [
|
||||
\App\Events\ExampleEvent::class => [
|
||||
\App\Listeners\ExampleListener::class,
|
||||
],
|
||||
];
|
||||
}
|
35
items/artisan
Normal file
35
items/artisan
Normal file
@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Console\Input\ArgvInput;
|
||||
use Symfony\Component\Console\Output\ConsoleOutput;
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Create The Application
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| First we need to get an application instance. This creates an instance
|
||||
| of the application / container and bootstraps the application so it
|
||||
| is ready to receive HTTP / Console requests from the environment.
|
||||
|
|
||||
*/
|
||||
|
||||
$app = require __DIR__.'/bootstrap/app.php';
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Run The Artisan Application
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When we run the console application, the current CLI command will be
|
||||
| executed in this console and the response sent back to a terminal
|
||||
| or another output device for the developers. Here goes nothing!
|
||||
|
|
||||
*/
|
||||
|
||||
$kernel = $app->make(
|
||||
'Illuminate\Contracts\Console\Kernel'
|
||||
);
|
||||
|
||||
exit($kernel->handle(new ArgvInput, new ConsoleOutput));
|
117
items/bootstrap/app.php
Normal file
117
items/bootstrap/app.php
Normal file
@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/../vendor/autoload.php';
|
||||
|
||||
(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
|
||||
dirname(__DIR__)
|
||||
))->bootstrap();
|
||||
|
||||
date_default_timezone_set(env('APP_TIMEZONE', 'UTC'));
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Create The Application
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here we will load the environment and create the application instance
|
||||
| that serves as the central piece of this framework. We'll use this
|
||||
| application as an "IoC" container and router for this framework.
|
||||
|
|
||||
*/
|
||||
|
||||
$app = new Laravel\Lumen\Application(
|
||||
dirname(__DIR__)
|
||||
);
|
||||
|
||||
$app->withFacades();
|
||||
|
||||
// $app->withEloquent();
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Register Container Bindings
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Now we will register a few bindings in the service container. We will
|
||||
| register the exception handler and the console kernel. You may add
|
||||
| your own bindings here if you like or you can make another file.
|
||||
|
|
||||
*/
|
||||
|
||||
$app->singleton(
|
||||
Illuminate\Contracts\Debug\ExceptionHandler::class,
|
||||
App\Exceptions\Handler::class
|
||||
);
|
||||
|
||||
$app->singleton(
|
||||
Illuminate\Contracts\Console\Kernel::class,
|
||||
App\Console\Kernel::class
|
||||
);
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Register Config Files
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Now we will register the "app" configuration file. If the file exists in
|
||||
| your configuration directory it will be loaded; otherwise, we'll load
|
||||
| the default version. You may register other files below as needed.
|
||||
|
|
||||
*/
|
||||
|
||||
$app->configure('app');
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Register Middleware
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Next, we will register the middleware with the application. These can
|
||||
| be global middleware that run before and after each request into a
|
||||
| route or middleware that'll be assigned to some specific routes.
|
||||
|
|
||||
*/
|
||||
|
||||
$app->middleware([
|
||||
Fruitcake\Cors\HandleCors::class,
|
||||
]);
|
||||
|
||||
// $app->routeMiddleware([
|
||||
// 'auth' => App\Http\Middleware\Authenticate::class,
|
||||
// ]);
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Register Service Providers
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here we will register all of the application's service providers which
|
||||
| are used to bind services into the container. Service providers are
|
||||
| totally optional, so you are not required to uncomment this line.
|
||||
|
|
||||
*/
|
||||
|
||||
// $app->register(App\Providers\AppServiceProvider::class);
|
||||
// $app->register(App\Providers\AuthServiceProvider::class);
|
||||
// $app->register(App\Providers\EventServiceProvider::class);
|
||||
$app->register(Fruitcake\Cors\CorsServiceProvider::class);
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Load The Application Routes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Next we will include the routes file so that they can all be added to
|
||||
| the application. This will provide all of the URLs the application
|
||||
| can respond to, as well as the controllers that may handle them.
|
||||
|
|
||||
*/
|
||||
$app->configure('cors');
|
||||
|
||||
$app->router->group([
|
||||
'namespace' => 'App\Http\Controllers',
|
||||
], function ($router) {
|
||||
require __DIR__.'/../routes/web.php';
|
||||
});
|
||||
|
||||
return $app;
|
42
items/composer.json
Normal file
42
items/composer.json
Normal file
@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "laravel/lumen",
|
||||
"description": "The Laravel Lumen Framework.",
|
||||
"keywords": ["framework", "laravel", "lumen"],
|
||||
"license": "MIT",
|
||||
"type": "project",
|
||||
"require": {
|
||||
"fruitcake/laravel-cors": "^2.0",
|
||||
"guzzlehttp/guzzle": "^7.3",
|
||||
"laravel/lumen-framework": "^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"deployer/dist": "^6.8",
|
||||
"fakerphp/faker": "^1.9.1",
|
||||
"mockery/mockery": "^1.3.1",
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"App\\": "app/",
|
||||
"Database\\Factories\\": "database/factories/",
|
||||
"Database\\Seeders\\": "database/seeders/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"classmap": [
|
||||
"tests/"
|
||||
]
|
||||
},
|
||||
"config": {
|
||||
"preferred-install": "dist",
|
||||
"sort-packages": true,
|
||||
"optimize-autoloader": true
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
"scripts": {
|
||||
"post-root-package-install": [
|
||||
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
|
||||
]
|
||||
}
|
||||
}
|
7778
items/composer.lock
generated
Normal file
7778
items/composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
60
items/config/cors.php
Normal file
60
items/config/cors.php
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Laravel CORS Options
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The allowed_methods and allowed_headers options are case-insensitive.
|
||||
|
|
||||
| You don't need to provide both allowed_origins and allowed_origins_patterns.
|
||||
| If one of the strings passed matches, it is considered a valid origin.
|
||||
|
|
||||
| If ['*'] is provided to allowed_methods, allowed_origins or allowed_headers
|
||||
| all methods / origins / headers are allowed.
|
||||
|
|
||||
*/
|
||||
|
||||
/*
|
||||
* You can enable CORS for 1 or multiple paths.
|
||||
* Example: ['api/*']
|
||||
*/
|
||||
'paths' => ['api/*'],
|
||||
|
||||
/*
|
||||
* Matches the request method. `['*']` allows all methods.
|
||||
*/
|
||||
'allowed_methods' => ['*'],
|
||||
|
||||
/*
|
||||
* Matches the request origin. `['*']` allows all origins. Wildcards can be used, eg `*.mydomain.com`
|
||||
*/
|
||||
'allowed_origins' => ['*'],
|
||||
|
||||
/*
|
||||
* Patterns that can be used with `preg_match` to match the origin.
|
||||
*/
|
||||
'allowed_origins_patterns' => [],
|
||||
|
||||
/*
|
||||
* Sets the Access-Control-Allow-Headers response header. `['*']` allows all headers.
|
||||
*/
|
||||
'allowed_headers' => ['*'],
|
||||
|
||||
/*
|
||||
* Sets the Access-Control-Expose-Headers response header with these headers.
|
||||
*/
|
||||
'exposed_headers' => [],
|
||||
|
||||
/*
|
||||
* Sets the Access-Control-Max-Age response header when > 0.
|
||||
*/
|
||||
'max_age' => 0,
|
||||
|
||||
/*
|
||||
* Sets the Access-Control-Allow-Credentials header.
|
||||
*/
|
||||
'supports_credentials' => false,
|
||||
];
|
29
items/database/factories/UserFactory.php
Normal file
29
items/database/factories/UserFactory.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
class UserFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* The name of the factory's corresponding model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $model = User::class;
|
||||
|
||||
/**
|
||||
* Define the model's default state.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function definition()
|
||||
{
|
||||
return [
|
||||
'name' => $this->faker->name,
|
||||
'email' => $this->faker->unique()->safeEmail,
|
||||
];
|
||||
}
|
||||
}
|
0
items/database/migrations/.gitkeep
Normal file
0
items/database/migrations/.gitkeep
Normal file
18
items/database/seeders/DatabaseSeeder.php
Normal file
18
items/database/seeders/DatabaseSeeder.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class DatabaseSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
// $this->call('UsersTableSeeder');
|
||||
}
|
||||
}
|
75
items/deploy.php
Normal file
75
items/deploy.php
Normal file
@ -0,0 +1,75 @@
|
||||
<?php
|
||||
namespace Deployer;
|
||||
|
||||
require 'recipe/laravel.php';
|
||||
|
||||
// Project name
|
||||
set('application', 'SPT-Items-API');
|
||||
|
||||
// Project repository
|
||||
set('repository', 'https://dev.sp-tarkov.com/Rev/spt-items-api.git');
|
||||
|
||||
set('shared_dirs', [
|
||||
'storage/app',
|
||||
'storage/framework/cache',
|
||||
'storage/framework/sessions',
|
||||
'storage/framework/views',
|
||||
'storage/logs',
|
||||
]);
|
||||
|
||||
// Writable dirs by web server
|
||||
add('writable_dirs', []);
|
||||
set('writable_use_sudo', false);
|
||||
|
||||
// Hosts
|
||||
host('spt-server')
|
||||
->multiplexing(false)
|
||||
->become('apache')
|
||||
->set('deploy_path', '/var/www/html');
|
||||
|
||||
task('artisan:cache:clear', function () {
|
||||
run('{{bin/php}} {{release_path}}/artisan cache:clear');
|
||||
})->desc('Execute artisan cache:clear');
|
||||
|
||||
task('deploy:vendors', function () {
|
||||
run('cd {{release_path}} && /usr/local/bin/composer install --verbose --prefer-dist --no-progress --no-interaction --optimize-autoloader --no-suggest');
|
||||
})->desc('installing composer packages');
|
||||
|
||||
|
||||
task('artisan:config:cache', function() {})->setPrivate();
|
||||
task('artisan:down', function() {})->setPrivate();
|
||||
task('artisan:event:cache', function() {})->setPrivate();
|
||||
task('artisan:event:clear', function() {})->setPrivate();
|
||||
task('artisan:horizon:terminate', function() {})->setPrivate();
|
||||
task('artisan:optimize', function() {})->setPrivate();
|
||||
task('artisan:optimize:clear', function() {})->setPrivate();
|
||||
task('artisan:route:cache', function() {})->setPrivate();
|
||||
task('artisan:storage:link', function() {})->setPrivate();
|
||||
task('artisan:up', function() {})->setPrivate();
|
||||
task('artisan:view:cache', function() {})->setPrivate();
|
||||
task('artisan:view:clear', function() {})->setPrivate();
|
||||
|
||||
// custom task
|
||||
task('items:refresh', function () {
|
||||
run('cd {{release_path}} && php artisan items:refresh');
|
||||
});
|
||||
|
||||
// Tasks
|
||||
task('deploy', [
|
||||
'deploy:info',
|
||||
'deploy:prepare',
|
||||
'deploy:lock',
|
||||
'deploy:release',
|
||||
'deploy:update_code',
|
||||
'deploy:shared',
|
||||
'deploy:vendors',
|
||||
'deploy:writable',
|
||||
'artisan:cache:clear',
|
||||
'items:refresh',
|
||||
'deploy:symlink',
|
||||
'deploy:unlock',
|
||||
'cleanup',
|
||||
]);
|
||||
|
||||
// [Optional] If deploy fails automatically unlock.
|
||||
after('deploy:failed', 'deploy:unlock');
|
17
items/phpunit.xml
Normal file
17
items/phpunit.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
|
||||
bootstrap="vendor/autoload.php"
|
||||
colors="true"
|
||||
>
|
||||
<testsuites>
|
||||
<testsuite name="Application Test Suite">
|
||||
<directory suffix="Test.php">./tests</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<php>
|
||||
<env name="APP_ENV" value="testing"/>
|
||||
<env name="CACHE_DRIVER" value="array"/>
|
||||
<env name="QUEUE_CONNECTION" value="sync"/>
|
||||
</php>
|
||||
</phpunit>
|
21
items/public/.htaccess
Normal file
21
items/public/.htaccess
Normal file
@ -0,0 +1,21 @@
|
||||
<IfModule mod_rewrite.c>
|
||||
<IfModule mod_negotiation.c>
|
||||
Options -MultiViews -Indexes
|
||||
</IfModule>
|
||||
|
||||
RewriteEngine On
|
||||
|
||||
# Handle Authorization Header
|
||||
RewriteCond %{HTTP:Authorization} .
|
||||
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
|
||||
|
||||
# Redirect Trailing Slashes If Not A Folder...
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_URI} (.+)/$
|
||||
RewriteRule ^ %1 [L,R=301]
|
||||
|
||||
# Handle Front Controller...
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteRule ^ index.php [L]
|
||||
</IfModule>
|
19
items/public/asset-manifest.json
Normal file
19
items/public/asset-manifest.json
Normal file
@ -0,0 +1,19 @@
|
||||
{
|
||||
"files": {
|
||||
"main.js": "/static/js/main.d930c480.chunk.js",
|
||||
"main.js.map": "/static/js/main.d930c480.chunk.js.map",
|
||||
"runtime-main.js": "/static/js/runtime-main.45092312.js",
|
||||
"runtime-main.js.map": "/static/js/runtime-main.45092312.js.map",
|
||||
"static/js/2.019ef1a9.chunk.js": "/static/js/2.019ef1a9.chunk.js",
|
||||
"static/js/2.019ef1a9.chunk.js.map": "/static/js/2.019ef1a9.chunk.js.map",
|
||||
"static/js/3.ff1076df.chunk.js": "/static/js/3.ff1076df.chunk.js",
|
||||
"static/js/3.ff1076df.chunk.js.map": "/static/js/3.ff1076df.chunk.js.map",
|
||||
"index.html": "/index.html",
|
||||
"static/js/2.019ef1a9.chunk.js.LICENSE.txt": "/static/js/2.019ef1a9.chunk.js.LICENSE.txt"
|
||||
},
|
||||
"entrypoints": [
|
||||
"static/js/runtime-main.45092312.js",
|
||||
"static/js/2.019ef1a9.chunk.js",
|
||||
"static/js/main.d930c480.chunk.js"
|
||||
]
|
||||
}
|
BIN
items/public/favicon.ico
Normal file
BIN
items/public/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
28
items/public/index.php
Normal file
28
items/public/index.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Create The Application
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| First we need to get an application instance. This creates an instance
|
||||
| of the application / container and bootstraps the application so it
|
||||
| is ready to receive HTTP / Console requests from the environment.
|
||||
|
|
||||
*/
|
||||
|
||||
$app = require __DIR__.'/../bootstrap/app.php';
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Run The Application
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Once we have the application, we can handle the incoming request
|
||||
| through the kernel, and send the associated response back to
|
||||
| the client's browser allowing them to enjoy the creative
|
||||
| and wonderful application we have prepared for them.
|
||||
|
|
||||
*/
|
||||
|
||||
$app->run();
|
BIN
items/public/logo192.png
Normal file
BIN
items/public/logo192.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
BIN
items/public/logo512.png
Normal file
BIN
items/public/logo512.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
25
items/public/manifest.json
Normal file
25
items/public/manifest.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"short_name": "React App",
|
||||
"name": "Create React App Sample",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"sizes": "64x64 32x32 24x24 16x16",
|
||||
"type": "image/x-icon"
|
||||
},
|
||||
{
|
||||
"src": "logo192.png",
|
||||
"type": "image/png",
|
||||
"sizes": "192x192"
|
||||
},
|
||||
{
|
||||
"src": "logo512.png",
|
||||
"type": "image/png",
|
||||
"sizes": "512x512"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
}
|
3
items/public/robots.txt
Normal file
3
items/public/robots.txt
Normal file
@ -0,0 +1,3 @@
|
||||
# https://www.robotstxt.org/robotstxt.html
|
||||
User-agent: *
|
||||
Disallow:
|
3
items/public/static/js/2.019ef1a9.chunk.js
Normal file
3
items/public/static/js/2.019ef1a9.chunk.js
Normal file
File diff suppressed because one or more lines are too long
73
items/public/static/js/2.019ef1a9.chunk.js.LICENSE.txt
Normal file
73
items/public/static/js/2.019ef1a9.chunk.js.LICENSE.txt
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
object-assign
|
||||
(c) Sindre Sorhus
|
||||
@license MIT
|
||||
*/
|
||||
|
||||
/**
|
||||
* A better abstraction over CSS.
|
||||
*
|
||||
* @copyright Oleg Isonen (Slobodskoi) / Isonen 2014-present
|
||||
* @website https://github.com/cssinjs/jss
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
/** @license MUI v5.0.1
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/** @license React v0.20.2
|
||||
* scheduler.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/** @license React v16.13.1
|
||||
* react-is.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/** @license React v17.0.2
|
||||
* react-dom.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/** @license React v17.0.2
|
||||
* react-is.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/** @license React v17.0.2
|
||||
* react-jsx-runtime.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/** @license React v17.0.2
|
||||
* react.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
1
items/public/static/js/2.019ef1a9.chunk.js.map
Normal file
1
items/public/static/js/2.019ef1a9.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
items/public/static/js/3.ff1076df.chunk.js
Normal file
2
items/public/static/js/3.ff1076df.chunk.js
Normal file
@ -0,0 +1,2 @@
|
||||
(this["webpackJsonpnew-item-finder-website"]=this["webpackJsonpnew-item-finder-website"]||[]).push([[3],{207:function(e,t,n){"use strict";n.r(t),n.d(t,"getCLS",(function(){return p})),n.d(t,"getFCP",(function(){return S})),n.d(t,"getFID",(function(){return F})),n.d(t,"getLCP",(function(){return k})),n.d(t,"getTTFB",(function(){return C}));var i,a,r,o,u=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v1-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},f=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},s=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},m="function"==typeof WeakSet?new WeakSet:new Set,d=function(e,t,n){var i;return function(){t.value>=0&&(n||m.has(t)||"hidden"===document.visibilityState)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},p=function(e,t){var n,i=u("CLS",0),a=function(e){e.hadRecentInput||(i.value+=e.value,i.entries.push(e),n())},r=c("layout-shift",a);r&&(n=d(e,i,t),f((function(){r.takeRecords().map(a),n()})),s((function(){i=u("CLS",0),n=d(e,i,t)})))},v=-1,l=function(){return"hidden"===document.visibilityState?0:1/0},h=function(){f((function(e){var t=e.timeStamp;v=t}),!0)},g=function(){return v<0&&(v=l(),h(),s((function(){setTimeout((function(){v=l(),h()}),0)}))),{get timeStamp(){return v}}},S=function(e,t){var n,i=g(),a=u("FCP"),r=function(e){"first-contentful-paint"===e.name&&(f&&f.disconnect(),e.startTime<i.timeStamp&&(a.value=e.startTime,a.entries.push(e),m.add(a),n()))},o=performance.getEntriesByName("first-contentful-paint")[0],f=o?null:c("paint",r);(o||f)&&(n=d(e,a,t),o&&r(o),s((function(i){a=u("FCP"),n=d(e,a,t),requestAnimationFrame((function(){requestAnimationFrame((function(){a.value=performance.now()-i.timeStamp,m.add(a),n()}))}))})))},y={passive:!0,capture:!0},w=new Date,E=function(e,t){i||(i=t,a=e,r=new Date,b(removeEventListener),L())},L=function(){if(a>=0&&a<r-w){var e={entryType:"first-input",name:i.type,target:i.target,cancelable:i.cancelable,startTime:i.timeStamp,processingStart:i.timeStamp+a};o.forEach((function(t){t(e)})),o=[]}},T=function(e){if(e.cancelable){var t=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){E(e,t),a()},i=function(){a()},a=function(){removeEventListener("pointerup",n,y),removeEventListener("pointercancel",i,y)};addEventListener("pointerup",n,y),addEventListener("pointercancel",i,y)}(t,e):E(t,e)}},b=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,T,y)}))},F=function(e,t){var n,r=g(),p=u("FID"),v=function(e){e.startTime<r.timeStamp&&(p.value=e.processingStart-e.startTime,p.entries.push(e),m.add(p),n())},l=c("first-input",v);n=d(e,p,t),l&&f((function(){l.takeRecords().map(v),l.disconnect()}),!0),l&&s((function(){var r;p=u("FID"),n=d(e,p,t),o=[],a=-1,i=null,b(addEventListener),r=v,o.push(r),L()}))},k=function(e,t){var n,i=g(),a=u("LCP"),r=function(e){var t=e.startTime;t<i.timeStamp&&(a.value=t,a.entries.push(e)),n()},o=c("largest-contentful-paint",r);if(o){n=d(e,a,t);var p=function(){m.has(a)||(o.takeRecords().map(r),o.disconnect(),m.add(a),n())};["keydown","click"].forEach((function(e){addEventListener(e,p,{once:!0,capture:!0})})),f(p,!0),s((function(i){a=u("LCP"),n=d(e,a,t),requestAnimationFrame((function(){requestAnimationFrame((function(){a.value=performance.now()-i.timeStamp,m.add(a),n()}))}))}))}},C=function(e){var t,n=u("TTFB");t=function(){try{var t=performance.getEntriesByType("navigation")[0]||function(){var e=performance.timing,t={entryType:"navigation",startTime:0};for(var n in e)"navigationStart"!==n&&"toJSON"!==n&&(t[n]=Math.max(e[n]-e.navigationStart,0));return t}();if(n.value=n.delta=t.responseStart,n.value<0)return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("pageshow",t)}}}]);
|
||||
//# sourceMappingURL=3.ff1076df.chunk.js.map
|
1
items/public/static/js/3.ff1076df.chunk.js.map
Normal file
1
items/public/static/js/3.ff1076df.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
items/public/static/js/main.d930c480.chunk.js
Normal file
2
items/public/static/js/main.d930c480.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
items/public/static/js/main.d930c480.chunk.js.map
Normal file
1
items/public/static/js/main.d930c480.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
items/public/static/js/runtime-main.45092312.js
Normal file
2
items/public/static/js/runtime-main.45092312.js
Normal file
@ -0,0 +1,2 @@
|
||||
!function(e){function t(t){for(var n,u,a=t[0],c=t[1],f=t[2],s=0,p=[];s<a.length;s++)u=a[s],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&p.push(o[u][0]),o[u]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(l&&l(t);p.length;)p.shift()();return i.push.apply(i,f||[]),r()}function r(){for(var e,t=0;t<i.length;t++){for(var r=i[t],n=!0,a=1;a<r.length;a++){var c=r[a];0!==o[c]&&(n=!1)}n&&(i.splice(t--,1),e=u(u.s=r[0]))}return e}var n={},o={1:0},i=[];function u(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,u),r.l=!0,r.exports}u.e=function(e){var t=[],r=o[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=n);var i,a=document.createElement("script");a.charset="utf-8",a.timeout=120,u.nc&&a.setAttribute("nonce",u.nc),a.src=function(e){return u.p+"static/js/"+({}[e]||e)+"."+{3:"ff1076df"}[e]+".chunk.js"}(e);var c=new Error;i=function(t){a.onerror=a.onload=null,clearTimeout(f);var r=o[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),i=t&&t.target&&t.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+i+")",c.name="ChunkLoadError",c.type=n,c.request=i,r[1](c)}o[e]=void 0}};var f=setTimeout((function(){i({type:"timeout",target:a})}),12e4);a.onerror=a.onload=i,document.head.appendChild(a)}return Promise.all(t)},u.m=e,u.c=n,u.d=function(e,t,r){u.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},u.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,t){if(1&t&&(e=u(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(u.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)u.d(r,n,function(t){return e[t]}.bind(null,n));return r},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,"a",t),t},u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},u.p="/",u.oe=function(e){throw console.error(e),e};var a=this["webpackJsonpnew-item-finder-website"]=this["webpackJsonpnew-item-finder-website"]||[],c=a.push.bind(a);a.push=t,a=a.slice();for(var f=0;f<a.length;f++)t(a[f]);var l=c;r()}([]);
|
||||
//# sourceMappingURL=runtime-main.45092312.js.map
|
1
items/public/static/js/runtime-main.45092312.js.map
Normal file
1
items/public/static/js/runtime-main.45092312.js.map
Normal file
File diff suppressed because one or more lines are too long
0
items/resources/views/.gitkeep
Normal file
0
items/resources/views/.gitkeep
Normal file
23
items/resources/views/app.blade.php
Normal file
23
items/resources/views/app.blade.php
Normal file
@ -0,0 +1,23 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon"
|
||||
href="data:image/png;base64,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" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||
<meta name="theme-color" content="#000000" />
|
||||
<meta name="description" content="item finder" />
|
||||
<link rel="apple-touch-icon" href="/logo192.png" />
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
<title>Item Finder</title>
|
||||
</head>
|
||||
|
||||
<body><noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
<script>!function (e) { function t(t) { for (var n, u, a = t[0], c = t[1], f = t[2], s = 0, p = []; s < a.length; s++)u = a[s], Object.prototype.hasOwnProperty.call(o, u) && o[u] && p.push(o[u][0]), o[u] = 0; for (n in c) Object.prototype.hasOwnProperty.call(c, n) && (e[n] = c[n]); for (l && l(t); p.length;)p.shift()(); return i.push.apply(i, f || []), r() } function r() { for (var e, t = 0; t < i.length; t++) { for (var r = i[t], n = !0, a = 1; a < r.length; a++) { var c = r[a]; 0 !== o[c] && (n = !1) } n && (i.splice(t--, 1), e = u(u.s = r[0])) } return e } var n = {}, o = { 1: 0 }, i = []; function u(t) { if (n[t]) return n[t].exports; var r = n[t] = { i: t, l: !1, exports: {} }; return e[t].call(r.exports, r, r.exports, u), r.l = !0, r.exports } u.e = function (e) { var t = [], r = o[e]; if (0 !== r) if (r) t.push(r[2]); else { var n = new Promise((function (t, n) { r = o[e] = [t, n] })); t.push(r[2] = n); var i, a = document.createElement("script"); a.charset = "utf-8", a.timeout = 120, u.nc && a.setAttribute("nonce", u.nc), a.src = function (e) { return u.p + "static/js/" + ({}[e] || e) + "." + { 3: "ff1076df" }[e] + ".chunk.js" }(e); var c = new Error; i = function (t) { a.onerror = a.onload = null, clearTimeout(f); var r = o[e]; if (0 !== r) { if (r) { var n = t && ("load" === t.type ? "missing" : t.type), i = t && t.target && t.target.src; c.message = "Loading chunk " + e + " failed.\n(" + n + ": " + i + ")", c.name = "ChunkLoadError", c.type = n, c.request = i, r[1](c) } o[e] = void 0 } }; var f = setTimeout((function () { i({ type: "timeout", target: a }) }), 12e4); a.onerror = a.onload = i, document.head.appendChild(a) } return Promise.all(t) }, u.m = e, u.c = n, u.d = function (e, t, r) { u.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: r }) }, u.r = function (e) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 }) }, u.t = function (e, t) { if (1 & t && (e = u(e)), 8 & t) return e; if (4 & t && "object" == typeof e && e && e.__esModule) return e; var r = Object.create(null); if (u.r(r), Object.defineProperty(r, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e) for (var n in e) u.d(r, n, function (t) { return e[t] }.bind(null, n)); return r }, u.n = function (e) { var t = e && e.__esModule ? function () { return e.default } : function () { return e }; return u.d(t, "a", t), t }, u.o = function (e, t) { return Object.prototype.hasOwnProperty.call(e, t) }, u.p = "/", u.oe = function (e) { throw console.error(e), e }; var a = this["webpackJsonpnew-item-finder-website"] = this["webpackJsonpnew-item-finder-website"] || [], c = a.push.bind(a); a.push = t, a = a.slice(); for (var f = 0; f < a.length; f++)t(a[f]); var l = c; r() }([])</script>
|
||||
<script src="/static/js/main.d930c480.chunk.js"></script>
|
||||
<script src="/static/js/2.019ef1a9.chunk.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
27
items/routes/web.php
Normal file
27
items/routes/web.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
/** @var \Laravel\Lumen\Routing\Router $router */
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Routes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here is where you can register all of the routes for an application.
|
||||
| It is a breeze. Simply tell Lumen the URIs it should respond to
|
||||
| and give it the Closure to call when that URI is requested.
|
||||
|
|
||||
*/
|
||||
|
||||
$router->get('/', function () {
|
||||
return view('app');
|
||||
});
|
||||
|
||||
$router->group(['prefix' => 'api'], function () use ($router) {
|
||||
$router->get('locales', 'ItemController@getLocales');
|
||||
$router->get('refresh', 'ItemController@refreshAllCache');
|
||||
$router->post('search', 'ItemController@search');
|
||||
$router->get('item/hierarchy', 'ItemController@getHierarchy');
|
||||
$router->get('item', 'ItemController@getItem');
|
||||
});
|
||||
|
2
items/storage/app/.gitignore
vendored
Normal file
2
items/storage/app/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
3
items/storage/framework/cache/.gitignore
vendored
Normal file
3
items/storage/framework/cache/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
*
|
||||
!data/
|
||||
!.gitignore
|
2
items/storage/framework/cache/data/.gitignore
vendored
Normal file
2
items/storage/framework/cache/data/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
2
items/storage/framework/views/.gitignore
vendored
Normal file
2
items/storage/framework/views/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
2
items/storage/logs/.gitignore
vendored
Normal file
2
items/storage/logs/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
21
items/tests/ExampleTest.php
Normal file
21
items/tests/ExampleTest.php
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
use Laravel\Lumen\Testing\DatabaseMigrations;
|
||||
use Laravel\Lumen\Testing\DatabaseTransactions;
|
||||
|
||||
class ExampleTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* A basic test example.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testExample()
|
||||
{
|
||||
$this->get('/');
|
||||
|
||||
$this->assertEquals(
|
||||
$this->app->version(), $this->response->getContent()
|
||||
);
|
||||
}
|
||||
}
|
16
items/tests/TestCase.php
Normal file
16
items/tests/TestCase.php
Normal file
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
use Laravel\Lumen\Testing\TestCase as BaseTestCase;
|
||||
|
||||
abstract class TestCase extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* Creates the application.
|
||||
*
|
||||
* @return \Laravel\Lumen\Application
|
||||
*/
|
||||
public function createApplication()
|
||||
{
|
||||
return require __DIR__.'/../bootstrap/app.php';
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user