diff options
author | 2024-08-07 19:48:19 -0700 | |
---|---|---|
committer | 2024-08-07 19:48:52 -0700 | |
commit | a439618cdc8168bad617d04875697b572f3ed41d (patch) | |
tree | b6d867a2d65713deb2e8c2daa25a9df2dd23308b | |
parent | 55231eb4cfb5b5ce246a68ef456619cdb65d8af1 (diff) | |
download | ibd-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.sql | 6 | ||||
-rw-r--r-- | backend/internal/database/stocks.go | 108 | ||||
-rw-r--r-- | backend/internal/ibd/stockinfo.go | 18 |
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) } |