{"id":21101392,"url":"https://github.com/trofimovdev/vk_chess","last_synced_at":"2025-10-14T19:08:39.527Z","repository":{"id":144132386,"uuid":"271764400","full_name":"trofimovdev/vk_chess","owner":"trofimovdev","description":"Решение тестового задания по бэкенду от VK","archived":false,"fork":false,"pushed_at":"2020-06-18T10:57:27.000Z","size":71,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-14T19:06:24.220Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/trofimovdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-06-12T09:50:09.000Z","updated_at":"2020-06-18T10:57:29.000Z","dependencies_parsed_at":null,"dependency_job_id":"38c19b2b-6fcb-4d7e-9d99-ba9c25a8357c","html_url":"https://github.com/trofimovdev/vk_chess","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/trofimovdev/vk_chess","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trofimovdev%2Fvk_chess","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trofimovdev%2Fvk_chess/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trofimovdev%2Fvk_chess/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trofimovdev%2Fvk_chess/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trofimovdev","download_url":"https://codeload.github.com/trofimovdev/vk_chess/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trofimovdev%2Fvk_chess/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279020641,"owners_count":26086895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-14T02:00:06.444Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-19T23:46:05.060Z","updated_at":"2025-10-14T19:08:39.522Z","avatar_url":"https://github.com/trofimovdev.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Тестовое задание\nЗадача: написать бэкенд для проведения шахматной партии.\n\nЧто требуется:\n* язык PHP,\n* использовать ООП,\n* хранить состояние партии (положение фигур на доске и очередность хода),\n* проверять ход на соответствие правилам,\n* определять конец игры,\n* написать API:\n* cделать ход,\n* cтатус партии,\n* начать новую партию,\n* продумать какие типы ошибок могут быть.\n\nЧто должно получится на выходе:\nвеб-сервис, который дает возможность провести шахматную партию, используя обозначенные выше методы API.\n\nЧто НЕ надо делать:\n* вычислять патовую ситуацию,\n* визуализацию.\n\n# Решение\nЯ решил, что использовать фреймворк для трех эндпоинтов нерационально, поэтому все написано на native PHP 7.4,\nзависимости через Composer.\n\nВ качестве БД используется Postgres, доска с фигурами хранится в JSONB. При вызове методов берется конкретная запись\nигры (т.е. ищется точное совпадение id), поэтому поиск можно оптимизировать с помощью хеш-индексов вместо стандартного\nB-tree.\n\n## Эндпоинты\n* /create — создать новую игры,\n* /move — сделать ход,\n* /status — получить статус партии.\n\n[Документация на Postman](https://documenter.getpostman.com/view/10892299/SzzkcHR2?version=latest)\n\n## Реализованный функционал:\n* базовые правила игры,\n* автоматический расчет очередности хода (нельзя передвинуть чужую фигуру),\n* [рокировка](https://ru.wikipedia.org/wiki/%D0%A0%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0),\n* [превращение пешки](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%88%D0%BA%D0%B8),\n* [взятие на проходе](https://ru.wikipedia.org/wiki/%D0%92%D0%B7%D1%8F%D1%82%D0%B8%D0%B5_%D0%BD%D0%B0_%D0%BF%D1%80%D0%BE%D1%85%D0%BE%D0%B4%D0%B5),\n* юнит-тесты.\n\nПрототип развернут на [chess.trofimov.dev](https://chess.trofimov.dev), сыграть простую партию и поставить\n[«Дурацкий мат»](https://ru.wikipedia.org/wiki/%D0%94%D1%83%D1%80%D0%B0%D1%86%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B0%D1%82)\nможно с помощью готового набора ссылок:\n1. https://chess.trofimov.dev/create — создаем новую игру, далее в качестве {id} подставляем значение из ответа\n2. https://chess.trofimov.dev/move?id={id}\u0026from=g2\u0026to=g4 — ходим g2-g4 за белых\n3. https://chess.trofimov.dev/move?id={id}\u0026from=e7\u0026to=e5 — ходим e7-e5 за черных\n4. https://chess.trofimov.dev/move?id={id}\u0026from=f2\u0026to=f3 — ходим f2-f3 за белых\n5. https://chess.trofimov.dev/move?id={id}\u0026from=d8\u0026to=h4 — ходим Фd8-h4× за черных\n\n## Установка\nНеобходим PHP 7.4, Postgres (10+ для использования хеш-индексов, т.к. до этой версии их использование не гарантирует\nцелостность данных при сбое), настроить проксирование запросов к /index.php (у меня Nginx с PHP-FPM, конфиг в папке\n`scripts/`) и заполнить данные от БД в .env файле.\n\n```shell\ngit clone https://github.com/trofimovdev/vk_chess.git \u0026\u0026 cd vk_chess\ncomposer install\npsql -U {db_user} {db_name} \u003c scripts/dump.sql\ncp .env.example .env\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrofimovdev%2Fvk_chess","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrofimovdev%2Fvk_chess","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrofimovdev%2Fvk_chess/lists"}