Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
714e0ae
infra(develop): creates CI/CD pipeline for staging environment
pedro-fs-garcia Apr 13, 2026
3f81c9a
fix: update deploy-staging workflow
pedro-fs-garcia Apr 13, 2026
f118515
feat(ticket): define final API contracts
eduardo-Rib Apr 14, 2026
736022e
hot_fix(seed): removes seeds that will cause conflict when merge happens
pedro-fs-garcia Apr 14, 2026
817d2f5
infra(docker-compose): fixes access to logs directory
pedro-fs-garcia Apr 14, 2026
d02c51b
Merge pull request #7 from Titus-System/feat/attendance_contracts
pedro-fs-garcia Apr 14, 2026
f70cc23
feat(chatbot): document URA attendance module and standardize API res…
pedro-fs-garcia Apr 15, 2026
6873491
Merge pull request #9 from Titus-System/feat/attendance_contracts
pedro-fs-garcia Apr 15, 2026
44bc35d
feat(companies,products): scaffold company/product domains and add in…
pedro-fs-garcia Apr 16, 2026
fb4de1b
feat(companies,products): add company-user endpoints and seed permiss…
pedro-fs-garcia Apr 16, 2026
62340de
Merge pull request #10 from Titus-System/feat/company-products
pedro-fs-garcia Apr 16, 2026
cde8049
Merge remote-tracking branch 'origin/develop' into feat/ticket
eduardo-Rib Apr 17, 2026
7640c7a
feat(event-dispatcher): add async in-process event bus for inter-doma…
pedro-fs-garcia Apr 18, 2026
f643152
Merge pull request #12 from Titus-System/feat/event-dispatcher
pedro-fs-garcia Apr 18, 2026
6ed1a8e
feat(event-dispatcher): add structured logging, Prometheus metrics, a…
pedro-fs-garcia Apr 19, 2026
c653297
Merge pull request #13 from Titus-System/feat/event-dispatcher
pedro-fs-garcia Apr 19, 2026
1e9d284
feat(api): adiciona atribuição de chamados, resolução de responsável …
m-germano Apr 19, 2026
3825301
feat(live-chat): add event-driven conversation lifecycle via Conversa…
pedro-fs-garcia Apr 20, 2026
f0b19fb
Merge pull request #14 from Titus-System/feat/event-dispatcher
pedro-fs-garcia Apr 20, 2026
5c3bad4
refactor(chatbot): standardize router export and prefix definition
borroniff Apr 22, 2026
a01267a
fix(ticket): align ticket history and list defaults
eduardo-Rib Apr 22, 2026
a76b8e6
fix(ticket): use explicit company data on ticket creation
eduardo-Rib Apr 22, 2026
0632a45
refactor(chatbot): remove dead code from FSM and fix TriageState typing
borroniff Apr 22, 2026
bcd74a2
refactor(ticket): simplify paginated repository query
eduardo-Rib Apr 22, 2026
79d15ad
fix(ticket): make update idempotent and adopt shared pagination
eduardo-Rib Apr 22, 2026
1dbcf7a
Merge pull request #16 from Titus-System/refactor/chatbot-typing-and-…
pedro-fs-garcia Apr 22, 2026
a80c185
fix(ticket): align contract with README (optional company, page_size)
pedro-fs-garcia Apr 22, 2026
f40ba35
Merge pull request #11 from Titus-System/feat/ticket
pedro-fs-garcia Apr 22, 2026
31e5b2c
feat(TicketListener): Creates and registers event listener for the ti…
pedro-fs-garcia Apr 23, 2026
747a368
feat(TicketService): Publishes a "tocket.created" event when ticket i…
pedro-fs-garcia Apr 23, 2026
f214cca
fix(ticket): wire EventDispatcher into TicketService DI and add pub/s…
pedro-fs-garcia Apr 23, 2026
f26e096
refactor(realtime-chat-web): descartar mudanças unilaterais e preserv…
pedro-fs-garcia Apr 25, 2026
765c8c3
Merge branch 'develop' into feat/realtime-chat-web
pedro-fs-garcia Apr 25, 2026
38819a0
fix(merge): resolve conflitos do merge com develop preservando retroc…
pedro-fs-garcia Apr 26, 2026
d9a94e7
Merge pull request #17 from Titus-System/feat/realtime-chat-web
pedro-fs-garcia Apr 26, 2026
e91ffd3
feat: return user with roles
pedro-fs-garcia Apr 27, 2026
032fa63
fix: removes obsolete DI
pedro-fs-garcia Apr 27, 2026
227b3dd
Merge pull request #18 from Titus-System/feat/finish-triage-event
pedro-fs-garcia Apr 27, 2026
adb5380
refactor(chatbot): add domain exceptions and replace generic try-except
borroniff Apr 27, 2026
c68d225
feat(ticket): add comment endpoints
pedro-fs-garcia Apr 27, 2026
7340dbc
Merge branch 'develop' into feat/ticket
pedro-fs-garcia Apr 27, 2026
73dac48
fix(tickets.services): add missing import of TicketComment
pedro-fs-garcia Apr 27, 2026
056af32
Merge pull request #20 from Titus-System/feat/ticket
pedro-fs-garcia Apr 27, 2026
1cd49d7
feat(ticket): implement queue listing with filters and ordering
eduardo-Rib Apr 27, 2026
db7fd16
feat(ticket): implement ticket assignment and publish assignee event
eduardo-Rib Apr 27, 2026
6b779de
feat(tickets): implements patch and delete endpoints for ticket comments
pedro-fs-garcia Apr 27, 2026
133ba65
Merge pull request #21 from Titus-System/feat/ticket
pedro-fs-garcia Apr 27, 2026
b538eb4
test(ticket): add e2e coverage for queue and assignment
eduardo-Rib Apr 27, 2026
6bcd9fc
test(ticket): stabilize queue and assignment e2e tests
eduardo-Rib Apr 28, 2026
f638373
Merge branch 'feat/ticket' of https://github.com/Titus-System/syncdes…
eduardo-Rib Apr 28, 2026
b13ba55
feat(users): implement remove and update roles endpoints
pedro-fs-garcia Apr 28, 2026
4fb8a5c
Merge pull request #22 from Titus-System/fix/user-roles
pedro-fs-garcia Apr 28, 2026
7ed87b4
Merge branch 'develop' into refactor/chatbot-domain-exceptions
pedro-fs-garcia Apr 28, 2026
c339009
tests: Add e2e tests to chatbot routes
pedro-fs-garcia Apr 28, 2026
99ce8c1
Merge pull request #19 from Titus-System/refactor/chatbot-domain-exce…
pedro-fs-garcia Apr 28, 2026
ffaa297
feat(ticket): implement ticket escalation flow
eduardo-Rib Apr 28, 2026
f2dbba0
feat(ticket): implement ticket transfer flow
eduardo-Rib Apr 28, 2026
df0448c
test(ticket): add e2e coverage for escalation and transfer
eduardo-Rib Apr 28, 2026
133345e
fix(ticket): remove department from escalation and transfer contracts
eduardo-Rib Apr 29, 2026
3fcba75
feat(ticket): publish ticket closed event and handle closing listeners
eduardo-Rib Apr 29, 2026
b0a8267
test(ticket): add e2e coverage for ticket closed event propagation
eduardo-Rib Apr 30, 2026
6859f0b
feat(notifications): add email outbox pattern and async worker
pedro-fs-garcia Apr 30, 2026
13b6f6f
docs(notifications): Adds README to notifications module
pedro-fs-garcia Apr 30, 2026
6163f59
Merge pull request #23 from Titus-System/feat/email-outbox
pedro-fs-garcia Apr 30, 2026
1430bec
config: Updates frontend url fallbacks and .env.example
pedro-fs-garcia Apr 30, 2026
0cbc4ef
Merge pull request #24 from Titus-System/feat/email-outbox
pedro-fs-garcia Apr 30, 2026
33c3792
feat(tickets): Add ticket history endpoint
pedro-fs-garcia Apr 30, 2026
102dd92
fix(chatbot): Adds exception handling and logging to new methods
pedro-fs-garcia Apr 30, 2026
fffd22f
Merge pull request #25 from Titus-System/feat/ticket
pedro-fs-garcia Apr 30, 2026
8625b30
chore(auth): add warning logger to failed login attempts
pedro-fs-garcia Apr 30, 2026
9ab968f
Merge pull request #26 from Titus-System/fix/login
pedro-fs-garcia Apr 30, 2026
bd088fa
fix(chatbot): start FSM on attendance creation to match README
pedro-fs-garcia May 1, 2026
655aeab
Merge pull request #27 from Titus-System/fix/chatbot-flow
pedro-fs-garcia May 1, 2026
3689b16
feat(search): implement full-text search for tickets with role-based …
pedro-fs-garcia May 1, 2026
7f5b8bd
fix: text seardh for tickets
pedro-fs-garcia May 1, 2026
90c09aa
Merge pull request #28 from Titus-System/feat/search
pedro-fs-garcia May 1, 2026
2b51a30
feat(live_chat): implement conversation text search with role-based s…
pedro-fs-garcia May 2, 2026
f9ef92c
Merge pull request #29 from Titus-System/feat/search
pedro-fs-garcia May 2, 2026
8252030
sec(auth): hide sensitive user data from response payloads
borroniff May 2, 2026
8428218
feat(db): add migrations and seeds for companies and products
borroniff May 2, 2026
624f8ee
feat(users): Add endpoint to deactivate user
pedro-fs-garcia May 2, 2026
9e6cf85
Merge pull request #32 from Titus-System/update/user
pedro-fs-garcia May 2, 2026
832d6cb
fix(chat): improve triage ticket and websocket flow
m-germano May 3, 2026
6edbaed
Merge pull request #30 from Titus-System/sec/hide-user-sensitive-data
pedro-fs-garcia May 3, 2026
c2293da
reinstate metrics to listener and fix tests to reflect the changes
pedro-fs-garcia May 3, 2026
4a72365
Merge pull request #33 from Titus-System/fix/chat
pedro-fs-garcia May 3, 2026
3522e84
style: atualiza layout dos templates de e-mail
Madhs31 May 3, 2026
496b36c
Merge branch 'develop' of https://github.com/Titus-System/syncdesk-ap…
Madhs31 May 3, 2026
2709d1f
Merge pull request #34 from Titus-System/style/atualiza-templates-email
Madhs31 May 3, 2026
ddf34e8
fix(db): remove empty migration
borroniff May 3, 2026
a4cb709
Merge pull request #31 from Titus-System/feat/db-migration-and-seed
pedro-fs-garcia May 3, 2026
bfbc2d2
style: atualiza layout dos templates de e-mail
Madhs31 May 3, 2026
bc02101
Merge pull request #35 from Titus-System/style/atualiza-templates-email
Madhs31 May 3, 2026
1c8e20c
style: atualiza layout dos templates de e-mail
Madhs31 May 3, 2026
e873388
Merge pull request #36 from Titus-System/style/atualiza-templates-email
Madhs31 May 3, 2026
4266889
style: atualiza layout dos templates de e-mail
Madhs31 May 3, 2026
7d8c863
Merge pull request #37 from Titus-System/style/atualiza-templates-email
Madhs31 May 3, 2026
1857010
fix: ticket text search
pedro-fs-garcia May 3, 2026
52ca53a
Merge pull request #38 from Titus-System/fix/ticket-search
pedro-fs-garcia May 3, 2026
719ab21
feat(core): implement full CRUD for companies and products
borroniff May 3, 2026
537541b
feat(auth): include company_id in JWT token payload
borroniff May 3, 2026
d9fa76e
fix(companies,products): corrige bugs de runtime e amplia cobertura d…
pedro-fs-garcia May 3, 2026
c90f8e7
Merge pull request #40 from Titus-System/feat/auth-jwt-company-id
pedro-fs-garcia May 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ PROJECT_VERSION=1.0.0

