Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 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
4a905e6
refactor: smtp host provider
soorq May 2, 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
49 changes: 49 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# --- 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=''
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
50 changes: 50 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: Build and Push

on:
push:
branches: [dev, main, feat/**]

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

jobs:
build-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- uses: actions/checkout@v4

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

- name: Log in to the Container registry
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
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}

- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile.prod
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
37 changes: 37 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: CI

on:
pull_request:
branches: [dev, main, 'feat/**']
push:
branches: [dev, main, 'feat/**']

jobs:
quality-check:
name: Lint & Test
runs-on: ubuntu-latest

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

- name: Install pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Run Lint
run: pnpm run lint

- name: Type Check
run: pnpm exec tsc --noEmit

- name: Run Tests
run: pnpm run test
33 changes: 33 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: 'CodeQL'

on:
push:
branches: [main, dev, feat/**, chore/**, build/**]
pull_request:
branches: [main]
schedule:
- cron: '15 13 * * 5'

jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write

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

- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: javascript-typescript

- name: Autobuild
uses: github/codeql-action/autobuild@v3

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
18 changes: 18 additions & 0 deletions .github/workflows/release-please.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: release-please

on:
push:
branches:
- main

permissions:
contents: write
pull-requests: write

jobs:
release-please:
runs-on: ubuntu-latest
steps:
- uses: googleapis/release-please-action@v4
with:
release-type: node
Loading
Loading