feat: update strategy set schema fields

This commit is contained in:
2026-04-03 08:03:27 +00:00
parent 3eae90a9ab
commit ebd4559939
13 changed files with 131 additions and 37 deletions
+3 -2
View File
@@ -95,8 +95,9 @@ def print_portfolio_detail(console: Console, detail: PortfolioDetailResponse) ->
"\n".join(
[
f"id: {detail.strategy_set.id}",
f"name: {detail.strategy_set.strategy_name}",
f"config: {detail.strategy_set.strategy_config}",
f"name: {detail.strategy_set.name}",
f"config: {detail.strategy_set.config}",
f"nick: {detail.strategy_set.nick}",
]
),
title="Strategy Set",
+3 -2
View File
@@ -10,8 +10,9 @@ from typing import Any, Protocol, runtime_checkable
@dataclass
class StrategySet:
id: str
strategy_name: str
strategy_config: str
name: str
config: str
nick: str
created_at: datetime | None = None
+1 -1
View File
@@ -45,7 +45,7 @@ class PortfolioDomainRepository(Protocol):
def update_portfolio(self, portfolio_id: str, **fields: object) -> Portfolio: ...
def list_portfolios(self, *, broker: str | None = None, status: str | None = None) -> list[Portfolio]: ...
def get_strategy_set(self, id: str) -> StrategySet | None: ...
def get_or_create_strategy_set(self, strategy_name: str, strategy_config: str) -> StrategySet: ...
def get_or_create_strategy_set(self, name: str, config: str) -> StrategySet: ...
def save(
self,
portfolio: Portfolio,
+1 -1
View File
@@ -43,7 +43,7 @@ class PortfolioRepository(Protocol):
def list_portfolios(self, *, broker: str | None = None, status: str | None = None) -> list[Portfolio]: ...
def get_or_create_strategy_set(self, strategy_name: str, strategy_config: str) -> StrategySet: ...
def get_or_create_strategy_set(self, name: str, config: str) -> StrategySet: ...
def get_strategy_set(self, id: str) -> StrategySet | None: ...
+17 -14
View File
@@ -2,6 +2,7 @@
from __future__ import annotations
import hashlib
import json
import uuid
from dataclasses import dataclass
@@ -82,10 +83,11 @@ class PostgresPortfolioRepository:
"""
CREATE TABLE IF NOT EXISTS strategy_sets (
id TEXT PRIMARY KEY,
strategy_name TEXT NOT NULL,
strategy_config TEXT NOT NULL DEFAULT '',
name TEXT NOT NULL,
config TEXT NOT NULL DEFAULT '',
nick TEXT NOT NULL UNIQUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (strategy_name, strategy_config)
UNIQUE (name, config)
)
"""
)
@@ -352,40 +354,41 @@ class PostgresPortfolioRepository:
rows = cur.fetchall()
return [self._row_to_portfolio(row) for row in rows]
def get_or_create_strategy_set(self, strategy_name: str, strategy_config: str) -> StrategySet:
def get_or_create_strategy_set(self, name: str, config: str) -> StrategySet:
self.ensure_schema()
nick = f"{name}:{hashlib.sha1(config.encode('utf-8')).hexdigest()[:12]}"
with self._connect().cursor() as cur:
new_id = str(uuid.uuid4())
cur.execute(
"""
INSERT INTO strategy_sets (id, strategy_name, strategy_config)
VALUES (%s, %s, %s)
ON CONFLICT (strategy_name, strategy_config) DO NOTHING
INSERT INTO strategy_sets (id, name, config, nick)
VALUES (%s, %s, %s, %s)
ON CONFLICT (name, config) DO NOTHING
""",
(new_id, strategy_name, strategy_config),
(new_id, name, config, nick),
)
cur.execute(
"""
SELECT id, strategy_name, strategy_config, created_at
SELECT id, name, config, nick, created_at
FROM strategy_sets
WHERE strategy_name = %s AND strategy_config = %s
WHERE name = %s AND config = %s
""",
(strategy_name, strategy_config),
(name, config),
)
row = cur.fetchone()
return StrategySet(id=row[0], strategy_name=row[1], strategy_config=row[2], created_at=row[3])
return StrategySet(id=row[0], name=row[1], config=row[2], nick=row[3], created_at=row[4])
def get_strategy_set(self, id: str) -> StrategySet | None:
self.ensure_schema()
with self._connect().cursor() as cur:
cur.execute(
"SELECT id, strategy_name, strategy_config, created_at FROM strategy_sets WHERE id = %s",
"SELECT id, name, config, nick, created_at FROM strategy_sets WHERE id = %s",
(id,),
)
row = cur.fetchone()
if row is None:
return None
return StrategySet(id=row[0], strategy_name=row[1], strategy_config=row[2], created_at=row[3])
return StrategySet(id=row[0], name=row[1], config=row[2], nick=row[3], created_at=row[4])
def save(
self,
+3 -2
View File
@@ -10,8 +10,9 @@ from pydantic import BaseModel, ConfigDict, Field
class StrategySetResponse(BaseModel):
id: str
strategy_name: str
strategy_config: str
name: str
config: str
nick: str
created_at: datetime | None = None
+3 -2
View File
@@ -65,8 +65,9 @@ def _to_strategy_set_response(strategy_set: StrategySet | None):
return None
return StrategySetResponse(
id=strategy_set.id,
strategy_name=strategy_set.strategy_name,
strategy_config=strategy_set.strategy_config,
name=strategy_set.name,
config=strategy_set.config,
nick=strategy_set.nick,
created_at=strategy_set.created_at,
)