TimeTracker — это система для отслеживания рабочего времени сотрудников, реализованная на языке Go. Проект предоставляет REST API для управления пользователями и их трудозатратами.
- Получение данных пользователей с фильтрацией и пагинацией.
- Получение трудозатрат по пользователю за период с сортировкой.
- Управление отсчетом времени по задачам для пользователей.
- Удаление пользователей.
- Изменение данных пользователей.
- Добавление новых пользователей.
- Получение информации через внешний API и обогащение данных пользователей. Для получения данных от API и их обогащения используется workerpool, который выполняется периодически с интервалом, заданным в настройках.
-
Автоматическое закрытие незавершенных задач: Задача, которая не была закрыта пользователем в текущем дне (поле "End time" пустое), автоматически считается закрытой той же датой концом рабочего дня*. Следовательно, для продолжения работы над задачей на следующий день, пользователь должен стартовать задачу заново. Такой подход избавит нас от необходимости регламентно создавать записи в базе, а также обрабатывать ситуации, когда регламент по аварийным причинам не работал в течение какого-то времени или была запущена тестовая копия рабочей базы, что может привести к длительному созданию записей. Кроме того, если задачи будут в рамках одного дня, будет проще работать с индексами и создавать соединения с другими таблицами, например, для тарификации времени разработчика. Пустая дата завершения = Конец рабочего дня. При необходимости можно реализовать отдельный флаг в настройках пользователя "Auto-carry over unfinished tasks" и логику для переноса задач.
-
Запрет на старт активной задачи: Если пользователь пытается стартовать активную** задачу, ему будет запрещено это действие с выбросом ошибки о том, что по задаче уже ведется трекинг.
-
Обработка завершения трекинга по закрытой или отсутствующей задаче: Если пользователь пытается завершить трекинг по уже закрытой или отсутствующей записи, ему будет выброшена ошибка о том, что задача уже была завершена или активная запись не найдена.
(*) Конец рабочего дня: конец рабочего дня из настроек пользователя или календарный конец дня "23:59:59".
(**) Время завершения не заполнено.
- Настройка
golangci-lintи исправление выявленных ошибок и замечаний. - Покрытие проекта тестами.
- Реализация более гибких возможностей для получения трудозатрат по всем пользователям.
- Добавление возможности назначать ролей пользователям, чтобы разрешить доступ к данным по трудозатратам только определённым пользователям.
- Разработка клиентской части на React 18+.
Файл .env содержит следующие параметры конфигурации:
RUN_ADDRESS=:8080
LOG_LEVEL=debug
DATABASE_URI=postgres://timetracker:example@localhost:5432/timetracker?sslmode=disable
JWT_SIGNING_KEY=test_key
CONCURRENCY=5
TASK_EXECUTION_INTERVAL=3000
USER_UPDATE_INTERVAL="5m"
DEFAULT_END_TIME="19:00"
API_SYSTEM_ADDRESS="localhost:8081"
- RUN_ADDRESS: Адрес и порт для запуска сервера (по умолчанию
:8080). - LOG_LEVEL: Уровень логирования (
debug). - DATABASE_URI: URI для подключения к базе данных PostgreSQL.
- JWT_SIGNING_KEY: Ключ для подписи JWT.
- CONCURRENCY: Количество одновременно выполняемых задач в workerpool.
- TASK_EXECUTION_INTERVAL: Интервал выполнения задач (в миллисекундах) в workerpool.
- USER_UPDATE_INTERVAL: Интервал обновления пользователей (время устаревания данных пользователя).
- DEFAULT_END_TIME: Время окончания работы по умолчанию.
- API_SYSTEM_ADDRESS: Адрес внешней API системы для получения данных пользователей.
- Go: Основной язык программирования.
- PostgreSQL: База данных для хранения информации.
- Docker: Контейнеризация базы данных Postgresql.
- Swagger: Автоматическая генерация документации API.
- JWT: Аутентификация с использованием JSON Web Tokens.
- Zap: Логирование.
- cmd: Исходный код для командной строки.
- docs: Документация проекта.
- internal: Внутренние пакеты и код.
- migrations: Миграции базы данных.
- .env: Конфигурационный файл.
- LICENSE: Лицензия проекта.
- README.md: Основной файл с описанием проекта.
- .gitignore: Файл для игнорируемых Git файлов.
- go.sum и go.mod: Файлы для управления зависимостями Go.
- docker-compose.yml: Конфигурация Docker Compose.
- postman_collection.json: Коллекция Postman для тестирования API.
- Клонируйте репозиторий:
git clone https://github.com/yourusername/timetracker.git
- Перейдите в директорию проекта:
cd timetracker - Создайте файл
.envи заполните его необходимыми параметрами (можно использовать пример из вышеуказанного описания). - Запустите Docker Compose для создания базы данных Postgresql:
docker compose up -d
- Перейдите в каталог
cmd/timetrackerи выполните команду:Эта команда выполнит миграции базы данных и запустит сервер.go run main.go
- Убедиться, что БД запущена
- Убедиться, что таблицы в БД созданы
- Перейти в каталог migrations
- Выполнить команду:
psql postgres://timetracker:example@localhost:5432/timetracker?sslmode=disable -f insert_test_data.sqlВ корневом каталоге проекта в архиве externalTestAPI.zip находится наивная реализация внешнего сервиса для тестирования получения данных от внешнего API.
Для отладки можно использовать файл postman_collection.json, который находится в корне проекта. Импортируйте этот файл в Postman, чтобы использовать готовые запросы для тестирования API.
- GET /api/users: Получение данных пользователей с фильтрацией и пагинацией.
- POST /api/task/summary: Получение трудозатрат по пользователю за период.
- POST /api/task/start: Начать отсчет времени по задаче.
- POST /api/task/stop: Закончить отсчет времени по задаче.
- DELETE /api/user/{id}: Удаление пользователя.
- PATCH /api/user/{id}: Обновление данных пользователя.
- POST /api/user: Добавление нового пользователя.
- POST /api/user/register: Регистрация нового пользователя.
- POST /api/user/login: Авторизация пользователя.
- GET /ping: Проверка состояния сервиса.
- POST /api/task: Добавление новой задачи.
- PATCH /api/task/{id}: Обновление данных задачи.
- DELETE /api/task/{id}: Удаление задачи.
- GET /api/tasks: Получение списка задач с фильтрацией и пагинацией.
Проект распространяется под лицензией MIT. Смотрите файл LICENSE для получения дополнительной информации.