ENVIRONMENT=development

FRONTEND_URL=http://syncdesk.pro
WEB_FRONTEND_URL=http://localhost:3000
MOBILE_FRONTEND_URL=syncdesk://

# CORS settings
CORS_ALLOW_ORIGINS=["https://app.example.com","http://localhost:3000"]
Expand All @@ -20,8 +21,8 @@ POSTGRES_HOST=localhost
POSTGRES_PORT=5432

# Configurações do MongoDB
MONGO_INITDB_ROOT_USERNAME=mongouser # option to be used with docker compose
MONGO_INITDB_ROOT_PASSWORD=mongopassword # to be used with docker compose
MONGO_INITDB_ROOT_USERNAME=mongouser
MONGO_INITDB_ROOT_PASSWORD=mongopassword
MONGO_USER=mongouser
MONGO_PASSWORD=mongopassword
MONGO_HOST=localhost
Expand Down
65 changes: 65 additions & 0 deletions .github/workflows/deploy-staging.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: Deploy Staging
on:
push:
branches: [ "develop" ]

env:
REGISTRY: ghcr.io
IMAGE_NAME: titus-system/syncdesk-api

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

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

- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: deploy/Dockerfile
push: true
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:staging

deploy:
needs: build-and-push
runs-on: ubuntu-latest
permissions:
contents: read
packages: read

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

