|
|
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("/") |
|
|
} |
|
|
|
|
|
|
|
|
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("/") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
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) |
|
|
} |
|
|
|