@marcos_feitoza/personal-finance-backen-trades-assets 1.1.1 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
## [1.2.1](https://github.com/MarcosOps/personal-finance-backend-trades-assets/compare/v1.2.0...v1.2.1) (2026-01-30)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* update corsmiddlwware ([ffd99b0](https://github.com/MarcosOps/personal-finance-backend-trades-assets/commit/ffd99b06d32c8d9f49a051da0fdecbcf2bc2bd3d))
|
|
7
|
+
* update gitignore ([26742b7](https://github.com/MarcosOps/personal-finance-backend-trades-assets/commit/26742b77816aa2e1a22a10a0a64c48ac7b48fd19))
|
|
8
|
+
|
|
9
|
+
# [1.2.0](https://github.com/MarcosOps/personal-finance-backend-trades-assets/compare/v1.1.1...v1.2.0) (2025-11-28)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
* add confirmation dialog for deletion operations ([1a568c8](https://github.com/MarcosOps/personal-finance-backend-trades-assets/commit/1a568c880a79b438dd421e9314b5785c88db6c36))
|
|
15
|
+
* update readme.me ([82c5d27](https://github.com/MarcosOps/personal-finance-backend-trades-assets/commit/82c5d279aeea11ca73103178c84727c1a0d33e7a))
|
|
16
|
+
|
|
1
17
|
## [1.1.1](https://github.com/MarcosOps/personal-finance-backend-trades-assets/compare/v1.1.0...v1.1.1) (2025-11-26)
|
|
2
18
|
|
|
3
19
|
|
package/README.md
CHANGED
|
@@ -1,22 +1,34 @@
|
|
|
1
|
-
# Biblioteca de Trades e Ativos - Personal Finance
|
|
1
|
+
# Biblioteca de Trades e Ativos - Personal Finance Backend
|
|
2
2
|
|
|
3
|
-
Este projeto contém a lógica de negócios
|
|
3
|
+
Este projeto contém a lógica de negócios e os modelos de dados específicos para o gerenciamento de `Trades` (transações de compra/venda de ativos) e `Assets` (ativos como ações, criptomoedas, etc.).
|
|
4
4
|
|
|
5
5
|
## Propósito
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
O objetivo desta biblioteca é encapsular toda a lógica de criação, leitura, atualização e exclusão (soft-delete) de trades e ativos. Ela interage com serviços externos (como o `market-data-service` para buscar detalhes de ativos) e com o banco de dados via `personal-finance-backend-shared`.
|
|
8
|
+
|
|
9
|
+
## Conteúdo Principal
|
|
10
|
+
|
|
11
|
+
- **`routers/trades.py`**: Define endpoints para a criação, listagem e exclusão (soft-delete) de trades.
|
|
12
|
+
- **`routers/assets.py`**: Define endpoints para a listagem e gerenciamento de ativos.
|
|
8
13
|
|
|
9
14
|
## Tecnologias
|
|
10
15
|
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
16
|
+
- **Framework**: FastAPI (seus routers são usados por outros serviços)
|
|
17
|
+
- **Busca de Dados Externos**: Utiliza `httpx` para comunicação com o `market-data-service`.
|
|
18
|
+
- **Banco de Dados**: Interage com o PostgreSQL através da `personal-finance-backend-shared`.
|
|
19
|
+
- **Dependências Locais**:
|
|
20
|
+
- `personal-finance-backend-shared`: Para acesso aos modelos, `crud` e utilitários.
|
|
13
21
|
|
|
14
|
-
|
|
22
|
+
---
|
|
15
23
|
|
|
16
|
-
|
|
24
|
+
## Como Usar (Instalação como Dependência)
|
|
17
25
|
|
|
18
|
-
|
|
26
|
+
Este projeto não é um serviço executável por si só. Ele é projetado para ser instalado como uma dependência local por outros serviços do backend (ex: `personal-finance-backend-core`).
|
|
27
|
+
|
|
28
|
+
Para incluir esta biblioteca como uma dependência editável em outro serviço (por exemplo, no `requirements.txt` do `personal-finance-backend-core`), adicione a seguinte linha no `requirements.txt` do serviço consumidor:
|
|
19
29
|
|
|
20
30
|
```
|
|
21
|
-
-e ./trades-assets
|
|
31
|
+
-e ./personal-finance-backend-trades-assets
|
|
22
32
|
```
|
|
33
|
+
|
|
34
|
+
**Importante:** Certifique-se de que o contexto de build do Docker (`Dockerfile`) ou o script de build (`dockerbuild.sh`) do serviço consumidor está copiando corretamente o diretório `personal-finance-backend-trades-assets` para o local esperado para que o `pip install -e` funcione.
|
package/package.json
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
from fastapi import FastAPI
|
|
2
2
|
from fastapi.middleware.cors import CORSMiddleware
|
|
3
3
|
from .routers import trades, assets
|
|
4
|
+
from personal_finance_shared.cors_utils import parse_cors_allowed_origins, cors_allow_credentials_for
|
|
4
5
|
|
|
5
6
|
app = FastAPI()
|
|
6
7
|
|
|
8
|
+
origins = parse_cors_allowed_origins()
|
|
9
|
+
allow_credentials = cors_allow_credentials_for(origins)
|
|
10
|
+
|
|
7
11
|
app.add_middleware(
|
|
8
12
|
CORSMiddleware,
|
|
9
|
-
allow_origins=
|
|
10
|
-
allow_credentials=
|
|
13
|
+
allow_origins=origins,
|
|
14
|
+
allow_credentials=allow_credentials,
|
|
11
15
|
allow_methods=["*"], # Allows all methods
|
|
12
16
|
allow_headers=["*"], # Allows all headers
|
|
13
17
|
)
|
|
@@ -79,9 +79,9 @@ async def create_trade(
|
|
|
79
79
|
db_trade = models.Trade(**trade_data, asset_id=db_asset.id, user_id=current_user.id)
|
|
80
80
|
|
|
81
81
|
if db_trade.trade_type == 'buy':
|
|
82
|
-
logger.info("STOCK PURCHASE recorded", extra={'user_id': current_user.id, 'shares': db_trade.shares, 'symbol': trade_symbol, 'price': db_trade.price})
|
|
82
|
+
logger.info("STOCK PURCHASE recorded", extra={'user_id': current_user.id, 'shares': float(db_trade.shares), 'symbol': trade_symbol, 'price': float(db_trade.price)})
|
|
83
83
|
elif db_trade.trade_type == 'sell':
|
|
84
|
-
logger.info("STOCK SALE recorded", extra={'user_id': current_user.id, 'shares': db_trade.shares, 'symbol': trade_symbol, 'price': db_trade.price})
|
|
84
|
+
logger.info("STOCK SALE recorded", extra={'user_id': current_user.id, 'shares': float(db_trade.shares), 'symbol': trade_symbol, 'price': float(db_trade.price)})
|
|
85
85
|
|
|
86
86
|
db.add(db_trade)
|
|
87
87
|
db.commit()
|
|
@@ -104,11 +104,8 @@ def read_trades(
|
|
|
104
104
|
):
|
|
105
105
|
logger.info("Reading trades", extra={'user_id': current_user.id, 'account': investment_account, 'skip': skip, 'limit': limit})
|
|
106
106
|
query = db.query(models.Trade).filter(
|
|
107
|
-
|
|
108
107
|
models.Trade.user_id == current_user.id,
|
|
109
|
-
models.Trade.deleted_at.is_(None)
|
|
110
|
-
,
|
|
111
|
-
models.Trade.deleted_at.is_(None) # Filter out soft-deleted trades
|
|
108
|
+
models.Trade.deleted_at.is_(None)
|
|
112
109
|
)
|
|
113
110
|
if investment_account:
|
|
114
111
|
query = query.filter(models.Trade.investment_account == investment_account)
|
|
@@ -123,20 +120,20 @@ def delete_trade(
|
|
|
123
120
|
db: Session = Depends(get_db),
|
|
124
121
|
current_user: models.User = Depends(get_current_user)
|
|
125
122
|
):
|
|
126
|
-
logger.info(
|
|
123
|
+
logger.info("Attempting soft-delete for trade", extra={'user_id': current_user.id, 'trade_id': trade_id})
|
|
127
124
|
db_trade = db.query(models.Trade).filter(
|
|
128
125
|
models.Trade.id == trade_id,
|
|
129
126
|
models.Trade.user_id == current_user.id,
|
|
130
|
-
models.Trade.deleted_at.is_(None)
|
|
127
|
+
models.Trade.deleted_at.is_(None)
|
|
131
128
|
).first()
|
|
132
129
|
|
|
133
130
|
if not db_trade:
|
|
134
|
-
logger.warning(
|
|
131
|
+
logger.warning("Trade not found or already deleted for soft-delete", extra={'user_id': current_user.id, 'trade_id': trade_id})
|
|
135
132
|
raise HTTPException(status_code=404, detail="Trade not found or already deleted")
|
|
136
133
|
|
|
137
|
-
db_trade.deleted_at = datetime.utcnow()
|
|
134
|
+
db_trade.deleted_at = datetime.utcnow()
|
|
138
135
|
db.add(db_trade)
|
|
139
136
|
db.commit()
|
|
140
137
|
db.refresh(db_trade)
|
|
141
|
-
logger.info(
|
|
142
|
-
return db_trade
|
|
138
|
+
logger.info("Successfully soft-deleted trade", extra={'user_id': current_user.id, 'trade_id': trade_id})
|
|
139
|
+
return db_trade
|