555 lines
13 KiB
YAML
555 lines
13 KiB
YAML
|
|
openapi: "3.0.3"
|
||
|
|
info:
|
||
|
|
title: Trading Journal API
|
||
|
|
version: "1.0.0"
|
||
|
|
description: OpenAPI description generated from [`app.py`](app.py) and DTOs in [`trading_journal/dto.py`](trading_journal/dto.py).
|
||
|
|
servers:
|
||
|
|
- url: "http://127.0.0.1:18881{basePath}"
|
||
|
|
variables:
|
||
|
|
basePath:
|
||
|
|
default: "/api/v1"
|
||
|
|
description: "API base path (matches settings.settings.api_base)"
|
||
|
|
components:
|
||
|
|
securitySchemes:
|
||
|
|
session_cookie:
|
||
|
|
type: apiKey
|
||
|
|
in: cookie
|
||
|
|
name: session_token
|
||
|
|
schemas:
|
||
|
|
UserCreate:
|
||
|
|
$ref: "#/components/schemas/UserCreate_impl"
|
||
|
|
UserCreate_impl:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- username
|
||
|
|
- password
|
||
|
|
properties:
|
||
|
|
username:
|
||
|
|
type: string
|
||
|
|
is_active:
|
||
|
|
type: boolean
|
||
|
|
default: true
|
||
|
|
password:
|
||
|
|
type: string
|
||
|
|
UserLogin:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- username
|
||
|
|
- password
|
||
|
|
properties:
|
||
|
|
username:
|
||
|
|
type: string
|
||
|
|
password:
|
||
|
|
type: string
|
||
|
|
UserRead:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- id
|
||
|
|
- username
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
username:
|
||
|
|
type: string
|
||
|
|
is_active:
|
||
|
|
type: boolean
|
||
|
|
SessionsBase:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- user_id
|
||
|
|
properties:
|
||
|
|
user_id:
|
||
|
|
type: integer
|
||
|
|
SessionsCreate:
|
||
|
|
allOf:
|
||
|
|
- $ref: "#/components/schemas/SessionsBase"
|
||
|
|
- type: object
|
||
|
|
required:
|
||
|
|
- expires_at
|
||
|
|
properties:
|
||
|
|
expires_at:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
ExchangesBase:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- name
|
||
|
|
properties:
|
||
|
|
name:
|
||
|
|
type: string
|
||
|
|
notes:
|
||
|
|
type: string
|
||
|
|
nullable: true
|
||
|
|
ExchangesRead:
|
||
|
|
allOf:
|
||
|
|
- $ref: "#/components/schemas/ExchangesBase"
|
||
|
|
- type: object
|
||
|
|
required:
|
||
|
|
- id
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
CycleBase:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
friendly_name:
|
||
|
|
type: string
|
||
|
|
nullable: true
|
||
|
|
status:
|
||
|
|
type: string
|
||
|
|
end_date:
|
||
|
|
type: string
|
||
|
|
format: date
|
||
|
|
nullable: true
|
||
|
|
funding_source:
|
||
|
|
type: string
|
||
|
|
nullable: true
|
||
|
|
capital_exposure_cents:
|
||
|
|
type: integer
|
||
|
|
nullable: true
|
||
|
|
loan_amount_cents:
|
||
|
|
type: integer
|
||
|
|
nullable: true
|
||
|
|
loan_interest_rate_tenth_bps:
|
||
|
|
type: integer
|
||
|
|
nullable: true
|
||
|
|
trades:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
$ref: "#/components/schemas/TradeRead"
|
||
|
|
nullable: true
|
||
|
|
exchange:
|
||
|
|
$ref: "#/components/schemas/ExchangesRead"
|
||
|
|
nullable: true
|
||
|
|
CycleCreate:
|
||
|
|
allOf:
|
||
|
|
- $ref: "#/components/schemas/CycleBase"
|
||
|
|
- type: object
|
||
|
|
required:
|
||
|
|
- user_id
|
||
|
|
- symbol
|
||
|
|
- exchange_id
|
||
|
|
- underlying_currency
|
||
|
|
- start_date
|
||
|
|
properties:
|
||
|
|
user_id:
|
||
|
|
type: integer
|
||
|
|
symbol:
|
||
|
|
type: string
|
||
|
|
exchange_id:
|
||
|
|
type: integer
|
||
|
|
underlying_currency:
|
||
|
|
type: string
|
||
|
|
start_date:
|
||
|
|
type: string
|
||
|
|
format: date
|
||
|
|
CycleUpdate:
|
||
|
|
allOf:
|
||
|
|
- $ref: "#/components/schemas/CycleBase"
|
||
|
|
- type: object
|
||
|
|
required:
|
||
|
|
- id
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
CycleRead:
|
||
|
|
allOf:
|
||
|
|
- $ref: "#/components/schemas/CycleCreate"
|
||
|
|
- type: object
|
||
|
|
required:
|
||
|
|
- id
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
TradeBase:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- symbol
|
||
|
|
- underlying_currency
|
||
|
|
- trade_type
|
||
|
|
- trade_strategy
|
||
|
|
- trade_date
|
||
|
|
- quantity
|
||
|
|
- price_cents
|
||
|
|
- commission_cents
|
||
|
|
properties:
|
||
|
|
friendly_name:
|
||
|
|
type: string
|
||
|
|
nullable: true
|
||
|
|
symbol:
|
||
|
|
type: string
|
||
|
|
exchange_id:
|
||
|
|
type: integer
|
||
|
|
underlying_currency:
|
||
|
|
type: string
|
||
|
|
trade_type:
|
||
|
|
type: string
|
||
|
|
trade_strategy:
|
||
|
|
type: string
|
||
|
|
trade_date:
|
||
|
|
type: string
|
||
|
|
format: date
|
||
|
|
quantity:
|
||
|
|
type: integer
|
||
|
|
price_cents:
|
||
|
|
type: integer
|
||
|
|
commission_cents:
|
||
|
|
type: integer
|
||
|
|
notes:
|
||
|
|
type: string
|
||
|
|
nullable: true
|
||
|
|
cycle_id:
|
||
|
|
type: integer
|
||
|
|
nullable: true
|
||
|
|
TradeCreate:
|
||
|
|
allOf:
|
||
|
|
- $ref: "#/components/schemas/TradeBase"
|
||
|
|
- type: object
|
||
|
|
properties:
|
||
|
|
user_id:
|
||
|
|
type: integer
|
||
|
|
nullable: true
|
||
|
|
trade_time_utc:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
nullable: true
|
||
|
|
gross_cash_flow_cents:
|
||
|
|
type: integer
|
||
|
|
nullable: true
|
||
|
|
net_cash_flow_cents:
|
||
|
|
type: integer
|
||
|
|
nullable: true
|
||
|
|
quantity_multiplier:
|
||
|
|
type: integer
|
||
|
|
default: 1
|
||
|
|
expiry_date:
|
||
|
|
type: string
|
||
|
|
format: date
|
||
|
|
nullable: true
|
||
|
|
strike_price_cents:
|
||
|
|
type: integer
|
||
|
|
nullable: true
|
||
|
|
is_invalidated:
|
||
|
|
type: boolean
|
||
|
|
default: false
|
||
|
|
invalidated_at:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
nullable: true
|
||
|
|
replaced_by_trade_id:
|
||
|
|
type: integer
|
||
|
|
nullable: true
|
||
|
|
TradeNoteUpdate:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- id
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
notes:
|
||
|
|
type: string
|
||
|
|
nullable: true
|
||
|
|
TradeFriendlyNameUpdate:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- id
|
||
|
|
- friendly_name
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
friendly_name:
|
||
|
|
type: string
|
||
|
|
TradeRead:
|
||
|
|
allOf:
|
||
|
|
- $ref: "#/components/schemas/TradeCreate"
|
||
|
|
- type: object
|
||
|
|
required:
|
||
|
|
- id
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
paths:
|
||
|
|
/status:
|
||
|
|
get:
|
||
|
|
summary: "Get API status"
|
||
|
|
security: [] # no auth required
|
||
|
|
responses:
|
||
|
|
"200":
|
||
|
|
description: OK
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
status:
|
||
|
|
type: string
|
||
|
|
/register:
|
||
|
|
post:
|
||
|
|
summary: "Register user"
|
||
|
|
security: [] # no auth required
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/UserCreate"
|
||
|
|
responses:
|
||
|
|
"201":
|
||
|
|
description: Created
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/UserRead"
|
||
|
|
"400":
|
||
|
|
description: Bad Request (user exists)
|
||
|
|
"500":
|
||
|
|
description: Internal Server Error
|
||
|
|
/login:
|
||
|
|
post:
|
||
|
|
summary: "Login"
|
||
|
|
security: [] # no auth required
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/UserLogin"
|
||
|
|
responses:
|
||
|
|
"200":
|
||
|
|
description: OK (sets session cookie)
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/SessionsBase"
|
||
|
|
headers:
|
||
|
|
Set-Cookie:
|
||
|
|
description: session cookie
|
||
|
|
schema:
|
||
|
|
type: string
|
||
|
|
"401":
|
||
|
|
description: Unauthorized
|
||
|
|
"500":
|
||
|
|
description: Internal Server Error
|
||
|
|
/exchanges:
|
||
|
|
post:
|
||
|
|
summary: "Create exchange"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/ExchangesBase"
|
||
|
|
responses:
|
||
|
|
"201":
|
||
|
|
description: Created
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/ExchangesRead"
|
||
|
|
"400":
|
||
|
|
description: Bad Request
|
||
|
|
"401":
|
||
|
|
description: Unauthorized
|
||
|
|
get:
|
||
|
|
summary: "List user exchanges"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
responses:
|
||
|
|
"200":
|
||
|
|
description: OK
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
$ref: "#/components/schemas/ExchangesRead"
|
||
|
|
"401":
|
||
|
|
description: Unauthorized
|
||
|
|
/exchanges/{exchange_id}:
|
||
|
|
patch:
|
||
|
|
summary: "Update exchange"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
parameters:
|
||
|
|
- name: exchange_id
|
||
|
|
in: path
|
||
|
|
required: true
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/ExchangesBase"
|
||
|
|
responses:
|
||
|
|
"200":
|
||
|
|
description: Updated
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/ExchangesRead"
|
||
|
|
"404":
|
||
|
|
description: Not found
|
||
|
|
"400":
|
||
|
|
description: Bad request
|
||
|
|
/cycles:
|
||
|
|
post:
|
||
|
|
summary: "Create cycle (currently returns 405 in code)"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/CycleBase"
|
||
|
|
responses:
|
||
|
|
"405":
|
||
|
|
description: Method not allowed (app currently returns 405)
|
||
|
|
patch:
|
||
|
|
summary: "Update cycle"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/CycleUpdate"
|
||
|
|
responses:
|
||
|
|
"200":
|
||
|
|
description: Updated
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/CycleRead"
|
||
|
|
"400":
|
||
|
|
description: Invalid data
|
||
|
|
"404":
|
||
|
|
description: Not found
|
||
|
|
/cycles/{cycle_id}:
|
||
|
|
get:
|
||
|
|
summary: "Get cycle by id"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
parameters:
|
||
|
|
- name: cycle_id
|
||
|
|
in: path
|
||
|
|
required: true
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
responses:
|
||
|
|
"200":
|
||
|
|
description: OK
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/CycleRead"
|
||
|
|
"404":
|
||
|
|
description: Not found
|
||
|
|
/cycles/user/{user_id}:
|
||
|
|
get:
|
||
|
|
summary: "Get cycles by user id"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
parameters:
|
||
|
|
- name: user_id
|
||
|
|
in: path
|
||
|
|
required: true
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
responses:
|
||
|
|
"200":
|
||
|
|
description: OK
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
$ref: "#/components/schemas/CycleRead"
|
||
|
|
/trades:
|
||
|
|
post:
|
||
|
|
summary: "Create trade"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/TradeCreate"
|
||
|
|
responses:
|
||
|
|
"201":
|
||
|
|
description: Created
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/TradeRead"
|
||
|
|
"400":
|
||
|
|
description: Invalid trade data
|
||
|
|
"500":
|
||
|
|
description: Internal Server Error
|
||
|
|
/trades/{trade_id}:
|
||
|
|
get:
|
||
|
|
summary: "Get trade by id"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
parameters:
|
||
|
|
- name: trade_id
|
||
|
|
in: path
|
||
|
|
required: true
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
responses:
|
||
|
|
"200":
|
||
|
|
description: OK
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/TradeRead"
|
||
|
|
"404":
|
||
|
|
description: Not found
|
||
|
|
/trades/friendlyname:
|
||
|
|
patch:
|
||
|
|
summary: "Update trade friendly name"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/TradeFriendlyNameUpdate"
|
||
|
|
responses:
|
||
|
|
"200":
|
||
|
|
description: Updated
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/TradeRead"
|
||
|
|
"404":
|
||
|
|
description: Not found
|
||
|
|
/trades/notes:
|
||
|
|
patch:
|
||
|
|
summary: "Update trade notes"
|
||
|
|
security:
|
||
|
|
- session_cookie: []
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/TradeNoteUpdate"
|
||
|
|
responses:
|
||
|
|
"200":
|
||
|
|
description: Updated
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: "#/components/schemas/TradeRead"
|
||
|
|
"404":
|
||
|
|
description: Not found
|