{"id":22572773,"url":"https://github.com/dmfed/astral-test","last_synced_at":"2025-10-10T01:33:55.463Z","repository":{"id":144365491,"uuid":"375722535","full_name":"dmfed/astral-test","owner":"dmfed","description":"Test assignment for job interview","archived":false,"fork":false,"pushed_at":"2021-06-10T14:19:22.000Z","size":11,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-20T08:51:25.472Z","etag":null,"topics":["basicauth","html","http","http-server","sqlite-database","sqlite3"],"latest_commit_sha":null,"homepage":"","language":"Go","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/dmfed.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":"2021-06-10T14:17:07.000Z","updated_at":"2021-10-21T22:09:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"fdafe9bf-59a4-41af-89e2-97ae5078ea8a","html_url":"https://github.com/dmfed/astral-test","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dmfed/astral-test","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmfed%2Fastral-test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmfed%2Fastral-test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmfed%2Fastral-test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmfed%2Fastral-test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dmfed","download_url":"https://codeload.github.com/dmfed/astral-test/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmfed%2Fastral-test/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002405,"owners_count":26083374,"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-09T02:00:07.460Z","response_time":59,"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":["basicauth","html","http","http-server","sqlite-database","sqlite3"],"created_at":"2024-12-08T02:11:52.414Z","updated_at":"2025-10-10T01:33:55.425Z","avatar_url":"https://github.com/dmfed.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Комментарии к выполненному тестовому заданию\n\nПривет. Представляю вашему вниманию решение тестового задания. Инструкция по\nзапуску в самом низу, но я бы просил прочесть комментарии к решению тоже, раз уж я их написал.\n5 min read.\n\n## Постановка задачи\nЗадание было сформулировано так: \n```\nТестовое задание. \nРеализовать веб приложение которое позволит авторизироваться, \nдобавлять данные(как вариант можно реализовать таблицу для продаж \nтоваров) в бд через страничку сайта и отображать данные из бд на \nотдельной странице. \nКачество верстки не важно, тип бд на выбор - mysql\\postgres\\sqlite. \nДолжна быть инструкция по запуску приложения. \nКод залить на github и предоставить ссылку.\n```\n\n## Комментарии к решению  \n1. Из задания не понятно однозначно, надо ли аутентифицировать пользователя для доступа ко всем страницам или только\nдля страницы добавления данных. Сделал аутентификацию по всем страницам. Исправляется на \"показывать всем\" удалением \nпары строчек. Разумеется, с реальной задачей надо было бы уточнить требования, на игрушечную не стал тратить время.\n\n2. Для хранилища выбрана Sqlite3, чтобы было проще собрать и запустить приложение,\nне поднимая полноценную базу. На целевой машине, соответственно, должна быть только sqlite3, а это буквально \nлюбой дистрибутив Linux или отсносительно свежая версия macOS. Библиортека для Sqlite - это, кстати,\nединственная внешняя зависимость, а минимум внешних зависимостей я считаю в целом хорошей практикой. \nХранилище полностью реализует CRUD, несмотря на то, что для решения этого не требуется. (Но при этом веб часть реализует \nтолько тот функционал, что был запрошен.)\n\n3. Имена пользователей и пароли хранятся в plain-text файле тоже для простоты и чтобы \nне тащить в проект лишние библиотеки (для хранения хэша пароля в норме бы использовал golang.org/x/crypto/bcrypt).\n\n4. Аутентификация пользователя на уровне HTTP организована с помощью отвечающего стандарту способа Authorization: Basic.\nhttps://datatracker.ietf.org/doc/html/rfc7617 Опять же для того, чтобы не тащить в проект лишние библиотеки или JavaScript. \nОчевидно, что в реальности такой тип аутентификации можно использовать только с TLS (т.к. имя пользователя и пароль передаются \nв base64, т.е. в plain-text). Кроме того, это решение упростило код, т.к. стандартная библиотека Go знает про Basic, что удобно.\nИ да, программе можно указать файлы сертифика и ключа, и тогда будет TLS.\n\n5. Маршрутизация по endpoints намеренно сделана без сторонних библиотек чисто на http.Handle, опять же чтобы избежать лишних зависимостей.\n(Gorilla mux многие очень любят приносить для этого в проект, и это функциональный роутер). Соответственно, проверки методов запроса сделаны руками.\n\n6. Код хендлеров http запросов не покрыт тестами. В норме надо было бы сделать тесты с помощью относительно недавно появившегося\nв стандартной библиотеке модуля https://golang.org/pkg/net/http/httptest/ Я, честно говоря, просто пожалел времени. Код хранилища и аутентификации при этом покрыты базовыми тестами. \n\n7. Струтура проекта могла бы быть лучше. Я вынес package main в корень проекта, чтобы упростить вам задачу запуска программы и сэкономить время.\nВ норме main хорошо бы класть в _repo root_/cmd.\n\n8. Такое понятие как \"верстка\" в моем решении остутсвует как класс, раз это было допустимо по условию. Честно не люблю делать пользовательские\nинтерфейсы, если речь не про CLI- утилиты (там люблю, да).\n\n\n## Инструкция по запуску\nПрограмма собирается компилятором Go версии 1.16.4. Более ранние версии (от 1.13) могут и должны работать, но это не проверялось.\nПрограмма собирается на Linux и macOS. Windows у меня нет. \n\nВ системе должны быть установлены sqlite3 и gcc (или clang на macOS) для сборки пакета **github.com/mattn/go-sqlite3**, т.к. библиотека\nиспользует cgo.\n\nПрограмме требуется модуль go-sqlite3. Инструкция по установке этой библиотеки находится здесь: https://github.com/mattn/go-sqlite3#installation.\n\nПосле установки библиотеки:\n\ngit clone https://  \ncd astral \u0026\u0026 go build \n\nВ репозитории уже лежит \"база данных\" уже наполненная рандомными объектами - **sample.db**, чтобы сразу что-то показывать. Также в корне репозиотрия \nлежит файл **users.conf**, в который можно добававлять user credentials. На одной строке должно быть два слова - имя пользователя (alphanumeric characters) \nи пароль (любые символы). По любой из найденных в файле пар можно залогиниться.\n\nДля запуска со значениями по умолчанию достаточно сказать **./astral**. Cервер будет слушать на **127.0.0.1:8083**. \n\nИмя пользователя: **user1**, пароль: **password1**. \n\nЧтобы изменить поведение по умолчанию - см. **./astral -- help**.\n\n**Ctrl+C** - чтобы завершить программу.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmfed%2Fastral-test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmfed%2Fastral-test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmfed%2Fastral-test/lists"}