{"id":23498368,"url":"https://github.com/cucumberian/_test_secrets_api","last_synced_at":"2026-05-05T23:31:54.664Z","repository":{"id":233589792,"uuid":"776482451","full_name":"cucumberian/_test_secrets_api","owner":"cucumberian","description":"secrets saving via api and one-time access via key generation","archived":false,"fork":false,"pushed_at":"2024-03-27T23:09:38.000Z","size":11,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-23T14:02:46.000Z","etag":null,"topics":["api","cryptography","fastapi","onetimesecret","redis"],"latest_commit_sha":null,"homepage":"http://secrets_api.minini.ru/docs","language":"Python","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/cucumberian.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}},"created_at":"2024-03-23T16:24:23.000Z","updated_at":"2024-10-19T10:45:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"b345834b-8e3b-402b-b8f4-b31d89004663","html_url":"https://github.com/cucumberian/_test_secrets_api","commit_stats":null,"previous_names":["cucumberian/_test_secrets_api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cucumberian/_test_secrets_api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumberian%2F_test_secrets_api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumberian%2F_test_secrets_api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumberian%2F_test_secrets_api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumberian%2F_test_secrets_api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cucumberian","download_url":"https://codeload.github.com/cucumberian/_test_secrets_api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cucumberian%2F_test_secrets_api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32672569,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-05T11:29:49.557Z","status":"ssl_error","status_checked_at":"2026-05-05T11:29:48.587Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["api","cryptography","fastapi","onetimesecret","redis"],"created_at":"2024-12-25T05:31:34.470Z","updated_at":"2026-05-05T23:31:54.651Z","avatar_url":"https://github.com/cucumberian.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Тестовое задание на вакансию backend разработчика\n## Задача:\nНужно сделать HTTP сервис для одноразовых секретов наподобие https://onetimesecret.com/.\n\nОн должен позволить создать секрет, задать кодовую фразу для его открытия и сгенерировать код, по которому можно прочитать секрет только один раз. UI не нужен, это должен быть \nJSON Api сервис.\n\nДля написания сервиса можно использовать FastAPI или любой другой фреймворк.\n    • Метод /generate должен принимать секрет и кодовую фразу и отдавать secret_key по которому этот секрет можно получить.\n    • Метод /secrets/{secret_key} принимает на вход кодовую фразу и отдает секрет.\n\n### Требования:\n    • Язык программирования: Python 3.7.\n    • Использование Docker, сервис должен запускаться с помощью docker-compose up.\n    • Код должен быть реализован на Фреймворке FastAPI .\n    • Код должен соответствовать PEP, необходимо использование type hints, к публичным методам должна быть написана документация на английском языке.\n### Усложнения:\n    • Написаны тесты (постарайтесь достичь покрытия в 70% и больше). Вы можете использовать pytest или любую другую библиотеку для тестирования.\n    • Сервис асинхронно обрабатывает запросы.\n    • Данные сервиса хранятся во внешнем хранилище, запуск которого также описан в docker-compose. Мы рекомендуем использовать Postgres, но Вы можете использовать любую подходящую базу.\n    • Секреты и кодовые фразы не хранятся в базе в открытом виде.\n    • Добавлена возможность задавать время жизни для секретов. Можно попробовать реализовать это с помощью TTL индексов.\n\n\n\n## Запуск\n### через docker-compose\n```shell\ndocker-compose up -d\n```\n### вручную\n1. Задать преемнные окружения, напрмиер через файл `.env`:\n```env\nexport REDIS_HOST=127.0.0.1\nexport REDIS_PORT=6379\nexport REDIS_DB=0\n```\n2. Считать файл с перемеными окружения\n```shell\nsource .env\n```\n3. перейти в каталог с приложение и установить зависсимости\n```shell\ncd app\npip3 install -r requirements.txt\n```\n4. запустить dev сервер через uvicorn\n```shell\nuvicorn app:app --host 127.0.0.1 --port 8000\n```\n\n- апи сервиса доступно по адресу http://localhost:8000/\n- документация по апи доступна по адресу http://localhost:8000/docs\n\n## Реализация\n### Эндпоинт `/generate`\nПри получении секрета и кодовой фразы, генерируется __ключ__,  секрет кодируется при помощи кодовой фразы и сохраняется в базу данных редис с секретным ключем с указанным временем жизни (по-умолчанию 1 час).\n### Эндпоинт `/secret/\u003cключ\u003e`\nПри получении ключа и кодовой фразы, секрет извлекается из базы данных по ключу и декодируется при помощи кодовой фразы. Если кодовая фраза неверная или секрета нет в базе данных, то пользователю выводится сообщение о том, что секрета нет.\nПосле извлечения секрета, он удаляется из базы данных и декодированный секрет отправляется пользователю.\n\n### Зависимости\n```shell\npip3 install fastapi redis cryptography uvicorn\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcucumberian%2F_test_secrets_api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcucumberian%2F_test_secrets_api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcucumberian%2F_test_secrets_api/lists"}