Shop It Docs
Portfolio Module

Reference

Every portfolio endpoint, DTO, cache key, and SQL query at a glance

A single-page lookup table for the portfolio module. All paths prefixed with /api/v1/nepse. All require JWT.

All 15 endpoints

Portfolio (tag: Portfolio — 8 endpoints)

MethodPathHandlerStatus
POST/portfolioscore.Handler.Create201
GET/portfolioscore.Handler.List200
GET/portfolios/{id}core.Handler.Get200
GET/portfolios/{id}/summarycore.Handler.GetSummary200
GET/portfolios/{id}/valuationcore.Handler.GetValuation200
GET/portfolios/{id}/broker-analysiscore.Handler.GetBrokerAnalysis200
PATCH/portfolios/{id}core.Handler.Update200
DELETE/portfolios/{id}core.Handler.Delete204

Portfolio Companies (tag: Portfolio Companies — 3 endpoints)

MethodPathHandlerStatus
GET/portfolios/{id}/holdingscompanies.Handler.ListHoldings200
GET/portfolios/{id}/distributioncompanies.Handler.GetDistribution200
GET/portfolios/{id}/companies/{symbol}companies.Handler.GetCompanyDetail200

Portfolio Transactions (tag: Portfolio Transactions — 4 endpoints)

MethodPathHandlerStatus
POST/portfolios/{id}/transactionstransactions.Handler.Add201
GET/portfolios/{id}/transactionstransactions.Handler.List200
PATCH/portfolios/{id}/transactions/{txId}transactions.Handler.Update200
DELETE/portfolios/{id}/transactions/{txId}transactions.Handler.Delete204

Schema

Three tables back the entire module.

nepse_portfolios

ColumnTypeNotes
iduuid PKUUIDv7
customer_iduuidFK
nametextmax 100
descriptiontext?max 500
is_defaultboolexactly one per customer (soft invariant)
last_fetched_attimestamptz?bumped on every detail read
deleted_attimestamptz?soft-delete
created_at, updated_attimestamptz

nepse_portfolio_transactions

ColumnTypeNotes
iduuid PKUUIDv7
portfolio_iduuid FKON DELETE CASCADE
company_iduuid FKON DELETE RESTRICT
typetextBUY | SELL | IPO | FPO | RIGHTS | AUCTION | DIVIDEND | BONUS
transacted_attimestamptz
quantityint?required for BUY/SELL/IPO/FPO/RIGHTS/AUCTION/BONUS
ratenumeric(14,4)?required for BUY/SELL/IPO/FPO/RIGHTS/AUCTION
amountnumeric(16,2)?required for BUY/SELL/IPO/FPO/RIGHTS/AUCTION/DIVIDEND
sebon_commission, broker_commission, dp_fee, net_amountnumeric?required for BUY and SELL
base_price, term, cgt_amountnumeric/text/numeric?required for SELL
notestext?max 500
deleted_attimestamptz?soft-delete
created_at, updated_attimestamptz

Per-type required-field shape enforced by CHECK constraints on the table. Indexes:

  • (portfolio_id, company_id, transacted_at) WHERE deleted_at IS NULL
  • (portfolio_id, transacted_at) WHERE deleted_at IS NULL

nepse_companies

Referenced via FK; not owned by this module.

Cache keys

KeyTTLUsed by
portfolio:detail:{id}30sGET /portfolios/{id}, GET /portfolios/{id}/summary
portfolio:valuation:{id}:1D60sGET /portfolios/{id}/valuation?range=1D
portfolio:valuation:{id}:{1W,1M,3M,6M,1Y,YTD,ALL}5minGET /portfolios/{id}/valuation?range=R

Defined in internal/platform/cache/keys.go.

sqlc queries

Located in internal/platform/database/queries/:

QueryFileUsed by
CreatePortfolioportfolios.sqlcore
FindPortfoliosByCustomerportfolios.sqlcore
FindPortfolioByIDportfolios.sqlshared.FindPortfolio
UpdatePortfolioportfolios.sqlcore (name/description/is_default)
UnsetDefaultForOtherPortfoliosportfolios.sqlcore (single-default invariant)
SoftDeletePortfolioportfolios.sqlcore
SoftDeleteTransactionsByPortfolioportfolios.sqlcore
CountPortfoliosByCustomerportfolios.sqlcore
TouchPortfolioFetchedAtcustomers.sqlcore (every detail read)
FindActivePortfolioSymbolsportfolios.sqlcore (broker-analysis)
FindLivePricesForCompaniesportfolios.sqlviews
FindBulkPriceHistoryForPortfolioportfolios.sqlviews (daily ranges)
FindBulkIntradayPricesForPortfolioportfolios.sqlviews (1D range)
FindBrokerActivityForSymbolsportfolios.sqlcore (broker-analysis)
CreateTransactionportfolio_transactions.sqltransactions.Add
FindTransactionsByPortfolioportfolio_transactions.sqltransactions.Find
CountTransactionsByPortfolioportfolio_transactions.sqltransactions.Find
FindTransactionForUpdateportfolio_transactions.sqltransactions.Update
UpdateTransactionportfolio_transactions.sqltransactions.Update
SoftDeleteTransactionportfolio_transactions.sqltransactions.Delete
FindAllPortfolioTransactionsForViewsportfolio_transactions.sqlviews.BuildState
FindTransactionsForCompanyTimelineportfolio_transactions.sqlviews.BuildCompanyDetail
GetCurrentUnitsByCompanyportfolio_transactions.sqltransactions (oversell guard)

Notable file paths

FilePurpose
internal/modules/portfolio/portfolio.goModule aggregator + chi route table
internal/modules/portfolio/core/service.goPortfolio CRUD + FindDetail/FindSummary/FindValuation/FindBrokerAnalysis
internal/modules/portfolio/transactions/service.goAdd/Find/Update/Delete + shape & cross-field validation
internal/modules/portfolio/views/state.goBuildState — chronological replay
internal/modules/portfolio/views/daypnl.goDayPnL — overnight + today decomposition
internal/modules/portfolio/views/valuation.goBuildValuation + BuildIntradayValuation
internal/modules/portfolio/views/distribution.gobyCompany + bySector pies
internal/modules/portfolio/views/holdings.goPer-company holding rows for the table
internal/modules/portfolio/views/company_detail.goSingle-symbol drilldown + timeline
internal/modules/portfolio/companies/service.goRead-side handler logic, sort/paginate
internal/modules/portfolio/companies/sort.goAllowed sort columns + comparator
internal/modules/portfolio/shared/cache.goTxRunner, Invalidator, RunReadSnapshot
internal/modules/portfolio/shared/conversions.goParseTradeTime (date or RFC3339), date helpers
internal/modules/portfolio/holdings/view.goHoldingResponse DTO (vestigial)
migrations/000023_portfolio_transactions.up.sqlSchema for unified transactions table

Module size

~3,000 LOC across 7 packages (core, companies, transactions, views, shared, holdings, root)