@marcos_feitoza/personal-finance-backen-trades-assets 1.1.1 → 1.2.0

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,11 @@
1
+ # [1.2.0](https://github.com/MarcosOps/personal-finance-backend-trades-assets/compare/v1.1.1...v1.2.0) (2025-11-28)
2
+
3
+
4
+ ### Features
5
+
6
+ * add confirmation dialog for deletion operations ([1a568c8](https://github.com/MarcosOps/personal-finance-backend-trades-assets/commit/1a568c880a79b438dd421e9314b5785c88db6c36))
7
+ * update readme.me ([82c5d27](https://github.com/MarcosOps/personal-finance-backend-trades-assets/commit/82c5d279aeea11ca73103178c84727c1a0d33e7a))
8
+
1
9
  ## [1.1.1](https://github.com/MarcosOps/personal-finance-backend-trades-assets/compare/v1.1.0...v1.1.1) (2025-11-26)
2
10
 
3
11
 
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 específica para o gerenciamento de `Trades` (transações de compra/venda) e `Assets` (ativos como ações, ETFs, etc.).
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
- Esta biblioteca encapsula as regras para criar e validar trades. Sua principal responsabilidade é, ao receber um novo trade para um símbolo de ação que ainda não existe no banco de dados, buscar os detalhes desse ativo (nome, setor, etc.) usando uma API externa e salvá-lo corretamente.
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
- - **Busca de Dados:** Usa a biblioteca `yfinance` para buscar os detalhes de novos ativos.
12
- - **Banco de Dados:** Interage com o banco de dados através da `personal-finance-backend-shared`.
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
- ## Como Usar
22
+ ---
15
23
 
16
- Este projeto não é um serviço executável. Ele é projetado para ser instalado como uma dependência local pelo serviço principal (`core-transactions-service`).
24
+ ## Como Usar (Instalação como Dependência)
17
25
 
18
- No `requirements.txt` do serviço principal, adicione a seguinte linha para incluí-lo:
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-library
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@marcos_feitoza/personal-finance-backen-trades-assets",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -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) # Filter out soft-deleted trades
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(f"Attempting soft-delete for trade ID: {trade_id} by user: {current_user.id}")
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) # Ensure it's not already deleted
127
+ models.Trade.deleted_at.is_(None)
131
128
  ).first()
132
129
 
133
130
  if not db_trade:
134
- logger.warning(f"Trade ID: {trade_id} not found or already deleted for user: {current_user.id}")
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() # Set deletion timestamp
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(f"Successfully soft-deleted trade ID: {trade_id} for user: {current_user.id}")
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