Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
d36cf7a
feat(config): implement centralized configuration module
soorq Apr 10, 2026
e96728b
feat(db): integrate drizzle orm, pg driver and initial migrations (#3)
soorq Apr 10, 2026
193f273
chore(repo): setup code quality tools and development environment
maksberegovoi Apr 10, 2026
4b790ab
chore(test): migrate from Jest to Vitest and setup lint-staged
maksberegovoi Apr 10, 2026
89d7ba6
feat(infra): bootstrap docker orchestration and core database module
soorq Apr 10, 2026
6eb3ab5
refactor: migrate from express to fastify and implement unified boots…
soorq Apr 10, 2026
46c4000
feat(infra): establish open-source automation and contribution standards
soorq Apr 10, 2026
298d512
docs: update README, contributing guide and address reviewer feedback
maksberegovoi Apr 10, 2026
ed00545
chore: setup husky, commitlint and lint-staged
maksberegovoi Apr 10, 2026
417bbf6
feat: implement health check and dump modules
soorq Apr 10, 2026
bdd4dce
fix(docker): image at pnpm prune scripts
soorq Apr 10, 2026
07cb9d4
revert:fix: docker image (#12)
soorq Apr 10, 2026
4fb50b5
chore: global reformat and setup prettier ignore rules (#14)
maksberegovoi Apr 10, 2026
2dcd2bd
feat: implement core modules (Auth, User), S3 integration, and CI/CD …
soorq Apr 13, 2026
be55453
feat(teams): full implementation of team management system
soorq Apr 15, 2026
bda6663
feat/refactor: modularize architecture and finalize projects module
soorq Apr 22, 2026
88e0e39
refactor: error example at swagger (#30)
soorq Apr 22, 2026
e2da98f
fix(auth): handle auth exceptions and fix internal server error 500 (…
soorq Apr 22, 2026
9b66ff7
fix: correct api versioning and improve global exception filter (#35)
soorq Apr 23, 2026
a67c894
feat(invitations): implement team invitation management with update a…
maksberegovoi Apr 24, 2026
24decf5
fix(teams): prevent duplicate tags in team creation (#36)
maksberegovoi Apr 24, 2026
5813ee9
chore: add redis password (#39)
soorq Apr 27, 2026
ad36605
refactor: optimize Dockerfiles with pnpm fetch and non-root users (#40)
soorq Apr 27, 2026
729d43f
fix(docker): fix static files copying in Dockerfile (#41)
soorq Apr 27, 2026
8c1ba12
feat(infra): setup k6 load testing, pnpm workspaces and production do…
soorq Apr 29, 2026
d2b2c42
refactor: complete migration to DDD Hexagonal architecture
soorq May 1, 2026
e629ed4
fix(teams): include user email in invitation handling methods (#55)
maksberegovoi May 1, 2026
a2f56be
refactor(teams): integrate mailer and add invitation ttl #56
maksberegovoi May 2, 2026
e5b452f
fix(auth): enhance refresh token cookie handling with environment-spe…
maksberegovoi May 2, 2026
32e2b36
refactor: smtp host provider (#59)
soorq May 3, 2026
552ebf4
refactor: auth controller to clear cookie on logout (#60)
soorq May 3, 2026
34b679c
feat: implement robust async media processing system and infrastructu…
soorq May 6, 2026
6d19373
refactor(auth): unify token expiration and session creation (#62)
soorq May 7, 2026
266d7dd
feat(logging): implement structured JSON logging with Winston and Lok…
soorq May 10, 2026
e014183
refactor(db): migrate to postgres.js and modernize database module #73
soorq May 11, 2026
505be2f
ci: stabilize pipelines, optimize db integrity checks and refactor wo…
soorq May 12, 2026
dafcb2c
refactor(s3): rework module instantiation with ConfigurableModuleBuil…
maksberegovoi May 14, 2026
7bac0e4
chore(tech-debt): refactor health module add to components and review…
soorq May 14, 2026
7ed455e
feat(cache): add cache module and redis adapter
maksberegovoi May 15, 2026
2db1ba8
refactor(health): enhance health check service with database and cach…
maksberegovoi May 15, 2026
6c341ea
test(health): add unit tests for health service indicators and status…
maksberegovoi May 15, 2026
628318b
feat: option forcePathStyle
soorq May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .commitlintrc.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default {
extends: ['@commitlint/config-conventional'],
};
42 changes: 42 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Dependencies
node_modules
npm-debug.log
yarn-error.log
pnpm-debug.log
infra/k6/node_modules

# Build output
dist
artifacts
out

# Environment variables
.env
.env.production
.env.local
!.env.example

# Docker / Infrastructure
docker-compose.yml
docker-compose.*.yml
Dockerfile
Dockerfile.*
.dockerignore

# Git
.git
.gitignore
.gitattributes

# Editor / OS
.vscode
.idea
.DS_Store
*.swp
*.log

# Tests and Coverage
coverage
test-results
*.spec.ts
*.e2e-spec.ts
52 changes: 52 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# --- APP ---
PORT=3000
NODE_ENV=development
COOKIE_SECRET=same-serious-secret
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://127.0.0.1:3000
THROTTLE_LIMIT=100
THROTTLE_TTL=60000

# --- POSTGRES ---
DB_SCHEMA=base

# ВАЖНО:
# Для работы ВНУТРИ Docker: используй хост 'database' и порт 5432
# DATABASE_URL=postgres://${DB_USERNAME}:${DB_PASSWORD}@database:5432/${DB_DATABASE}

# Для работы ЛОКАЛЬНО (без докера): используй 'localhost' и порт 6000
DATABASE_URL=postgres://${DB_USERNAME}:${DB_PASSWORD}@localhost:${DB_PORT}/${DB_DATABASE}

# --- REDIS ---
# in the docker network will be, not show port redis, at prod env
# REDIS_HOST=redis
# at development mode
REDIS_HOST=127.0.0.1
REDIS_PORT=7000
REDIS_PASSWORD=same-password

JWT_AUDIENCE="task-tracker-client"

JWT_ACCESS_SECRET=same-same-same-same-same
JWT_ACCESS_EXPIRES_IN=15m

JWT_REFRESH_SECRET=same-same-same-same-same
JWT_REFRESH_EXPIRES_IN=15m

# --- MAIL SETTINGS ---
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USER=example@gmail.com

# 16x password
MAIL_PASSWORD=xxxxxxxxyyyyyyyy
MAIL_FROM_NAME="Task Tracker"
MAIL_FROM_EMAIL=example@gmail.com

S3_BUCKET_NAME=''
S3_ENDPOINT=''
S3_REGION=''
S3_ACCESS_KEY=''
S3_SECRET_KEY=''

IMAGOR_SECRET=''
IMAGOR_URL=''
67 changes: 44 additions & 23 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,46 @@
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
project: 'tsconfig.json',
tsconfigRootDir: __dirname,
sourceType: 'module',
},
plugins: ['@typescript-eslint/eslint-plugin'],
extends: [
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
],
root: true,
env: {
node: true,
jest: true,
},
ignorePatterns: ['.eslintrc.js'],
rules: {
'@typescript-eslint/interface-name-prefix': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-explicit-any': 'off',
},
parser: '@typescript-eslint/parser',
parserOptions: {
project: 'tsconfig.json',
tsconfigRootDir: __dirname,
sourceType: 'module',
},
plugins: ['@typescript-eslint/eslint-plugin'],
extends: ['plugin:@typescript-eslint/recommended'],
root: true,
env: {
node: true,
},
globals: {
describe: 'readonly',
it: 'readonly',
expect: 'readonly',
beforeEach: 'readonly',
afterEach: 'readonly',
vi: 'readonly',
},
ignorePatterns: [
'.eslintrc.js',
'*.config.{js,ts}',
'migrations',
'infra',
'.github',
'dist',
'node_modules',
],
rules: {
'prettier/prettier': 'off',
'@typescript-eslint/interface-name-prefix': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
},
],
},
};
41 changes: 41 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: 'Bug Report'
description: 'Сообщить об ошибке в работе приложения'
labels: ['bug', 'triage']
body:
- type: markdown
attributes:
value: |
Спасибо, что решили помочь сделать проект лучше!
- type: input
id: version
attributes:
label: 'Версия приложения'
description: 'Какую версию вы используете? (например, 0.0.1)'
placeholder: '0.0.x'
validations:
required: true
- type: textarea
id: steps
attributes:
label: 'Шаги воспроизведения'
description: 'Как нам увидеть эту ошибку?'
placeholder: |
1. Запустить docker-compose
2. Отправить POST запрос на /api/v1/auth...
validations:
required: true
- type: dropdown
id: environment
attributes:
label: 'Окружение'
options:
- Docker
- Local (pnpm)
- Production
validations:
required: true
- type: textarea
id: expected
attributes:
label: 'Ожидаемое поведение'
placeholder: 'Что должно было произойти?'
10 changes: 10 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
blank_issues_enabled: false

contact_links:
- name: '❓ Вопросы по использованию'
url: 'https://github.com/Task-Tracker-Lab/task-tracker-backend/discussions/new?category=q-a'
about: 'Если вы не уверены, баг это или нет, или вам нужна помощь в настройке — спросите здесь.'

- name: '💡 Идеи и предложения'
url: 'https://github.com/Task-Tracker-Lab/task-tracker-backend/discussions/new?category=ideas'
about: 'Хотите обсудить новую крутую фичу перед тем, как заводить задачу? Вам сюда.'
18 changes: 18 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: 'Feature Request'
description: 'Предложить новую идею или улучшение'
labels: ['enhancement']
body:
- type: textarea
id: problem
attributes:
label: 'Какую проблему мы решаем?'
description: 'Опишите, почему текущего функционала недостаточно.'
validations:
required: true
- type: textarea
id: solution
attributes:
label: 'Ваше предложение'
description: 'Как именно вы видите реализацию этой фичи?'
validations:
required: true
56 changes: 56 additions & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
core:
- changed-files:
- any-glob-to-any-file: 'src/**/*'
- all-globs-to-all-files:
- '!src/shared/entities/**/*'
- '!src/**/*.spec.{ts,js}'

database:
- changed-files:
- any-glob-to-any-file:
- 'src/shared/entities/**/*'
- 'libs/database/**/*'
- 'migrations/**/*'
- 'drizzle.config.ts'

dependencies:
- changed-files:
- any-glob-to-any-file:
- 'package.json'
- 'pnpm-lock.yaml'
- 'pnpm-workspace.yaml'

devops:
- changed-files:
- any-glob-to-any-file:
- 'infra/**/*'
- '.github/workflows/**/*'
- 'Dockerfile*'
- '.dockerignore'

testing:
- changed-files:
- any-glob-to-any-file:
- 'test/**/*'
- 'src/**/*.spec.{ts,js}'
- 'k6/**/*'
- 'vitest.config*'

libs:
- changed-files:
- any-glob-to-any-file: 'libs/**/*'
- all-globs-to-all-files:
- '!libs/database/**/*'

dx:
- changed-files:
- any-glob-to-any-file:
- 'pnpm-workspace.yaml'
- '.*'
- '!package.json'

documentation:
- changed-files:
- any-glob-to-any-file:
- '**/*.md'
- 'LICENSE'
73 changes: 73 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
name: Build and Push

on:
push:
branches: [main, dev, 'feat/**', 'fix/**', 'refactor/**', 'chore/**']
pull_request:
branches: [main, dev]
workflow_dispatch:
inputs:
force_push:
description: 'Force push image to registry?'
type: boolean
default: false

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}

jobs:
build-push:
runs-on: ubuntu-latest
env:
IS_BASE_BRANCH: ${{ github.ref_name == 'main' || github.ref_name == 'dev' }}
IS_PUSH: ${{ github.event_name == 'push' }}
FORCE_PUSH: ${{ github.event.inputs.force_push == 'true' }}

permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to the Container registry
if: ${{ (env.IS_PUSH == 'true' && env.IS_BASE_BRANCH == 'true') ||
env.FORCE_PUSH == 'true' }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels)
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=ref,event=branch
type=sha,format=short
# latest вешаем только когда мерджим в main
type=raw,value=latest,enable=${{ github.ref_name == 'main' }}

- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile.prod
push: ${{ (env.IS_PUSH == 'true' && env.IS_BASE_BRANCH == 'true') ||
env.FORCE_PUSH == 'true' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
Loading
Loading