- name: Copy compose files to Droplet
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.DROPLET_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
target: /opt/syncdesk
source: docker-compose.yaml,deploy/docker-compose.staging.yaml,deploy/prometheus,deploy/alertmanager,deploy/loki,deploy/promtail,deploy/grafana

- name: Deploy to Droplet
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.DROPLET_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /opt/syncdesk
docker compose -f docker-compose.yaml -f deploy/docker-compose.staging.yaml pull api
docker compose -f docker-compose.yaml -f deploy/docker-compose.staging.yaml up -d --force-recreate
12 changes: 11 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
.PHONY: install run dev lint format typecheck test seed migrate makemigration pre-commit
.PHONY: install run dev lint format typecheck test seed migrate makemigration pre-commit up down logs


install:
poetry install
Expand Down Expand Up @@ -41,3 +42,12 @@ pre-commit:
poetry run mypy app/
poetry run bandit -c pyproject.toml -r app/
poetry run pytest

up:
docker compose up --build

down:
docker compose down

logs:
docker compose logs -f
3 changes: 3 additions & 0 deletions alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
from app.db.postgres.base import Base

import app.domains.auth.models # noqa: F401 — register models with Base.metadata
import app.domains.companies.models # noqa: F401 — register models with Base.metadata
import app.domains.products.models # noqa: F401 — register models with Base.metadata
import app.domains.notifications.models # noqa: F401 — register models with Base.metadata

