diff options
author | 2024-08-06 14:10:32 -0700 | |
---|---|---|
committer | 2024-08-06 14:10:32 -0700 | |
commit | 641c81198d7fed7138bb482f226e54bd703094ab (patch) | |
tree | bef3ee6d24f568ef1b5225ab6681d8f584a25268 /backend/internal | |
parent | 34b09d6291eb272ea5e69a79c572de7637e0a122 (diff) | |
download | ibd-trader-641c81198d7fed7138bb482f226e54bd703094ab.tar.gz ibd-trader-641c81198d7fed7138bb482f226e54bd703094ab.tar.zst ibd-trader-641c81198d7fed7138bb482f226e54bd703094ab.zip |
Implement `CheckIBDUsername` for `UserService`
Diffstat (limited to 'backend/internal')
-rw-r--r-- | backend/internal/ibd/check_ibd_username.go | 59 | ||||
-rw-r--r-- | backend/internal/server/idb/user/v1/user.go | 25 | ||||
-rw-r--r-- | backend/internal/server/server.go | 4 |
3 files changed, 84 insertions, 4 deletions
diff --git a/backend/internal/ibd/check_ibd_username.go b/backend/internal/ibd/check_ibd_username.go new file mode 100644 index 0000000..03d2640 --- /dev/null +++ b/backend/internal/ibd/check_ibd_username.go @@ -0,0 +1,59 @@ +package ibd + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" +) + +const ( + checkUsernameUrl = "https://sso.accounts.dowjones.com/getuser" +) + +func (c *Client) CheckIBDUsername(ctx context.Context, username string) (bool, error) { + cfg, err := c.getLoginPage(ctx) + if err != nil { + return false, err + } + + return c.checkIBDUsername(ctx, cfg, username) +} + +func (c *Client) checkIBDUsername(ctx context.Context, cfg *authConfig, username string) (bool, error) { + body := map[string]string{ + "username": username, + "csrf": cfg.ExtraParams.Csrf, + } + bodyJson, err := json.Marshal(body) + if err != nil { + return false, err + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, checkUsernameUrl, bytes.NewReader(bodyJson)) + if err != nil { + return false, err + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("X-REMOTE-USER", username) + req.Header.Set("X-REQUEST-EDITIONID", "IBD-EN_US") + req.Header.Set("X-REQUEST-SCHEME", "https") + + resp, err := c.Do(req) + if err != nil { + return false, err + } + + if resp.Result.StatusCode == http.StatusUnauthorized { + return false, nil + } else if resp.Result.StatusCode != http.StatusOK { + return false, fmt.Errorf( + "unexpected status code %d: %s", + resp.Result.StatusCode, + resp.Result.Content, + ) + } + return true, nil +} diff --git a/backend/internal/server/idb/user/v1/user.go b/backend/internal/server/idb/user/v1/user.go index 9550b06..8e5f16a 100644 --- a/backend/internal/server/idb/user/v1/user.go +++ b/backend/internal/server/idb/user/v1/user.go @@ -6,6 +6,7 @@ import ( pb "github.com/ansg191/ibd-trader-backend/api/gen/idb/user/v1" "github.com/ansg191/ibd-trader-backend/internal/database" + "github.com/ansg191/ibd-trader-backend/internal/ibd" "github.com/mennanov/fmutils" "google.golang.org/grpc/codes" @@ -16,11 +17,12 @@ import ( type Server struct { pb.UnimplementedUserServiceServer - db database.UserStore + db database.UserStore + client *ibd.Client } -func New(db database.UserStore) *Server { - return &Server{db: db} +func New(db database.UserStore, client *ibd.Client) *Server { + return &Server{db: db, client: client} } func (u *Server) CreateUser(ctx context.Context, request *pb.CreateUserRequest) (*pb.CreateUserResponse, error) { @@ -92,3 +94,20 @@ func (u *Server) UpdateUser(ctx context.Context, request *pb.UpdateUserRequest) User: newUser, }, nil } + +func (u *Server) CheckIBDUsername(ctx context.Context, req *pb.CheckIBDUsernameRequest) (*pb.CheckIBDUsernameResponse, error) { + username := req.IbdUsername + if username == "" { + return nil, status.Errorf(codes.InvalidArgument, "username cannot be empty") + } + + // Check if the username exists + exists, err := u.client.CheckIBDUsername(ctx, username) + if err != nil { + return nil, status.Errorf(codes.Internal, "unable to check username: %v", err) + } + + return &pb.CheckIBDUsernameResponse{ + Exists: exists, + }, nil +} diff --git a/backend/internal/server/server.go b/backend/internal/server/server.go index 133deb7..c46a629 100644 --- a/backend/internal/server/server.go +++ b/backend/internal/server/server.go @@ -10,6 +10,7 @@ import ( spb "github.com/ansg191/ibd-trader-backend/api/gen/idb/stock/v1" upb "github.com/ansg191/ibd-trader-backend/api/gen/idb/user/v1" "github.com/ansg191/ibd-trader-backend/internal/database" + "github.com/ansg191/ibd-trader-backend/internal/ibd" "github.com/ansg191/ibd-trader-backend/internal/leader/manager/ibd/scrape" "github.com/ansg191/ibd-trader-backend/internal/redis/taskqueue" "github.com/ansg191/ibd-trader-backend/internal/server/idb/stock/v1" @@ -31,6 +32,7 @@ func New( port uint16, db database.Database, rClient *redis.Client, + client *ibd.Client, ) (*Server, error) { scrapeQueue, err := taskqueue.New( ctx, @@ -43,7 +45,7 @@ func New( } s := grpc.NewServer() - upb.RegisterUserServiceServer(s, user.New(db)) + upb.RegisterUserServiceServer(s, user.New(db, client)) spb.RegisterStockServiceServer(s, stock.New(db, scrapeQueue)) longrunningpb.RegisterOperationsServer(s, newOperationServer(scrapeQueue)) reflection.Register(s) |