diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8f0de65 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ea0665b --- /dev/null +++ b/.env.example @@ -0,0 +1,59 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=laravel +DB_USERNAME=root +DB_PASSWORD= + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +FILESYSTEM_DISK=local +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailpit +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_HOST= +PUSHER_PORT=443 +PUSHER_SCHEME=https +PUSHER_APP_CLUSTER=mt1 + +VITE_APP_NAME="${APP_NAME}" +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_HOST="${PUSHER_HOST}" +VITE_PUSHER_PORT="${PUSHER_PORT}" +VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml new file mode 100644 index 0000000..9634a0e --- /dev/null +++ b/.github/workflows/issues.yml @@ -0,0 +1,12 @@ +name: issues + +on: + issues: + types: [labeled] + +permissions: + issues: write + +jobs: + help-wanted: + uses: laravel/.github/.github/workflows/issues.yml@main diff --git a/.github/workflows/pull-requests.yml b/.github/workflows/pull-requests.yml new file mode 100644 index 0000000..18b32b3 --- /dev/null +++ b/.github/workflows/pull-requests.yml @@ -0,0 +1,12 @@ +name: pull requests + +on: + pull_request_target: + types: [opened] + +permissions: + pull-requests: write + +jobs: + uneditable: + uses: laravel/.github/.github/workflows/pull-requests.yml@main diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..8e6e9cd --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,47 @@ +name: Tests + +on: + push: + branches: + - master + - '*.x' + pull_request: + schedule: + - cron: '0 0 * * *' + +permissions: + contents: read + +jobs: + tests: + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + php: [8.1, 8.2] + + name: PHP ${{ matrix.php }} + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite + coverage: none + + - name: Install Composer dependencies + run: composer install --prefer-dist --no-interaction --no-progress + + - name: Copy environment file + run: cp .env.example .env + + - name: Generate app key + run: php artisan key:generate + + - name: Execute tests + run: vendor/bin/phpunit diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml new file mode 100644 index 0000000..ebda620 --- /dev/null +++ b/.github/workflows/update-changelog.yml @@ -0,0 +1,13 @@ +name: update changelog + +on: + release: + types: [released] + +permissions: {} + +jobs: + update: + permissions: + contents: write + uses: laravel/.github/.github/workflows/update-changelog.yml@main diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7fe978f --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +/.phpunit.cache +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/vendor +.env +.env.backup +.env.production +.phpunit.result.cache +Homestead.json +Homestead.yaml +auth.json +npm-debug.log +yarn-error.log +/.fleet +/.idea +/.vscode diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..9ebcf8d --- /dev/null +++ b/.htaccess @@ -0,0 +1,5 @@ + + + RewriteEngine On + RewriteRule ^(.*)$ public/$1 [L] + \ No newline at end of file diff --git a/.styleci.yml b/.styleci.yml new file mode 100644 index 0000000..9daadf1 --- /dev/null +++ b/.styleci.yml @@ -0,0 +1,9 @@ +php: + preset: laravel + disabled: + - no_unused_imports + finder: + not-name: + - index.php +js: true +css: true diff --git a/123123123.zip b/123123123.zip new file mode 100644 index 0000000..49566b5 Binary files /dev/null and b/123123123.zip differ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d9eba7c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,74 @@ +# Release Notes + +## [Unreleased](https://github.com/laravel/laravel/compare/v10.2.5...10.x) + +## [v10.2.5](https://github.com/laravel/laravel/compare/v10.2.4...v10.2.5) - 2023-06-30 + +- Allow accessing APP_NAME in Vite scope by [@domnantas](https://github.com/domnantas) in https://github.com/laravel/laravel/pull/6204 +- Omit default values for suffix in phpunit.xml by [@spawnia](https://github.com/spawnia) in https://github.com/laravel/laravel/pull/6210 + +## [v10.2.4](https://github.com/laravel/laravel/compare/v10.2.3...v10.2.4) - 2023-06-07 + +- Add `precognitive` key to $middlewareAliases by @emargareten in https://github.com/laravel/laravel/pull/6193 + +## [v10.2.3](https://github.com/laravel/laravel/compare/v10.2.2...v10.2.3) - 2023-06-01 + +- Update description by @taylorotwell in https://github.com/laravel/laravel/commit/85203d687ebba72b2805b89bba7d18dfae8f95c8 + +## [v10.2.2](https://github.com/laravel/laravel/compare/v10.2.1...v10.2.2) - 2023-05-23 + +- Add lock path by @taylorotwell in https://github.com/laravel/laravel/commit/a6bfbc7f90e33fd6cae3cb23f106c9689858c3b5 + +## [v10.2.1](https://github.com/laravel/laravel/compare/v10.2.0...v10.2.1) - 2023-05-12 + +- Add hashed cast to user password by @emargareten in https://github.com/laravel/laravel/pull/6171 +- Bring back pusher cluster config option by @jesseleite in https://github.com/laravel/laravel/pull/6174 + +## [v10.2.0](https://github.com/laravel/laravel/compare/v10.1.1...v10.2.0) - 2023-05-05 + +- Update welcome.blade.php by @aymanatmeh in https://github.com/laravel/laravel/pull/6163 +- Sets package.json type to module by @timacdonald in https://github.com/laravel/laravel/pull/6090 +- Add url support for mail config by @chu121su12 in https://github.com/laravel/laravel/pull/6170 + +## [v10.1.1](https://github.com/laravel/laravel/compare/v10.0.7...v10.1.1) - 2023-04-18 + +- Fix laravel/framework constraints for Default Service Providers by @Jubeki in https://github.com/laravel/laravel/pull/6160 + +## [v10.0.7](https://github.com/laravel/laravel/compare/v10.1.0...v10.0.7) - 2023-04-14 + +- Adds `phpunit/phpunit@10.1` support by @nunomaduro in https://github.com/laravel/laravel/pull/6155 + +## [v10.1.0](https://github.com/laravel/laravel/compare/v10.0.6...v10.1.0) - 2023-04-15 + +- Minor skeleton slimming by @taylorotwell in https://github.com/laravel/laravel/pull/6159 + +## [v10.0.6](https://github.com/laravel/laravel/compare/v10.0.5...v10.0.6) - 2023-04-05 + +- Add job batching options to Queue configuration file by @AnOlsen in https://github.com/laravel/laravel/pull/6149 + +## [v10.0.5](https://github.com/laravel/laravel/compare/v10.0.4...v10.0.5) - 2023-03-08 + +- Add replace_placeholders to log channels by @alanpoulain in https://github.com/laravel/laravel/pull/6139 + +## [v10.0.4](https://github.com/laravel/laravel/compare/v10.0.3...v10.0.4) - 2023-02-27 + +- Fix typo by @izzudin96 in https://github.com/laravel/laravel/pull/6128 +- Specify facility in the syslog driver config by @nicolus in https://github.com/laravel/laravel/pull/6130 + +## [v10.0.3](https://github.com/laravel/laravel/compare/v10.0.2...v10.0.3) - 2023-02-21 + +- Remove redundant `@return` docblock in UserFactory by @datlechin in https://github.com/laravel/laravel/pull/6119 +- Reverts change in asset helper by @timacdonald in https://github.com/laravel/laravel/pull/6122 + +## [v10.0.2](https://github.com/laravel/laravel/compare/v10.0.1...v10.0.2) - 2023-02-16 + +- Remove unneeded call by @taylorotwell in https://github.com/laravel/laravel/commit/3986d4c54041fd27af36f96cf11bd79ce7b1ee4e + +## [v10.0.1](https://github.com/laravel/laravel/compare/v10.0.0...v10.0.1) - 2023-02-15 + +- Add PHPUnit result cache to gitignore by @itxshakil in https://github.com/laravel/laravel/pull/6105 +- Allow php-http/discovery as a composer plugin by @nicolas-grekas in https://github.com/laravel/laravel/pull/6106 + +## [v10.0.0 (2022-02-14)](https://github.com/laravel/laravel/compare/v9.5.2...v10.0.0) + +Laravel 10 includes a variety of changes to the application skeleton. Please consult the diff to see what's new. diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000..e6b9960 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,27 @@ +command('inspire')->hourly(); + } + + /** + * Register the commands for the application. + */ + protected function commands(): void + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php new file mode 100644 index 0000000..56af264 --- /dev/null +++ b/app/Exceptions/Handler.php @@ -0,0 +1,30 @@ + + */ + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + */ + public function register(): void + { + $this->reportable(function (Throwable $e) { + // + }); + } +} diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php new file mode 100644 index 0000000..1afb06b --- /dev/null +++ b/app/Http/Controllers/AdminController.php @@ -0,0 +1,202 @@ +all(), [ + 'name' => 'required', + 'description' => 'required', + 'count' => 'required', + 'id_image' => 'required', + // 'id_sport_courses' => 'required', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } + else{ + SportTasks::create([ + 'name' => $request->name, + 'description' => $request->description, + 'count' => $request->count, + 'id_image' => $request->id_image, + //'id_sport_courses' => $request->id_sport_courses, + ]); + return response(['Новое упражнение было добавлено'], 200); + } + } + + //Добавление курса(название) + public function AddSportCourses(Request $request) + { + $error = Validator::make($request->all(), [ + 'name' => 'required', + 'description' => 'required', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } + else{ + SportCourses::create([ + 'name' => $request->name, + 'description' => $request->description, + 'visibility' => 1, + ]); + return response(['Новое курс(название) был добавлен'], 200); + } + } + //Отключение курса(название) + public function VisivilitySportCourses(Request $request) + { + $error = Validator::make($request->all(), [ + 'id' => 'required', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } + else{ + $SportCourses = SportCourses::where('id', $request->id)->first(); + if ($SportCourses != null) { + if($SportCourses->visibility == 0){ + $SC = $SportCourses; + $SC->visibility = 1; + $SC->update(); + return response(['Включение курса'], 200); + } + else if($SportCourses->visibility == 1){ + $SC = $SportCourses; + $SC->visibility = 0; + $SC->update(); + return response(['Отключение курса'], 200); + } + else{ + return response(['Ошибка, неизвестные данные в поле'], 400); + } + } + else{ + return response(['Такого курса нету'], 400); + } + } + } + + //Добавление фотографии + function AddImage(Request $request) + { + $valid = Validator::make($request->all(),[ + 'name'=>'required', + 'url_image' => 'image|mimes:jpg,png,jpeg,gif,svg', + 'count'=>'required', + //'url_image' => 'required|image|mimes:jpg,png,jpeg,gif,svg', + ]); + if ($valid->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $valid->errors()]], 400); + } + else{ + if($request->image != null){ + Image::create([ + 'name'=>$request->name, + 'url_image' => '/storage/app/' . Storage::putFile('images', $request->file('url_image')), + 'count'=>$request->count, + ]); + } + else{ + Image::create([ + 'name'=>$request->name, + 'count'=>$request->count, + ]); + } + + + return response(['Фотография добавлена'], 200); + } + } + + //Создание аккаунта врачу + public function CreateAccountDoctor(Request $request) + { + $error = Validator::make($request->all(), [ + 'login' => 'required', + 'password' => 'required', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } + else{ + Doctor::create([ + 'login' => $request->login, + 'password' => Hash::make($request->password), + 'api_token' => Str::random(80) + ]); + return response(['Аккаунт врача был создан'], 200); + } + } + + //Создание набора курсов + public function CreateSetsOfSportsActivities(Request $request){ + $error = Validator::make($request->all(), [ + 'name' => 'required|unique:sets_of_sports_activities', + 'day' => 'required', + 'description' => 'required', + 'id_sport_courses' => 'required', + ]); + + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } + else{ + SetsOfSportsActivities::create([ + 'name' => $request->name, + 'day' => $request->day, + 'description' => $request->description, + 'id_sport_courses' => $request->id_sport_courses, + ]); + return response(['Новый набор добавлен'], 200); + } + } + + //Создание связи набора курса и упражнения + public function CreateSetsOfSportsExercises(Request $request){ + $error = Validator::make($request->all(), [ + 'number' => 'required', + 'id_sports_tasks' => 'required', + 'id_sets_of_sports_activities' => 'required', + ]); + + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } + else{ + SetOfSportsExercises::create([ + 'number' => $request->number, + 'id_sports_tasks' => $request->id_sports_tasks, + 'id_sets_of_sports_activities' => $request->id_sets_of_sports_activities, + ]); + return response(['Создание связи между набором для курса и упражнения'], 200); + } + } + + + + +} diff --git a/app/Http/Controllers/Api/Auth/LoginController.php b/app/Http/Controllers/Api/Auth/LoginController.php new file mode 100644 index 0000000..ba1d586 --- /dev/null +++ b/app/Http/Controllers/Api/Auth/LoginController.php @@ -0,0 +1,47 @@ +only('email', 'password'); + + if (!Auth::attempt($credentials)) { + return response()->json([ + 'message' => 'You cannot sign with those credentials', + 'errors' => 'Unauthorised' + ], 401); + } + + //Генерация токена + $token = Auth::user()->createToken(config('app.name')); + + //Если отмечено в чек box что "сохрани меня", то токен хранится месяц, иначе 1 день + $token->token->expires_at = $request->remember_me ? + Carbon::now()->addMonth() : + Carbon::now()->addDay(); + + $token->token->save(); + + return response()->json([ + 'token_type' => 'Bearer', + 'token' => $token->accessToken, + 'expires_at' => Carbon::parse($token->token->expires_at)->toDateTimeString() + ], 200); + } +} diff --git a/app/Http/Controllers/Api/Auth/LogoutController.php b/app/Http/Controllers/Api/Auth/LogoutController.php new file mode 100644 index 0000000..bdd2b36 --- /dev/null +++ b/app/Http/Controllers/Api/Auth/LogoutController.php @@ -0,0 +1,19 @@ +user()->token()->revoke(); + + return response()->json([ + 'message' => 'You are successfully logged out', + ]); + } +} diff --git a/app/Http/Controllers/Api/Auth/RegisterController.php b/app/Http/Controllers/Api/Auth/RegisterController.php new file mode 100644 index 0000000..484f898 --- /dev/null +++ b/app/Http/Controllers/Api/Auth/RegisterController.php @@ -0,0 +1,25 @@ +only('login', 'email'), + ['password' => bcrypt($request->password)], + )); + + return response()->json([ + 'message' => 'You were successfully registered. Use your email and password to sign in.' + ], 200); + } +} diff --git a/app/Http/Controllers/BlockPauseController.php b/app/Http/Controllers/BlockPauseController.php new file mode 100644 index 0000000..f37f99c --- /dev/null +++ b/app/Http/Controllers/BlockPauseController.php @@ -0,0 +1,16 @@ +makeHidden(['id']); + $error = Validator::make($request->all(), [ + 'login' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:20|min:4|unique:patient', + 'password' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:100|min:10', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + Patient::create([ + 'login' => $request->login, + 'password' => Hash::make($request->password), + 'token' => Str::random(80), + 'id_doctor' => $Doctor->id, + + ]); + return response(['message' => 'Новый пациент был создан'], 200); + } + } + + //Обновление данных пациента + public function UpdateAccountPatient(Request $request) + { + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + 'login' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:20|min:4|unique:patient', + 'password' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:100|min:10', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id)->first(); + if ($Patient != null) { + $pat = $Patient; + $pat->login = $request->login; + $pat->password = Crypt::encryptString($request->password); + $pat->update(); + } + + return response(['Данные обновлены' => $request->password], 200); + } + } + +// //Обновление данных пациента +// public function AddCoursesAccountPatient(Request $request) +// { +// $error = Validator::make($request->all(), [ +// 'id' => 'required', +// 'login' => 'required', +// 'password' => 'required', +// ]);//1024 +// if ($error->fails()) { +// return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); +// } +// else{ +// $Patient = Patient::where('id', $request->id)->first(); +// if ($Patient != null) { +// $pat = $Patient; +// $pat->login = $request->login; +// $pat->password = Crypt::encryptString($request->password); +// $pat->update(); +// } +// +// return response(['Данные обновлены' => $request->password], 200); +// } +// } + + //Редактирвоание курса + public function GetCoursesSport(Request $request) + { + $Doctor = Auth::user()->makeHidden(['id']); + $error = Validator::make($request->all(), [ + 'id_patient' => 'required|numeric|max:10000|min:1', + 'id_sports_courses_patient' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id_patient)->first(); + if ($Patient != null) { + if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { + + $SetOfSportsExercises = SetOfSportsExercises::orderBy('id', 'ASC') + ->leftJoin('sets_of_sports_activities', 'sets_of_sports_activities.id', '=', 'set_of_sports_exercises.id_sets_of_sports_activities') + ->leftJoin('sports_tasks', 'sports_tasks.id', '=', 'set_of_sports_exercises.id_sports_tasks') + ->leftJoin('sports_courses', 'sports_courses.id', '=', 'sets_of_sports_activities.id_sports_courses') + ->leftJoin('sport_patient', 'sport_patient.id_sports_courses', '=', 'sports_courses.id') + ->leftJoin('image', 'image.id', '=', 'sports_tasks.id_image') + ->select('sports_tasks.id', 'sports_tasks.name', 'sports_tasks.description', 'image.url_image')->where("sport_patient.id", $Patient->id_sport_patient) + ->distinct() + ->where("sports_courses.id", $request->id_sports_courses_patient)->get();//, 'patient.email', 'doctor.login as loginDoctor', 'doctor.email as emailDoctor', 'patient.pause', 'patient.block', 'patient.report7day', 'patient.report15day', 'sport_patient.id_patient', 'patient.total_days_sports', 'patient.now_days_sports', 'patient.created_at', 'patient.updated_at' + return response(["set_of_sports_exercises" => $SetOfSportsExercises], 200); + } else { + return response(['message' => 'Ошибка, курса у пациента нету'], 400); + } + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + } + } + + //Редактирвоание курса + //в БУДУШЕМ НУЖНО ИЗМЕНИТЬ И УБИРАТЬ ЗАБЛОКИРОВАННЫЕ НЕ ЧЕРЕЗ ПЕРЕБОРКУ ЦИКЛА А ПРОСТО ЧЕРЕЗ ЗАПРОС В БАЗУ, ПРОСТО НУЖНО ПОСИДЕТЬ И ПОНЯТЬ ЧТО Я НЕПРАВИЛЬНО ЗАБИВАЛ В БАЗУ + public function GetCoursesSportYes(Request $request) + { + $Doctor = Auth::user()->makeHidden(['id']); + $error = Validator::make($request->all(), [ + 'id_patient' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id_patient)->first(); + if ($Patient != null) { + if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { + $SetOfSportsExercises2 = CoursesSportEdit::get(); + + + $CoursesSportEdit = CoursesSportEdit::orderBy('id', 'ASC')->where('id_sport_patient', $Patient->id_sport_patient)->get(); + + $result = []; + + $number = 0; + + if (Count($CoursesSportEdit) != 0) { + $CoursesSportEdit = CoursesSportEdit::orderBy('id', 'ASC')->where('id_sport_patient', $Patient->id_sport_patient)->get(); + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + ->join('sets_of_sports_activities', 'set_of_sports_exercises.id_sets_of_sports_activities', '=', 'sets_of_sports_activities.id') + ->join('sports_tasks', 'set_of_sports_exercises.id_sports_tasks', '=', 'sports_tasks.id') + ->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->join('sports_courses', 'sets_of_sports_activities.id_sports_courses', '=', 'sports_courses.id') + ->join('sport_patient', 'sport_patient.id_sports_courses', '=', 'sports_courses.id') + ->join('image', 'sports_tasks.article_image', '=', 'image.article') + ->select('sports_tasks.id', 'sports_tasks.name', 'sports_tasks.description', 'image.url_image') + ->distinct('id') + ->where('sport_patient.id', $Patient->id_sport_patient) + ->get(); + for ($i = 0; $i != Count($SetOfSportsExercises); $i++) { + $res = 0; + for ($j = 0; $j != Count($CoursesSportEdit); $j++) { + if ($SetOfSportsExercises[$i]->id != $CoursesSportEdit[$j]->id_sports_tasks) { + $res++; + } + } + if ($res == Count($CoursesSportEdit)) { + $number++; + $search_sport = [ + 'number' => $number, + 'id' => $SetOfSportsExercises[$i]->id, + 'name' => $SetOfSportsExercises[$i]->name, + 'description' => $SetOfSportsExercises[$i]->description, + 'url_image' => $SetOfSportsExercises[$i]->url_image, + ]; + array_push($result, $search_sport); + } + } + } else { + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + ->join('sets_of_sports_activities', 'set_of_sports_exercises.id_sets_of_sports_activities', '=', 'sets_of_sports_activities.id') + ->join('sports_tasks', 'set_of_sports_exercises.id_sports_tasks', '=', 'sports_tasks.id') + ->join('sports_courses', 'sets_of_sports_activities.id_sports_courses', '=', 'sports_courses.id') + ->join('sport_patient', 'sport_patient.id_sports_courses', '=', 'sports_courses.id') + ->join('image', 'sports_tasks.article_image', '=', 'image.article') + ->select('sports_tasks.id', 'sports_tasks.name', 'sports_tasks.description', 'image.url_image') + ->distinct('id') + ->where('sport_patient.id', $Patient->id_sport_patient) + ->get(); + for ($i = 0; $i != Count($SetOfSportsExercises); $i++) { + $number++; + $search_sport = [ + 'number' => $number, + 'id' => $SetOfSportsExercises[$i]->id, + 'name' => $SetOfSportsExercises[$i]->name, + 'description' => $SetOfSportsExercises[$i]->description, + 'url_image' => $SetOfSportsExercises[$i]->url_image, + ]; + array_push($result, $search_sport); + } + } + + + return response(["set_of_sports_exercises_yes" => $result], 200); + } else { + return response(['message' => 'Ошибка, курса у пациента нету'], 400); + } + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + } + } + + public function GetCoursesSportNo(Request $request) + { + $Doctor = Auth::user()->makeHidden(['id']); + $error = Validator::make($request->all(), [ + 'id_patient' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id_patient)->first(); + if ($Patient != null) { + if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { + + $CoursesSportEdit = CoursesSportEdit::orderBy('id', 'ASC')->distinct() + ->join('sports_tasks', 'courses_sport_edit.id_sports_tasks', '=', 'sports_tasks.id') + ->join('image', 'sports_tasks.article_image', '=', 'image.article') + ->select('sports_tasks.id as sports_tasks_id', 'courses_sport_edit.id', 'sports_tasks.name', 'sports_tasks.description', 'image.url_image') + ->distinct('id') + ->where('courses_sport_edit.id_sport_patient', $Patient->id_sport_patient) + ->get(); + $result = []; + $number = 0; + for ($i = 0; $i != Count($CoursesSportEdit); $i++) { + $number++; + $search_sport = [ + 'number' => $number, + 'id' => $CoursesSportEdit[$i]->id, + 'name' => $CoursesSportEdit[$i]->name, + 'description' => $CoursesSportEdit[$i]->description, + 'url_image' => $CoursesSportEdit[$i]->url_image, + ]; + array_push($result, $search_sport); + } + + return response(["set_of_sports_exercises_no" => $result], 200); + } else { + return response(['message' => 'Ошибка, курса у пациента нету'], 400); + } + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + } + } + + public function UpdateBlockSportTasksYes(Request $request) + { + $error = Validator::make($request->all(), [ + 'id_patient' => 'required|numeric|max:10000|min:1', + 'id_sports_tasks' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id_patient)->first(); + if ($Patient != null) { + $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->first(); + $SportTasks = SportTasks::where('id', $request->id_sports_tasks)->first(); + if ($SportTasks != null && $SportPatient != null) { + CoursesSportEdit::create([ + 'id_sport_patient' => $SportPatient->id, + 'id_sports_tasks' => $SportTasks->id, + ]); + return response(['message' => 'Тренировка добавлена в блок'], 200); + + } else { + return response(['message' => 'Таких данных нету'], 400); + } + } else { + return response(['message' => 'Такого пациента нету'], 400); + + } + } + } + + public function UpdateBlockSportTasksNo(Request $request) + { + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $CoursesSportEdit = CoursesSportEdit::where('id', $request->id)->first(); + if ($CoursesSportEdit != null) { + $CoursesSportEdit->delete(); + return response(['message' => 'Тренировка убрана из блока'], 200); + } else { + return response(['message' => 'Таких данных нету'], 400); + } + + } + } + +//Блокировка + public function UpdateBlockAccountPatient(Request $request) + { + + + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id)->first(); + if ($Patient != null) { + $CalendarDays = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->orderBy('day', 'DESC')->first(); + + if ($Patient->block == null || $Patient->block == "") { + //Если есть календарный список + if ($CalendarDays != null) { + for ($i = 0; $i < 4; $i++) { + CalendarDays::create([ + 'id_patient' => $Patient->id, + 'day' => $CalendarDays->day + $i, + 'date' => date('Y-m-d', strtotime("+$i day", strtotime($CalendarDays->date))), + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + + $pat = $Patient; + $date = date('Y-m-d', strtotime('+3 day')); + $pat->block = $date; + $pat->update(); + + //Установка блока в календаре + for ($i = 0; $i < 4; $i++) { + $dateCD = date('Y-m-d', strtotime("+$i day")); + $CD = CalendarDays::where('date', $dateCD)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD->block = $dateCD; + $CD->update(); + } + + } //Если нету календарного списка + else if ($CalendarDays == null) { + $pat = $Patient; + $date = date('Y-m-d', strtotime('+3 day')); + $pat->block = $date; + $pat->update(); + + //Установка блока в календаре + for ($i = 0; $i < 4; $i++) { + $dateCD = date('Y-m-d', strtotime("+$i day")); + $CD = CalendarDays::where('date', $dateCD)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD->block = $dateCD; + $CD->update(); + } + } else { + return response(['message' => 'Ошибка, обратитесь в поддержку. Код - 1.1'], 400); + } + return response(['message' => 'Блокировка включена'], 200); + } else if ($Patient->block != null && $Patient->block != "") { + if ($CalendarDays != null) { + $pat = $Patient; + $pat->block = null; + $pat->update(); + //Проверка количества дней в календаре и их изменение + $this->AddandClearDayPatient($Patient->id); + + } //Если нету календарного списка + else if ($CalendarDays == null) { + $pat = $Patient; + $pat->block = null; + $pat->update(); + } else { + return response(['message' => 'Ошибка, обратитесь в поддержку. Код - 1.2'], 400); + } + //Сброс блока в календаре + $dateCD = date('Y-m-d'); + $CD1 = CalendarDays::where('date', $dateCD)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD2 = CalendarDays::where('day', '>=', $CD1->day)->where('id_sport_patient', $Patient->id_sport_patient)->get(); + for ($i = 0; $i < count($CD2); $i++) { + $CDUpdate = CalendarDays::where('id', $CD2[$i]->id)->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CDUpdate->block = null; + $CDUpdate->update(); + } + return response(['message' => 'Блокировка отключена'], 200); + } else { + return response(['message' => 'Ошибка, неизвестные данные в поле'], 400); + } + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + } + } + +//Пауза + public + function UpdatePauseAccountPatient(Request $request) + { + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id)->first(); + if ($Patient != null) { + $CalendarDays = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->orderBy('day', 'DESC')->first(); + + if ($Patient->pause == null || $Patient->pause == "") { + + if ($CalendarDays != null) { + for ($i = 0; $i < 2; $i++) { + CalendarDays::create([ + 'id_patient' => $Patient->id, + 'day' => $CalendarDays->day + $i, + 'date' => date('Y-m-d', strtotime("+$i day", strtotime($CalendarDays->date))), + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + $pat = $Patient; + $date = date('Y-m-d', strtotime('+1 day')); + $pat->pause = $date; + $pat->update(); + //Установка пауз в календаре + for ($i = 0; $i < 2; $i++) { + $dateCD = date('Y-m-d', strtotime("+$i day")); + $CD = CalendarDays::where('date', $dateCD)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD->pause = $dateCD; + $CD->update(); + } + } else if ($CalendarDays == null) { + $pat = $Patient; + $date = date('Y-m-d', strtotime('+1 day')); + $pat->pause = $date; + $pat->update(); + + //Установка пауз в календаре + for ($i = 0; $i < 2; $i++) { + $dateCD = date('Y-m-d', strtotime("+$i day")); + $CD = CalendarDays::where('date', $dateCD)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD->pause = $dateCD; + $CD->update(); + } + } else { + return response(['message' => 'Ошибка, обратитесь в поддержку. Код - 2.1'], 400); + } + + return response(['message' => 'Пауза включена'], 200); + } else if ($Patient->pause != null && $Patient->pause != "") { + if ($CalendarDays != null) { + $pat = $Patient; + $pat->pause = null; + $pat->update(); + //Проверка количества дней в календаре и их изменение + $this->AddandClearDayPatient($Patient->id); + + + } else if ($CalendarDays == null) { + $pat = $Patient; + $pat->pause = null; + $pat->update(); + + + } else { + return response(['message' => 'Ошибка, обратитесь в поддержку. Код - 2.2'], 400); + + } + //Сброс паузы в календаре + $dateCD = date('Y-m-d'); + $CD1 = CalendarDays::where('date', $dateCD)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD2 = CalendarDays::where('day', '>=', $CD1->day)->where('id_sport_patient', $Patient->id_sport_patient)->get(); + for ($i = 0; $i < count($CD2); $i++) { + $CDUpdate = CalendarDays::where('id', $CD2[$i]->id)->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CDUpdate->pause = null; + $CDUpdate->update(); + } + return response(['message' => 'Пауза отключена'], 200); + } else { + return response(['message' => 'Ошибка, неизвестные данные в поле'], 400); + } + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + + } + } + + +// //Подтверждение на 7 день +// public function Addreport7dayAccountPatient(Request $request) +// { +// $error = Validator::make($request->all(), [ +// 'id' => 'required', +// ]);//1024 +// if ($error->fails()) { +// return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); +// } +// else{ +// $Patient = Patient::where('id', $request->id)->first(); +// if ($Patient != null) { +// if($Patient->report7day == null || $Patient->report7day == ""){ +// $pat = $Patient; +// $pat->report7day = date ('Y-m-d'); +// $pat->update(); +// return response(['Отчет за 7 дней отправлен'], 200); +// } +// else{ +// return response(['Отчет за 7 дней уже отправлен'], 400); +// } +// } +// else{ +// return response(['Ошибка, такого пациента нету'], 400); +// } +// +// } +// } +// +// //Подтверждение на 15 день +// public function Addreport15dayAccountPatient(Request $request) +// { +// $error = Validator::make($request->all(), [ +// 'id' => 'required', +// ]);//1024 +// if ($error->fails()) { +// return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); +// } +// else{ +// $Patient = Patient::where('id', $request->id)->first(); +// if ($Patient != null) { +// if($Patient->report15day == null || $Patient->report15day == ""){ +// $pat = $Patient; +// $pat->report15day = date ('Y-m-d'); +// $pat->update(); +// return response(['Отчет за 15 дней отправлен'], 200); +// } +// else{ +// return response(['Отчет за 15 дней уже отправлен'], 400); +// } +// } +// else{ +// return response(['Ошибка, такого пациента нету'], 400); +// } +// } +// } + + public function GetPatientSearch(Request $request) + { + $error = Validator::make($request->all(), [ + 'login' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:20|min:4', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('login', 'like', '%' . $request->login . '%')->orderBy('id', 'ASC')->get(); + return response()->json($Patient); + } + } + + //Вывод всех пациентов + public function GetPatientAll() + { + $Patient = Patient::orderBy('id', 'ASC') + ->leftJoin('doctor', 'doctor.id', '=', 'patient.id_doctor') + ->leftJoin('sport_patient', 'sport_patient.id', '=', 'patient.id_sport_patient') + ->select('patient.id', 'patient.login', 'patient.email', 'doctor.login as loginDoctor', 'doctor.email as emailDoctor', 'patient.pause', 'patient.block', 'patient.report7day', 'patient.report15day', 'patient.id_sport_patient as id_sport_patient', 'patient.total_days_sports', 'patient.now_days_sports', 'patient.created_at', 'patient.updated_at') + ->get();//, 'patient.email', 'doctor.login as loginDoctor', 'doctor.email as emailDoctor', 'patient.pause', 'patient.block', 'patient.report7day', 'patient.report15day', 'sport_patient.id_patient', 'patient.total_days_sports', 'patient.now_days_sports', 'patient.created_at', 'patient.updated_at' + $result = []; + $number = 0; + for ($i = 0; $i != Count($Patient); $i++) { + $number++; + $search_patient = [ + 'number' => $number, + 'id' => $Patient[$i]->id, + 'login' => $Patient[$i]->login, + 'loginDoctor' => $Patient[$i]->login, + 'emailDoctor' => $Patient[$i]->emailDoctor, + 'pause' => $Patient[$i]->pause, + 'block' => $Patient[$i]->block, + 'report7day' => $Patient[$i]->report7day, + 'report15day' => $Patient[$i]->report15day, + 'id_sport_patient' => $Patient[$i]->id_sport_patient, + 'total_days_sports' => $Patient[$i]->total_days_sports, + 'now_days_sports' => $Patient[$i]->now_days_sports, + 'created_at' => $Patient[$i]->created_at, + 'updated_at' => $Patient[$i]->updated_at, + ]; + array_push($result, $search_patient); + } + return response(["patient" => $result], 200); + } + + //Вывод все пациентов конкретного врача с курсом + public function GetPatientAllActive() + { + $Doctor = Auth::user()->makeHidden(['id']); + + $Patient = Patient::orderBy('id', 'ASC') + ->leftJoin('doctor', 'doctor.id', '=', 'patient.id_doctor') + ->leftJoin('sport_patient', 'sport_patient.id', '=', 'patient.id_sport_patient') + ->select('patient.id', 'patient.login', 'patient.email', 'doctor.login as loginDoctor', 'doctor.email as emailDoctor', 'patient.pause', 'patient.block', 'patient.report7day', 'patient.report15day', 'patient.id_sport_patient as id_sport_patient', 'patient.total_days_sports', 'patient.now_days_sports', 'patient.created_at', 'patient.updated_at') + ->where("patient.id_doctor", $Doctor->id) + ->where("patient.id_sport_patient","!=", null) + ->get();//, 'patient.email', 'doctor.login as loginDoctor', 'doctor.email as emailDoctor', 'patient.pause', 'patient.block', 'patient.report7day', 'patient.report15day', 'sport_patient.id_patient', 'patient.total_days_sports', 'patient.now_days_sports', 'patient.created_at', 'patient.updated_at' + + $result = []; + $number = 0; + for ($i = 0; $i != Count($Patient); $i++) { + $number++; + $search_patient = [ + 'number' => $number, + 'id' => $Patient[$i]->id, + 'login' => $Patient[$i]->login, + 'loginDoctor' => $Patient[$i]->login, + 'emailDoctor' => $Patient[$i]->emailDoctor, + 'pause' => $Patient[$i]->pause, + 'block' => $Patient[$i]->block, + 'report7day' => $Patient[$i]->report7day, + 'report15day' => $Patient[$i]->report15day, + 'id_sport_patient' => $Patient[$i]->id_sport_patient, + 'total_days_sports' => $Patient[$i]->total_days_sports, + 'now_days_sports' => $Patient[$i]->now_days_sports, + 'created_at' => $Patient[$i]->created_at, + 'updated_at' => $Patient[$i]->updated_at, + ]; + array_push($result, $search_patient); + } + return response(["patient" => $result], 200); + } + + //Вывод все пациентов конкретного врача без курса + public function GetPatientAllNotActive() + { + $Doctor = Auth::user()->makeHidden(['id']); + + $Patient = Patient::orderBy('id', 'ASC') + ->leftJoin('doctor', 'doctor.id', '=', 'patient.id_doctor') + ->leftJoin('sport_patient', 'sport_patient.id', '=', 'patient.id_sport_patient') + ->select('patient.id', 'patient.login', 'patient.email', 'doctor.login as loginDoctor', 'doctor.email as emailDoctor', 'patient.pause', 'patient.block', 'patient.report7day', 'patient.report15day', 'patient.id_sport_patient as id_sport_patient', 'patient.total_days_sports', 'patient.now_days_sports', 'patient.created_at', 'patient.updated_at') + ->where("patient.id_doctor", $Doctor->id) + ->where("patient.id_sport_patient", null) + ->get();//, 'patient.email', 'doctor.login as loginDoctor', 'doctor.email as emailDoctor', 'patient.pause', 'patient.block', 'patient.report7day', 'patient.report15day', 'sport_patient.id_patient', 'patient.total_days_sports', 'patient.now_days_sports', 'patient.created_at', 'patient.updated_at' + $result = []; + $number = 0; + for ($i = 0; $i != Count($Patient); $i++) { + $number++; + $search_patient = [ + 'number' => $number, + 'id' => $Patient[$i]->id, + 'login' => $Patient[$i]->login, + 'loginDoctor' => $Patient[$i]->login, + 'emailDoctor' => $Patient[$i]->emailDoctor, + 'pause' => $Patient[$i]->pause, + 'block' => $Patient[$i]->block, + 'report7day' => $Patient[$i]->report7day, + 'report15day' => $Patient[$i]->report15day, + 'id_sport_patient' => $Patient[$i]->id_sport_patient, + 'total_days_sports' => $Patient[$i]->total_days_sports, + 'now_days_sports' => $Patient[$i]->now_days_sports, + 'created_at' => $Patient[$i]->created_at, + 'updated_at' => $Patient[$i]->updated_at, + ]; + array_push($result, $search_patient); + } + return response(["patient" => $result], 200); + } + + + public function GetPatientID(Request $request) + { + $Doctor = Auth::user()->makeHidden(['id']); + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::orderBy('id', 'ASC') + ->leftJoin('doctor', 'doctor.id', '=', 'patient.id_doctor') + ->select('patient.id', 'patient.login', 'patient.email', 'doctor.login as loginDoctor', 'doctor.email as emailDoctor', 'patient.pause', 'patient.block', 'patient.report7day', 'patient.report15day', 'patient.id_sport_patient as id_sport_patient', 'patient.total_days_sports', 'patient.now_days_sports', 'patient.created_at', 'patient.updated_at')->where("patient.id", $request->id)->first();//, 'patient.email', 'doctor.login as loginDoctor', 'doctor.email as emailDoctor', 'patient.pause', 'patient.block', 'patient.report7day', 'patient.report15day', 'sport_patient.id_patient', 'patient.total_days_sports', 'patient.now_days_sports', 'patient.created_at', 'patient.updated_at' + return response( $Patient, 200); + } + + } + + +//Авторизация врача + public function LoginDoctor(Request $request) + { + $validation = Validator::make($request->all(), [ + 'login' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:20|min:4', + 'password' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:100|min:8', + ]); + if ($validation->fails()) { + $result = [ + 'error' => [ + 'code' => 400, + 'message' => 'Validation error', + 'error' => $validation->errors() + ]]; + return response($result, 422); + } + + if (Auth::guard('doctor')->attempt(['login' => $request->login, 'password' => $request->password])) { + $user = Auth::guard('doctor')->user(); + $pat = $user; + $pat->api_token = Str::random(80); + $pat->update(); + + return response([ + 'id' => $user->id, + 'token' => $user->api_token, + + ], 200); + } + return response([ + 'error' => [ + 'code' => 401, + 'message' => 'Unauthorized', + 'error' => [ + 'ОУ у тебя произошла ошибка']] + ], 401); + } + + public function LogoutDoctor() + { + $user = Auth::user()->makeHidden(['id', 'role']); + $pat = $user; + $pat->api_token = null; + $pat->update(); + + return response(['message' => 'Вы вышли из аккаунта'], 200); + } + + +//Вывод курса для врача, чтобы он смог посмотеть что входит в курс + public function GetCours(Request $request) + { + $error = Validator::make($request->all(), [ + 'name' => 'required|regex:/^[a-z0-9а-яё;]+$/iu|string|max:100|min:4', + 'day' => 'required|numeric|max:365|min:1', + + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Cours = SportTasks::orderBy('id', 'ASC') + ->leftJoin('image', 'image.id', '=', 'sports_tasks.id_image') + ->leftJoin('set_of_sports_exercises', 'set_of_sports_exercises.id_sports_tasks', '=', 'sports_tasks.id') + ->leftJoin('sets_of_sports_activities', 'sets_of_sports_activities.id', '=', 'set_of_sports_exercises.id_sets_of_sports_activities') + ->leftJoin('sports_courses', 'sports_courses.id', '=', 'sets_of_sports_activities.id_sports_courses') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'sets_of_sports_activities.name as sets_of_sports_activities_Name', 'sets_of_sports_activities.description as sets_of_sports_activities_Description', 'sports_tasks.name as sports_tasks_Name', 'sports_tasks.description as sports_tasks_Description', 'sports_tasks.count as sports_tasks_Count', 'image.url_image as image_Url',) + ->where('sports_courses.name', '=', $request->name)->where('sets_of_sports_activities.day', '=', $request->day) + ->get(); + return response()->json($Cours); + } + + } + +//Вывод всех курсов + public function GetCoursAll() + { + $Cours = SportCourses::get(); + return response(['courses' => $Cours], 200); + } + + //Вывод курса пациента + public function GetCoursAllPatient(Request $request) + { + $user = Auth::user()->makeHidden(['id']); + + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id)->first(); + if ($Patient != null) { + $Cours = SportCourses::where('user_id',0)->get(); + $SportCourses = SportCourses::join('sport_patient', 'sports_courses.id', '=', 'sport_patient.id_sports_courses') + ->distinct() + ->select('sports_courses.id', 'sports_courses.name', 'sports_courses.description', 'sports_courses.visibility', 'sports_courses.created_at', 'sports_courses.updated_at') + ->where('id_patient', $Patient->id) + ->where('sport_patient.id', $Patient->id_sport_patient) + ->where('user_id',0) + ->first(); + $result = []; + $number = 0; + //Если у пациента есть курс + $SportPatient_ = SportPatient::where('id',$request->id)->first(); + $Cours_ = SportCourses::where('user_id',0)->where('id',$SportPatient_->id_sports_courses)->first(); + if ($Patient->id_sport_patient != null && $Cours_!=null && $SportCourses !=null) { + for ($i = 0; $i != Count($Cours); $i++) { + $number++; + if ($Cours[$i]->id == $SportCourses->id) { + $search_cours = [ + 'number' => $number, + 'id' => $Cours[$i]->id, + 'name' => $Cours[$i]->name, + 'description' => $Cours[$i]->description, + 'visibility' => 100000, + 'created_at' => $Cours[$i]->created_at, + 'updated_at' => $Cours[$i]->updated_at, + ]; + array_push($result, $search_cours); + } else { + $search_cours = [ + 'number' => $number, + 'id' => $Cours[$i]->id, + 'name' => $Cours[$i]->name, + 'description' => $Cours[$i]->description, + 'visibility' => 0, + 'created_at' => $Cours[$i]->created_at, + 'updated_at' => $Cours[$i]->updated_at, + ]; + array_push($result, $search_cours); + } + + } + } //Если его нету + else { + for ($i = 0; $i != Count($Cours); $i++) { + $number++; + $search_cours = [ + 'number' => $number, + 'id' => $Cours[$i]->id, + 'name' => $Cours[$i]->name, + 'description' => $Cours[$i]->description, + 'visibility' => 0, + 'created_at' => $Cours[$i]->created_at, + 'updated_at' => $Cours[$i]->updated_at, + ]; + array_push($result, $search_cours); + } + } + + + return response(['courses' => $result], 200); + //return response(['courses' => $Cours], 200); + } else { + return response(['Такого пациента нету'], 401); + } + } + + } + + //Вывод курсов созданных врачем + function GetCoursesDoctorPatient(Request $request){ + $user = Auth::user()->makeHidden(['id']); + + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id)->first(); + if ($Patient != null) { + $Cours = SportCourses::where('user_id',$user->id)->get(); + $SportCourses = SportCourses::join('sport_patient', 'sports_courses.id', '=', 'sport_patient.id_sports_courses') + ->distinct() + ->select('sports_courses.id', 'sports_courses.name', 'sports_courses.description', 'sports_courses.visibility', 'sports_courses.created_at', 'sports_courses.updated_at') + ->where('id_patient', $Patient->id) + ->where('sport_patient.id', $Patient->id_sport_patient) + ->where('user_id',$user->id) + ->first(); + $result = []; + $number = 0; + //Если у пациента есть курс + $SportPatient_ = SportPatient::where('id',$request->id)->first(); + $Cours_ = SportCourses::where('user_id',$user->id)->where('id',$SportPatient_->id_sports_courses)->first(); + if ($Patient->id_sport_patient != null && $Cours_==null && $SportCourses !=null) { + for ($i = 0; $i != Count($Cours); $i++) { + $number++; + if ($Cours[$i]->id == $SportCourses->id) { + $search_cours = [ + 'number' => $number, + 'id' => $Cours[$i]->id, + 'name' => $Cours[$i]->name, + 'description' => $Cours[$i]->description, + 'visibility' => 100000, + 'created_at' => $Cours[$i]->created_at, + 'updated_at' => $Cours[$i]->updated_at, + ]; + array_push($result, $search_cours); + } else { + $search_cours = [ + 'number' => $number, + 'id' => $Cours[$i]->id, + 'name' => $Cours[$i]->name, + 'description' => $Cours[$i]->description, + 'visibility' => 0, + 'created_at' => $Cours[$i]->created_at, + 'updated_at' => $Cours[$i]->updated_at, + ]; + array_push($result, $search_cours); + } + + } + } //Если его нету + else { + for ($i = 0; $i != Count($Cours); $i++) { + $number++; + $search_cours = [ + 'number' => $number, + 'id' => $Cours[$i]->id, + 'name' => $Cours[$i]->name, + 'description' => $Cours[$i]->description, + 'visibility' => 0, + 'created_at' => $Cours[$i]->created_at, + 'updated_at' => $Cours[$i]->updated_at, + ]; + array_push($result, $search_cours); + } + } + + + return response(['courses_doctor' => $result], 200); + //return response(['courses' => $Cours], 200); + } else { + return response(['Такого пациента нету'], 401); + } + } + + } + + +//Добавление курса пациенту + public + function AddSportPatient(Request $request) + { + $user = Auth::user()->makeHidden(['id']); + $Patient = Patient::where('id', $request->id_patient)->first(); + $error = Validator::make($request->all(), [ + 'id_patient' => 'required|numeric|max:10000|min:1', + 'id_course' => 'required|numeric|max:10000|min:1', + 'all_day' => 'required|numeric|max:365|min:1', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id_patient)->first(); + + if ($Patient != null) { + if ($Patient->id_sport_patient == null) { + //Добовляем данные для списка с курсами + $SportPatient = SportPatient::create([ + 'id_patient' => $request->id_patient, + 'id_sports_courses' => $request->id_course, + ]); + + //Добавление в таблицу пациентов в запись пациента к какая запись из sport_patient относится к нему(в которой хранится ID курса который к неу относится) + $pat = $Patient; + $pat->id_sport_patient = $SportPatient->id; + $pat->total_days_sports = $request->all_day; + $pat->now_days_sports = 0; + $pat->all_days_sports = 0; + $pat->id_doctor = $user->id; + $pat->update(); + + //Создание списка на 30 дней в таблице calendar_days + for ($i = 0; $i < $request->all_day; $i++) {//Цикл на количество дней + $date = date('Y-m-d', strtotime("$i day")); + CalendarDays::create([ + 'id_patient' => $request->id_patient, + 'day' => $i + 1, + 'date' => $date, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + + return response(['message' => 'Курс был добавлен в таблицу для хранения всех куров у пациента'], 200); + } else { + return response(['message' => 'У пациента уже есть курс, чтобы добавить новый удалите предыдуший'], 200); + } + } else { + return response(['message' => 'Такого пациента нету'], 401); + } + } + } + +//Очистка курса пациента + public + function ClearPatientSport(Request $request) + { + $error = Validator::make($request->all(), [ + 'id_patient' => 'required|numeric|max:10000|min:1', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id_patient)->first(); + + if ($Patient != null) { + if ($Patient->id_sport_patient == null) { + return response(['message' => 'У пациента нету курса'], 200); + } else { + //Обновляем что курс окончен + $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->first(); + $SP = $SportPatient; + $SP->finished = 1; + $SP->update(); + + $pat = $Patient; + $pat->pause = null; + $pat->block = null; + $pat->report7day = null; + $pat->report15day = null; + $pat->id_sport_patient = null; + $pat->total_days_sports = null; + $pat->now_days_sports = null; + $pat->all_days_sports = null; + $pat->update(); + return response(['message' => 'Курс пациента был очишен'], 200); + } + + } else { + return response(['message' => 'Такого пациента нету'], 401); + + } + } + } + + + function AddandClearDayPatient(string $id) + { + $Patient = Patient::where('id', $id)->first(); + $CalendarDaysAdd = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('date', '>=', date('Y-m-d'))->get(); + $dateMax = $Patient->total_days_sports - $Patient->now_days_sports; + $CoutCD = Count($CalendarDaysAdd); + + if ($dateMax != $CoutCD) { + if ($dateMax < $CoutCD) { + $max = $CoutCD - $dateMax; + for ($i = 1; $i < $max; $i++) { + CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('date', '>=', date('Y-m-d'))->orderBy('date', 'DESC')->first()->delete(); + } + } else { + $max = ($dateMax - $CoutCD) + 1; + $CalendarDaysDelete = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('date', '>=', date('Y-m-d'))->orderBy('date', 'DESC')->first(); + for ($i = 1; $i < $max; $i++) { + CalendarDays::create([ + 'id_patient' => $Patient->id, + 'day' => $CalendarDaysDelete->day + $i, + 'date' => date('Y-m-d', strtotime("+$i day", strtotime($CalendarDaysDelete->date))), + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + } + } + return response("CoutCD - $CoutCD | dateMax - $dateMax | Patient->total_days_sports - $Patient->total_days_sports | Patient->now_days_sports - $Patient->now_days_sports", 400); + } + + +//Вывод курса для врача, чтобы он смог посмотеть что входит в курс + public + function GetPatientBAQiestionar(Request $request) + { + $error = Validator::make($request->all(), [ + 'id' => '', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id)->first(); + if ($Patient->id_sport_patient == null || $Patient->id_sport_patient == "") { + return response(['message' => "У пациента отсутсвует курс"], 200); + } else { + + $BeforeQuestionnaire = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->orderBy('date', 'ASC')->get(); + + $result = []; + for ($i = 0; $i < Count($BeforeQuestionnaire); $i++) { + $AfterQuestionnaireSearch = AfterQuestionnaire::where('date', $BeforeQuestionnaire[$i]->date)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + if ($AfterQuestionnaireSearch != null) { + $search_sport = [ + 'date' => $BeforeQuestionnaire[$i]->date, + 'idb' => $BeforeQuestionnaire[$i]->id, + 'oneb' => $BeforeQuestionnaire[$i]->one, + 'twob' => $BeforeQuestionnaire[$i]->two, + 'threeb' => $BeforeQuestionnaire[$i]->three, + 'fourb' => $BeforeQuestionnaire[$i]->four, + 'fiveb' => $BeforeQuestionnaire[$i]->five, + 'sixb' => $BeforeQuestionnaire[$i]->six, + 'sevenb' => $BeforeQuestionnaire[$i]->seven, + 'eightb' => $BeforeQuestionnaire[$i]->eight, + 'nineb' => $BeforeQuestionnaire[$i]->nine, + + 'statusa' => "1", + 'ida' => $AfterQuestionnaireSearch->id, + 'onea' => $AfterQuestionnaireSearch->one, + 'twoa' => $AfterQuestionnaireSearch->two, + 'threea' => $AfterQuestionnaireSearch->three, + 'foura' => $AfterQuestionnaireSearch->four, + 'fivea' => $AfterQuestionnaireSearch->five, + 'sixa' => $AfterQuestionnaireSearch->six, + 'sevena' => $AfterQuestionnaireSearch->seven, + 'eighta' => $AfterQuestionnaireSearch->eight, + 'ninea' => $AfterQuestionnaireSearch->nine, + 'tena' => $AfterQuestionnaireSearch->ten, + 'elevena' => $AfterQuestionnaireSearch->eleven, + 'twelvea' => $AfterQuestionnaireSearch->twelve, + ]; + } else { + $search_sport = [ + 'date' => $BeforeQuestionnaire[$i]->date, + 'idb' => $BeforeQuestionnaire[$i]->id, + 'oneb' => $BeforeQuestionnaire[$i]->one, + 'twob' => $BeforeQuestionnaire[$i]->two, + 'threeb' => $BeforeQuestionnaire[$i]->three, + 'fourb' => $BeforeQuestionnaire[$i]->four, + 'fiveb' => $BeforeQuestionnaire[$i]->five, + 'sixb' => $BeforeQuestionnaire[$i]->six, + 'sevenb' => $BeforeQuestionnaire[$i]->seven, + 'eightb' => $BeforeQuestionnaire[$i]->eight, + 'nineb' => $BeforeQuestionnaire[$i]->nine, + + 'statusa' => "0", + 'onea' => 0, + 'twoa' => 0, + 'threea' => 0, + 'foura' => 0, + 'fivea' => 0, + 'sixa' => 0, + 'sevena' => 0, + 'eighta' => 0, + 'ninea' => 0, + 'tena' => 0, + 'elevena' => 0, + 'twelvea' => 0, + ]; + } + + array_push($result, $search_sport); + } + + + return response(['questionnaire' => $result], 200); + + + } + } + } + + function CheckTokenDoctor() + { + $User = Auth::user(); + if ($User != null) { + return response(['status' => "300"], 200); + } else { + return response(['status' => "600"], 200); + } + } + + + public function UpdatePatientLogin(Request $request) + { + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + 'login' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:20|min:4', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id)->first(); + if ($Patient != null) { + $PatientLogin = Patient::where('login', $request->login)->first(); + if ($PatientLogin == null) { + $P = $Patient; + $P->login = $request->login; + $P->update(); + return response(['message' => 'Логин обновлен'], 200); + } else { + return response(['message' => 'Данный логин уже занят'], 200); + } + + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + + } + } + + public function UpdatePatientPassword(Request $request) + { + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + 'password' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:100|min:10', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id)->first(); + if ($Patient != null) { + $P = $Patient; + $P->password = Hash::make($request->password); + $P->update(); + return response(['message' => 'Пароль обновлен'], 200); + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + + } + } + + //Вывод новых необработанных заявлений + public function GetAppealsDoctorNew() + { + $User = Auth::user(); + if ($User != null) { + $Appeals = AppealsDoctor::where('check', 0)->where('id_doctor', $User->id)->first(); + $result = []; + $number=0; + if($Appeals!=null){ + $AppealsList = AppealsDoctor::where('check', 0)->where('id_doctor', $User->id)->get(); + for ($i = 0; $i != Count($AppealsList); $i++) { + $Patient = Patient::where('id',$AppealsList[$i]->id_patient)->first(); + $number = $number+1; + $search_check = [ + 'number' => $number, + 'id' => $AppealsList[$i]->id, + 'text' => $AppealsList[$i]->text, + 'id_patient' => $AppealsList[$i]->id_patient, + 'id_doctor'=>$AppealsList[$i]->id_doctor, + 'check'=>$AppealsList[$i]->check, + 'login'=>$Patient->login, + 'created_at'=>$AppealsList[$i]->created_at, + 'updated_at'=>$AppealsList[$i]->updated_at, + ]; + array_push($result, $search_check); + } + return response(['appeals_new' => $result], 200); + } + else{ + return response(['appeals_new' => null], 200); + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Вывод новых обработанных заявлений + public function GetAppealsDoctorOld() + { + $User = Auth::user(); + if ($User != null) { + $Appeals = AppealsDoctor::where('check', 1)->where('id_doctor', $User->id)->first(); + $result = []; + $number=0; + if($Appeals!=null){ + $AppealsList = AppealsDoctor::where('check', 1)->where('id_doctor', $User->id)->get(); + for ($i = 0; $i != Count($AppealsList); $i++) { + $Patient = Patient::where('id',$AppealsList[$i]->id_patient)->first(); + $number = $number+1; + $search_check = [ + 'number' => $number, + 'id' => $AppealsList[$i]->id, + 'text' => $AppealsList[$i]->text, + 'id_patient' => $AppealsList[$i]->id_patient, + 'id_doctor'=>$AppealsList[$i]->id_doctor, + 'check'=>$AppealsList[$i]->check, + 'login'=>$Patient->login, + 'created_at'=>$AppealsList[$i]->created_at, + 'updated_at'=>$AppealsList[$i]->updated_at, + ]; + array_push($result, $search_check); + } + return response(['appeals_old' => $result], 200); + } + else{ + return response(['appeals_old' => null], 200); + } + + + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Создание сообщения для пациента + public function AddMessageDoctor(Request $request) + { + $User = Auth::user(); + if ($User != null) { + $error = Validator::make($request->all(), [ + //'id' => 'required|numeric|max:10000|min:1', + 'login' => 'required|string|max:1000|min:4', + // 'text' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:100|min:4', + 'text' => 'required|string|max:1000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('login', $request->login)->first(); + if ($Patient != null) { + AppealsPatient::create([ + 'text' => $request->text, + 'id_patient' => $Patient->id, + 'id_doctor' => $User->id, + ]); + return response(['message' => 'Сообщение отправлено'], 200); + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Создание сообщения для пациента + public function UpdateMessageDoctor(Request $request) + { + $User = Auth::user(); + if ($User != null) { + $error = Validator::make($request->all(), [ + 'id_patient' => 'required|numeric|max:10000|min:1', + 'id' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $request->id_patient)->first(); + if ($Patient != null) { + + $AppealsPatient = AppealsDoctor::where('id',$request->id)->where('check',0)->where('id_patient',$Patient->id)->where('id_doctor',$User->id)->first(); + if($AppealsPatient!=null){ + if($AppealsPatient->check == 0){ + $AP = $AppealsPatient; + $AP->check = 1; + $AP->update(); + return response(['message' => 'Подтверждено'], 200); + } + else{ + return response(['message' => 'Данное сообщение уже отмечено'], 200); + } + } + else{ + return response(['message' => 'Такого сообщения нету'], 200); + } + + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Создание основы для собственного курса от врача + function AddCoursesName(Request $request){ + $User = Auth::user(); + if ($User != null) { + $error = Validator::make($request->all(), [ + 'name' => 'required|string|max:150|min:4', + 'description' => 'required|string|max:1000|min:4', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $SportCourses = SportCourses::create([ + 'name'=>$request->name, + 'description'=>$request->description, + 'visibility'=>1, + 'user_id'=>$User->id, + ]); + SetsOfSportsActivities::create([ + 'name'=>uniqid(), + 'day'=>1, + 'description'=>"Общий курс", + 'id_sports_courses'=>$SportCourses->id, + ]); + return response(['message' => 'Шаблон для курса создан'], 200); + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Добавление упражнения в курс + function AddCoursesCreatingDoctor(Request $request){ + $User = Auth::user(); + if ($User != null) { + $error = Validator::make($request->all(), [ + 'id_sports_tasks' => 'required|numeric|max:10000|min:1', + 'id_sets_of_sports_activities' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $SportTasks = SportTasks::where('id',$request->id_sports_tasks)->first(); + if($SportTasks!=null){ + $SetOfSportsExercises = SetOfSportsExercises::where('id_sets_of_sports_activities',$request->id_sets_of_sports_activities)->where('id_sports_tasks',$request->id_sports_tasks)->orderBy('id','DESC')->first(); + + if($SetOfSportsExercises ==null){ + $SetOfSportsExercisesSport = SetOfSportsExercises::where('id_sets_of_sports_activities',$request->id_sets_of_sports_activities)->where('id_sports_tasks','!=',$request->id_sports_tasks)->orderBy('id','DESC')->first(); + if($SetOfSportsExercisesSport==null){ + SetOfSportsExercises::create([ + 'number'=>1, + 'day'=>1, + 'id_sports_tasks'=>$request->id_sports_tasks, + 'id_sets_of_sports_activities'=>$request->id_sets_of_sports_activities, + ]); + + return response(['message' => 'Первое упражнение добавлено'], 200); + } + else{ + SetOfSportsExercises::create([ + 'number'=>$SetOfSportsExercisesSport->number+1, + 'day'=>1, + 'id_sports_tasks'=>$request->id_sports_tasks, + 'id_sets_of_sports_activities'=>$request->id_sets_of_sports_activities, + ]); + return response(['message' => 'Упражнение добавлено'], 200); + } + + + } + else{ + return response(['message' => 'Такое упражнение уже есть'], 200); + } + } + else{ + return response(['message' => 'Такого упражнения нету'], 200); + } + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + + //Удаление упражнения из курса + function ClearCoursesCreatingDoctor(Request $request){ + $User = Auth::user(); + if ($User != null) { + $error = Validator::make($request->all(), [ + 'id_sets_of_sports_exercises' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $SetOfSportsExercises = SetOfSportsExercises::where('id',$request->id_sets_of_sports_exercises)->first(); + if($SetOfSportsExercises!=null){ + SetOfSportsExercises::where('id',$request->id_sets_of_sports_exercises)->delete(); + return response(['message' => 'Упражнение удалено'], 200); + } + else{ + return response(['message' => 'Такого упражнения нету'], 200); + } + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Вывод курсов созданных врачем + function GetCoursesDoctor(){ + $User = Auth::user(); + + $SportCoursesDoctor = SportCourses::where('user_id',$User->id)->get(); + $SetsOfSportsActivities = SetsOfSportsActivities::orderBy('id', 'ASC') + ->leftJoin('sports_courses', 'sports_courses.id', '=', 'sets_of_sports_activities.id_sports_courses') + ->select('sports_courses.id', 'sports_courses.name', 'sports_courses.description', 'sports_courses.visibility', 'sports_courses.visibility','sports_courses.user_id','sets_of_sports_activities.id as id_activity','sports_courses.created_at','sports_courses.updated_at') + ->distinct() + ->where("sports_courses.user_id", $User->id) + ->get(); + $result = []; + $number=0; + for ($i = 0; $i != Count($SetsOfSportsActivities); $i++) { + $number = $number+1; + $search_check = [ + 'number' => $number, + 'id' => $SetsOfSportsActivities[$i]->id, + 'name' => $SetsOfSportsActivities[$i]->name, + 'description' => $SetsOfSportsActivities[$i]->description, + 'visibility' => $SetsOfSportsActivities[$i]->visibility, + 'user_id'=>$SetsOfSportsActivities[$i]->user_id, + 'id_activity'=>$SetsOfSportsActivities[$i]->id_activity, + 'created_at'=>$SetsOfSportsActivities[$i]->created_at, + 'updated_at'=>$SetsOfSportsActivities[$i]->updated_at, + ]; + array_push($result, $search_check); + } + + return response(['sport_courses_doctor' => $result], 200); + + } + + //Вывод всех упражнений + function GetEditCourseDoctorAll(Request $request){ + //$Doctor = Auth::user()->makeHidden(['id']); + $error = Validator::make($request->all(), [ + 'id_doctor_courses' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $SportCourses = SportCourses::orderBy('id', 'ASC')->where('id', $request->id_doctor_courses)->first(); + if ($SportCourses != null) { + + //$SportCoursesAdd = SportCourses::orderBy('id', 'ASC')->where('id_doctor_courses', $request->id_doctor_courses)->get(); + // $SportTasks = $Set::get(); + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + ->join('sets_of_sports_activities', 'set_of_sports_exercises.id_sets_of_sports_activities', '=', 'sets_of_sports_activities.id') + ->join('sports_tasks', 'set_of_sports_exercises.id_sports_tasks', '=', 'sports_tasks.id') + // ->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->join('sports_courses', 'sets_of_sports_activities.id_sports_courses', '=', 'sports_courses.id') + ->join('image', 'sports_tasks.article_image', '=', 'image.article') + ->select('sports_tasks.id','set_of_sports_exercises.id as id_exercises', 'sports_tasks.name', 'sports_tasks.description', 'image.url_image') + ->distinct('id') + ->where('sports_courses.id', '!=',$request->id_doctor_courses) + ->get(); + + $CoursesSportEdit = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + ->join('sets_of_sports_activities', 'set_of_sports_exercises.id_sets_of_sports_activities', '=', 'sets_of_sports_activities.id') + ->join('sports_tasks', 'set_of_sports_exercises.id_sports_tasks', '=', 'sports_tasks.id') + // ->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->join('sports_courses', 'sets_of_sports_activities.id_sports_courses', '=', 'sports_courses.id') + ->join('image', 'sports_tasks.article_image', '=', 'image.article') + ->select('sports_tasks.id','set_of_sports_exercises.id as id_exercises', 'sports_tasks.name', 'sports_tasks.description', 'image.url_image') + ->distinct('id') + ->where('sports_courses.id',$request->id_doctor_courses) + ->get(); + $result = []; + + $number = 0; + + if ($CoursesSportEdit != null) { + for ($i = 0; $i != Count($SetOfSportsExercises); $i++) { + $res = 0; + for ($j = 0; $j != Count($CoursesSportEdit); $j++) { + if ($SetOfSportsExercises[$i]->id != $CoursesSportEdit[$j]->id) { + $res++; + } + } + if ($res == Count($CoursesSportEdit)) { + $number++; + $search_sport = [ + 'number' => $number, + 'id' => $SetOfSportsExercises[$i]->id, + 'id_exercises' => $SetOfSportsExercises[$i]->id_exercises, + 'name' => $SetOfSportsExercises[$i]->name, + 'description' => $SetOfSportsExercises[$i]->description, + 'url_image' => $SetOfSportsExercises[$i]->url_image, + ]; + array_push($result, $search_sport); + } + } + } else { + for ($i = 0; $i != Count($SetOfSportsExercises); $i++) { + $search_sport = [ + 'number' => $number, + 'id' => $SetOfSportsExercises[$i]->id, + 'id_exercises' => $SetOfSportsExercises[$i]->id_exercises, + 'name' => $SetOfSportsExercises[$i]->name, + 'description' => $SetOfSportsExercises[$i]->description, + 'url_image' => $SetOfSportsExercises[$i]->url_image, + ]; + array_push($result, $search_sport); + } + } + + return response(['set_of_sports_exercises_all' => $result], 200); + + + } else { + return response(['message' => 'Ошибка, такого курса нету'], 400); + } + } + } + + //Вывод добавленных упражнений в курс + function GetEditCourseDoctorYour(Request $request){ + //$Doctor = Auth::user()->makeHidden(['id']); + $error = Validator::make($request->all(), [ + 'id_doctor_courses' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $SportCourses = SportCourses::orderBy('id', 'ASC')->where('id', $request->id_doctor_courses)->first(); + if ($SportCourses != null) { + + + + $CoursesSportEdit = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + ->join('sets_of_sports_activities', 'set_of_sports_exercises.id_sets_of_sports_activities', '=', 'sets_of_sports_activities.id') + ->join('sports_tasks', 'set_of_sports_exercises.id_sports_tasks', '=', 'sports_tasks.id') + // ->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->join('sports_courses', 'sets_of_sports_activities.id_sports_courses', '=', 'sports_courses.id') + ->join('image', 'sports_tasks.article_image', '=', 'image.article') + ->select('sports_tasks.id', 'sports_tasks.name', 'sports_tasks.description', 'image.url_image','set_of_sports_exercises.id as id_exercises') + ->distinct('id') + ->where('sports_courses.id',$request->id_doctor_courses, ) + ->get(); + + $result = []; + $number = 0; + + for ($i = 0; $i != Count($CoursesSportEdit); $i++) { + $number++; + $search_sport = [ + 'number' => $number, + 'id' => $CoursesSportEdit[$i]->id, + 'id_exercises' => $CoursesSportEdit[$i]->id_exercises, + 'name' => $CoursesSportEdit[$i]->name, + 'description' => $CoursesSportEdit[$i]->description, + 'url_image' => $CoursesSportEdit[$i]->url_image, + ]; + array_push($result, $search_sport); + } + + + return response(['set_of_sports_exercises_your' => $result], 200); + + + } else { + return response(['message' => 'Ошибка, такого курса нету'], 400); + } + } + } + + //Получение данных для первой страницы врача + function CountPatientAndAppeals() + { + $User = Auth::user(); + $Patient = Patient::where('id_doctor',$User->id)->get(); + $AppealsCheck = AppealsDoctor::where('check',0)->where('id_doctor',$User->id)->get(); + $AppealsAll = AppealsDoctor::where('id_doctor',$User->id)->get(); + + return response(['patient' => Count($Patient),'appeals_check' => Count($AppealsCheck),'appeals_all' => Count($AppealsAll)], 200); + } + + + +} diff --git a/app/Http/Controllers/PatientController.php b/app/Http/Controllers/PatientController.php new file mode 100644 index 0000000..6cc7888 --- /dev/null +++ b/app/Http/Controllers/PatientController.php @@ -0,0 +1,2242 @@ +all(), [ + 'login' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:20', + 'password' => 'required|regex:/^[a-zA-Z0-9\-]+$/|string|max:100', + ]); + if ($validation->fails()) { +// $result = [ +// 'error' => [ +// 'code' => 400, +// 'message' => 'Validation error', +// 'error' => $validation->errors() +// ]]; + + return response(['message' => 'Ошибка валидации'], 422); + } + + if (Auth::guard('patient')->attempt(['login' => $request->login, 'password' => $request->password])) { + $user = Auth::guard('patient')->user(); + $pat = $user; + $pat->api_token = Str::random(80); + $pat->update(); + + return response([ + 'id' => $user->id, + 'token' => $user->api_token, + ], 200); + } + return response(['message' => 'Неверные данные'], 401); + } + + public function LogoutPatient() + { + $user = Auth::user()->makeHidden(['id', 'role']); + $pat = $user; + $pat->api_token = null; + $pat->update(); + + return response(['message' => 'Вы вышли из аккаунта'], 200); + } + + //Вывод курса для пациента в зависимоти от того сколько дней у него пройдено + public function GetCoursSportPatient(Request $request) + { + $error = Validator::make($request->all(), [ + 'name' => 'required', + 'day' => 'required', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Cours = SportTasks::orderBy('id', 'ASC') + ->leftJoin('image', 'image.id', '=', 'sports_tasks.id_image') + ->leftJoin('set_of_sports_exercises', 'set_of_sports_exercises.id_sports_tasks', '=', 'sports_tasks.id') + ->leftJoin('sets_of_sports_activities', 'sets_of_sports_activities.id', '=', 'set_of_sports_exercises.id_sets_of_sports_activities') + ->leftJoin('sports_courses', 'sports_courses.id', '=', 'sets_of_sports_activities.id_sports_courses') + ->d('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'sets_of_sports_activities.name as sets_of_sports_activities_Name', 'sets_of_sports_activities.description as sets_of_sports_activities_Description', 'sports_tasks.name as sports_tasks_Name', 'sports_tasks.description as sports_tasks_Description', 'sports_tasks.count as sports_tasks_Count', 'image.url_image as image_Url',) + ->where('sports_courses.name', '=', $request->name)->where('sets_of_sports_activities.day', '=', $request->day) + ->get(); + return response()->json($Cours); + } + + } + + //Подтверждение анкеты ДО, после которой увеличится количество дней если не хватит, а также увеличится выведется определенная тренировка в зависимоти был ли бан или пауза в предыдушем дне + public function AddBeforeQuestionnaire(Request $request) + { + $error = Validator::make($request->all(), [ + 'one' => 'required', + 'two' => 'required', + 'three' => 'required', + 'four' => 'required', + 'five' => 'required', + 'six' => 'required', + 'seven' => 'required', + 'eight' => 'required', + 'nine' => 'required', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Auth::user()->makeHidden(['id']); + $date = date("Y-m-d"); + if ($Patient != null) { + //Проверка на то, есть ли курс у пациента + if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { + $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->first(); + //Проверка на то, закончин ли данный курс + if ($SportPatient->finished == false) { + + $date = date("Y-m-d"); + $BeforeQuestionnaire = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + $BeforeQuestionnaireDate = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); + + //Если была хоть одна анкета под данный курс + if ($BeforeQuestionnaireDate != null) { + //Проверка на то есть заполнял ли пользватель анкету ДО на эту дату + if ($BeforeQuestionnaire == null) { + $BeforeQuestionnaireSearch = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); + $AfterQuestionnaire = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $BeforeQuestionnaireSearch->date)->first(); + //Проверка на то заполнил ли пользователь анкету ПОСЛЕ за предыдущий день + if ($AfterQuestionnaire != null) {//Если заполнил + + //Заполнение анкеты + $BQ = BeforeQuestionnaire::create([ + 'id_sport_patient' => $SportPatient->id, + 'date' => $date, + 'one' => $request->one, + 'two' => $request->two, + 'three' => $request->three, + 'four' => $request->four, + 'five' => $request->five, + 'six' => $request->six, + 'seven' => $request->seven, + 'eight' => $request->eight, + 'nine' => $request->nine, + ]); + return response(['Анкета ДО добавлена', date('Y-m-d', strtotime("0 day"))], 200); + + //Подтверждаем в календарном дне, что анкета ДО заполнена + $pat = $Patient; + $pat->before_questionnaire = $BQ->id; + $pat->update(); + + //ПРоверка на блок + if ($request->one >= 6) { + //Блокировка + $pat = $Patient; + $pat->ban = date('Y-m-d', strtotime("3 day")); + $pat->update(); + } //Проверка на паузу + else if ($request->four == "1" || $request->five == "1" || $request->six == "1" || $request->seven == "1" || $request->nine == "1") { + //Пауза + $pat = $Patient; + $pat->pause = date('Y-m-d', strtotime("1 day")); + $pat->update(); + } + } else if ($AfterQuestionnaire == null && + (($Patient->pause == $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->pause))) == $BeforeQuestionnaireSearch->date) || + ($Patient->block == $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->block))) == $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-2 day', strtotime($Patient->block))) == $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-3 day', strtotime($Patient->block))) == $BeforeQuestionnaireSearch->date))) {//Заполнение анкеты за предыдущий день занятий + //Заполнение анкеты + $BQ = BeforeQuestionnaire::create([ + 'id_sport_patient' => $SportPatient->id, + 'date' => $date, + 'one' => $request->one, + 'two' => $request->two, + 'three' => $request->three, + 'four' => $request->four, + 'five' => $request->five, + 'six' => $request->six, + 'seven' => $request->seven, + 'eight' => $request->eight, + 'nine' => $request->nine, + ]); + + + //Подтверждаем в календарном дне, что анкета ДО заполнена + $CalendarDays = CalendarDays::where('id_patient', $Patient->id)->where('date', date('Y-m-d'))->where('id_sport_patient', $Patient->id_sport_patient)->first(); + if ($CalendarDays != null) { + $CD = $CalendarDays; + $CD->id_before_questionnaire = $BQ->id; + $CD->update(); + + //ПРоверка на блок + if ($request->one >= 6) { + //Блокировка + $pat = $Patient; + $pat->block = date('Y-m-d', strtotime("3 day")); + $pat->update(); + } //Проверка на паузу + else if ($request->four == "1" || $request->five == "1" || $request->six == "1" || $request->seven == "1" || $request->nine == "1") { + //Пауза + $pat = $Patient; + $pat->pause = date('Y-m-d', strtotime("1 day")); + $pat->update(); + } + return response(['Анкета ДО добавлена'], 200); + } else { + return response(['Ошибка системы'], 401); + } + + + } else { + return response(['У вас не заполнена анкета за придушивший день занятий'], 401); + } + } else { + return response(['У пользователя уже заполнена анкета ДО на сегодня'], 401); + } + } else {//Если небыло ни одной анкеты за курс(первая) + + //Создание списка на 30 дней в таблице calendar_days + for ($i = 0; $i < $Patient->total_days_sports; $i++) {//Циул на количество дней + $date = date('Y-m-d', strtotime("$i day")); + CalendarDays::create([ + 'id_patient' => $Patient->id, + 'day' => $i + 1, + 'date' => date('d-m-Y', strtotime($date)), + 'id_sport_patient' => $SportPatient->id, + ]); + } + + //Заполнение анкеты + $BQ = BeforeQuestionnaire::create([ + 'id_sport_patient' => $SportPatient->id, + 'date' => $date, + 'one' => $request->one, + 'two' => $request->two, + 'three' => $request->three, + 'four' => $request->four, + 'five' => $request->five, + 'six' => $request->six, + 'seven' => $request->seven, + 'eight' => $request->eight, + 'nine' => $request->nine, + ]); + + $BQ = BeforeQuestionnaire::where('date', date('Y-m-d'))->where('id_sport_patient', $Patient->id_sport_patient)->first(); + //Подтверждаем в календарном дне, что анкета ДО заполнена + $CalendarDays = CalendarDays::where('id_patient', $Patient->id)->where('date', date('Y-m-d'))->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + $CD = $CalendarDays; + $CD->id_before_questionnaire = $BQ->id; + $CD->update(); + + //ПРоверка на блок + if ($request->one >= 6) { + //Блокировка + $pat = $Patient; + $pat->block = date('Y-m-d', strtotime("3 day")); + $pat->update(); + } //Проверка на паузу + else if ($request->four == "1" || $request->five == "1" || $request->six == "1" || $request->seven == "1" || $request->nine == "1") { + //Пауза + $pat = $Patient; + $pat->pause = date('Y-m-d', strtotime("1 day")); + $pat->update(); + } + return response(['Анкета ДО добавлена'], 200); + + } + + + } else { + return response(['Данный курс уже окончен, обратитесь к врачу'], 401); + } + } else { + return response(['У вас нету курса, попросите врача добавить вать вам курс'], 401); + } + } else { + return response(['Такого пациента нету'], 401); + } + } + } + + + //Подтверждение анкеты ПОСЛЕ, после увеличится количество выполненных дней и подтверждения анкет на определенный день + public function AddAfterQuestionnaire(Request $request) + { + //Сегодняшняя дата + $date = date("Y-m-d"); + + $error = Validator::make($request->all(), [ + 'one' => 'required', + 'two' => 'required', + 'three' => 'required', + 'four' => 'required', + 'five' => 'required', + 'six' => 'required', + 'seven' => 'required', + 'eight' => 'required', + 'nine' => 'required', + 'ten' => 'required', + 'eleven' => 'required', + 'twelve' => 'required', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Auth::user()->makeHidden(['id']); + if ($Patient != null) { + //Проверка на то, есть ли курс у пациента + if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { + $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->first(); + $BeforeQuestionnaireNew = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); + + //Проверка на то отправлялась ли хоть одна анкета ДО + if ($BeforeQuestionnaireNew != null) { + + //Проверка на то, активен ли данный курс + if ($SportPatient->finished == false) { + $BeforeQuestionnaireSearch = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); + $AfterQuestionnaireSearch = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $BeforeQuestionnaireSearch->date)->first(); + $BeforeQuestionnaireDate = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + $AfterQuestionnaireDate = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + + //Проверка на то отправлена ли анкета ДО за сегодня + if ($BeforeQuestionnaireDate == null && $AfterQuestionnaireSearch == null) { + $dateBefSearch = $BeforeQuestionnaireSearch->date; + $pause = $Patient->pause; + $pauseNo1DAy = date('Y-m-d', strtotime('-1 day', strtotime($Patient->pause))); + $block = $Patient->block; + $blockNo1DAy = date('Y-m-d', strtotime('-1 day', strtotime($Patient->block))); + $blockNo2DAy = date('Y-m-d', strtotime('-2 day', strtotime($Patient->block))); + $blockNo3DAy = date('Y-m-d', strtotime('-3 day', strtotime($Patient->block))); + + //Проверка на то заполнялась ли анкета ПОСЛЕ за предыдущий день и не было ли блокировок или пауза + if ($AfterQuestionnaireSearch == null) { + if (($pause == null && $block == null) || + ((($pause != null && $block != null)) && $pause != $dateBefSearch && $pauseNo1DAy != $dateBefSearch && $block != $dateBefSearch && $blockNo1DAy != $dateBefSearch && $blockNo2DAy != $dateBefSearch && $blockNo3DAy != $dateBefSearch) || + ((($pause != null && $block == null)) && $pause != $dateBefSearch && $pauseNo1DAy != $dateBefSearch) || + ((($pause == null && $block != null)) && $block != $dateBefSearch && $blockNo1DAy != $dateBefSearch && $blockNo2DAy != $dateBefSearch && $blockNo3DAy != $dateBefSearch)) { + + $SportForDay = SportForDay::where('day', $BeforeQuestionnaireSearch->date)->where('date', $date)->where('id_patient', $Patient->id_patient)->where('id_sport_patient', $Patient->id_sport_patient)->where('finish', 0)->first(); + //Проверка на то все ли задания были выполнены, если нет, то нельзя отправить отчет + if ($SportForDay == null) { + //Заполнение анкеты за предыдущий день + $AQ = AfterQuestionnaire::create([ + 'id_sport_patient' => $Patient->id_sport_patient, + 'date' => $BeforeQuestionnaireSearch->date, + 'one' => $request->one, + 'two' => $request->two, + 'three' => $request->three, + 'four' => $request->four, + 'five' => $request->five, + 'six' => $request->six, + 'seven' => $request->seven, + 'eight' => $request->eight, + 'nine' => $request->nine, + 'ten' => $request->ten, + 'eleven' => $request->eleven, + 'twelve' => $request->twelve, + ]); + + $AfterQuestionnaireUpdate = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); + + //Подтверждаем в календарном дне, что анкета ПОСЛЕ заполнена + $CalendarDays = CalendarDays::where('date', $BeforeQuestionnaireSearch->date)->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + $pat = $CalendarDays; + $pat->id_after_questionnaire = $AfterQuestionnaireUpdate->id; + $pat->update(); + + //ПРоверка на блок + if ($request->ten == 1) { + //Блокировка + $pat = $Patient; + $pat->block = date('Y-m-d', strtotime("3 day")); + $pat->update(); + } //Проверка на паузу + else if ($request->one >= "6" || $request->three == "0" || $request->six == "1" || $request->eight == "1" || $request->eleven == "1") { + //Пауза + $pat = $Patient; + $pat->pause = date('Y-m-d', strtotime("1 day")); + $pat->update(); + } + $pat2 = $Patient; + $pat2->now_days_sports = $Patient->now_days_sports + 1; + $pat2->update(); + + return response(['Анкета ПОСЛЕ добавлена за предыдущий день' . "dateBefSearch=" . $dateBefSearch . ". pause=" . $pause . ". pauseNo1DAy=" . $pauseNo1DAy . ". block=" . $block . ". blockNo1DAy=" . $blockNo1DAy . ". blockNo2DAy=" . $blockNo2DAy . ". blockNo3DAy=" . $blockNo3DAy], 200); + + } else { + return response(['Не все задания выполнены'], 200); + } + } else if ($AfterQuestionnaireSearch != null) {//Заполнение анкеты за предыдущий день занятий + return response(['У вас уже заполнена анкета ПОСЛЕ предыдущий день'], 401); + } else { + return response(['У пользователя не заполнена анкета ДО на сегодня, поэтому анкету после он не может заполнить'], 401); + } + } else { + return response(['У пользователя не заполнена анкета ДО на сегодня, поэтому анкету после он не может заполнить'], 401); + } + } else if ($BeforeQuestionnaireDate != null && $AfterQuestionnaireDate == null) { + + $SportForDay = SportForDay::where('finish', 0)->first(); + //Проверка на то все ли задания были выполнены, если нет, то нельзя отправить отчет + if ($SportForDay == null) { + $AQ = AfterQuestionnaire::create([ + 'id_sport_patient' => $Patient->id_sport_patient, + 'date' => $date, + 'one' => $request->one, + 'two' => $request->two, + 'three' => $request->three, + 'four' => $request->four, + 'five' => $request->five, + 'six' => $request->six, + 'seven' => $request->seven, + 'eight' => $request->eight, + 'nine' => $request->nine, + 'ten' => $request->ten, + 'eleven' => $request->eleven, + 'twelve' => $request->twelve, + ]); + + + $AfterQuestionnaireUpdate = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); + + //Подтверждаем в календарном дне, что анкета ПОСЛЕ заполнена + $CalendarDays = CalendarDays::where('date', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + $pat = $CalendarDays; + $pat->id_after_questionnaire = $AfterQuestionnaireUpdate->id; + $pat->update(); + + + //ПРоверка на блок + if ($request->ten == 1) { + //Блокировка + $pat = $Patient; + $pat->block = date('Y-m-d', strtotime("3 day")); + $pat->update(); + } //Проверка на паузу + else if ($request->one >= "6" || $request->three == "0" || $request->six == "1" || $request->eight == "1" || $request->eleven == "1") { + //Пауза + $pat = $Patient; + $pat->pause = date('Y-m-d', strtotime("1 day")); + $pat->update(); + } + return response(['Анкета ПОСЛЕ добавлена', $SportForDay], 200); + } else { + return response(['Не все задания выполнены'], 200); + } + } else { + return response(['У пользователя уже заполнена анкета ПОСЛЕ на сегодня'], 401); + } + + + } else { + return response(['Данный курс уже окончен, обратитесь к врачу'], 401); + } + } else { + return response(['У вас не заполнена анкета ДО'], 401); + } + + } else { + return response(['У вас нету курса, попросите врача добавить вать вам курс'], 401); + } + } else { + return response(['Такого пациента нету'], 401); + } + } + } + + +// //Функция для вывода нужной карточки на экран +// public function VisibleView() +// { +// $Patient = Auth::user()->makeHidden(['id']); +// $date = date("Y-m-d"); +// +// if ($Patient != null) { +// //Проверка на то, есть ли курс у пациента +// if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { +// $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->first(); +// $Calendare = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); +// //Проверка на то, закончин ли данный курс +// if ($SportPatient->finished == false) { +// //ППоверка есть ли нужное количество дней в календаре на данный курс, если нет то отправлять пациента на экран с подтверждением начинания сегодняшнего дня, в акнкету до тренировки, чтобы он создавал +// +// $BeforeQuestionnaireSearch = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); +// $AfterQuestionnaireSearch = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $BeforeQuestionnaireSearch->date)->first(); +// +// $AfterQuestionnaire = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); +// $BeforeQuestionnaire = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); +// if ($Patient->block >= $date) {//Если блок +// return response(['view' => 3, 'text' => 'Курс заблокирован до' . $Patient->block], 200); +// } else if ($Patient->pause >= $date) {//Если пауза +// return response(['view' => 4, 'text' => 'Курс на паузе до' . $Patient->block], 200); +// } else if ($BeforeQuestionnaire == null && $AfterQuestionnaire == null && $AfterQuestionnaireSearch != null) {//Ели не заполнена анкеты ДО +// return response(['view' => 5, 'text' => 'Анкета ДО тренировки'], 200); +// } else if ($BeforeQuestionnaire != null && $AfterQuestionnaire == null && ($Calendare->count_workout_max != null && $Calendare->count_workout_make != null) && ($Calendare->count_workout_max == $Calendare->count_workout_make)) {//Еcли не заполнена анкеты ПОСЛЕ +// return response(['view' => 6, 'text' => 'Анкета ПОСЛЕ тренировки'], 200); +// } //Вывод анкеты ПОСЛЕ если не заполнил за предыдущий день +// else if ($AfterQuestionnaireSearch == null && +// (($Patient->pause == null || $Patient->pause != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->pause))) != $BeforeQuestionnaireSearch->date) || +// ($Patient->block == null || $Patient->block != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-2 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-3 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date))) {//Заполнение анкеты за предыдущий день занятий +// return response(['view' => 7, 'text' => 'Анкета ПОСЛЕ за предыдущий день'], 200); +// } else if ($AfterQuestionnaire != null && $BeforeQuestionnaire != null) {//Ели не заполнены анкеты +// return response(['view' => 8, 'text' => 'Тренировки на сегодня окончены, ждем вас завтра'], 200); +// } else if ($AfterQuestionnaire != null && $BeforeQuestionnaire == null && $Patient->pause == null && $Patient->block == null && ($Calendare->count_workout_max != $Calendare->count_workout_make)) {//Ели не заполнены анкеты +// return response(['view' => 9, 'text' => 'Тренировки на сегодня'], 200); +// } //Условие, если курса на этот день нету, то выводим экран с сообщение, "чтобы начать вам нужно подтвердить данное действие" +// else if ($AfterQuestionnaire != null && $BeforeQuestionnaire == null && $Patient->pause == null && $Patient->block == null && $Calendare->id_sport_patient == null) {//Ели не заполнены анкеты +// return response(['view' => 10, 'text' => 'Чтобы начать вам нужно подтвердить данное действие'], 200); +// } +// +// +// } else { +// return response(['view' => 2, 'text' => 'Ваш курс окончен. Для дальнейших действий обратитесь к врачу'], 200); +// } +// } else { +// return response(['view' => 1, 'text' => 'Попросите врача добавить вам курс'], 200); +// } +// } else { +// return response(['Такого пациента нету'],); +// } +// } + + +// //Функция для вывода нужной карточки на экран +// public function VisibleView2() +// { +// $Patient = Auth::user()->makeHidden(['id']); +// $date = date("Y-m-d"); +// +// if ($Patient != null) { +// //Проверка на то, есть ли курс у пациента +// if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { +// +// $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->first(); +// //Проверка на то, закончен ли данный курс +// if ($SportPatient->finished == 0) { +// //Проверка если ли блокировка +// if (($Patient->block !== null && $Patient->block !== "" && $Patient->block >= $date) || ($Patient->pause !== null && $Patient->pause !== "" && $Patient->pause >= $date)) { +// if ($Patient->block !== null && $Patient->block !== "" && $Patient->block >= $date) { +// return response(['view' => 3, 'text' => 'У вас блокировка до ' . $Patient->block], 200); +// } else if ($Patient->pause !== null && $Patient->pause !== "" && $Patient->pause >= $date) { +// return response(['view' => 4, 'text' => 'У вас пауза до ' . $Patient->pause], 200); +// } +// } else { +// //Проверка на то есть ли хоть одна анкета ДО +// $BeforeQ = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); +// $AfterQ = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); +// if ($BeforeQ != null) { +// $BeforeQuestionnaire = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', '<', $date)->where('date', $date)->first(); +// $AfterQuestionnaire = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', '<', $date)->where('date', $date)->first(); +// +// $SportForDay = SportForDay::where('day', $date)->where('finish', 1)->get(); +// +// $CalendareDays = CalendarDays::where('date', $date)->first(); +// +// if($AfterQ == null && ($Patient->pause != null || $Patient->block != null) && +// (($Patient->pause == null || $Patient->pause != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->pause))) != $BeforeQuestionnaireSearch->date) || +// ($Patient->block == null || $Patient->block != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-2 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-3 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date))){ +// +// } +// +// if ($BeforeQuestionnaire!= null && $AfterQ == null &&$CalendareDays->count_workout_max > Count($SportForDay)) { +// return response(['view' => 9, 'text' => 'Список тренировок'], 200); +// } +// else if($BeforeQuestionnaire!= null && $AfterQ == null &&$CalendareDays->count_workout_max == Count($SportForDay)){ +// return response(['view' => 10, 'text' => 'Анкета ПОСЛЕ тренировки'], 200); +// } +// else{ +// +// $BeforeQuestionnaireDate = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', '<', $date)->orderBy('date', 'DESC')->first(); +// +// $AfterQuestionnaireDate = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', '<', $date)->where('date', $BeforeQuestionnaireDate->date)->first(); +// $SportForDateOld = SportForDay::where('day', $BeforeQuestionnaireDate->date)->where('finish', 0)->get(); +// $CalendareDaysOld = CalendarDays::where('date', $BeforeQuestionnaireDate->date)->first(); +// +// +// +// +// +// $BeforeQuestionnaireSearch = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->orderBy('date', 'DESC')->first(); +// $AfterQuestionnaireSearch = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $BeforeQuestionnaireSearch->date)->first(); +// +// //Если небыло выполнено ни одног дня +// if ($BeforeQuestionnaire == null && $AfterQuestionnaire == null && $Patient->now_days_sport == 0) { +// return response(['view' => 5, 'text' => 'Нажмите кнопку подтверждения чтобы начать курс'], 200); +// } else if ($BeforeQuestionnaire == null && $AfterQuestionnaire == null && $Patient->now_days_sport > 0) { +// if ($SportForDateOld < $CalendareDaysOld->count_workout_max && $AfterQuestionnaireSearch == null && +// (($Patient->pause == null || $Patient->pause != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->pause))) != $BeforeQuestionnaireSearch->date) || +// ($Patient->block == null || $Patient->block != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-2 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-3 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date))) {//Заполнение анкеты за предыдущий день занятий +// return response(['view' => 6, 'text' => 'Список тренировок которые не закончил пациент за предыдущий день'], 200); +// } else if ($SportForDateOld == $CalendareDaysOld->count_workout_max && $AfterQuestionnaireSearch == null && +// (($Patient->pause == null || $Patient->pause != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->pause))) != $BeforeQuestionnaireSearch->date) || +// ($Patient->block == null || $Patient->block != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-2 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-3 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date))) {//Заполнение анкеты за предыдущий день занятий +// return response(['view' => 7, 'text' => 'Анкета ПОСЛЕ за предыдущий день'], 200); +// } else { +// return response(['view' => 8, 'text' => 'Анкета ДО тренировки'], 200); +// } +// } else if ($BeforeQuestionnaire != null && $AfterQuestionnaire == null && $Patient->now_days_sport > 0 && $SportForDay < $CalendareDays->count_workout_max) { +// return response(['view' => 9, 'text' => 'Список тренировок'], 200); +// } else if ($BeforeQuestionnaire != null && $AfterQuestionnaire == null && $Patient->now_days_sport > 0 && $SportForDay == $CalendareDays->count_workout_max) { +// return response(['view' => 10, 'text' => 'Анкета ПОСЛЕ тренировки'], 200); +// } else if ($BeforeQuestionnaire != null && $AfterQuestionnaire != null && $Patient->now_days_sport > 0 && $SportForDay == $CalendareDays->count_workout_max) { +// return response(['view' => 11, 'text' => 'Комплекс на сегодня вы выполнили, ждем вас завтра'], 200); +// } else { +// return response(['view' => 616.1, 'text' => 'Ошибка системы'], 400); +// } +// } +// } else { +// return response(['view' => 12, 'text' => 'Начало курса. Нажмите кнопку подтверждения чтобы начать курс'], 200); +// } +// +// } +// } else { +// return response(['view' => 2, 'text' => 'Ваш курс окончен. Для дальнейших действий обратитесь к врачу'], 200); +// } +// } else { +// return response(['view' => 1, 'text' => 'Попросите врача добавить вам курс'], 200); +// } +// } else { +// return response(['Такого пациента нету'],); +// } +// } + + + //Функция для вывода нужной карточки на экран + public function VisibleView3() + { + $Patient = Auth::user()->makeHidden(['id']); + $date = date("Y-m-d"); + + if ($Patient != null) { + //Проверка на то, есть ли курс у пациента + if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { + $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->first(); + //$CalendarDays = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('article_sport_for_day','!=',null)->orderBy('id','DESC')->first(); + $SportForDay = SportForDay::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('day', $date)->where('finish', 0)->first(); + $BeforeQuestionnaireToday = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + $AfterQuestionnaireToday = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + + if(($Patient->total_days_sports == $Patient->now_days_sports)&&($SportForDay==null)&&($BeforeQuestionnaireToday!=null)&&($AfterQuestionnaireToday==null)){ + return response(['view' => 4, 'text' => 'Анкета ПОСЛЕ тренировки'], 200); + + } + else{ + if(($Patient->total_days_sports == $Patient->now_days_sports)&&($SportForDay==null)&&($BeforeQuestionnaireToday!=null)&&($AfterQuestionnaireToday!=null)){ + return response(['view' => 2, 'text' => 'Ваш курс окончен. Для дальнейших действий обратитесь к врачу'], 200); + } + else{ + //Проверка на то, закончен ли данный курс + if (($SportPatient->finished == 0) ) { + + //Есть ли блок или пауза на данный момент + if (($Patient->block !== null && $Patient->block !== "" && $Patient->block >= $date) || ($Patient->pause !== null && $Patient->pause !== "" && $Patient->pause >= $date)) { + if ($Patient->block !== null && $Patient->block !== "" && $Patient->block >= $date) { + $blockDate = $Patient->block[8].$Patient->block[9].'.'.$Patient->block[5].$Patient->block[6].'.'.$Patient->block[0].$Patient->block[1].$Patient->block[2].$Patient->block[3]; + + return response(['view' => 9, 'text' => 'Ваш курс заблокирован до ' . $blockDate], 200); + } else if ($Patient->pause !== null && $Patient->pause !== "" && $Patient->pause >= $date) { + $pauseDate = $Patient->pause[8].$Patient->pause[9].'.'.$Patient->pause[5].$Patient->pause[6].'.'.$Patient->pause[0].$Patient->pause[1].$Patient->pause[2].$Patient->pause[3]; + + return response(['view' => 10, 'text' => 'Ваш курс на пауза до ' . $pauseDate], 200); + } + //Если нету паузы на данный момент + } else { + $BeforeQuestionnaire = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); + $AfterQuestionnaire = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); + + //Не было заполнено ни одной анкеты + if ($BeforeQuestionnaire == null && $AfterQuestionnaire == null) { + return response(['view' => 3, 'text' => 'Начало курса. Нажмите кнопку подтверждения чтобы начать курс'], 200); + } //Если была заполнена хотя бы анкета ДО + else if ($BeforeQuestionnaire != null) { + $BeforeQuestionnaireToday = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + $AfterQuestionnaireToday = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + + $SportForDay = SportForDay::where('day', $date)->where('finish', 1)->get(); + $CalendareDays = CalendarDays::where('date', $date)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + //Заполнена ли анкета ДО на сегодня + if ($BeforeQuestionnaireToday == null && $AfterQuestionnaireToday == null) { + $BeforeQuestionnaireDate = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', '<', $date)->orderBy('date', 'DESC')->first(); + $AfterQuestionnaireDate = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', '<', $date)->where('date', $BeforeQuestionnaireDate->date)->first(); + +// //Заполнялась ли анкета ПОСЛЕ за предыдущий день +// if ($AfterQuestionnaireDate == null) { +// +// $BeforeQuestionnaireSearch = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->orderBy('date', 'DESC')->first(); +// $AfterQuestionnaireSearch = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $BeforeQuestionnaireSearch->date)->first(); +// //Были ли паузы или блокировки в эти даты +// if ($AfterQuestionnaireSearch == null && +// (($Patient->pause == null || $Patient->pause != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->pause))) != $BeforeQuestionnaireSearch->date) || +// ($Patient->block == null || $Patient->block != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-2 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-3 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date))) { +// return response(['view' => 7, 'text' => 'Анкета ПОСЛЕ за предыдущий день'], 200); +// } //Если была пауза или блокировка в эти даты +// else { +// return response(['view' => 8, 'text' => 'Анкета ДО тренировки'], 200); +// } +// +// } //Если анкета ПОЛСЕ за предыдущий день присутствует +// else { + return response(['view' => 8, 'text' => 'Анкета ДО тренировки'], 200); + // } + + } //Если заполнена анкета ДО на сегодня, но не заполнена после + else if ($BeforeQuestionnaireToday != null && $AfterQuestionnaireToday == null) { + $SportForDay = SportForDay::where('id_sport_patient', $Patient->id_sport_patient)->where('id_patient', $Patient->id)->where('day', $date)->where('finish', 0)->get(); + // if ($CalendareDays->count_workout_max == $CalendareDays->count_workout_make) { + if (Count($SportForDay) == 0) { + return response(['view' => 4, 'text' => 'Анкета ПОСЛЕ тренировки'], 200); + } else { + return response(['view' => 5, 'text' => 'Список упражнений на сегодня'], 200); + } + } else if ($BeforeQuestionnaireToday != null && $AfterQuestionnaireToday != null) { + return response(['view' => 6, 'text' => 'Тренировки на сегодня выполнены'], 200); + } else { + return response(['view' => 616, 'text' => 'Ошибка системы'], 400); + } + } else { + return response(['view' => 617, 'text' => 'Ошибка системы3'], 400); + } + } + } else { + return response(['view' => 2, 'text' => 'Ваш курс окончен. Для дальнейших действий обратитесь к врачу'], 200); + } + } + } + + + + } else { + return response(['view' => 1, 'text' => 'Попросите врача добавить вам курс'], 200); + } + } else { + return response(['Такого пациента нету'],); + } + } + + //Функция добавления занятий надень при различных условия, то ест сколько пройдено дней, сколько осталось, есть ли блокировка или пауза и т.д. + public function AddCourses() + { + $Patient = Auth::user()->makeHidden(['id']); + $date = date("Y-m-d"); + if ($Patient != null) { + //Проверка на то, есть ли курс у пациента + if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { + $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->first(); + //Проверка на то, закончин ли данный курс + if ($SportPatient->finished == false) { + + if ($Patient->block >= $date) {//Если блок + return response(['view' => 3, 'text' => 'Курс заблокирован до' . $Patient->block], 200); + } else if ($Patient->pause >= $date) {//Если пауза + return response(['view' => 4, 'text' => 'Курс на паузе до' . $Patient->block], 200); + } else { + $totalDaySport = $Patient->total_days_sports;//Всего дней спорта + $nowDaySport = $Patient->now_days_sports;//Пройдено дней + $remainedDaySport = $totalDaySport - $nowDaySport;//Пройдено дней + + $CalendarDays = CalendarDays::where('date', '>=', $date)->where('id_patient', $Patient->id)->get(); + $countCalendar = count($CalendarDays);//Сколько дней пройдено + + $BeforeQuestionnaireDate = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + $AfterQuestionnaireDate = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + + //Проверка на то отправлена ли анкета ДО за сегодня + if ($BeforeQuestionnaireDate != null && $AfterQuestionnaireDate == null) { + //Если равно это первый день + if ($nowDaySport == 0) { + $SportPatient = SportPatient::where('id_patient', $Patient->id)->where('finished', 0)->first(); + $SetsOfSportsActivities = SetsOfSportsActivities::where('id_sports_courses', $SportPatient->id_sports_courses)->where('day', 1)->first(); + $SetOfSportsExercises = SetOfSportsExercises::where('id_sets_of_sports_activities', $SetsOfSportsActivities->id)->get(); + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + $SportForDay = SportForDay::where('day', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + $CalendarDays = CalendarDays::where('date', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD = $CalendarDays; + $CD->article_sport_for_day = $SportForDay->article; + $CD->update(); + return response(['$SetOfSportsExercises' => $SetOfSportsExercises, $CalendarDays], 200); + + } else if ($nowDaySport > 0) { + if ($remainedDaySport <= $countCalendar) { + return response(['view' => 1, '$totalDaySport' => "$totalDaySport", '$nowDaySport' => "$nowDaySport", '$remainedDaySport' => "$remainedDaySport", '$countCalendar' => "$countCalendar", '$CalendarDays' => "$CalendarDays"], 200); + } else { + return response(['view' => 2, '$totalDaySport' => "$totalDaySport", '$nowDaySport' => "$nowDaySport", '$remainedDaySport' => "$remainedDaySport", '$countCalendar' => "$countCalendar", '$CalendarDays' => "$CalendarDays"], 200); + + } + } + } else { + return response(['Отсутствует анкета ДО'], 200); + } + } + } else { + return response(['view' => 2, 'text' => 'Ваш курс окончен. Для дальнейших действий обратитесь к врачу'], 200); + } + } else { + return response(['view' => 1, 'text' => 'Попросите врача добавить вам курс'], 200); + } + } else { + return response(['Такого пациента нету'],); + } + } + + //Функция добавления занятий на текуший день + public function AddCourses2(string $id) + { + $Patient = Patient::where('id', $id)->first(); + $date = date("Y-m-d"); + if ($Patient != null) { + //Проверка на то, есть ли курс у пациента + if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { + $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->first(); + //Проверка на то, добавлялся ли сегодня данный курс + $SportForDay = SportForDay::where('day', $date)->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + if ($SportForDay == null) { + $totalDaySport = $Patient->total_days_sports;//Всего дней спорта + $allDaySport = $Patient->all_days_sports;//Пройдено дней + $nowDaySport = $Patient->now_days_sports;//Пройдено курсов + $remainedDaySport = $totalDaySport - $allDaySport;//Осталось пройти + //Проверка на то, закончен ли данный курс + if ($SportPatient->finished == false && ($totalDaySport != $allDaySport)) { + + $CalendarDays = CalendarDays::where('date', '>=', $date)->where('id_patient', $Patient->id)->get(); + $countCalendar = count($CalendarDays);//Сколько дней пройдено + + $BeforeQuestionnaireDate = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + $AfterQuestionnaireDate = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + + //Проверка на то отправлена ли анкета ДО за сегодня + if ($BeforeQuestionnaireDate != null && $AfterQuestionnaireDate == null) { + + + $SetsOfSportsActivitiesSearchDay = SetsOfSportsActivities::orderBy('id', 'ASC') + ->join('sports_courses', 'sports_courses.id', 'sets_of_sports_activities.id_sports_courses') + ->join('sport_patient', 'sport_patient.id_sports_courses', 'sports_courses.id') + ->select('sets_of_sports_activities.id', 'sets_of_sports_activities.day') + ->distinct() + ->where('sport_patient.id', $Patient->id_sport_patient) + ->get(); + //Проверка на то сколько есть дней курса, то есть если всего один день в курсе, то его и выдаем, а иначе идем по дням + if (Count($SetsOfSportsActivitiesSearchDay) == 1) { + $SportPatient = SportPatient::where('id_patient', $Patient->id)->where('finished', 0)->first(); + $SetsOfSportsActivities = SetsOfSportsActivities::where('id_sports_courses', $SportPatient->id_sports_courses)->where('day', 1)->first(); + //$SetOfSportsExercises = SetOfSportsExercises::where('id_sets_of_sports_activities', $SetsOfSportsActivities->id)->get(); + + $CoursesSportEdit = CoursesSportEdit::orderBy('id', 'ASC')->where('id_sport_patient', $Patient->id_sport_patient)->get(); + + + $result = []; + + $number = 0; + + if (Count($CoursesSportEdit) == 0) { + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + //->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') + ->distinct() + //->where('sport_patient.id', $Patient->id_sport_patient) + ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) + ->get(); + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + } else { + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + ->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') + ->distinct() + //->where('sport_patient.id', $Patient->id_sport_patient) + ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) + ->get(); + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + } + + $SportForDay = SportForDay::where('day', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + $CalendarDays = CalendarDays::where('date', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD = $CalendarDays; + $CD->article_sport_for_day = $SportForDay->article; + $CD->count_workout_max = count($SetOfSportsExercises); + $CD->update(); + return response(['message', 'Тренировка на сегодня добавлена'], 200); + } else { + + + //Если равно это первый день + if ($nowDaySport == 1) { + $SportPatient = SportPatient::where('id_patient', $Patient->id)->where('finished', 0)->first(); + $SetsOfSportsActivities = SetsOfSportsActivities::where('id_sports_courses', $SportPatient->id_sports_courses)->where('day', 1)->first(); + //$SetOfSportsExercises = SetOfSportsExercises::where('id_sets_of_sports_activities', $SetsOfSportsActivities->id)->get(); + + $CoursesSportEdit = CoursesSportEdit::orderBy('id', 'ASC')->where('id_sport_patient', $Patient->id_sport_patient)->get(); + + if (Count($CoursesSportEdit) == 0) { + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + //->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') + ->distinct() + //->where('sport_patient.id', $Patient->id_sport_patient) + ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) + ->get(); + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + } else { + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + ->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') + ->distinct() + //->where('sport_patient.id', $Patient->id_sport_patient) + ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) + ->get(); + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + } + $SportForDay = SportForDay::where('day', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + $CalendarDays = CalendarDays::where('date', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD = $CalendarDays; + $CD->article_sport_for_day = $SportForDay->article; + $CD->count_workout_max = Count($SetOfSportsExercises); + $CD->update(); + return response(['message', 'Тренировка на сегодня добавлена'], 200); + + } else if ($nowDaySport > 1) { + $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->where('id_patient', $Patient->id)->first(); + $SetsOfSportsActivitiesCours = SetsOfSportsActivities::where('id_sports_courses', $SportPatient->id_sports_courses)->first(); + //Есть ли такой курс + if ($SetsOfSportsActivitiesCours != null) { + $SetsOfSportsActivities = SetsOfSportsActivities::where('id_sports_courses', $SportPatient->id_sports_courses)->where('day', $nowDaySport)->first(); + //Есть ли такой день + if ($SetsOfSportsActivities != null) { + + $CoursesSportEdit = CoursesSportEdit::orderBy('id', 'ASC')->where('id_sport_patient', $Patient->id_sport_patient)->get(); + + if (Count($CoursesSportEdit) == 0) { + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + //->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') + ->distinct() + //->where('sport_patient.id', $Patient->id_sport_patient) + ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) + ->get(); + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + } else { + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + ->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') + ->distinct() + //->where('sport_patient.id', $Patient->id_sport_patient) + ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) + ->get(); + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + } + $SportForDay = SportForDay::where('day', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + $CalendarDays = CalendarDays::where('date', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD = $CalendarDays; + $CD->article_sport_for_day = $SportForDay->article; + $CD->count_workout_max = count($SetOfSportsExercises); + $CD->update(); + // return response(['$SetOfSportsExercises' => $SetOfSportsExercises, $CalendarDays], 200); + return response(['message', 'Тренировка на сегодня добавлена'], 200); + } else { + $SetsOfSportsActivities = SetsOfSportsActivities::where('id_sports_courses', $SportPatient->id_sports_courses)->orderBy('day', 'DESC')->first(); + $CoursesSportEdit = CoursesSportEdit::orderBy('id', 'ASC')->where('id_sport_patient', $Patient->id_sport_patient)->get(); + + if (Count($CoursesSportEdit) == 0) { + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + //->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') + ->distinct() + //->where('sport_patient.id', $Patient->id_sport_patient) + ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) + ->get(); + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + } else { + $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') + ->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') + ->distinct() + //->where('sport_patient.id', $Patient->id_sport_patient) + ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) + ->get(); + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + } + $SportForDay = SportForDay::where('day', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + $CalendarDays = CalendarDays::where('date', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $CD = $CalendarDays; + $CD->article_sport_for_day = $SportForDay->article; + $CD->count_workout_max = count($SetOfSportsExercises); + $CD->update(); + return response(['message', 'Тренировка на сегодня добавлена'], 200); + } + + } else { + return response(['text' => 'Такого курса нету'], 200); + } + + } else { + return response(['Отсутствует анкета ДО 1'], 200); + } + } + } else { + return response(['Отсутствует анкета ДО 2'], 200); + } + } else { + return response(['view' => 2, 'text' => 'Ваш курс окончен. Для дальнейших действий обратитесь к врачу'], 200); + } + } else { + return response(['view' => 123, 'text' => 'На сегодня вы уже добавили задания на данный курс'], 200); + + } + } else { + return response(['view' => 1, 'text' => 'Попросите врача добавить вам курс'], 200); + } + } else { + return response(['Такого пациента нету'],); + } + } + + function CoutSportCourses() + { + $Patient = Auth::user()->makeHidden(['id']); + $date = date("Y-m-d"); + if ($Patient != null) { + //Проверка на то, есть ли курс у пациента + if ($Patient->id_sport_patient != null || $Patient->id_sport_patient != "") { + $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->first(); + //Проверка на то, закончен ли данный курс + if ($SportPatient->finished == false) { + $SportForDay = SportForDay::where('day', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->get(); + return response(['SportForDay' => $SportForDay], 200); + } else { + return response(['view' => 2, 'text' => 'Ваш курс окончен. Для дальнейших действий обратитесь к врачу'], 200); + } + } else { + return response(['view' => 1, 'text' => 'Попросите врача добавить вам курс'], 200); + } + } else { + return response(['message' => 'Такого пациента нету'],); + } + } + + function AddBeforeQuestionnaire2(Request $request) + { + $error = Validator::make($request->all(), [ + 'one' => 'required|numeric|max:10|min:0', + 'two' => 'required|numeric|max:1|min:0', + 'three' => 'required|numeric|max:1|min:0', + 'four' => 'required|numeric|max:1|min:0', + 'five' => 'required|numeric|max:1|min:0', + 'six' => 'required|numeric|max:1|min:0', + 'seven' => 'required|numeric|max:1|min:0', + 'eight' => 'required|numeric|max:1|min:0', + 'nine' => 'required|numeric|max:1|min:0', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Auth::user()->makeHidden(['id']); + + if ($Patient->id_sport_patient != null && $Patient->finished == 0) { + // return response(['message' => 'Анкета ПОСЛПЕ за сегодня уже заполненаassdasd1243'], 200); + + //Проверка количества дней в календаре и их изменение + $this->AddandClearDayPatient($Patient->id); + + //Добовлени дня в календарь + if( $this->AddDayCalendare($Patient->id)){ + // return $this->AddandClearDayPatient(); + + $date = date("Y-m-d"); + $BeforeQuestionnaireNEW = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); + $BeforeQuestionnaireDate = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + + $pause = $Patient->pause; + $block = $Patient->block; + //Был ли блок или пауза + if (($Patient->block == null && $Patient->pause == null) || ($pause < $date && $block < $date) || ($pause < $date && $block == null) || ($pause == null && $block < $date)) {//Если да + + //Если первое заполнение анкеты + if ($BeforeQuestionnaireNEW == null) { +// //Создание списка на n дней в таблице calendar_days +// for ($i = 0; $i < $Patient->total_days_sports; $i++) {//Циул на количество дней +// $date = date('Y-m-d', strtotime("$i day")); +// CalendarDays::create([ +// 'id_patient' => $Patient->id, +// 'day' => $i + 1, +// //'date'=>date('d-m-Y',strtotime($date)), +// 'id_sport_patient' => $Patient->id_sport_patient, +// 'date' => $date, +// ]); +// } + + //Заполнение анкеты + $BQ = BeforeQuestionnaire::create([ + 'id_sport_patient' => $Patient->id_sport_patient, + 'date' => date("Y-m-d"), + 'one' => $request->one, + 'two' => $request->two, + 'three' => $request->three, + 'four' => $request->four, + 'five' => $request->five, + 'six' => $request->six, + 'seven' => $request->seven, + 'eight' => $request->eight, + 'nine' => $request->nine, + ]); + //Увеличения дня на 1 и задания для следующего дня + $pat2 = $Patient; + $pat2->now_days_sports = $Patient->now_days_sports + 1; + $pat2->all_days_sports = $Patient->all_days_sports + 1; + $pat2->update(); + + + //Подтверждаем в календарном дне, что анкета ДО заполнена + $CalendarDays = CalendarDays::where('id_patient', $Patient->id)->where('date', date("Y-m-d"))->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $BeforeQuestionnaire = BeforeQuestionnaire::where('date', date("Y-m-d"))->where('id_sport_patient', $Patient->id_sport_patient)->first(); + if ($CalendarDays != null) { + $CD = $CalendarDays; + $CD->id_before_questionnaire = $BeforeQuestionnaire->id; + $CD->update(); + + //ПРоверка на блок + if ($request->one >= 6) { + //Блокировка + $pat = $Patient; + $pat->block = date('Y-m-d', strtotime("3 day")); + $pat->update(); + $CD->block = date('Y-m-d', strtotime("3 day")); + $CD->update(); + PatientController::AddCourses2($Patient->id); + } //Проверка на паузу + else if ($request->four == "1" || $request->five == "1" || $request->six == "1" || $request->seven == "1" || $request->nine == "1") { + //Пауза + $pat = $Patient; + $pat->pause = date('Y-m-d', strtotime("1 day")); + $pat->update(); + $CD->pause = date('Y-m-d', strtotime("1 day")); + $CD->update(); + + PatientController::AddCourses2($Patient->id); + } else { + PatientController::AddCourses2($Patient->id); + } + + return response(['message' => 'Анкета ДО добавлена', $CalendarDays], 200); + } else { + return response(['message' => 'Ошибка системы', $CalendarDays], 401); + } + } else { + //Заполнена ли анкета ДО на сегодня + if ($BeforeQuestionnaireDate == null) { + $BeforeQuestionnaire = BeforeQuestionnaire::where('date', $date)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $BeforeQuestionnaireDateLast = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->get(); + + $dateBefSearch = $BeforeQuestionnaireDateLast[count($BeforeQuestionnaireDateLast) - 1]->date; + + //$AfterQuestionnaire = AfterQuestionnaire::where('date', $dateBefSearch)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $BeforeQuestionnaireSearch = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->orderBy('date', 'DESC')->first(); + //$AfterQuestionnaireSearch = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $BeforeQuestionnaireSearch->date)->first(); +////////////////////////////////////////////////////////////// +/// ///////////////////////////////////////////////////////// +/// //////////////////////////////////////////////////////// +/// ////////////////////////////////////////////////////////// +/// ////////////////////////////////////////////////////// + //Заполнена ли анкета ПОСЛЕ за вчераи небыло ли блока в это время + if ((($Patient->pause == null || $Patient->pause != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->pause))) != $BeforeQuestionnaireSearch->date) || + ($Patient->block == null || $Patient->block != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-2 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-3 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date))) { + //Заполнение анкеты + $BQ = BeforeQuestionnaire::create([ + 'id_sport_patient' => $Patient->id_sport_patient, + 'date' => $date, + 'one' => $request->one, + 'two' => $request->two, + 'three' => $request->three, + 'four' => $request->four, + 'five' => $request->five, + 'six' => $request->six, + 'seven' => $request->seven, + 'eight' => $request->eight, + 'nine' => $request->nine, + ]); + //Увеличения дня на 1 и задания для следующего дня + $pat2 = $Patient; + $pat2->now_days_sports = $Patient->now_days_sports + 1; + $pat2->all_days_sports = $Patient->all_days_sports + 1; + $pat2->update(); + + + //Подтверждаем в календарном дне, что анкета ДО заполнена + $CalendarDays = CalendarDays::where('id_patient', $Patient->id)->where('date', $date)->where('id_sport_patient', $Patient->id_sport_patient)->orderBy('day', 'DESC')->first(); + $BeforeQuestionnaire = BeforeQuestionnaire::where('date', $date)->first(); + if ($CalendarDays != null) { + $CD = $CalendarDays; + $CD->id_before_questionnaire = $BeforeQuestionnaire->id; + $CD->update(); + + //ПРоверка на блок + if ($request->one >= 6) { + //Блокировка + $pat = $Patient; + $pat->block = date('Y-m-d', strtotime("3 day")); + $pat->update(); + $CD->block = date('Y-m-d', strtotime("3 day")); + $CD->update(); + if ($Patient->all_days_sports > 1) { + //Уменьшние задания для следующего дня + $pat2 = $Patient; + $pat2->all_days_sports = $Patient->all_days_sports - 1; + $pat2->update(); + } + PatientController::AddCourses2($Patient->id); + } //Проверка на паузу + else if ($request->four == "1" || $request->five == "1" || $request->six == "1" || $request->seven == "1" || $request->nine == "1") { + //Пауза + $pat = $Patient; + $pat->pause = date('Y-m-d', strtotime("1 day")); + $pat->update(); + $CD->pause = date('Y-m-d', strtotime("1 day")); + $CD->update(); + if ($Patient->all_days_sports > 1) { + //Увеличения задания для следующего дня + $pat2 = $Patient; + + $pat2->all_days_sports = $Patient->all_days_sports - 1; + $pat2->update(); + } + PatientController::AddCourses2($Patient->id); + } else { + PatientController::AddCourses2($Patient->id); + } + return response(['message' => 'Анкета ДО добавлена'], 200); + } else { + return response(['message' => 'Ошибка системы'], 401); + } + } else { + return response(['message' => 'Вам сначала нужно заполнить анкету ПОСЛЕ за вчерашний день'], 401); + } + } else { + return response(['message' => 'Анкета ДО уже заполнена на сегодня'], 401); + } + } + } else { + return response(['message' => 'У вас есть или блок или пауза, поэтому вам ограничен временно доступ'], 401); + } + } + else { + return response(['message' => 'Ошибка системы2'], 401); + } + + + } else { + return response(['message' => 'У вас нету курса, обратитесь к врачу, чтобы он добавил вам курс'], 401); + } + } + } + + + + + + + //Подтверждение анкеты ПОСЛЕ, после увеличится количество выполненных дней и подтверждения анкет на определенный день + public function AddAfterQuestionnaire2(Request $request) + { + //Сегодняшняя дата + $date = date("Y-m-d"); + + $error = Validator::make($request->all(), [ + 'one' => 'required|numeric|max:10|min:0', + 'two' => 'required|numeric|max:1|min:0', + 'three' => 'required|numeric|max:1|min:0', + 'four' => 'required|numeric|max:1|min:0', + 'five' => 'required|numeric|max:1|min:0', + 'six' => 'required|numeric|max:1|min:0', + 'seven' => 'required|numeric|max:1|min:0', + 'eight' => 'required|numeric|max:1|min:0', + 'nine' => 'required|numeric|max:1|min:0', + 'ten' => 'required|numeric|max:1|min:0', + 'eleven' => 'required|numeric|max:1|min:0', + 'twelve' => 'required|numeric|max:1|min:0', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Auth::user()->makeHidden(['id']); + if ($Patient != null) { + //Проверка на то, есть ли курс у пациента + if ($Patient->id_sport_patient != null && $Patient->finished == 0) { + //Был ли блок или пауза + $pause = $Patient->pause; + $block = $Patient->block; + if (($Patient->block == null && $Patient->pause == null) || ($pause < $date && $block < $date) || ($pause < $date && $block == null) || ($pause == null && $block < $date)) {//Если да + $date = date("Y-m-d"); + $BeforeQuestionnaireNEW = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->first(); + $BeforeQuestionnaireDate = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + $AfterQuestionnaireDate = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $date)->first(); + + //Проверка на то отправлялась ли хоть одна анкета ДО + if ($BeforeQuestionnaireNEW != null) { + //Проверка на то заполнялась ли анкета ДО за сегодня + if ($AfterQuestionnaireDate == null) { + + //Проверка количества дней в календаре и их изменение + //$this->AddandClearDayPatient($Patient->id); + + //Проверка на то заполнялась ли анкета ДО за сегодня + if ($BeforeQuestionnaireDate == null) { + + $BeforeQuestionnaireSearch = BeforeQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->orderBy('date', 'DESC')->first(); + $AfterQuestionnaireSearch = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->where('date', $BeforeQuestionnaireSearch->date)->first(); + //Проверка на то отправлялась ли анкета за вчера + if ($AfterQuestionnaireSearch != null && (($Patient->pause == null || $Patient->pause != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->pause))) != $BeforeQuestionnaireSearch->date) || + ($Patient->block == null || $Patient->block != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-1 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-2 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date || date('Y-m-d', strtotime('-3 day', strtotime($Patient->block))) != $BeforeQuestionnaireSearch->date))) { + return response(['message' => 'У вас не заполнена анкета ДО за сегодня'], 401); + } else { + + $AQ = AfterQuestionnaire::create([ + 'id_sport_patient' => $Patient->id_sport_patient, + 'date' => $BeforeQuestionnaireSearch->date, + 'one' => $request->one, + 'two' => $request->two, + 'three' => $request->three, + 'four' => $request->four, + 'five' => $request->five, + 'six' => $request->six, + 'seven' => $request->seven, + 'eight' => $request->eight, + 'nine' => $request->nine, + 'ten' => $request->ten, + 'eleven' => $request->eleven, + 'twelve' => $request->twelve, + ]); + + + $AfterQuestionnaireUpdate = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->orderBy('date', 'DESC')->first(); + + //Подтверждаем в календарном дне, что анкета ПОСЛЕ заполнена + $CalendarDays = CalendarDays::where('date', $AfterQuestionnaireUpdate->date)->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + $pat = $CalendarDays; + $pat->id_after_questionnaire = $AfterQuestionnaireUpdate->id; + $pat->update(); + + + //ПРоверка на блок + if ($request->nine == "1") { + //Блокировка + $pat = $Patient; + $pat->block = date('Y-m-d', strtotime("3 day")); + $pat->update(); + if ($Patient->all_days_sports > 1) { + //Увеличения задания для следующего дня + $pat2 = $Patient; + $pat2->all_days_sports = $Patient->all_days_sports - 1; + $pat2->update(); + } + } //Проверка на паузу + else if ($request->one >= "6" || $request->three == "0" || $request->six == "1" || $request->eight == "1" || $request->eleven == "1") { + //Пауза + $pat = $Patient; + $pat->pause = date('Y-m-d', strtotime("1 day")); + $pat->update(); + if ($Patient->all_days_sports > 1) { + //Увеличения задания для следующего дня + $pat2 = $Patient; + $pat2->all_days_sports = $Patient->all_days_sports - 1; + $pat2->update(); + } + } else { + + //Увеличения задания для следующего дня +// $pat2 = $Patient; +// $pat2->all_days_sports = $Patient->all_days_sports + 1; +// $pat2->update(); + } + + + + return response(['message' => 'Анкета ПОСЛЕ за предыдуший день заполнена'], 200); + } + } else { + //$SportForDay = SportForDay::where('finish', 0)->where('day', $date)->first(); + //Проверка на то все ли задания были выполнены, если нет, то нельзя отправить отчет + // if ($SportForDay == null) { + $AQ = AfterQuestionnaire::create([ + 'id_sport_patient' => $Patient->id_sport_patient, + 'date' => $date, + 'one' => $request->one, + 'two' => $request->two, + 'three' => $request->three, + 'four' => $request->four, + 'five' => $request->five, + 'six' => $request->six, + 'seven' => $request->seven, + 'eight' => $request->eight, + 'nine' => $request->nine, + 'ten' => $request->ten, + 'eleven' => $request->eleven, + 'twelve' => $request->twelve, + ]); + + + $AfterQuestionnaireUpdate = AfterQuestionnaire::where('id_sport_patient', $Patient->id_sport_patient)->orderBy('date', 'DESC')->first(); + + //Подтверждаем в календарном дне, что анкета ПОСЛЕ заполнена + $CalendarDays = CalendarDays::where('date', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + $pat = $CalendarDays; + $pat->id_after_questionnaire = $AfterQuestionnaireUpdate->id; + $pat->update(); + + //Проверка на блок + if ($request->ten == 1) { + //Блокировка + $pat = $Patient; + $pat->block = date('Y-m-d', strtotime("3 day")); + $pat->update(); + if ($Patient->all_days_sports > 1) { + //Увеличения задания для следующего дня + $pat2 = $Patient; + $pat2->all_days_sports = $Patient->all_days_sports - 1; + $pat2->update(); + } + } //Проверка на паузу + else if ($request->one >= "6" || $request->three == "0" || $request->six == "1" || $request->eight == "1" || $request->eleven == "1") { + //Пауза + $pat = $Patient; + $pat->pause = date('Y-m-d', strtotime("1 day")); + $pat->update(); + if ($Patient->all_days_sports > 1) { + //Увеличения задания для следующего дня + $pat2 = $Patient; + $pat2->all_days_sports = $Patient->all_days_sports - 1; + $pat2->update(); + } + } else { + //Увеличения задания для следующего дня +// $pat2 = $Patient; +// $pat2->all_days_sports = $Patient->all_days_sports + 1; +// $pat2->update(); + } + + + + return response(['message' => 'Анкета ПОСЛПЕ заполнена'], 200); + //} else { + // return response(['message' => 'Не все задания были заполнена'], 200); + //} + } + } else { + return response(['message' => 'Анкета ПОСЛПЕ за сегодня уже заполнена'], 200); + } + } else { + return response(['message' => 'У вас не заполнена первая анкета ДО'], 401); + } + } else { + return response(['message' => 'У вас есть или блок или пауза, поэтому вам ограничен временно доступ'], 401); + } + } else { + return response(['message' => 'У вас нету курса, обратитесь к врачу чтобы он добавил вам курс'], 401); + } + } else { + return response(['message' => 'Такого пациента нету'], 401); + } + } + } + + + //Добовления дня в календарь + function AddDayCalendare(string $id) + { + $Patient = Patient::where('id', $id)->first(); + // $Patient = Auth::user()->makeHidden(['id']); + $CalendarDays = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('date', date('Y-m-d'))->first();//Проверяем есть ли такая дата в календаре + $CalendarDaysAdd = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->orderBy('id','DESC')->first();//Проверяем есть ли такая дата в календаре + + if($CalendarDays==null){ + CalendarDays::create([ + 'id_patient' => $Patient->id, + 'day' => $CalendarDaysAdd->day + 1, + 'date' => date('Y-m-d', strtotime("+1 day", strtotime($CalendarDaysAdd->date))), + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + return response(['message' => 'День в календарь добавлен'], 200); + } + else{ + return response(['message' => 'День в календарь уже добавлен'], 200); + + } + + + } + + //Функция добавляющая дни в календарь + function AddandClearDayPatient(string $id) + { + $Patient = Patient::where('id', $id)->first(); + $CalendarDaysAdd = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('date', '>=', date('Y-m-d'))->get(); + $dateMax = $Patient->total_days_sports - $Patient->now_days_sports; + $CoutCD = Count($CalendarDaysAdd); + if ($dateMax != $CoutCD) { + if ($dateMax < $CoutCD) { + $max = ($CoutCD - $dateMax); + for ($i = 1; $i < $max; $i++) { + CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('date', '>', date('Y-m-d'))->orderBy('date', 'DESC')->first()->delete(); + } + } else { + $max = ($dateMax - $CoutCD)+1; + $CalendarDays = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('date', '>', date('Y-m-d'))->orderBy('date', 'DESC')->first(); + for ($i = 1; $i < $max; $i++) { + CalendarDays::create([ + 'id_patient' => $Patient->id, + 'day' => $CalendarDays->day + $i, + 'date' => date('Y-m-d', strtotime("+$i day", strtotime($CalendarDays->date))), + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + } + return response("CoutCD - $CoutCD | dateMax - $dateMax | Patient->total_days_sports - $Patient->total_days_sports | Patient->now_days_sports - $Patient->now_days_sports", 200); + + } + else{ + return response("CoutCD - $CoutCD | dateMax - $dateMax | Patient->total_days_sports - $Patient->total_days_sports | Patient->now_days_sports - $Patient->now_days_sports", 200); + + } + } + + +// function asdasdas(){ +// $Patient = Patient::where('id', 17)->first(); +// +// $CalendarDaysAdd = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('date', '=', date('Y-m-d'))->get(); +// +// $dateMax = $Patient->total_days_sports - $Patient->now_days_sports; +// $CoutCD = 12; +// $max = $CoutCD - $dateMax; +//// for ($i = 1; $i < $max; $i++) { +//// CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->where('date', '>=', date('Y-m-d'))->orderBy('date', 'DESC')->first()->delete(); +//// } +// return response($max, 200); +// +// } + + //Вывода данных для списка в календарь + function PatientCalendareDay() + { + $Patient = Auth::user()->makeHidden(['id']); + if ($Patient != null) { + if ($Patient->id_sport_patient != null && $Patient->finished == 0) { + $Calendare = CalendarDays::where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->distinct()->orderBy('id', 'ASC')->get(); + if ($Calendare != null) { + return response(["сalendare" => $Calendare], 200); + } else { + return response(['message' => 'Данные отсутсвуют'], 401); + } + } else { + return response(['message' => 'У вас нету курса, обратитесь к врачу чтобы он добавил вам курс'], 401); + } + } else { + return response(['message' => 'Такого пациента нету'], 401); + } + } + + + //Вывода данных для одного определенного упражнения + function patientDaySport(Request $request) + { + $Patient = Auth::user()->makeHidden(['id']); + $error = Validator::make($request->all(), [ + 'id' => 'required', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + + } + + } + + + function CheckTokenPatient() + { + $User = Auth::user(); + if ($User != null) { + return response(['status' => "300"], 200); + } else { + return response(['status' => "600"], 200); + } + } + + + //Список упражнений на сегодня + function GetSportDay() + { + $Patient = Auth::user()->makeHidden(['id']); + + if ($Patient != null) { + if ($Patient->id_sport_patient != null && $Patient->finished == 0) { + $date = date("Y-m-d"); + $SportForDay = SportForDay::where('day', $date)->where('id_sport_patient', $Patient->id_sport_patient)->orderBy('finish', 'ASC')->get(); + $number = 0; + $result = []; + for ($i = 0; $i != Count($SportForDay); $i++) { + $number++; + $SportTasks = SportTasks::where('id', $SportForDay[$i]->id_sports_tasks)->first(); + $search_sport = [ + 'number' => $number, + 'id' => $SportForDay[$i]->id, + 'article' => $SportForDay[$i]->article, + 'day' => $SportForDay[$i]->day, + 'category' => $SportTasks->article_image, + 'id_patient' => $SportForDay[$i]->id_patient, + 'id_sports_tasks' => $SportForDay[$i]->id_sports_tasks, + 'id_sport_patient' => $SportForDay[$i]->id_sport_patient, + 'finish' => $SportForDay[$i]->finish, + 'created_at' => $SportForDay[$i]->created_at, + 'updated_at' => $SportForDay[$i]->updated_at, + ]; + array_push($result, $search_sport); + } + return response(['sport_for_day' => $result], 200); + } else { + return response(['message' => 'У вас нету курса, обратитесь к врачу чтобы он добавил вам курс'], 401); + } + } else { + return response(['message' => 'Такого пациента нету'], 401); + } + } + + function GetSportDayOne(Request $request) + { + $Patient = Auth::user()->makeHidden(['id']); + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + if ($Patient != null) { + if ($Patient->id_sport_patient != null && $Patient->finished == 0) { + $date = date("Y-m-d"); + //$CalendarDays = CalendarDays::where('date', $date)->where('id_sport_patient', $Patient->id_sport_patient)->get(); + $SportForDay = SportForDay::where('id', $request->id)->first(); + $SportTasks = SportTasks::where('id', $SportForDay->id_sports_tasks)->first(); + $Image = Image::where('article', $SportTasks->article_image)->get(); + $search_sport = [ + 'id' => $SportTasks->id, + 'name' => $SportTasks->name, + 'description' => $SportTasks->description, + 'count' => $SportTasks->count, + 'image_url' => $Image, + 'category' => $Image[0]->article[0], + 'finish' => $SportForDay->finish, + 'created_at' => $SportTasks->created_at, + 'updated_at' => $SportTasks->updated_at, + ]; + + return response($search_sport, 200); + + } else { + return response(['message' => 'У вас нету курса, обратитесь к врачу чтобы он добавил вам курс'], 401); + } + } else { + return response(['message' => 'Такого пациента нету'], 401); + } + } + } + +// function asddsasdasad(){ +// $Patient = Auth::user()->makeHidden(['id']); +// $SportPatient = SportPatient::where('id', $Patient->id_sport_patient)->where('id_patient', $Patient->id)->first(); +// $nowDaySport = $Patient->now_days_sports;//Пройдено курсов +// +// $CoursesSportEdit = CoursesSportEdit::orderBy('id', 'ASC')->get(); +// $SetsOfSportsActivities = SetsOfSportsActivities::where('id_sports_courses', $SportPatient->id_sports_courses)->where('day', $nowDaySport)->first(); +// $SetOfSportsExercises = DB::table('set_of_sports_exercises')->orderBy('id', 'ASC') +// ->join('courses_sport_edit', 'set_of_sports_exercises.id_sports_tasks', '!=', 'courses_sport_edit.id_sports_tasks') +// ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') +// ->distinct() +// //->where('sport_patient.id', $Patient->id_sport_patient) +// ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) +// ->get(); +// $result = []; +// +// $number = 0; +// for ($i = 0; $i != Count($SetOfSportsExercises); $i++) { +// $res = 0; +// for ($j = 0; $j != Count($CoursesSportEdit); $j++) { +// if ($SetOfSportsExercises[$i]->id_sports_tasks != $CoursesSportEdit[$j]->id_sports_tasks) { +// $res++; +// } +// } +// if ($res == Count($CoursesSportEdit)) { +// $number++; +// $search_sport = [ +// 'number' => $number, +// 'id' => $SetOfSportsExercises[$i]->id, +// 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, +// 'id_sets_of_sports_activities' => $SetOfSportsExercises[$i]->id_sets_of_sports_activities, +// 'created_at' => $SetOfSportsExercises[$i]->created_at, +// 'updated_at' => $SetOfSportsExercises[$i]->updated_at, +// ]; +// array_push($result, $search_sport); +// } +// } +// +// return response($result, 200); +// } + + + function AddSportCheck(Request $request) + { + $Patient = Auth::user()->makeHidden(['id']); + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + 'check' => 'required|numeric|max:2|min:1', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + if ($Patient != null) { + if ($Patient->id_sport_patient != null && $Patient->finished == 0) { + + $SportForDay = SportForDay::where('id', $request->id)->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); + $SFD = $SportForDay; + if ($SportForDay->finish == 0) { + if ($request->check == 1) { + $SFD->finish = $request->check; + $SFD->update(); + return response(['message' => 'Упражнение выполнено'], 200); + } else if ($request->check == 2) { + $SFD->finish = $request->check; + $SFD->update(); + return response(['message' => 'Упражнение пропущено'], 200); + } else { + return response(['message' => 'Ошибка 124'], 200); + } + } else { + return response(['message' => 'Упражнение уже было пройдено'], 200); + } + + + } else { + return response(['message' => 'У вас нету курса, обратитесь к врачу чтобы он добавил вам курс'], 401); + } + } else { + return response(['message' => 'Такого пациента нету'], 401); + } + } + } + + function ProgressPatientCourses() + { + $Patient = Auth::user()->makeHidden(['id']); + + if ($Patient != null) { + if ($Patient->id_sport_patient != null && $Patient->finished == 0) { + + $SportForDay = SportForDay::select('day') + ->Count('day') + ->where('id_patient', $Patient->id) + ->where('id_sport_patient', $Patient->id_sport_patient) + ->orderBy('day', 'ASC') + ->groupBy('day') + ->get(); + + $result = []; + $result1 = []; + $number = 0; + for ($i = 0; $i != Count($SportForDay); $i++) { + $SportForDayCheck = SportForDay::where('day', $SportForDay[$i]->day)->get(); + $check_1 = 0; + $check_0 = 0; + $count_workout_max = 0; + $number++; + for ($j = 0; $j != Count($SportForDayCheck); $j++) { + $count_workout_max++; + + if ($SportForDayCheck[$j]->finish == 1) { + $check_1++; + } + if ($SportForDayCheck[$j]->finish == 0) { + $check_0++; + } + + } + $search_check = [ + 'number' => $number, + 'id' => $SportForDayCheck[$i]->id, + 'count_workout_max' => $count_workout_max, + 'day' => $SportForDayCheck[$i]->day, + 'count' => $check_1, + 'finish' => $check_0 + ]; + array_push($result, $search_check); + } + + return response(['search_check_sport' => $result], 200); + + } else { + return response(['message' => 'У вас нету курса, обратитесь к врачу чтобы он добавил вам курс'], 401); + } + } else { + return response(['message' => 'Такого пациента нету'], 401); + } + } + + + //Вывод новых необработанных заявлений + public function GetAppealsPatientNew() + { + $User = Auth::user(); + if ($User != null) { + $Appeals = AppealsPatient::where('check', 0)->where('id_patient', $User->id)->first(); + $result = []; + $number = 0; + if ($Appeals != null) { + $AppealsList = AppealsPatient::where('check', 0)->where('id_patient', $User->id)->get(); + for ($i = 0; $i != Count($AppealsList); $i++) { + $Doctor = Doctor::where('id', $AppealsList[$i]->id_doctor)->first(); + $number = $number + 1; + $search_check = [ + 'number' => $number, + 'id' => $AppealsList[$i]->id, + 'text' => $AppealsList[$i]->text, + 'id_patient' => $AppealsList[$i]->id_patient, + 'id_doctor' => $AppealsList[$i]->id_doctor, + 'check' => $AppealsList[$i]->check, + 'login' => $Doctor->login, + 'created_at' => $AppealsList[$i]->created_at, + 'updated_at' => $AppealsList[$i]->updated_at, + ]; + array_push($result, $search_check); + } + return response(['appeals_new' => $result], 200); + } else { + return response(['appeals_new' => null], 200); + } + + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Вывод новых обработанных заявлений + public function GetAppealsPatientOld() + { + $User = Auth::user(); + if ($User != null) { + $Appeals = AppealsPatient::where('check', 1)->where('id_patient', $User->id)->first(); + $result = []; + $number = 0; + if ($Appeals != null) { + $AppealsList = AppealsPatient::where('check', 1)->where('id_patient', $User->id)->get(); + for ($i = 0; $i != Count($AppealsList); $i++) { + $Doctor = Doctor::where('id', $AppealsList[$i]->id_doctor)->first(); + $number = $number + 1; + $search_check = [ + 'number' => $number, + 'id' => $AppealsList[$i]->id, + 'text' => $AppealsList[$i]->text, + 'id_patient' => $AppealsList[$i]->id_patient, + 'id_doctor' => $AppealsList[$i]->id_doctor, + 'check' => $AppealsList[$i]->check, + 'login' => $Doctor->login, + 'created_at' => $AppealsList[$i]->created_at, + 'updated_at' => $AppealsList[$i]->updated_at, + ]; + array_push($result, $search_check); + } + return response(['appeals_old' => $result], 200); + } else { + return response(['appeals_old' => null], 200); + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Создание сообщения для пациента + public function AddMessagePatient(Request $request) + { + $User = Auth::user(); + if ($User != null) { + $error = Validator::make($request->all(), [ + 'text' => 'required|string|max:1000|min:1', + ]); + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Doctor = Doctor::where('id', $User->id_doctor)->first(); + if ($Doctor != null) { + AppealsDoctor::create([ + 'text' => $request->text, + 'id_patient' => $User->id, + 'id_doctor' => $Doctor->id, + ]); + return response(['message' => 'Сообщение отправлено'], 200); + } else { + return response(['message' => 'Ошибка, такого врача нету'], 400); + } + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Создание сообщения для пациента + public function UpdateMessagePatient(Request $request) + { + $User = Auth::user(); + if ($User != null) { + $error = Validator::make($request->all(), [ + 'id' => 'required|numeric|max:10000|min:1', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } else { + $Patient = Patient::where('id', $User->id)->first(); + $Doctor = Doctor::where('id', $Patient->id_doctor)->first(); + + if ($Doctor != null) { + $AppealsDoctor = AppealsPatient::where('id', $request->id)->where('check', 0)->first(); + if ($AppealsDoctor != null) { + if ($AppealsDoctor->check == 0) { + $AP = $AppealsDoctor; + $AP->check = 1; + $AP->update(); + return response(['message' => 'Подтверждено'], 200); + } else { + return response(['message' => 'Данное сообщение уже отмечено'], 200); + } + } else { + return response(['message' => 'Такого сообщения нету'], 200); + } + } else { + return response(['message' => 'Ошибка, такого доктора нету'], 400); + } + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Вывод дня окончания паузы + function getDatePause() + { + $User = Auth::user(); + if ($User != null) { + + $Patient = Patient::where('id', $User->id)->first(); + if ($Patient != null) { + + return response(['date_pause' => $Patient->pause], 200); + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + //Вывод дня окончания блока + function getDateBlock() + { + $User = Auth::user(); + if ($User != null) { + + $Patient = Patient::where('id', $User->id)->first(); + if ($Patient != null) { + + return response(['date_pause' => $Patient->block], 200); + } else { + return response(['message' => 'Ошибка, такого пациента нету'], 400); + } + } else { + return response(['message' => 'Ошибка 404'], 404); + } + } + + + function dkkofskfkk() + { + $User = Auth::user(); + $Patient = Patient::where('id', $User->id)->first(); + $date = date("Y-m-d"); + + + $SportPatient = SportPatient::where('id_patient', $Patient->id)->where('finished', 0)->first(); + $SetsOfSportsActivities = SetsOfSportsActivities::where('id_sports_courses', $SportPatient->id_sports_courses)->where('day', 1)->first(); + //$SetOfSportsExercises = SetOfSportsExercises::where('id_sets_of_sports_activities', $SetsOfSportsActivities->id)->get(); + + $CoursesSportEdit = CoursesSportEdit::orderBy('id', 'ASC')->where('id_sport_patient', $Patient->id_sport_patient)->first(); + + if ($CoursesSportEdit != null) { + $SetOfSportsExercises = SetOfSportsExercises::orderBy('id', 'ASC') + ->join('courses_sport_edit', 'courses_sport_edit.id_sports_tasks', '!=', 'set_of_sports_exercises.id_sports_tasks') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') + ->distinct() + //->where('sport_patient.id', $Patient->id_sport_patient) + ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) + ->get(); + + $result = []; + + $number = 0; + for ($i = 0; $i != Count($SetOfSportsExercises); $i++) { + + $number++; + $search_sport = [ + 'number' => $number, + 'id' => $SetOfSportsExercises[$i]->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sets_of_sports_activities' => $SetOfSportsExercises[$i]->id_sets_of_sports_activities, + 'created_at' => $SetOfSportsExercises[$i]->created_at, + 'updated_at' => $SetOfSportsExercises[$i]->updated_at, + ]; + array_push($result, $search_sport); + } + + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + + return response(['message' => $result], 200); + } else { + $SetOfSportsExercises = SetOfSportsExercises::orderBy('id', 'ASC') + ->select('set_of_sports_exercises.id', 'set_of_sports_exercises.number', 'set_of_sports_exercises.id_sports_tasks', 'set_of_sports_exercises.id_sets_of_sports_activities', 'set_of_sports_exercises.created_at', 'set_of_sports_exercises.updated_at') + ->distinct() + //->where('sport_patient.id', $Patient->id_sport_patient) + ->where('id_sets_of_sports_activities', $SetsOfSportsActivities->id) + ->get(); + + $result = []; + + $number = 0; + + for ($i = 0; $i != Count($SetOfSportsExercises); $i++) { + + $number++; + $search_sport = [ + 'number' => $number, + 'id' => $SetOfSportsExercises[$i]->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sets_of_sports_activities' => $SetOfSportsExercises[$i]->id_sets_of_sports_activities, + 'created_at' => $SetOfSportsExercises[$i]->created_at, + 'updated_at' => $SetOfSportsExercises[$i]->updated_at, + ]; + array_push($result, $search_sport); + } + + $article = uniqid(); + //Заполняем цикл + for ($i = 0; $i < Count($SetOfSportsExercises); $i++) { + SportForDay::create([ + 'article' => $article, + 'day' => $date, + 'id_patient' => $Patient->id, + 'id_sports_tasks' => $SetOfSportsExercises[$i]->id_sports_tasks, + 'id_sport_patient' => $Patient->id_sport_patient, + ]); + } + + return response(['message' => $result], 200); + } + + +// $SportForDay = SportForDay::where('day', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); +// +// $CalendarDays = CalendarDays::where('date', date("Y-m-d"))->where('id_patient', $Patient->id)->where('id_sport_patient', $Patient->id_sport_patient)->first(); +// $CD = $CalendarDays; +// $CD->article_sport_for_day = $SportForDay->article; +// $CD->count_workout_max = count($SetOfSportsExercises); +// $CD->update(); + + + return response(['message' => $SetOfSportsExercises], 200); + + } + + //Провверка на то есть ли анкета ДО + function LookBefore() + { + $User = Auth::user(); + $Patient = Patient::where('id', $User->id)->first(); + $date = date("Y-m-d"); + $BeforeQuestion = BeforeQuestionnaire::where('id_sport_patient',$Patient->id_sport_patient)->where('date',$date)->first(); + if($BeforeQuestion!=null){ + return response(['before_look' => 1], 200); + } + else{ + return response(['before_look' => 2], 200); + } + } + + //Провверка на то есть ли анкета ПОСЛЕ + function LookAfter() + { + $User = Auth::user(); + $Patient = Patient::where('id', $User->id)->first(); + $date = date("Y-m-d"); + $AfterQuestion = AfterQuestionnaire::where('id_sport_patient',$Patient->id_sport_patient)->where('date',$date)->first(); + if($AfterQuestion!=null){ + return response(['after_look' => 1], 200); + } + else{ + return response(['after_look' => 2], 200); + } + } + + //Вывод календаря для пациента + function GetCalendare(){ + $User = Auth::user(); + $Patient = Patient::where('id', $User->id)->first(); + $date = date("Y-m-d"); + if($Patient!=null){ + if($Patient->id_sport_patient!=null){ + $Calendare = CalendarDays::where('id_sport_patient',$Patient->id_sport_patient)->where('id_patient',$Patient->id)->distinct()->first(); + if($Calendare!=null){ + $Calendare_list = CalendarDays::where('id_sport_patient',$Patient->id_sport_patient)->where('id_patient',$Patient->id)->orderBy('day','ASC')->distinct()->get(); + + return response(['calendare_day' => $Calendare_list], 200); + } + else{ + return response(['message' => 'Таких данных нету'], 400); + } + } + else{ + return response(['message' => 'Курса у пациента нету'], 400); + } + } + else{ + return response(['message' => 'Такого пациента нету'], 400); + } + + } + +} diff --git a/app/Http/Controllers/SportsCoursesController.php b/app/Http/Controllers/SportsCoursesController.php new file mode 100644 index 0000000..8c4b1ee --- /dev/null +++ b/app/Http/Controllers/SportsCoursesController.php @@ -0,0 +1,37 @@ +all(), [ + 'name' => 'required', + 'description' => 'required', + ]);//1024 + if ($error->fails()) { + return response(['error' => ['code' => 400, 'message' => 'Validation error', 'errors' => $error->errors()]], 400); + } + else{ + SportCourses::create([ + 'name' => $request->name, + 'description' => $request->description + ]); + return response(['Новый курс создан'], 200); + } + + + } + + +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000..8964d12 --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,69 @@ + + */ + protected $middleware = [ + // \App\Http\Middleware\TrustHosts::class, + \App\Http\Middleware\TrustProxies::class, + \Illuminate\Http\Middleware\HandleCors::class, + \App\Http\Middleware\PreventRequestsDuringMaintenance::class, + \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, + \App\Http\Middleware\TrimStrings::class, + \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + ]; + + /** + * The application's route middleware groups. + * + * @var array> + */ + protected $middlewareGroups = [ + 'web' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + + ], + ]; + + /** + * The application's middleware aliases. + * + * Aliases may be used instead of class names to conveniently assign middleware to routes and groups. + * + * @var array + */ + protected $middlewareAliases = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class, + 'signed' => \App\Http\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + ]; +} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..d4ef644 --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,17 @@ +expectsJson() ? null : route('login'); + } +} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000..867695b --- /dev/null +++ b/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php new file mode 100644 index 0000000..74cbd9a --- /dev/null +++ b/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php new file mode 100644 index 0000000..afc78c4 --- /dev/null +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -0,0 +1,30 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..88cadca --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ + + */ + protected $except = [ + 'current_password', + 'password', + 'password_confirmation', + ]; +} diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php new file mode 100644 index 0000000..c9c58bd --- /dev/null +++ b/app/Http/Middleware/TrustHosts.php @@ -0,0 +1,20 @@ + + */ + public function hosts(): array + { + return [ + $this->allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php new file mode 100644 index 0000000..3391630 --- /dev/null +++ b/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,28 @@ +|string|null + */ + protected $proxies; + + /** + * The headers that should be used to detect proxies. + * + * @var int + */ + protected $headers = + Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB; +} diff --git a/app/Http/Middleware/ValidateSignature.php b/app/Http/Middleware/ValidateSignature.php new file mode 100644 index 0000000..093bf64 --- /dev/null +++ b/app/Http/Middleware/ValidateSignature.php @@ -0,0 +1,22 @@ + + */ + protected $except = [ + // 'fbclid', + // 'utm_campaign', + // 'utm_content', + // 'utm_medium', + // 'utm_source', + // 'utm_term', + ]; +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 0000000..9e86521 --- /dev/null +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/app/Models/AfterQuestionnaire.php b/app/Models/AfterQuestionnaire.php new file mode 100644 index 0000000..3ce9f7f --- /dev/null +++ b/app/Models/AfterQuestionnaire.php @@ -0,0 +1,34 @@ + + */ + protected $casts = [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + +} diff --git a/app/Models/Image.php b/app/Models/Image.php new file mode 100644 index 0000000..c822f93 --- /dev/null +++ b/app/Models/Image.php @@ -0,0 +1,25 @@ + + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + +} diff --git a/app/Models/SetOfSportsExercises.php b/app/Models/SetOfSportsExercises.php new file mode 100644 index 0000000..bb175dc --- /dev/null +++ b/app/Models/SetOfSportsExercises.php @@ -0,0 +1,23 @@ + + */ + protected $guarded = false; + protected $table = 'patient'; + protected $fillable = [ + 'login', + 'password', + 'api_token' + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var array + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..452e6b6 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,24 @@ + + */ + protected $policies = [ + // + ]; + + /** + * Register any authentication / authorization services. + */ + public function boot(): void + { + // + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..2be04f5 --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,19 @@ +> + */ + protected $listen = [ + Registered::class => [ + SendEmailVerificationNotification::class, + ], + ]; + + /** + * Register any events for your application. + */ + public function boot(): void + { + // + } + + /** + * Determine if events and listeners should be automatically discovered. + */ + public function shouldDiscoverEvents(): bool + { + return false; + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..1a7f073 --- /dev/null +++ b/app/Providers/RouteServiceProvider.php @@ -0,0 +1,41 @@ +by($request->user()?->id ?: $request->ip()); + }); + + $this->routes(function () { + Route::middleware('api') + ->prefix('/api') + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->prefix('/') + ->group(base_path('routes/web.php')); + }); + } +} diff --git a/artisan b/artisan new file mode 100644 index 0000000..67a3329 --- /dev/null +++ b/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..037e17d --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..e1fb449 --- /dev/null +++ b/composer.json @@ -0,0 +1,66 @@ +{ + "name": "laravel/laravel", + "type": "project", + "description": "The skeleton application for the Laravel framework.", + "keywords": ["laravel", "framework"], + "license": "MIT", + "require": { + "php": "^8.1", + "guzzlehttp/guzzle": "^7.2", + "laravel/framework": "^10.10", + "laravel/sanctum": "^3.2", + "laravel/tinker": "^2.8" + }, + "require-dev": { + "fakerphp/faker": "^1.9.1", + "laravel/pint": "^1.0", + "laravel/sail": "^1.18", + "mockery/mockery": "^1.4.4", + "nunomaduro/collision": "^7.0", + "phpunit/phpunit": "^10.1", + "spatie/laravel-ignition": "^2.0" + }, + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-update-cmd": [ + "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ] + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true, + "php-http/discovery": true + } + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..b7cc1dd --- /dev/null +++ b/composer.lock @@ -0,0 +1,8079 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "aa322c53454393ed775cfe4807d54a50", + "packages": [ + { + "name": "brick/math", + "version": "0.11.0", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "5.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.11.0" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-01-15T23:15:59+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.8" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2023-06-16T13:40:37+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "84a527db05647743d50373e0ec53a152f2cde568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-15T16:57:16+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2023-08-10T19:36:49+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-02-25T20:23:15+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-08-27T10:20:53+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-08-03T15:11:55+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-08-27T10:13:57+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/61bf437fc2197f587f6857d3ff903a24f1731b5d", + "reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.19 || ^9.5.8", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2023-08-27T10:19:19+00:00" + }, + { + "name": "laravel/framework", + "version": "v10.28.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "09137f50f715c1efc649788a26092dcb1ec4ab6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/09137f50f715c1efc649788a26092dcb1ec4ab6e", + "reference": "09137f50f715c1efc649788a26092dcb1ec4ab6e", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.9", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.67", + "nunomaduro/termwind": "^1.13", + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.2", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^8.12", + "pda/pheanstalk": "^4.0", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-10-10T13:01:37+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.11", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "cce65a90e64712909ea1adc033e1d88de8455ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/cce65a90e64712909ea1adc033e1d88de8455ffd", + "reference": "cce65a90e64712909ea1adc033e1d88de8455ffd", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.11" + }, + "time": "2023-10-03T01:07:35+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v3.3.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "338f633e6487e76b255470d3373fbc29228aa971" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/338f633e6487e76b255470d3373fbc29228aa971", + "reference": "338f633e6487e76b255470d3373fbc29228aa971", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.21|^10.0", + "illuminate/contracts": "^9.21|^10.0", + "illuminate/database": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "php": "^8.0.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.28.2|^8.8.3", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2023-09-07T15:46:33+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/e5a3057a5591e1cfe8183034b0203921abe2c902", + "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2023-07-14T13:56:28+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/b936d415b252b499e8c3b1f795cd4fc20f57e1f3", + "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.10.4|^0.11.1", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.8.2" + }, + "time": "2023-08-15T14:27:00+00:00" + }, + { + "name": "league/commonmark", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2023-08-30T16:55:00+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.17.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "bd4c9b26849d82364119c68429541f1631fba94b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/bd4c9b26849d82364119c68429541f1631fba94b", + "reference": "bd4c9b26849d82364119c68429541f1631fba94b", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.220.0", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.14", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.17.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-10-05T20:15:05+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "ec7383f25642e6fd4bb0c9554fc2311245391781" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ec7383f25642e6fd4bb0c9554fc2311245391781", + "reference": "ec7383f25642e6fd4bb0c9554fc2311245391781", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem-local/issues", + "source": "https://github.com/thephpleague/flysystem-local/tree/3.16.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-08-30T10:23:59+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/a6dfb1194a2946fcdc1f38219445234f65b35c96", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.13.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2023-08-05T12:09:49+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "e2392369686d420ca32df3803de28b5d6f76867d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/e2392369686d420ca32df3803de28b5d6f76867d", + "reference": "e2392369686d420ca32df3803de28b5d6f76867d", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.4.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-06-21T08:46:11+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.71.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "98276233188583f2ff845a0f992a235472d9466a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", + "reference": "98276233188583f2ff845a0f992a235472d9466a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2023-09-25T11:31:05+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.5", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a", + "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": "7.1 - 8.3" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.5" + }, + "time": "2023-10-05T20:37:59+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "cead6637226456b35e1175cc53797dd585d85545" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/cead6637226456b35e1175cc53797dd585d85545", + "reference": "cead6637226456b35e1175cc53797dd585d85545", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.2" + }, + "time": "2023-09-19T11:58:07+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.17.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + }, + "time": "2023-08-13T19:53:39+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.15.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2023-02-08T01:06:31+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-02-25T19:38:58+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.11.22", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/128fa1b608be651999ed9789c95e6e2a31b5802b", + "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^4.0 || ^3.1", + "php": "^8.0 || ^7.0.8", + "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-0.11": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.11.22" + }, + "time": "2023-10-14T21:56:36+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.4", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "60a4c63ab724854332900504274f6150ff26d286" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", + "reference": "60a4c63ab724854332900504274f6150ff26d286", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.4" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2023-04-15T23:01:58+00:00" + }, + { + "name": "symfony/console", + "version": "v6.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-16T10:10:12+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-12T16:00:22+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "1f69476b64fb47105c06beef757766c376b548c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/1f69476b64fb47105c06beef757766c376b548c4", + "reference": "1f69476b64fb47105c06beef757766c376b548c4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-12T06:57:20+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-06T06:56:43+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-26T12:56:25+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b50f5e281d722cb0f4c296f908bacc3e2b721957", + "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.2" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^5.4|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-04T21:33:54+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f991a964368bee8d883e8d57ced4fe9fff04dfc", + "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-foundation": "^6.3.4", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.3.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<5.4", + "symfony/var-dumper": "<6.3", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/clock": "^6.2", + "symfony/config": "^6.1", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dependency-injection": "^6.3.4", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0", + "symfony/property-access": "^5.4.5|^6.0.5", + "symfony/routing": "^5.4|^6.0", + "symfony/serializer": "^6.3", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0", + "symfony/validator": "^6.3", + "symfony/var-exporter": "^6.2", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-30T06:37:04+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/d89611a7830d51b5e118bca38e390dea92f9ea06", + "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^6.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/messenger": "^6.2", + "symfony/twig-bridge": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-06T09:47:15+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/serializer": "~6.2.13|^6.3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-29T06:59:36+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "875e90aeea2777b6f135677f618529449334a612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:30:37+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "42292d99c55abe617799667f454222c54c60e229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-28T09:04:16+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-16T06:22:46+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9c44518a5aff8da565c8a55dbe85d2769e6f630e", + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/process", + "version": "v6.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-07T10:39:22+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/82616e59acd3e3d9c916bba798326cb7796d7d31", + "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-20T16:05:51+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/string", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339", + "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-18T10:38:32+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-31T07:08:24+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-30T17:17:10+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/01b0f20b1351d997711c56f1638f7a8c3061e384", + "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-08T07:25:02+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3d9999376be5fea8de47752837a3e1d1c5f69ef5", + "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-12T10:11:35+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.6", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" + }, + "time": "2023-01-03T09:29:04+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.5.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2022-10-16T01:01:54+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.21-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.0" + }, + "time": "2023-06-12T08:44:38+00:00" + }, + { + "name": "filp/whoops", + "version": "2.15.3", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "c83e88a30524f9360b11f585f71e6b17313b7187" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/c83e88a30524f9360b11f585f71e6b17313b7187", + "reference": "c83e88a30524f9360b11f585f71e6b17313b7187", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.15.3" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2023-07-13T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.13.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "93b2d0d49719bc6e444ba21cd4dbbccec935413d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/93b2d0d49719bc6e444ba21cd4dbbccec935413d", + "reference": "93b2d0d49719bc6e444ba21cd4dbbccec935413d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.34.1", + "illuminate/view": "^10.23.1", + "laravel-zero/framework": "^10.1.2", + "mockery/mockery": "^1.6.6", + "nunomaduro/larastan": "^2.6.4", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.18.2" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2023-10-10T15:39:09+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.25.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "e81a7bd7ac1a745ccb25572830fecf74a89bb48a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/e81a7bd7ac1a745ccb25572830fecf74a89bb48a", + "reference": "e81a7bd7ac1a745ccb25572830fecf74a89bb48a", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.0|^9.0|^10.0", + "illuminate/contracts": "^8.0|^9.0|^10.0", + "illuminate/support": "^8.0|^9.0|^10.0", + "php": "^8.0", + "symfony/yaml": "^6.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0|^7.0|^8.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2023-09-11T17:37:09+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.6", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/b8e0bb7d8c604046539c1115994632c74dcb361e", + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.10", + "psalm/plugin-phpunit": "^0.18.4", + "symplify/easy-coding-standard": "^11.5.0", + "vimeo/psalm": "^4.30" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2023-08-09T00:03:52+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v7.10.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "49ec67fa7b002712da8526678abd651c09f375b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2", + "reference": "49ec67fa7b002712da8526678abd651c09f375b2", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.15.3", + "nunomaduro/termwind": "^1.15.1", + "php": "^8.1.0", + "symfony/console": "^6.3.4" + }, + "conflict": { + "laravel/framework": ">=11.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.3.0", + "laravel/framework": "^10.28.0", + "laravel/pint": "^1.13.3", + "laravel/sail": "^1.25.0", + "laravel/sanctum": "^3.3.1", + "laravel/tinker": "^2.8.2", + "nunomaduro/larastan": "^2.6.4", + "orchestra/testbench-core": "^8.13.0", + "pestphp/pest": "^2.23.2", + "phpunit/phpunit": "^10.4.1", + "sebastian/environment": "^6.0.1", + "spatie/laravel-ignition": "^2.3.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2023-10-11T15:45:01+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "355324ca4980b8916c18b9db29f3ef484078f26e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/355324ca4980b8916c18b9db29f3ef484078f26e", + "reference": "355324ca4980b8916c18b9db29f3ef484078f26e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.15", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-10-04T15:34:17+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "62bd7af13d282deeb95650077d28ba3600ca321c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/62bd7af13d282deeb95650077d28ba3600ca321c", + "reference": "62bd7af13d282deeb95650077d28ba3600ca321c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.4-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.1" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2023-10-08T05:01:11+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:15+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-14T13:18:12+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.10", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-28T11:50:59+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-01T07:48:21+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-04-11T05:39:26+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-24T13:22:09+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-07-19T07:19:23+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.10", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T09:25:50+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/483f76a82964a0431aa836b6ed0edde0c248e3ab", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.5.3" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-06-28T12:59:17+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "5f2c6a7a0d2c1d90c12559dc7828fd942911a544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/5f2c6a7a0d2c1d90c12559dc7828fd942911a544", + "reference": "5f2c6a7a0d2c1d90c12559dc7828fd942911a544", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0|^10.0", + "nesbot/carbon": "^2.62.1", + "php": "^8.0", + "spatie/backtrace": "^1.5.2", + "symfony/http-foundation": "^5.0|^6.0", + "symfony/mime": "^5.2|^6.0", + "symfony/process": "^5.2|^6.0", + "symfony/var-dumper": "^5.2|^6.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.3.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.4.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-07-28T08:07:24+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.11.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "48b23411ca4bfbc75c75dfc638b6b36159c375aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/48b23411ca4bfbc75c75dfc638b6b36159c375aa", + "reference": "48b23411ca4bfbc75c75dfc638b6b36159c375aa", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/backtrace": "^1.5.3", + "spatie/flare-client-php": "^1.4.0", + "symfony/console": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "illuminate/cache": "^9.52", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^6.0", + "symfony/process": "^5.4|^6.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-09-19T15:29:52+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "bf21cd15aa47fa4ec5d73bbc932005c70261efc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/bf21cd15aa47fa4ec5d73bbc932005c70261efc8", + "reference": "bf21cd15aa47fa4ec5d73bbc932005c70261efc8", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0", + "php": "^8.1", + "spatie/flare-client-php": "^1.3.5", + "spatie/ignition": "^1.9", + "symfony/console": "^6.2.3", + "symfony/var-dumper": "^6.2.3" + }, + "require-dev": { + "livewire/livewire": "^2.11", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.3.4", + "orchestra/testbench": "^8.0", + "pestphp/pest": "^1.22.3", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.3", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-10-09T12:55:26+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-31T07:08:24+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.1" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..4c231b4 --- /dev/null +++ b/config/app.php @@ -0,0 +1,188 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + 'asset_url' => env('ASSET_URL'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => 'file', + // 'store' => 'redis', + ], + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => ServiceProvider::defaultProviders()->merge([ + /* + * Package Service Providers... + */ + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + ])->toArray(), + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => Facade::defaultAliases()->merge([ + // 'Example' => App\Facades\Example::class, + ])->toArray(), + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..9fa8afc --- /dev/null +++ b/config/auth.php @@ -0,0 +1,148 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + 'api' => [ + 'driver' => 'token', + 'provider' => 'users', + 'hash' => false, + ], + 'doctor' => [ + 'driver' => 'session', + 'provider' => 'doctors', + ], + 'doctor_token' => [ + 'driver' => 'token', + 'provider' => 'doctors', + 'hash' => false, + ], + + 'patient' => [ + 'driver' => 'session', + 'provider' => 'patients', + ], + + 'patient_token' => [ + 'driver' => 'token', + 'provider' => 'patients', + 'hash' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, + ], + 'doctors' => [ + 'driver' => 'eloquent', + 'model' => \App\Models\Doctor::class, + ], + 'patients' => [ + 'driver' => 'eloquent', + 'model' => \App\Models\Patient::class, + ], + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_reset_tokens', + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 0000000..2410485 --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,71 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', + 'port' => env('PUSHER_PORT', 443), + 'scheme' => env('PUSHER_SCHEME', 'https'), + 'encrypted' => true, + 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', + ], + 'client_options' => [ + // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..d4171e2 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,111 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + 'lock_connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, or DynamoDB cache + | stores there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..8a39e6d --- /dev/null +++ b/config/cors.php @@ -0,0 +1,34 @@ + ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..f4f6dc8 --- /dev/null +++ b/config/database.php @@ -0,0 +1,151 @@ + env('DB_CONNECTION', 'pgsql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'rehability'), + 'username' => env('DB_USERNAME', 'postgres'), + 'password' => env('DB_PASSWORD', 'PutYourPasswordHere'), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..e9d9dbd --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,76 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been set up for each driver as an example of the required values. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + 'throw' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 0000000..bcd3be4 --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 65536, + 'threads' => 1, + 'time' => 4, + ], + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..c44d276 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,131 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => LOG_USER, + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..e652bd0 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,125 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "log", "array", "failover" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN'), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..01c6b05 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,109 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/sanctum.php b/config/sanctum.php new file mode 100644 index 0000000..529cfdc --- /dev/null +++ b/config/sanctum.php @@ -0,0 +1,67 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort() + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. If this value is null, personal access tokens do + | not expire. This won't tweak the lifetime of first-party sessions. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..0ace530 --- /dev/null +++ b/config/services.php @@ -0,0 +1,34 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + 'scheme' => 'https', + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..8fed97c --- /dev/null +++ b/config/session.php @@ -0,0 +1,201 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', + +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..22b8a18 --- /dev/null +++ b/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..a6ecc0a --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,38 @@ + + */ +class UserFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 0000000..444fafb --- /dev/null +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..a9f4519 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,22 @@ +create(); + + // \App\Models\User::factory()->create([ + // 'name' => 'Test User', + // 'email' => 'test@example.com', + // ]); + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0e6480f --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "axios": "^1.1.2", + "laravel-vite-plugin": "^0.8.0", + "vite": "^4.0.0" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..f112c0c --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,31 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..3aec5e2 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + 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] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/after.xlsx b/public/after.xlsx new file mode 100644 index 0000000..258fd58 Binary files /dev/null and b/public/after.xlsx differ diff --git a/public/css/card.css b/public/css/card.css new file mode 100644 index 0000000..5e65f3b --- /dev/null +++ b/public/css/card.css @@ -0,0 +1,3 @@ +.cardImage{ + +} diff --git a/public/css/footer.css b/public/css/footer.css new file mode 100644 index 0000000..1f2aff1 --- /dev/null +++ b/public/css/footer.css @@ -0,0 +1,108 @@ +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); + +body { + line-height: 1.5; + font-family: 'Poppins', sans-serif; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +.container { + max-width: 1170px; + margin: auto; +} + +.row { + display: flex; + flex-wrap: wrap; +} + +ul { + list-style: none; +} + +.footer { + background-color: #24262b; + padding: 70px 0; +} + +.footer-col { + width: 25%; + padding: 0 15px; +} + +.footer-col h4 { + font-size: 18px; + color: #ffffff; + text-transform: capitalize; + margin-bottom: 35px; + font-weight: 500; + position: relative; +} + +.footer-col h4::before { + content: ''; + position: absolute; + left: 0; + bottom: -10px; + background-color: #e91e63; + height: 2px; + box-sizing: border-box; + width: 50px; +} + +.footer-col ul li:not(:last-child) { + margin-bottom: 10px; +} + +.footer-col ul li a { + font-size: 16px; + text-transform: capitalize; + color: #ffffff; + text-decoration: none; + font-weight: 300; + color: #bbbbbb; + display: block; + transition: all 0.3s ease; +} + +.footer-col ul li a:hover { + color: #ffffff; + padding-left: 8px; +} + +.footer-col .social-links a { + display: inline-block; + height: 40px; + width: 40px; + background-color: rgba(255, 255, 255, 0.2); + margin: 0 10px 10px 0; + text-align: center; + line-height: 40px; + border-radius: 50%; + color: #ffffff; + transition: all 0.5s ease; +} + +.footer-col .social-links a:hover { + color: #24262b; + background-color: #ffffff; +} + +/*responsive*/ +@media (max-width: 767px) { + .footer-col { + width: 50%; + margin-bottom: 30px; + } +} + +@media (max-width: 574px) { + .footer-col { + width: 100%; + } +} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 0000000..f676e49 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,286 @@ + +body { + background-color: #d7d7d7; +} + +.dsfd{ + text-align: right; +} +.imageFon { + /*background: url(../image/64ed33179141073.64f4b4f57a43e.jpg);*/ + background: url(../image/64ed33179141073.64f4b4f57a43e.jpg); + + background-size: cover; + width: 100%; + height: 1000px; + background-repeat: no-repeat; +} + +/*AldertSans*/ +@font-face { + font-family: 'AlbertSans'; + src: url(../fontfamali/AlbertSans/AlbertSans-Bold.ttf); +} + +/*Dihjauti*/ +@font-face { + font-family: 'Dihjauti'; + src: url(../fontfamali/Dihjauti/Dihjauti-Bold.otf); +} + +.fontAldertSans { + font-family: 'AlbertSans'; + font-size: 20px; +} + +.fontDihjauti { + font-family: 'Dihjauti'; + font-size: 20px; +} + + + +/*Выявление*/ +.green { + background-color: green; +} + +.red { + background-color: red;; +} + + + +/*Рамка во круг фотографии*/ +.imgBorder { + border: 3px solid transparent; /* Прозрачная рамка */ +} +.imgBorder:hover { + border: 3px solid #00af64; /* Цветная рамка */ +} + +.sasdasdasd{ +max-width: 300px; +} + + +/* Задаем высоту большим блокам, чтобы у нас на странице получится скролл */ +.element-big { + width: 100%; + height: 1200px; +} + +.element-animation { + margin: 2rem 0; + font-size: 3rem; + + /* Скроем элемент в начальном состоянии */ + opacity: 0; + transform: translateY(20px); +} + +.element-animation.element-show { + opacity: 1; + transition: all 1.5s; + transform: translateY(0%); +} + + + +/*Прозрачный фон*/ +@import url("https://fonts.googleapis.com/css2?family=Reggae+One&family=Source+Sans+Pro&family=Oleo+Script&family=Dela+Gothic+One&family=Atma&display=swap"); + +/* ----- RESET ----- */ +* { + padding: 0; + margin: 0; + box-sizing: border-box; +} + +.backCard { + font-size: 16px; + background-color: #e2efff; + display: flex; + flex-direction: column; + align-items: center; +} + + + + +#brand-name { + color: #ededed; + font-family: "Reggae One", cursive; + flex-shrink: 1; +} + +.tagline { + color: #b3b3b3; + font-family: "Oleo Script", cursive; + flex-shrink: 1; +} + +header svg { + fill: #ededed; + width: 3.2rem; + margin-left: 1.4rem; + grid-row: 1 / span 2; + grid-column: 2 / span 1; +} + +h2, +.category-description { + background-image: linear-gradient(90deg, #f2bc18, #fffc2e); + width: calc(100% - calc(2.2rem * 2)); + max-width: 640px; + padding: 2.8rem; + transform: translateY(2.2rem); +} + +h2 { + color: rgba(0, 0, 0, 0.8); + font-family: "Dela Gothic One", cursive; + font-size: 2rem; + padding-bottom: 1.5rem; + margin-bottom: 0; + border-radius: 2.7rem 2.7rem 0 0; +} + +.category-description { + color: rgba(0, 0, 0, 0.45); + font-family: "Atma", cursive; + font-size: 1.25rem; + padding-top: 0; + padding-bottom: 6.5rem; + margin-top: 0; + border-radius: 0 0 2.7rem 2.7rem; +} + +.item { + background-color: rgba(255, 255, 255, 0.5); + width: calc(100% - calc(4.8rem * 2)); + max-width: 480px; + padding: 2.8rem; + margin-bottom: 2.2rem; + display: flex; + flex-direction: column; + border-radius: 1.7rem; + box-shadow: 0 1.5rem 3rem rgba(0, 0, 0, 0.2); + transform: translateY(-1rem); + backdrop-filter: blur(1.5rem); +} + +.item:last-child { + margin-bottom: 0.5rem; +} + +.item h3 { + font-size: 1.75rem; + font-weight: bold; + height: 2.8rem; + margin-bottom: 0.5rem; +} + +.item figure { + width: 100%; + margin-bottom: 1.5rem; + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; + border-radius: 1.5rem; +} + +.item figure img { + height: 320px; + display: block; +} + +.description { + color: rgba(255, 255, 255, 0.7); + background-color: rgba(0, 0, 0, 0.5); + width: calc(100% - calc(2.8rem * 2)); + height: 320px; + line-height: 1.75rem; + padding: 2.5rem; + position: absolute; + top: calc(2.8rem + 3.3rem); + left: 2.8rem; + overflow: auto; + opacity: 0; + border-radius: 1.5rem; + transition: opacity 200ms ease-out; +} + +.item figure:hover + .description, +.description:hover { + opacity: 1; +} + +.item button { + width: 100%; + color: #d99904; + font-size: 1.5rem; + font-weight: bold; + text-shadow: 0 -1px #ffc233; + background-image: linear-gradient(#ffe46e 0%, #ffd936 30% 80%, #ffcd19 100%); + padding: 1.4rem; + border: solid 1px #c98d00; + outline: none; + border-radius: 2.5rem / 50%; + transition: filter 500ms ease-out; +} + +.item button:hover { + filter: brightness(90%); +} + +.item button:active { + filter: brightness(80%); +} + +.price { + font-size: 1.4rem; + font-weight: bold; + margin-bottom: 1.5rem; +} + +.special { + margin-bottom: 0.5rem; +} + +select { + padding: 0.8rem 1.2rem; + border: solid 1px #efefef; + margin-bottom: 1.2rem; + outline: none; + border-radius: 0.75rem; + transition: box-shadow 200ms ease-out; +} + +select:focus, +select:active { + box-shadow: 0 0 0 0.25rem rgba(43, 153, 255, 0.5); +} + +label { + margin-bottom: 0.7rem; +} + + + +/*Закругления краев*/ +.border{ + border-radius: 20px 20px 20px 20px; +} + +.borderImageTop{ + border-radius: 20px 20px 0px 0px ; +} + + +.fill { + background-size: cover; + background-position: center; + +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/fontfamali/AlbertSans/AlbertSans-Black.ttf b/public/fontfamali/AlbertSans/AlbertSans-Black.ttf new file mode 100644 index 0000000..e1e9d6e Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-Black.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-BlackItalic.ttf b/public/fontfamali/AlbertSans/AlbertSans-BlackItalic.ttf new file mode 100644 index 0000000..6168ffb Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-BlackItalic.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-Bold.ttf b/public/fontfamali/AlbertSans/AlbertSans-Bold.ttf new file mode 100644 index 0000000..d9c2ec8 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-Bold.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-BoldItalic.ttf b/public/fontfamali/AlbertSans/AlbertSans-BoldItalic.ttf new file mode 100644 index 0000000..ab6cbc1 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-BoldItalic.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-ExtraBold.ttf b/public/fontfamali/AlbertSans/AlbertSans-ExtraBold.ttf new file mode 100644 index 0000000..b1b7a54 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-ExtraBold.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-ExtraBoldItalic.ttf b/public/fontfamali/AlbertSans/AlbertSans-ExtraBoldItalic.ttf new file mode 100644 index 0000000..2cd9971 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-ExtraBoldItalic.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-ExtraLight.ttf b/public/fontfamali/AlbertSans/AlbertSans-ExtraLight.ttf new file mode 100644 index 0000000..a473321 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-ExtraLight.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-ExtraLightItalic.ttf b/public/fontfamali/AlbertSans/AlbertSans-ExtraLightItalic.ttf new file mode 100644 index 0000000..df6cb6d Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-ExtraLightItalic.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-Italic-VariableFont_wght.ttf b/public/fontfamali/AlbertSans/AlbertSans-Italic-VariableFont_wght.ttf new file mode 100644 index 0000000..c5f3e8d Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-Italic-VariableFont_wght.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-Italic.ttf b/public/fontfamali/AlbertSans/AlbertSans-Italic.ttf new file mode 100644 index 0000000..30065c1 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-Italic.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-Light.ttf b/public/fontfamali/AlbertSans/AlbertSans-Light.ttf new file mode 100644 index 0000000..83610da Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-Light.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-LightItalic.ttf b/public/fontfamali/AlbertSans/AlbertSans-LightItalic.ttf new file mode 100644 index 0000000..fc553be Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-LightItalic.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-Medium.ttf b/public/fontfamali/AlbertSans/AlbertSans-Medium.ttf new file mode 100644 index 0000000..cddc178 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-Medium.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-MediumItalic.ttf b/public/fontfamali/AlbertSans/AlbertSans-MediumItalic.ttf new file mode 100644 index 0000000..c51edfb Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-MediumItalic.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-Regular.ttf b/public/fontfamali/AlbertSans/AlbertSans-Regular.ttf new file mode 100644 index 0000000..3abc177 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-Regular.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-SemiBold.ttf b/public/fontfamali/AlbertSans/AlbertSans-SemiBold.ttf new file mode 100644 index 0000000..9fbd384 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-SemiBold.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-SemiBoldItalic.ttf b/public/fontfamali/AlbertSans/AlbertSans-SemiBoldItalic.ttf new file mode 100644 index 0000000..99f942f Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-SemiBoldItalic.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-Thin.ttf b/public/fontfamali/AlbertSans/AlbertSans-Thin.ttf new file mode 100644 index 0000000..35506b3 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-Thin.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-ThinItalic.ttf b/public/fontfamali/AlbertSans/AlbertSans-ThinItalic.ttf new file mode 100644 index 0000000..f5e3210 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-ThinItalic.ttf differ diff --git a/public/fontfamali/AlbertSans/AlbertSans-VariableFont_wght.ttf b/public/fontfamali/AlbertSans/AlbertSans-VariableFont_wght.ttf new file mode 100644 index 0000000..201f3c4 Binary files /dev/null and b/public/fontfamali/AlbertSans/AlbertSans-VariableFont_wght.ttf differ diff --git a/public/fontfamali/AlbertSans/COPYRIGHT.txt b/public/fontfamali/AlbertSans/COPYRIGHT.txt new file mode 100644 index 0000000..a3c9e49 --- /dev/null +++ b/public/fontfamali/AlbertSans/COPYRIGHT.txt @@ -0,0 +1 @@ +Copyright 2021 The Albert Sans Project Authors (https://github.com/usted/Albert-Sans) \ No newline at end of file diff --git a/public/fontfamali/AlbertSans/LICENSE.txt b/public/fontfamali/AlbertSans/LICENSE.txt new file mode 100644 index 0000000..77b1731 --- /dev/null +++ b/public/fontfamali/AlbertSans/LICENSE.txt @@ -0,0 +1,91 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/fontfamali/AlbertSans/OFL.txt b/public/fontfamali/AlbertSans/OFL.txt new file mode 100644 index 0000000..4bd05e4 --- /dev/null +++ b/public/fontfamali/AlbertSans/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2021 The Albert Sans Project Authors (https://github.com/usted/Albert-Sans) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/fontfamali/Dihjauti/COPYRIGHT.txt b/public/fontfamali/Dihjauti/COPYRIGHT.txt new file mode 100644 index 0000000..1753efe --- /dev/null +++ b/public/fontfamali/Dihjauti/COPYRIGHT.txt @@ -0,0 +1 @@ +Copyright (c) 2022, T. Christopher White \ No newline at end of file diff --git a/public/fontfamali/Dihjauti/Dihjauti-Bold.otf b/public/fontfamali/Dihjauti/Dihjauti-Bold.otf new file mode 100644 index 0000000..fcdda49 Binary files /dev/null and b/public/fontfamali/Dihjauti/Dihjauti-Bold.otf differ diff --git a/public/fontfamali/Dihjauti/Dihjauti-BoldItalic.otf b/public/fontfamali/Dihjauti/Dihjauti-BoldItalic.otf new file mode 100644 index 0000000..6983fd5 Binary files /dev/null and b/public/fontfamali/Dihjauti/Dihjauti-BoldItalic.otf differ diff --git a/public/fontfamali/Dihjauti/Dihjauti-Italic.otf b/public/fontfamali/Dihjauti/Dihjauti-Italic.otf new file mode 100644 index 0000000..c84115f Binary files /dev/null and b/public/fontfamali/Dihjauti/Dihjauti-Italic.otf differ diff --git a/public/fontfamali/Dihjauti/Dihjauti-Regular.otf b/public/fontfamali/Dihjauti/Dihjauti-Regular.otf new file mode 100644 index 0000000..f04ca4f Binary files /dev/null and b/public/fontfamali/Dihjauti/Dihjauti-Regular.otf differ diff --git a/public/fontfamali/Dihjauti/DihjautiS-Bold.otf b/public/fontfamali/Dihjauti/DihjautiS-Bold.otf new file mode 100644 index 0000000..d26a361 Binary files /dev/null and b/public/fontfamali/Dihjauti/DihjautiS-Bold.otf differ diff --git a/public/fontfamali/Dihjauti/DihjautiS-BoldItalic.otf b/public/fontfamali/Dihjauti/DihjautiS-BoldItalic.otf new file mode 100644 index 0000000..7779b7c Binary files /dev/null and b/public/fontfamali/Dihjauti/DihjautiS-BoldItalic.otf differ diff --git a/public/fontfamali/Dihjauti/DihjautiS-Italic.otf b/public/fontfamali/Dihjauti/DihjautiS-Italic.otf new file mode 100644 index 0000000..bc91aa9 Binary files /dev/null and b/public/fontfamali/Dihjauti/DihjautiS-Italic.otf differ diff --git a/public/fontfamali/Dihjauti/DihjautiS-Regular.otf b/public/fontfamali/Dihjauti/DihjautiS-Regular.otf new file mode 100644 index 0000000..0df26f5 Binary files /dev/null and b/public/fontfamali/Dihjauti/DihjautiS-Regular.otf differ diff --git a/public/fontfamali/Dihjauti/LICENSE.txt b/public/fontfamali/Dihjauti/LICENSE.txt new file mode 100644 index 0000000..77b1731 --- /dev/null +++ b/public/fontfamali/Dihjauti/LICENSE.txt @@ -0,0 +1,91 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/fontfamali/Dihjauti/SIL Open Font License_1.txt b/public/fontfamali/Dihjauti/SIL Open Font License_1.txt new file mode 100644 index 0000000..15e5f38 --- /dev/null +++ b/public/fontfamali/Dihjauti/SIL Open Font License_1.txt @@ -0,0 +1,44 @@ +Copyright (c) 04 February 2022, T. Christopher White (amenemsu@gmail.com), +with Reserved Font Names Dihjauti and Dihjauti S. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the copyright statement(s). + +"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. + +5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/public/free-icon-door-269315.png b/public/free-icon-door-269315.png new file mode 100644 index 0000000..6dfac0a Binary files /dev/null and b/public/free-icon-door-269315.png differ diff --git a/public/image/2d48b7176641053.64c8b3216d3d3.jpg b/public/image/2d48b7176641053.64c8b3216d3d3.jpg new file mode 100644 index 0000000..92f14e0 Binary files /dev/null and b/public/image/2d48b7176641053.64c8b3216d3d3.jpg differ diff --git a/public/image/2eed7b173399147.6490063b84284.jpg b/public/image/2eed7b173399147.6490063b84284.jpg new file mode 100644 index 0000000..a080fed Binary files /dev/null and b/public/image/2eed7b173399147.6490063b84284.jpg differ diff --git a/public/image/64ed33179141073.64f4b4f57a43e.jpg b/public/image/64ed33179141073.64f4b4f57a43e.jpg new file mode 100644 index 0000000..c76aa40 Binary files /dev/null and b/public/image/64ed33179141073.64f4b4f57a43e.jpg differ diff --git a/public/image/cdcae4176641053.64c8b32261aac.jpg b/public/image/cdcae4176641053.64c8b32261aac.jpg new file mode 100644 index 0000000..6282a17 Binary files /dev/null and b/public/image/cdcae4176641053.64c8b32261aac.jpg differ diff --git a/public/image/fon1.png b/public/image/fon1.png new file mode 100644 index 0000000..96a93e5 Binary files /dev/null and b/public/image/fon1.png differ diff --git a/public/image/image1.jpg b/public/image/image1.jpg new file mode 100644 index 0000000..5a9a686 Binary files /dev/null and b/public/image/image1.jpg differ diff --git a/public/image/image2.jpg b/public/image/image2.jpg new file mode 100644 index 0000000..ee43256 Binary files /dev/null and b/public/image/image2.jpg differ diff --git a/public/image/image3.jpg b/public/image/image3.jpg new file mode 100644 index 0000000..eadd380 Binary files /dev/null and b/public/image/image3.jpg differ diff --git a/public/image/image4.jpg b/public/image/image4.jpg new file mode 100644 index 0000000..b203a93 Binary files /dev/null and b/public/image/image4.jpg differ diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..1d69f3a --- /dev/null +++ b/public/index.php @@ -0,0 +1,55 @@ +make(Kernel::class); + +$response = $kernel->handle( + $request = Request::capture() +)->send(); + +$kernel->terminate($request, $response); diff --git a/public/js/app.js b/public/js/app.js new file mode 100644 index 0000000..7222ffb --- /dev/null +++ b/public/js/app.js @@ -0,0 +1,17 @@ + +function onEntry(entry) { + entry.forEach(change => { + if (change.isIntersecting) { + change.target.classList.add('element-show'); + } + }); +} + +let options = { + threshold: [0.5] }; +let observer = new IntersectionObserver(onEntry, options); +let elements = document.querySelectorAll('.element-animation'); + +for (let elm of elements) { + observer.observe(elm); +} diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/public/scss/style.scss b/public/scss/style.scss new file mode 100644 index 0000000..139645c --- /dev/null +++ b/public/scss/style.scss @@ -0,0 +1,82 @@ +HTML SCSSResult Skip Results Iframe +EDIT ON +// Colors +$color-primary-white: rgb(240, 240, 240); + +main { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 50px; + font-family: 'Roboto', sans-serif; +} + +.card { + width: 24rem; + height: 36rem; + border-radius: 10px; + overflow: hidden; + cursor: pointer; + position: relative; + color: $color-primary-white; + box-shadow: 0 10px 30px 5px rgba(0, 0, 0, 0.2); + + img { + position: absolute; + object-fit: cover; + width: 100%; + height: 100%; + top: 0; + left: 0; + opacity: 0.9; + transition: opacity .2s ease-out; + } + + h2 { + position: absolute; + inset: auto auto 30px 30px; + margin: 0; + transition: inset .3s .3s ease-out; + font-family: 'Roboto Condensed', sans-serif; + font-weight: normal; + text-transform: uppercase; + } + + p, a { + position: absolute; + opacity: 0; + max-width: 80%; + transition: opacity .3s ease-out; + } + + p { + inset: auto auto 80px 30px; + } + + a { + inset: auto auto 40px 30px; + color: inherit; + text-decoration: none; + } + + &:hover h2 { + inset: auto auto 220px 30px; + transition: inset .3s ease-out; + } + + &:hover p, &:hover a { + opacity: 1; + transition: opacity .5s .1s ease-in; + } + + &:hover img { + transition: opacity .3s ease-in; + opacity: 1; + } + +} + +.material-symbols-outlined { + vertical-align: middle; +} diff --git a/resources/css/app.css b/resources/css/app.css new file mode 100644 index 0000000..a9bcdfd --- /dev/null +++ b/resources/css/app.css @@ -0,0 +1,8 @@ +body { + background-color: #000; +} + +.dsfd{ + text-align: right; +} + diff --git a/resources/js/app.js b/resources/js/app.js new file mode 100644 index 0000000..e59d6a0 --- /dev/null +++ b/resources/js/app.js @@ -0,0 +1 @@ +import './bootstrap'; diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js new file mode 100644 index 0000000..846d350 --- /dev/null +++ b/resources/js/bootstrap.js @@ -0,0 +1,32 @@ +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ + +import axios from 'axios'; +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; + +/** + * Echo exposes an expressive API for subscribing to channels and listening + * for events that are broadcast by Laravel. Echo and event broadcasting + * allows your team to easily build robust real-time web applications. + */ + +// import Echo from 'laravel-echo'; + +// import Pusher from 'pusher-js'; +// window.Pusher = Pusher; + +// window.Echo = new Echo({ +// broadcaster: 'pusher', +// key: import.meta.env.VITE_PUSHER_APP_KEY, +// cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1', +// wsHost: import.meta.env.VITE_PUSHER_HOST ? import.meta.env.VITE_PUSHER_HOST : `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`, +// wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80, +// wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443, +// forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https', +// enabledTransports: ['ws', 'wss'], +// }); diff --git a/resources/views/form.blade.php b/resources/views/form.blade.php new file mode 100644 index 0000000..b9e7748 --- /dev/null +++ b/resources/views/form.blade.php @@ -0,0 +1,203 @@ + + + + + + + + @yield('title') + + + + + + @yield('title') + + + + + + + + + + Разработки + + + + Главная + Характеристики + @auth + Профиль + Корзина + + + @if(Auth::user()->isAdmin()) + Админ панель + + @endif + @endauth + + + + @guest + Авторизация + @endguest + @auth + Выход + @endauth + + + + + + + + Добро пожаловать + Данный сайт дает возможность ознакомится + пользователям и возможным будушим пациента + с функционалом данного сервиса + + + + + + Разработанные приложения + + + + + + + + + + 1 + 2 + 3 + + @csrf + + Перейти + + + + + + + + + + + 1 + 2 + 3 + + @csrf + + Перейти + + + + + + + + + + + 1 + 2 + 3 + + @csrf + + Перейти + + + + + + + +{{-- --}} +{{-- --}} +{{-- --}} +{{-- Реабилитация--}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- Suede fabric pointed toe stylish cut front low heel --}} +{{-- --}} +{{-- --}} +{{-- --}} + + + + + + + + + + + +{{----}} +{{-- @yield('main_view')--}} +{{----}} + + + +@yield('script') + + diff --git a/resources/views/form2.blade.php b/resources/views/form2.blade.php new file mode 100644 index 0000000..fb67dc8 --- /dev/null +++ b/resources/views/form2.blade.php @@ -0,0 +1,46 @@ + + + + + + + @yield('title') + + @yield('title') + + + + + + + + + + + + Главная + Продукция + + + + @guest + Авторизация + Регистрация + @endguest + + + + + + + @yield('main_view') + + + + + +@yield('script') + + + diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php new file mode 100644 index 0000000..fae6035 --- /dev/null +++ b/resources/views/home.blade.php @@ -0,0 +1,58 @@ +@extends('form') + +@section('title') + Главная +@endsection + + + +@section('main_view') + + + + + + + + + + + + + + First slide label + Some representative placeholder content for the first slide. + + + + + + Second slide label + Some representative placeholder content for the second slide. + + + + + + Third slide label + Some representative placeholder content for the third slide. + + + + + + Previous + + + + Next + + + + + +@endsection + +@section('script') + +@endsection diff --git a/resources/views/login.blade.php b/resources/views/login.blade.php new file mode 100644 index 0000000..1409f21 --- /dev/null +++ b/resources/views/login.blade.php @@ -0,0 +1,37 @@ +@extends('form') + +@section('title') + Авторизация +@endsection + + +@section('main_view') + + + Авторизация + + + + + + + + Логин + + + + + Пароль + + + + + Авторизоваться + + + +@endsection + +@section('script') + +@endsection diff --git a/resources/views/register.blade.php b/resources/views/register.blade.php new file mode 100644 index 0000000..dae0c7c --- /dev/null +++ b/resources/views/register.blade.php @@ -0,0 +1,164 @@ +@extends('form') + +@section('title') + Регистрация +@endsection + +@section('main_view') + + Регистрация + + + + + + + + + Имя + + + + + Фамилия + + + + + Отчество + + + + + Email + + + + + Логин + + + + + Пароль + + + + + Повторите пароль + + + + + + Даю согласие на обработку своих + данных + + + + Зарегистрироваться + + + + + +@endsection + +{{--@section('script')--}} +{{-- --}} +@endsection diff --git a/routes/api.php b/routes/api.php new file mode 100644 index 0000000..58ef22a --- /dev/null +++ b/routes/api.php @@ -0,0 +1,190 @@ +get('/user', function (Request $request) { + return $request->user(); +}); + + +//Route::middleware('auth:api')->get('/user', function (Request $request) { +// return $request->user(); +//}); +// +// +//Route::group(['namespace' => 'Api'], function () { +// Route::group(['namespace' => 'Auth'], function () { +// Route::POST('/register', [RegisterController::class,'__invoke']); +// Route::POST('/login', [LoginController::class,'__invoke']); +// Route::POST('/logout', [LogoutController::class,'__invoke'])->middleware('auth:api'); +// }); +//}); +// + + + + +//Запросы врача + + +//Админ +Route::post('/AddSportCourses', [AdminController::class,'AddSportCourses']);//Добавление курса(название) +Route::post('/falseVisivilitySportCourses', [AdminController::class,'falseVisivilitySportCourses']);//Отключение курса(название) +Route::put('/VisivilitySportCourses', [AdminController::class,'VisivilitySportCourses']);//Включение/отключение курса +Route::post('/AddSportTasks', [AdminController::class,'AddSportTasks']);//Добавление упражнения +Route::post('/AddImage', [AdminController::class,'AddImage']);//Добавление фотографии +Route::post('/CreateAccountDoctor', [AdminController::class,'CreateAccountDoctor']);//Регистрация врача +Route::post('/CreateSetsOfSportsActivities', [AdminController::class,'CreateSetsOfSportsActivities']);//Добавление записи в набор курсов +Route::post('/CreateSetsOfSportsExercises', [AdminController::class,'CreateSetsOfSportsExercises']);//Создание связи между набором для курса и упражнения +Route::get('/GetCours', [AdminController::class,'GetCours']);//ВЫвод курса по названию(1 курс) + + + + +//Запросы для пациента + +//Route::get('/asdasdas', [PatientController::class,'asdasdas']);//Авторизация пациента + +Route::post('/LoginPatient', [PatientController::class,'LoginPatient']);//Авторизация пациента +Route::middleware(['auth:patient_token'],)->group(function(){ + Route::get('/CheckTokenPatient', [PatientController::class,'CheckTokenPatient']);//Проверка токена, если при запуске приложения данный запрос вернет "300" значит токен действителен, иначе выбросит пользователя на страницу авторизации, данный запрос вызовется в том случае если в приложение пресутсвуют данные в переменной Token + Route::post('/LogoutPatient', [PatientController::class,'LogoutPatient']);//Авторизация + Route::post('/AddBeforeQuestionnaire', [PatientController::class,'AddBeforeQuestionnaire']);//Заполнение анкеты ДО + Route::post('/AddAfterQuestionnaire', [PatientController::class,'AddAfterQuestionnaire']);//Заполнение анкеты ПОСЛЕ + Route::post('/AddCourses', [PatientController::class,'AddCourses']);//Добавление курса на сегодня + Route::post('/AddCourses2', [PatientController::class,'AddCourses2']);//Добавление курса на сегодня + Route::get('/CoutSportCourses', [PatientController::class,'CoutSportCourses']);//Вывод списка спортивных задания на 1 день + Route::get('/VisibleView', [PatientController::class,'VisibleView']);//Вывод нужного экрана + Route::get('/VisibleView2', [PatientController::class,'VisibleView2']);//Вывод нужного экрана + Route::get('/VisibleView3', [PatientController::class,'VisibleView3']);//Вывод нужного экрана + + //Для тестов + Route::post('/AddBeforeQuestionnaire2', [PatientController::class,'AddBeforeQuestionnaire2']); + Route::post('/AddAfterQuestionnaire2', [PatientController::class,'AddAfterQuestionnaire2']);//Заполнение анкеты ПОСЛЕ + + //Проверка токена + + + Route::get('/PatientCalendareDay', [PatientController::class,'PatientCalendareDay']);//Вывод календаря + Route::get('/GetSportDay',[PatientController::class,'GetSportDay']);//Вывод списка упражнений + Route::get('/GetSportDayOne',[PatientController::class,'GetSportDayOne']);//Вывод определенного упражнения + + // Route::get('/asddsasdasad',[PatientController::class,'asddsasdasad']);//Вывод определенного упражнения + Route::put('/AddSportCheck',[PatientController::class,'AddSportCheck']);//Подтверждение выполненности упражнения + Route::get('/ProgressPatientCourses',[PatientController::class,'ProgressPatientCourses']);//Вывод прогресса пациента + + //Сообщения + Route::get('/GetAppealsPatientNew',[PatientController::class,'GetAppealsPatientNew']); //Получение необработанных заявлений + Route::get('/GetAppealsPatientOld',[PatientController::class,'GetAppealsPatientOld']); //Получение обработанных заявлений + Route::post('/AddMessagePatient',[PatientController::class,'AddMessagePatient']); //Создание сообщение от врача + Route::put('/UpdateMessagePatient',[PatientController::class,'UpdateMessagePatient']); //Обработано сообщение от пациента + + //День окончания блока и паузы + Route::get('/getDatePause',[PatientController::class,'getDatePause']); //день окончания паузы + Route::get('/getDateBlock',[PatientController::class,'getDateBlock']); //День окончания блока + + Route::get('/LookBefore',[PatientController::class,'LookBefore']); //Проверка на то есть ли анкета ДО + Route::get('/LookAfter',[PatientController::class,'LookAfter']); //Проверка на то есть ли анкета ПОСЛЕ + + Route::get('/GetCalendare',[PatientController::class,'GetCalendare']); //Вывод списка дней календаря + + + + Route::get('/dkkofskfkk',[PatientController::class,'dkkofskfkk']); //dkkofskfkk + //Route::get('/AddDayCalendare', [PatientController::class,'AddDayCalendare']);//Вывод данных для первой страницы врача + + + Route::get('/AddandClearDayPatient',[PatientController::class,'AddandClearDayPatient']); //Вывод списка дней календаря + + +}); + +//Запросы для врача + +Route::post('/LoginDoctor', [DoctorController::class,'LoginDoctor']);//Авторизация врача +Route::middleware(['auth:doctor_token'],)->group(function(){ + Route::get('/CheckTokenDoctor', [DoctorController::class,'CheckTokenDoctor']); + Route::post('/LogoutDoctor', [DoctorController::class,'LogoutDoctor']);//Авторизация + Route::get('/GetPatientAll', [DoctorController::class,'GetPatientAll']);//Вывод всех пациентов + Route::get('/GetPatientAllActive', [DoctorController::class,'GetPatientAllActive']);//Вывод всех пациентов определенного врача с активными курсами + Route::get('/GetPatientAllNotActive', [DoctorController::class,'GetPatientAllNotActive']);//Вывод всех пациентов определенного врача с не активными курсами + + Route::get('/GetPatientID', [DoctorController::class,'GetPatientID']);//Вывод пациента по if + Route::get('/GetPatientSearch', [DoctorController::class,'GetPatientSearch']);//Вывод пациентов + Route::post('/CreateAccountPatient', [DoctorController::class,'CreateAccountPatient']);//Создание аккаунта + Route::put('/UpdateAccountPatient', [DoctorController::class,'UpdateAccountPatient']);//Обновление данных пользователя + //Route::post('/AddCoursesAccountPatient', [DoctorController::class,'AddCoursesAccountPatient']);//Добавление курса пациенту + Route::put('/UpdateBlockAccountPatient', [DoctorController::class,'UpdateBlockAccountPatient']);//Добавление блокировки + Route::put('/UpdatePauseAccountPatient', [DoctorController::class,'UpdatePauseAccountPatient']);//Добавление паузы +// Route::post('/Addreport7dayAccountPatient', [DoctorController::class,'Addreport7dayAccountPatient']);//Добавление паузы +// Route::post('/Addreport15dayAccountPatient', [DoctorController::class,'Addreport15dayAccountPatient']);//Добавление паузы + Route::get('/GetCours', [DoctorController::class,'GetCours']);//Получения курса пациента в зависимости от того сколько дней пройдено + Route::post('/AddSportPatient', [DoctorController::class,'AddSportPatient']);//Добавление курса пациенту + Route::put('/ClearPatientSport', [DoctorController::class,'ClearPatientSport']);//Очистка курса у пациента + + Route::get('/GetPatientBAQiestionar', [DoctorController::class,'GetPatientBAQiestionar']);//Вывод отчетов + Route::get('/GetCoursAll', [DoctorController::class,'GetCoursAll']);//Вывод всех курсов + Route::get('/GetCoursAllPatient', [DoctorController::class,'GetCoursAllPatient']);//Вывод курссов стандартных + Route::get('/GetCoursesDoctorPatient', [DoctorController::class,'GetCoursesDoctorPatient']);//Вывод курса кастомных от врача + + + Route::get('/GetCoursesSport', [DoctorController::class,'GetCoursesSport']);//Вывод список упражнений курса + Route::get('/GetCoursesSportYes', [DoctorController::class,'GetCoursesSportYes']);//Вывод список включенных упражнений курса + Route::get('/GetCoursesSportNo', [DoctorController::class,'GetCoursesSportNo']);//Вывод список отключенных упражнений курса + + Route::put('/UpdateBlockSportTasksYes', [DoctorController::class,'UpdateBlockSportTasksYes']);//Включение упражнения + Route::put('/UpdateBlockSportTasksNo', [DoctorController::class,'UpdateBlockSportTasksNo']);//Отключение упражнения + + Route::put('/UpdatePatientLogin', [DoctorController::class,'UpdatePatientLogin']);//Обновление логина пациента + Route::put('/UpdatePatientPassword', [DoctorController::class,'UpdatePatientPassword']);//Обновление пароля пациента + + //Сообщения + Route::get('/GetAppealsDoctorNew',[DoctorController::class,'GetAppealsDoctorNew']); //Получение необработанных заявлений + Route::get('/GetAppealsDoctorOld',[DoctorController::class,'GetAppealsDoctorOld']); //Получение обработанных заявлений + Route::post('/AddMessageDoctor',[DoctorController::class,'AddMessageDoctor']); //Создание сообщение от врача + Route::put('/UpdateMessageDoctor',[DoctorController::class,'UpdateMessageDoctor']); //Обработано сообщение от пациента + + Route::post('/AddCoursesName', [DoctorController::class,'AddCoursesName']);//Создание основы для собственного курса от врача + Route::get('/GetCoursesDoctor', [DoctorController::class,'GetCoursesDoctor']);//Вывод созданных курсов врача + + Route::post('/AddCoursesCreatingDoctor',[DoctorController::class,'AddCoursesCreatingDoctor']); //Добавление упражнения в курс врача + Route::delete('/ClearCoursesCreatingDoctor',[DoctorController::class,'ClearCoursesCreatingDoctor']); //Удаление упражнения в курс врача + + Route::get('/GetEditCourseDoctorAll', [DoctorController::class,'GetEditCourseDoctorAll']);//Вывод всех упражнений не входящих в курс + Route::get('/GetEditCourseDoctorYour', [DoctorController::class,'GetEditCourseDoctorYour']);//Вывод всех упражнений входящих в курс + + Route::get('/CountPatientAndAppeals', [DoctorController::class,'CountPatientAndAppeals']);//Вывод данных для первой страницы врача + + + +}); +Route::get('/GetCoursAll', [DoctorController::class,'GetCoursAll']);//Вывод всех курсов +//Очистка +Route::get('/clear', function() { + + Artisan::call('cache:clear'); + Artisan::call('config:clear'); + Artisan::call('config:cache'); + Artisan::call('view:clear'); + Artisan::call('route:clear'); + + return "Cleared!"; + +}); diff --git a/routes/channels.php b/routes/channels.php new file mode 100644 index 0000000..5d451e1 --- /dev/null +++ b/routes/channels.php @@ -0,0 +1,18 @@ +id === (int) $id; +}); diff --git a/routes/console.php b/routes/console.php new file mode 100644 index 0000000..e05f4c9 --- /dev/null +++ b/routes/console.php @@ -0,0 +1,19 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 0000000..67561f9 --- /dev/null +++ b/routes/web.php @@ -0,0 +1,19 @@ +make(Kernel::class)->bootstrap(); + + return $app; + } +} diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php new file mode 100644 index 0000000..8364a84 --- /dev/null +++ b/tests/Feature/ExampleTest.php @@ -0,0 +1,19 @@ +get('/'); + + $response->assertStatus(200); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..2932d4a --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..421b569 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.js'], + refresh: true, + }), + ], +});
3
Suede fabric pointed toe stylish cut front low heel
Some representative placeholder content for the first slide.
Some representative placeholder content for the second slide.
Some representative placeholder content for the third slide.