config = context.config
if config.config_file_name is not None:
Expand Down
54 changes: 54 additions & 0 deletions alembic/versions/14eee043999d_adds_email_outbox.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
"""adds_email_outbox

Revision ID: 14eee043999d
Revises: 337ea87962d5
Create Date: 2026-04-30 07:22:32.475373

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision: str = '14eee043999d'
down_revision: Union[str, Sequence[str], None] = '337ea87962d5'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('email_outbox',
sa.Column('id', sa.UUID(), nullable=False),
sa.Column('event_type', sa.String(length=64), nullable=False),
sa.Column('recipient', sa.String(length=320), nullable=False),
sa.Column('payload', postgresql.JSONB(astext_type=sa.Text()), nullable=False),
sa.Column('status', sa.Enum('PENDING', 'PROCESSING', 'SENT', 'RETRY', 'DEAD', name='email_outbox_status'), nullable=False),
sa.Column('attempts', sa.Integer(), nullable=False),
sa.Column('max_attempts', sa.Integer(), nullable=False),
sa.Column('last_error', sa.Text(), nullable=True),
sa.Column('next_attempt_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
sa.Column('sent_at', sa.DateTime(), nullable=True),
sa.Column('locked_at', sa.DateTime(), nullable=True),
sa.Column('lock_owner', sa.String(length=128), nullable=True),
sa.PrimaryKeyConstraint('id', name=op.f('pk_email_outbox'))
)
op.create_index('ix_email_outbox_event_type', 'email_outbox', ['event_type'], unique=False)
op.create_index('ix_email_outbox_recipient', 'email_outbox', ['recipient'], unique=False)
op.create_index('ix_email_outbox_status_next_attempt_at', 'email_outbox', ['status', 'next_attempt_at'], unique=False)
# ### end Alembic commands ###


def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index('ix_email_outbox_status_next_attempt_at', table_name='email_outbox')
op.drop_index('ix_email_outbox_recipient', table_name='email_outbox')
op.drop_index('ix_email_outbox_event_type', table_name='email_outbox')
op.drop_table('email_outbox')
# ### end Alembic commands ###
71 changes: 71 additions & 0 deletions alembic/versions/337ea87962d5_add_company_product.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
"""add_company_product

