gofio

http server for overview for accounts from FIO bank
git clone git://gtms.dev/gofio
Log | Files | Refs

main.go (2325B)


      1 package main
      2 
      3 import (
      4 	"bytes"
      5 	"fio/fio"
      6 	"flag"
      7 	"fmt"
      8 	"log"
      9 	"net/http"
     10 	"os"
     11 	"strings"
     12 )
     13 
     14 const base_url = "https://www.fio.cz/ib_api/rest/"
     15 
     16 var (
     17 	tokensFile = flag.String("t", "tokens", "fio api token")
     18 	port       = flag.String("port", "3000", "serving port")
     19 
     20 	templates map[string][]byte
     21 	accounts  []*account
     22 	lastUri   string = "/"
     23 )
     24 
     25 func checkErr(err error, msg ...interface{}) {
     26 	if err != nil {
     27 		log.Fatal(msg...)
     28 	}
     29 }
     30 
     31 func main() {
     32 	flag.Parse()
     33 
     34 	// Tokens
     35 	if *tokensFile == "" {
     36 		log.Fatal("Token file was not provided")
     37 	}
     38 	file, err := os.Open(*tokensFile)
     39 	checkErr(err, "Cannot read token file")
     40 	tokens, err := parseTokens(file)
     41 	checkErr(err, "Cannot parse token file")
     42 
     43 	// templates
     44 	templates = loadTemplates([]string{"dashboard", "balance", "card"})
     45 
     46 	// accounts
     47 	for _, token := range tokens {
     48 		fio := fio.Fio{Base_url: base_url, Token: token.token}
     49 		accounts = append(accounts, &account{name: token.name, config: token.config, fio: &fio})
     50 	}
     51 
     52 	http.HandleFunc("/", serveDashboard())
     53 	for _, acc := range accounts {
     54 		http.HandleFunc("/"+acc.name, serveBalance(acc.name))
     55 	}
     56 
     57 	log.Printf("Listening on :%s...\n", *port)
     58 	err = http.ListenAndServe(":"+*port, nil)
     59 	checkErr(err, err)
     60 }
     61 
     62 // DASHBOARD
     63 func serveDashboard() http.HandlerFunc {
     64 	return func(w http.ResponseWriter, r *http.Request) {
     65 		file := loadDashboard(templates["dashboard"])
     66 		fmt.Fprint(w, file)
     67 	}
     68 }
     69 
     70 // BALANCE
     71 func serveBalance(name string) http.HandlerFunc {
     72 	return func(w http.ResponseWriter, r *http.Request) {
     73 		acc := getAcc(name)
     74 		cards := accCards(acc.name)
     75 		balance, err := acc.loadBalance(templates["balance"], cards)
     76 		if err != nil {
     77 			log.Print(err)
     78 			http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
     79 			return
     80 		}
     81 		fmt.Fprint(w, balance)
     82 	}
     83 }
     84 
     85 func loadDashboard(template []byte) string {
     86 	cards := accCards("")
     87 	return strings.Replace(string(template), "{{CARDS}}", cards, -1)
     88 }
     89 
     90 func accCards(activeAcc string) string {
     91 	var cardBuf bytes.Buffer
     92 	for _, acc := range accounts {
     93 		card, err := acc.loadCard(templates["card"], activeAcc == acc.name)
     94 		if err != nil {
     95 			log.Print(err)
     96 			continue
     97 		}
     98 		cardBuf.WriteString(card)
     99 	}
    100 	return cardBuf.String()
    101 }
    102 
    103 func getAcc(name string) *account {
    104 	for _, acc := range accounts {
    105 		if acc.name == name {
    106 			return acc
    107 		}
    108 	}
    109 	return nil
    110 }