2026-03-24 12:09:19 +01:00
2026-03-24 12:09:19 +01:00
2026-03-24 11:17:08 +01:00
2026-03-24 11:17:08 +01:00
2026-03-24 11:17:08 +01:00
2026-03-24 12:09:19 +01:00
2026-03-24 12:09:19 +01:00
2026-03-24 11:21:53 +01:00

Portfolio Engine

A lightweight portfolio tracking backend written in Go. Replaces spreadsheets with a proper database, REST API, and an interactive shell — all in a single binary.

Features

  • SQLite database with foreign key enforcement
  • REST API on port 8080
  • Interactive shell for managing data without an HTTP client
  • Tracks companies with share count, price, and currency

Project Structure

.
├── main.go                  # Entry point, HTTP routes, shell loop
├── app.db                   # SQLite database (auto-created on first run)
├── build.sh                 # Build script
├── go.mod / go.sum
└── internal/
    ├── database/
    │   └── main.go          # Schema init (InitDB)
    ├── handlers/
    │   └── main.go          # HTTP handlers (HealthHandler, AddCompanyHandler)
    ├── model/
    │   └── company.go       # Structs + SQL queries (Company, Currency, CompanyInput)
    ├── service/
    │   ├── company.go       # Company business logic
    │   ├── currency.go      # Currency business logic
    │   └── main.go          # Service setup
    └── shell/
        ├── company.go       # Shell commands for companies
        └── currency.go      # Shell commands for currencies

Getting Started

Prerequisites

  • Go 1.21+
  • GCC (required for SQLite CGO bindings)
    • Ubuntu/Debian: sudo apt install gcc
    • macOS: comes with Xcode Command Line Tools

Install & Run

git clone git@git.samantha42.xyz:samantha/Portifolio-Engine.git
cd Portifolio-Engine
go mod download
go run main.go

Or use the build script:

chmod +x build.sh
./build.sh
./Portifolio

On startup you'll see:

Connected to SQLite database
Server running on :8080

Shell ready. Commands: add-company, help, exit
>

The HTTP server and the shell run concurrently — the API is live while you type shell commands.

REST API

GET /health

Returns the status of the server and database connection.

curl http://localhost:8080/health
{
  "status": "ok",
  "database": "ok"
}

Returns 503 if the database is unreachable.


POST /add/company

Add a new company. The currency_id must reference an existing currency in the database.

curl -X POST http://localhost:8080/add/company \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Novo Nordisk",
    "shares_outstanding": 4442064180,
    "price": 251.00,
    "currency_id": 1
  }'
{ "status": "created" }

Shell Commands

The shell starts automatically after the server and accepts commands interactively.

Command Description
add-currency Add a new currency interactively
list-currency List all currencies with their IDs
add-company Add a new company interactively
help Show available commands
exit Quit the application

Example session

> add-currency
  Code (e.g. DKK): DKK
  Name (e.g. Danish Krone): Danish Krone
  ✓ Currency 'Danish Krone' (DKK) added with ID 1

> list-currency
  ID    CODE   NAME
  ------------------------------
  1     DKK    Danish Krone

> add-company
  Name: Maersk
  Shares outstanding: 15224309
  Price: 15270.00
  Currency ID: 1
  ✓ Company 'Maersk' added.

Database Schema

CREATE TABLE currencies (
    id   INTEGER PRIMARY KEY AUTOINCREMENT,
    code TEXT    NOT NULL UNIQUE,
    name TEXT    NOT NULL
);

CREATE TABLE companies (
    id                 INTEGER PRIMARY KEY AUTOINCREMENT,
    name               TEXT    NOT NULL UNIQUE,
    shares_outstanding INTEGER NOT NULL,
    price              REAL    NOT NULL,
    currency_id        INTEGER NOT NULL,
    FOREIGN KEY (currency_id) REFERENCES currencies(id)
);

Roadmap

  • GET /companies — list all companies
  • GET /currencies — list all currencies
  • Price update endpoint
  • Market cap calculation (price × shares)
  • Multi-currency conversion
  • Frontend dashboard
Description
No description provided
Readme 113 MiB
Languages
Go 49.1%
HTML 29.3%
CSS 21.6%