Revision ID: 337ea87962d5
Revises: 55fb7ad5d992
Create Date: 2026-04-15 23:07:17.118432

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = '337ea87962d5'
down_revision: Union[str, Sequence[str], None] = '55fb7ad5d992'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('companies',
sa.Column('id', sa.UUID(), nullable=False),
sa.Column('legal_name', sa.String(length=255), nullable=False),
sa.Column('trade_name', sa.String(length=255), nullable=True),
sa.Column('tax_id', sa.String(length=14), nullable=False),
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
sa.Column('deleted_at', sa.DateTime(), nullable=True),
sa.PrimaryKeyConstraint('id', name=op.f('pk_companies'))
)
op.create_index(op.f('ix_companies_legal_name'), 'companies', ['legal_name'], unique=True)
op.create_index(op.f('ix_companies_tax_id'), 'companies', ['tax_id'], unique=True)
op.create_index(op.f('ix_companies_trade_name'), 'companies', ['trade_name'], unique=False)
op.create_table('products',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=127), nullable=False),
sa.Column('description', sa.String(length=500), nullable=True),
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
sa.Column('deleted_at', sa.DateTime(), nullable=True),
sa.PrimaryKeyConstraint('id', name=op.f('pk_products'))
)
op.create_table('company_products',
sa.Column('company_id', sa.UUID(), nullable=False),
sa.Column('product_id', sa.Integer(), nullable=False),
sa.Column('bought_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
sa.Column('support_until', sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_company_products_company_id_companies')),
sa.ForeignKeyConstraint(['product_id'], ['products.id'], name=op.f('fk_company_products_product_id_products')),
sa.PrimaryKeyConstraint('company_id', 'product_id', name=op.f('pk_company_products'))
)
op.add_column('users', sa.Column('company_id', sa.UUID(), nullable=True))
op.create_index(op.f('ix_users_company_id'), 'users', ['company_id'], unique=False)
op.create_foreign_key(op.f('fk_users_company_id_companies'), 'users', 'companies', ['company_id'], ['id'])
# ### end Alembic commands ###


def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(op.f('fk_users_company_id_companies'), 'users', type_='foreignkey')
op.drop_index(op.f('ix_users_company_id'), table_name='users')
op.drop_column('users', 'company_id')
op.drop_table('company_products')
op.drop_table('products')
op.drop_index(op.f('ix_companies_trade_name'), table_name='companies')
op.drop_index(op.f('ix_companies_tax_id'), table_name='companies')
op.drop_index(op.f('ix_companies_legal_name'), table_name='companies')
op.drop_table('companies')
# ### end Alembic commands ###
11 changes: 8 additions & 3 deletions app/api/api_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
from app.core.config import get_settings
from app.core.dependencies import ResponseFactoryDep
from app.domains.auth import auth_router, permission_router, role_router, user_router
from app.domains.companies import company_router
from app.domains.live_chat import chat_router, conversation_router
from app.domains.ticket import ticket_router
from app.domains.products import product_router
from app.domains.ticket.routers import ticket_router
from app.schemas.response import ErrorContent, GenericSuccessContent

from app.domains.chatbot.routers import router as chatbot_router
from app.domains.chatbot import chatbot_router

api_router = APIRouter()

Expand Down Expand Up @@ -51,4 +53,7 @@ async def root(response_factory: ResponseFactoryDep, request: Request) -> JSONRe

api_router.include_router(ticket_router, prefix="/tickets", tags=["Tickets"])

api_router.include_router(chatbot_router)
api_router.include_router(chatbot_router, prefix="/chatbot", tags=["Chatbot URA"])

api_router.include_router(company_router, prefix="/companies", tags=["Companies"])
api_router.include_router(product_router, prefix="/products", tags=["Products"])
9 changes: 8 additions & 1 deletion app/core/background_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,12 @@


def global_background_tasks(pg_engine: AsyncEngine) -> list[asyncio.Task[None]]:
tasks: list[asyncio.Task[None]] = [asyncio.create_task(update_system_metrics(pg_engine))]
from app.core.dependencies import get_email_service
from app.domains.notifications.worker import run_email_outbox_worker

email_strategy = get_email_service()
tasks: list[asyncio.Task[None]] = [
asyncio.create_task(update_system_metrics(pg_engine)),
asyncio.create_task(run_email_outbox_worker(pg_engine, email_strategy)),
]
return tasks
12 changes: 10 additions & 2 deletions app/core/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ def project_client_identifier(self) -> str:

ENVIRONMENT: str = "development"

MOBILE_FRONTEND_URL: str = "syncdesk:/"
WEB_FRONTEND_URL: str = "http://localhost:3000"
MOBILE_FRONTEND_URL: str = "http://syncdesk.pro"
WEB_FRONTEND_URL: str = "http://syncdesk.pro"

# CORS settings
CORS_ALLOW_ORIGINS: list[str] = ["*"]
Expand Down Expand Up @@ -135,6 +135,14 @@ def invite_token_timedelta(self) -> timedelta:
RUN_RESEND_INTEGRATION_TESTS: bool = False
RESEND_TEST_TO_EMAIL: str = ""

# Email Outbox
EMAIL_OUTBOX_ENABLED: bool = True
EMAIL_OUTBOX_POLL_SECONDS: int = 5
EMAIL_OUTBOX_BATCH_SIZE: int = 50
EMAIL_OUTBOX_MAX_ATTEMPTS: int = 5
EMAIL_OUTBOX_BACKOFF_MAX_SECONDS: int = 900
EMAIL_OUTBOX_WORKER_ID: str = ""

model_config = SettingsConfigDict(extra="allow", env_file=".env", env_file_encoding="utf-8")


Expand Down
Loading
Loading