Files
portfolio-hub/docs/batches/bat-005_20260503_broker-credential-cli/implementation.md
T
genichin 222c66bb7f feat(BAT-005): add broker credential CLI command with persistence and tests
- Add CredentialService for managing broker credentials
- Implement credential CLI commands (create, list, get, update, delete)
- Add postgres repository support for credential operations
- Add comprehensive test coverage for credential CLI
- Update docs/batches/index.md and docs/srs/index.md with BAT-005
- Update docs/project-structure.md to reflect credential service
2026-05-03 12:44:40 +00:00

2.0 KiB

BAT-005 Implementation Log

  • Status: completed
  • Batch: BAT-005
  • Profile: batch-lite
  • Completed: 2026-05-03

구현 내역

1. app/repositories/postgres.py — delete_broker_credential 추가

def delete_broker_credential(self, user_id: str, broker: str) -> bool:
    with self._connect().cursor() as cur:
        cur.execute(
            "DELETE FROM broker_credentials WHERE user_id = %s AND broker = %s",
            (user_id, broker),
        )
        return cur.rowcount > 0

2. app/cli/commands/credential.py — 신규 생성

  • credential_app = typer.Typer(help="Broker credential management commands.")
  • _with_service(ctx, callback): repository 생성 → execute_command → finally close. RuntimeError도 캐치해 stdout 출력 후 exit 1.
  • set 명령: --user, --broker (기본값 kis), --account-ref, --app-key, --app-secret, --force
  • list 명령: --user — encrypted_payload 제외 dict 리스트 출력
  • remove 명령: --user, --broker, --force — delete_broker_credential 호출

3. app/cli/main.py — credential_app 등록

from app.cli.commands.credential import credential_app
...
app.add_typer(credential_app, name="credential")

4. tests/test_cli.py

  • FakeRepo.__init__: _broker_credentials: dict[tuple[str, str], BrokerCredential] = {} 추가
  • FakeRepo.upsert/list/get/delete_broker_credential 메서드 추가
  • _settings_with_enc_key(), build_runner_with_enc_key() 헬퍼 추가
  • 신규 테스트 5개 추가

5. docs/project-structure.md — CLI 모듈 목록 갱신

  • app/cli/ 섹션에 credential 명령 그룹 추가
  • primary runtime 설명에 broker credentials 추가

설계 결정

  • dict 리스트 출력은 render_output의 타입 매칭을 우회해 console.print(item) 직접 호출 (기존 render_output이 등록된 타입만 처리함)
  • RuntimeError(CREDENTIAL_ENCRYPTION_KEY 미설정)는 _with_service 헬퍼에서 캐치해 stdout으로 출력 후 exit 1 처리