thesis_forecasting_website / handlers /infograpic_handler.go
tebakaja's picture
deployment
03c0050
raw
history blame
2.64 kB
package handlers
import (
"os"
"fmt"
"sync"
"github.com/gofiber/fiber/v2"
loaders "thesis_forecasting_website/loaders"
)
func InfographicHandler(c *fiber.Ctx) error {
issuer_name := c.Query("issuer_name")
if issuer_name == "" {
return c.Redirect("/")
}
// json validation
fundamental_json := fmt.Sprintf("./indonesia_stocks/fundamentals/%s.json", issuer_name)
historical_json := fmt.Sprintf("./indonesia_stocks/historicals/%s.json", issuer_name)
indicator_json := fmt.Sprintf("./indonesia_stocks/indicators/%s.json", issuer_name)
json_paths := []string{fundamental_json, historical_json, indicator_json}
err_channel := make(chan error, len(json_paths))
var waitgroup_validate sync.WaitGroup
waitgroup_validate.Add(len(json_paths))
for _, json_path := range json_paths {
go func(path string) {
defer waitgroup_validate.Done()
if _, err := os.Stat(path); os.IsNotExist(err) {
err_channel <- fmt.Errorf("file missing: %s", path)
return
}
err_channel <- nil
}(json_path)
}
waitgroup_validate.Wait()
for i := 0; i < len(json_paths); i++ {
if err := <-err_channel; err != nil {
return c.Redirect("/")
}
}
// load infographics (fundamental, historical, indicator)
var (
fundamental *loaders.Fundamental
historicals []loaders.Historical
indicators []loaders.Indicator
errors []error
mutex sync.Mutex
)
addError := func(err error) {
if err != nil {
mutex.Lock()
errors = append(errors, err)
mutex.Unlock()
}
}
var waitgroup_infographics sync.WaitGroup
waitgroup_infographics.Add(3)
go func() {
defer waitgroup_infographics.Done()
data, err := loaders.FundamentalLoader(fundamental_json)
if err != nil { addError(err) }
mutex.Lock()
fundamental = data
mutex.Unlock()
}()
go func() {
defer waitgroup_infographics.Done()
data, err := loaders.HistoricalLoader(historical_json)
if err != nil { addError(err) }
mutex.Lock()
historicals = data
mutex.Unlock()
}()
go func() {
defer waitgroup_infographics.Done()
data, err := loaders.IndicatorLoader(indicator_json)
if err != nil { addError(err) }
mutex.Lock()
indicators = data
mutex.Unlock()
}()
waitgroup_infographics.Wait()
if len(errors) > 0 {
for _, err := range errors { println(err.Error()) }
return c.Redirect("/")
}
data := fiber.Map{
"Fundamentals": fundamental,
"Historicals": historicals,
"Technicals": indicators,
}
return c.Render("infographic", data)
}