public async Task <IActionResult> Login(dynamic req)
        {
            JObject body = DeserializeRequest(req);

            if (!body.ContainsKey("email") || !body.ContainsKey("password"))
            {
                return(BadRequest("Request body must contain 'email' and 'password'"));
            }

            string res;

            try {
                res = await AuthConnection.Instance.LoginUser(body.GetValue("email").ToString().ToLowerInvariant(),
                                                              body.GetValue("password").ToString());
            } catch (Exception e) {
                return(BadRequest($"Something went wrong: {e}"));
            }

            // If the user exists in Azure B2C but doesn't exist in the database, create the user's profile
            // First, get the user's claims from the generated JWT
            JObject tokenObject = DeserializeRequest(res);

            if (tokenObject.ContainsKey("error"))
            {
                return(Unauthorized(tokenObject.GetValue("error_description").ToString()));
            }

            JwtSecurityToken            jwt = AuthConnection.DecodeToken(tokenObject.GetValue("access_token").ToString());
            Dictionary <string, string> claimsDictionary = AuthConnection.GetClaimsFromToken(jwt);

            try {
                // See if the user exists in the database
                string queryString = GetVertex(claimsDictionary["emails"]);
                var    result      = await DatabaseConnection.Instance.ExecuteQuery(queryString);

                // If the user exists, return Ok()
                if (result.Count > 0)
                {
                    return(Ok(res));
                }

                string firstName = claimsDictionary["given_name"];
                string lastName  = claimsDictionary["family_name"];
                string email     = claimsDictionary["emails"].ToLowerInvariant();

                // Else, create the user
                UserVertex u = new UserVertex(firstName, lastName);

                IActionResult  createUserResult = await new UsersController().CreateUser(email, u).ConfigureAwait(false);
                OkObjectResult okResult         = createUserResult as OkObjectResult;

                if (okResult.StatusCode != 200)
                {
                    return(BadRequest("Error creating new user vertex when signing in user for the first time"));
                }

                return(Ok(res));
            } catch (Exception e) {
                return(BadRequest($"Unknown error signing user for the first time: {e}"));
            }
        }
        public async Task <IActionResult> LoginUser(dynamic req)
        {
            JObject body = DeserializeRequest(req);

            string res;

            try {
                res = await AuthConnection.Instance.LoginUser(body.GetValue("email").ToString().ToLowerInvariant(),
                                                              body.GetValue("password").ToString());
            } catch (Exception e) {
                return(BadRequest($"Something went wrong: {e}"));
            }

            // If the user exists in Azure B2C but doesn't exist in the database, create the user's profile
            // First, get the user's claims from the generated JWT
            JObject tokenObject = DeserializeRequest(res);

            if (tokenObject.ContainsKey("error"))
            {
                return(Unauthorized(tokenObject.GetValue("error_description").ToString()));
            }

            JwtSecurityToken jwt = AuthConnection.DecodeToken(tokenObject.GetValue("access_token").ToString());

            Dictionary <string, string> claimsDictionary = new Dictionary <string, string>();

            foreach (Claim claim in jwt.Claims)
            {
                claimsDictionary[claim.Type] = claim.Value;
            }

            try {
                // See if the user exists in the database
                string queryString = ReadVertexQuery(claimsDictionary["emails"]);
                var    result      = await DatabaseConnection.Instance.ExecuteQuery(queryString);

                // If the user exists, return Ok()
                if (result.Count > 0)
                {
                    return(Ok(res));
                }

                // Else, create the user
                JObject user = new JObject(
                    new JProperty("firstName", claimsDictionary["given_name"]),
                    new JProperty("lastName", claimsDictionary["family_name"]),
                    new JProperty("email", claimsDictionary["emails"].ToLowerInvariant()));

                IActionResult createUserResult = await CreateUser(user.ToString()).ConfigureAwait(false);

                OkObjectResult okResult = createUserResult as OkObjectResult;

                if (okResult.StatusCode != 200)
                {
                    return(BadRequest("Error creating new user vertex when signing in user for the first time"));
                }

                return(Ok(res));
            } catch (Exception e) {
                return(BadRequest($"Unknown error signing user for the first time: {e}"));
            }
        }