= Stock Ticker

== Overview

[source,console]
----
$ curl http://stock-ticker.test/stockprice

Symbol: MSFT

Week       | Closing Price
==========================
2023-02-17 |   258.0600
2023-02-10 |   263.1000
2023-02-03 |   258.3500
2023-01-27 |   248.1600
2023-01-20 |   240.2200
2023-01-13 |   239.2300
2023-01-06 |   224.9300

----

This is a simple web service that prints the last 'N' weeks of closing stock prices for a particular stock.
The data is retrieved from https://www.alphavantage.co/documentation/[Alpha Vantage's API].

The web service servers the following endpoints:

- `/healthcheck` - Returns `200` if the server is up and running.
- `/stockprice` - Prints the closing prices for the latest N weeks.

=== Alpha Vantage API Key

Before running the web service you'll need to obtain an API key from Alpha Vantage.
You can claim a free key from:

https://www.alphavantage.co/support/#api-key

=== Required environment variables

[%header,cols=3*]
|===
|Environment Variable
|Description
|Example

|SYMBOL
|The stock's symbol.
|MSFT

|NWEEKS
|Display the closing price for the last N weeks.
|7

|APIKEY
|Your API key from Alpha Vantage.
|
|===

=== Command line arguments

[%header,cols=3*]
|===
|Argument
|Description
|Default

|address
|The address that the web server will listen on.
|0.0.0.0:8080
|===

== Running the docker image locally

The docker image is published to the container registry at Code Flow https://codeflow.dananglin.me.uk/apollo/stock-ticker/packages[here].
You can pull and run the docker image from the registry with the following command:

[source,console]
----
docker run --rm \
    -d \
    -e SYMBOL=MSFT \
    -e NWEEKS=3 \
    -e APIKEY=<YOUR_API_KEY> \
    --publish 8080:8080 \
    --name stock-ticker \
    codeflow.dananglin.me.uk/apollo/stock-ticker:v0.1.0
----

Alternatively you can build and run the docker image locally.

[source,console]
----
git clone https://codeflow.dananglin.me.uk/apollo/stock-ticker.git
cd stock-ticker
docker build -t stock-ticker -f deploy/Dockerfile .
docker run --rm \
    -d \
    -e SYMBOL=MSFT \
    -e NWEEKS=3 \
    -e APIKEY=<YOUR_API_KEY> \
    --publish 8080:8080 \
    --name stock-ticker \
    stock-ticker
----

Now you can go to http://localhost:8080/stockprice in your browser to view a table of the latest weekly closing stock prices for Microsoft (MSFT).

== Deploying the web service on Minikube

The web service can be deployed on any distribution of Kubernetes but the below guide will focus on deployment onto a Minikube cluster.
The Kubernetes manifest can viewed https://codeflow.dananglin.me.uk/apollo/stock-ticker/src/branch/main/deploy/manifest.yaml[here] and you can download and modify it as you wish.

1. Follow https://k8s-docs.netlify.app/en/docs/tasks/tools/install-minikube/[these instructions] to install and start a Minikube cluster.

2. Set up ingress using either the https://minikube.sigs.k8s.io/docs/handbook/addons/ingress-dns/[Ingress DNS] or https://minikube.sigs.k8s.io/docs/handbook/addons/kong-ingress/[Kong Ingress] addon.

3. Apply the Kubernetes manifest to your Minikube cluster.

    kubectl apply -f https://codeflow.dananglin.me.uk/apollo/stock-ticker/raw/branch/main/deploy/manifest.yaml

4. Wait until the pods are running and in a 'Ready' state.

    $ kubectl -n stock-ticker get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    stock-ticker-656859cf74-bb8w6   1/1     Running   0          29s
    stock-ticker-656859cf74-nvnbf   1/1     Running   0          29s
    stock-ticker-656859cf74-p6xzk   1/1     Running   0          29s

5. Go to http://stock-ticker.<YOUR_TLD>/stockprice from your browser.
