aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Anshul Gupta <ansg191@anshulg.com> 2024-08-07 19:48:19 -0700
committerGravatar Anshul Gupta <ansg191@anshulg.com> 2024-08-07 19:48:52 -0700
commita439618cdc8168bad617d04875697b572f3ed41d (patch)
treeb6d867a2d65713deb2e8c2daa25a9df2dd23308b
parent55231eb4cfb5b5ce246a68ef456619cdb65d8af1 (diff)
downloadibd-trader-a439618cdc8168bad617d04875697b572f3ed41d.tar.gz
ibd-trader-a439618cdc8168bad617d04875697b572f3ed41d.tar.zst
ibd-trader-a439618cdc8168bad617d04875697b572f3ed41d.zip
Rewrite `LetterRating` to match protobuf def
Also changes DB schema to accept strings instead of integers.
-rw-r--r--backend/db/migrations/000002_create_data_tables.up.sql6
-rw-r--r--backend/internal/database/stocks.go108
-rw-r--r--backend/internal/ibd/stockinfo.go18
3 files changed, 61 insertions, 71 deletions
diff --git a/backend/db/migrations/000002_create_data_tables.up.sql b/backend/db/migrations/000002_create_data_tables.up.sql
index 116c424..f279aa3 100644
--- a/backend/db/migrations/000002_create_data_tables.up.sql
+++ b/backend/db/migrations/000002_create_data_tables.up.sql
@@ -55,9 +55,9 @@ CREATE TABLE IF NOT EXISTS ratings
composite SMALLINT, -- The composite rating (0-99)
eps SMALLINT, -- The EPS rating (0-99)
rel_str SMALLINT, -- The relative strength rating (0-99)
- group_rel_str SMALLINT, -- The group relative strength rating (E-A+) E=0, A+=13
- smr SMALLINT, -- The SMR rating (E-A+)
- acc_dis SMALLINT, -- The acc/dis rating (E-A+)
+ group_rel_str CHAR(2), -- The group relative strength rating (E-A+) E=0, A+=13
+ smr CHAR(2), -- The SMR rating (E-A+)
+ acc_dis CHAR(2), -- The acc/dis rating (E-A+)
chart_analysis UUID REFERENCES chart_analysis (id), -- The ID of the chart analysis for the stock
price MONEY, -- The price of the stock at the time of the rating
diff --git a/backend/internal/database/stocks.go b/backend/internal/database/stocks.go
index 865aec4..0627a72 100644
--- a/backend/internal/database/stocks.go
+++ b/backend/internal/database/stocks.go
@@ -3,9 +3,10 @@ package database
import (
"context"
"database/sql"
+ "database/sql/driver"
"errors"
- "fmt"
+ pb "github.com/ansg191/ibd-trader-backend/api/gen/idb/stock/v1"
"github.com/ansg191/ibd-trader-backend/internal/analyzer"
"github.com/ansg191/ibd-trader-backend/internal/utils"
@@ -193,93 +194,94 @@ type Ratings struct {
AccDis LetterRating
}
-type LetterRating uint8
-
-const (
- LetterRatingE LetterRating = iota
- LetterRatingEPlus
- LetterRatingDMinus
- LetterRatingD
- LetterRatingDPlus
- LetterRatingCMinus
- LetterRatingC
- LetterRatingCPlus
- LetterRatingBMinus
- LetterRatingB
- LetterRatingBPlus
- LetterRatingAMinus
- LetterRatingA
- LetterRatingAPlus
-)
+type LetterRating pb.LetterGrade
func (r LetterRating) String() string {
- switch r {
- case LetterRatingE:
+ switch pb.LetterGrade(r) {
+ case pb.LetterGrade_LETTER_GRADE_E:
return "E"
- case LetterRatingEPlus:
+ case pb.LetterGrade_LETTER_GRADE_E_PLUS:
return "E+"
- case LetterRatingDMinus:
+ case pb.LetterGrade_LETTER_GRADE_D_MINUS:
return "D-"
- case LetterRatingD:
+ case pb.LetterGrade_LETTER_GRADE_D:
return "D"
- case LetterRatingDPlus:
+ case pb.LetterGrade_LETTER_GRADE_D_PLUS:
return "D+"
- case LetterRatingCMinus:
+ case pb.LetterGrade_LETTER_GRADE_C_MINUS:
return "C-"
- case LetterRatingC:
+ case pb.LetterGrade_LETTER_GRADE_C:
return "C"
- case LetterRatingCPlus:
+ case pb.LetterGrade_LETTER_GRADE_C_PLUS:
return "C+"
- case LetterRatingBMinus:
+ case pb.LetterGrade_LETTER_GRADE_B_MINUS:
return "B-"
- case LetterRatingB:
+ case pb.LetterGrade_LETTER_GRADE_B:
return "B"
- case LetterRatingBPlus:
+ case pb.LetterGrade_LETTER_GRADE_B_PLUS:
return "B+"
- case LetterRatingAMinus:
+ case pb.LetterGrade_LETTER_GRADE_A_MINUS:
return "A-"
- case LetterRatingA:
+ case pb.LetterGrade_LETTER_GRADE_A:
return "A"
- case LetterRatingAPlus:
+ case pb.LetterGrade_LETTER_GRADE_A_PLUS:
return "A+"
default:
- return "Unknown"
+ return "NA"
}
}
-func LetterRatingFromString(str string) (LetterRating, error) {
+func LetterRatingFromString(str string) LetterRating {
switch str {
- case "N/A":
- fallthrough
case "E":
- return LetterRatingE, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_E)
case "E+":
- return LetterRatingEPlus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_E_PLUS)
case "D-":
- return LetterRatingDMinus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_D_MINUS)
case "D":
- return LetterRatingD, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_D)
case "D+":
- return LetterRatingDPlus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_D_PLUS)
case "C-":
- return LetterRatingCMinus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_C_MINUS)
case "C":
- return LetterRatingC, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_C)
case "C+":
- return LetterRatingCPlus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_C_PLUS)
case "B-":
- return LetterRatingBMinus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_B_MINUS)
case "B":
- return LetterRatingB, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_B)
case "B+":
- return LetterRatingBPlus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_B_PLUS)
case "A-":
- return LetterRatingAMinus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_A_MINUS)
case "A":
- return LetterRatingA, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_A)
case "A+":
- return LetterRatingAPlus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_A_PLUS)
+ case "NA":
+ fallthrough
default:
- return 0, fmt.Errorf("unknown rating: %s", str)
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_UNSPECIFIED)
}
}
+
+func (r LetterRating) Value() (driver.Value, error) {
+ return r.String(), nil
+}
+
+func (r *LetterRating) Scan(src any) error {
+ var source string
+ switch v := src.(type) {
+ case string:
+ source = v
+ case []byte:
+ source = string(v)
+ default:
+ return errors.New("incompatible type for LetterRating")
+ }
+ *r = LetterRatingFromString(source)
+ return nil
+}
diff --git a/backend/internal/ibd/stockinfo.go b/backend/internal/ibd/stockinfo.go
index 9caa956..1e3b96f 100644
--- a/backend/internal/ibd/stockinfo.go
+++ b/backend/internal/ibd/stockinfo.go
@@ -207,23 +207,11 @@ func processSmartRating(node *html.Node, ratings *database.Ratings) error {
}
ratings.RelStr = uint8(ratingValue)
case "Group RS Rating":
- ratingValue, err := database.LetterRatingFromString(ratingValueStr)
- if err != nil {
- return fmt.Errorf("failed to parse Group RS Rating: %w", err)
- }
- ratings.GroupRelStr = ratingValue
+ ratings.GroupRelStr = database.LetterRatingFromString(ratingValueStr)
case "SMR Rating":
- ratingValue, err := database.LetterRatingFromString(ratingValueStr)
- if err != nil {
- return fmt.Errorf("failed to parse SMR Rating: %w", err)
- }
- ratings.SMR = ratingValue
+ ratings.SMR = database.LetterRatingFromString(ratingValueStr)
case "Acc/Dis Rating":
- ratingValue, err := database.LetterRatingFromString(ratingValueStr)
- if err != nil {
- return fmt.Errorf("failed to parse Acc/Dis Rating: %w", err)
- }
- ratings.AccDis = ratingValue
+ ratings.AccDis = database.LetterRatingFromString(ratingValueStr)
default:
return fmt.Errorf("unknown rating name: %s", ratingName)
}