aboutsummaryrefslogtreecommitdiff
path: root/backend/internal
diff options
context:
space:
mode:
authorGravatar Anshul Gupta <ansg191@anshulg.com> 2024-08-06 14:10:32 -0700
committerGravatar Anshul Gupta <ansg191@anshulg.com> 2024-08-06 14:10:32 -0700
commit641c81198d7fed7138bb482f226e54bd703094ab (patch)
treebef3ee6d24f568ef1b5225ab6681d8f584a25268 /backend/internal
parent34b09d6291eb272ea5e69a79c572de7637e0a122 (diff)
downloadibd-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.go59
-rw-r--r--backend/internal/server/idb/user/v1/user.go25
-rw-r--r--backend/internal/server/server.go4
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)