diff --git a/backend/scripts/emailCleaner.mjs b/backend/scripts/emailCleaner.mjs deleted file mode 100644 index 609572262..000000000 --- a/backend/scripts/emailCleaner.mjs +++ /dev/null @@ -1,33 +0,0 @@ -import jsonData from './test-data.json' assert {type: 'json'}; - -const emailMap = {}; - -jsonData.forEach(user => { - const lowercaseEmail = user.email.toLowerCase(); - if (!emailMap[lowercaseEmail]) { - emailMap[lowercaseEmail] = user; - } else { - const existingUser = emailMap[lowercaseEmail]; - existingUser.skillsToMatch.push(...user.skillsToMatch); - existingUser.projects.push(...user.projects); - existingUser.managedProjects.push(...user.managedProjects); - existingUser.textingOk = existingUser.textingOk || user.textingOk; - existingUser.isActive = existingUser.isActive || user.isActive; - existingUser.newMember = existingUser.newMember || user.newMember; - existingUser.currentRole = existingUser !== user ? existingUser.currentRole : user.currentRole; - existingUser.desiredRole = existingUser !== user ? existingUser.desiredRole : user.desiredRole; - - if (existingUser.accessLevel === 'admin' || user.accessLevel === 'admin') { - existingUser.accessLevel = 'admin'; - } - // Preserving the older createdDate, firstAttended and modifying the email - if (new Date(user.createdDate) < new Date(existingUser.createdDate)) { - existingUser.createdDate = user.createdDate; - existingUser.firstAttended = user.firstAttended; - existingUser.email = `${user.email.toLowerCase()}_${user._id}` - } - } - // Always lowercase email - user.email = lowercaseEmail; -}); - diff --git a/backend/scripts/python/env/.gitignore b/backend/scripts/python/env/.gitignore new file mode 100644 index 000000000..f514b74c5 --- /dev/null +++ b/backend/scripts/python/env/.gitignore @@ -0,0 +1,2 @@ +# Created by venv; see https://docs.python.org/3/library/venv.html +* diff --git a/backend/scripts/python/env/Duplicate Removal.ipynb b/backend/scripts/python/env/Duplicate Removal.ipynb new file mode 100644 index 000000000..847f9e455 --- /dev/null +++ b/backend/scripts/python/env/Duplicate Removal.ipynb @@ -0,0 +1,405 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "377dcf28-dc41-416c-85bd-03c723ac73c5", + "metadata": {}, + "source": [ + "# Setup\n", + "\n", + "For dev, you must have the backend api running on your computer. For prod, please change USER_API_URL to reflect the production url.\n", + "\n", + "Please also configure the `x-custom-required-header` within your `.env` file to have the correct value." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "bf6a5708-01b8-4439-b085-996a0b9309df", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import json\n", + "from dotenv import load_dotenv\n", + "import os\n", + "import re\n", + "from datetime import datetime\n", + "from functools import reduce\n", + "\n", + "load_dotenv()\n", + "custom_request_header = os.getenv(\"CUSTOM_REQUEST_HEADER\")\n", + "DATABASE_URL = os.getenv(\"DATABASE_URL\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3387bab6-f11c-47c2-9c7a-def83999f50e", + "metadata": {}, + "outputs": [], + "source": [ + "USER_API_URL = 'http://localhost:3000/api/users'\n", + "HEADERS = { \"x-customrequired-header\": custom_request_header }" + ] + }, + { + "cell_type": "markdown", + "id": "0c952dc5-c39e-4337-9043-16c1dbce38b3", + "metadata": {}, + "source": [ + "## Retrieve Users\n", + "\n", + "Retrieve a list of all users and the format it into a dictionary where users are hashed to their _id." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "2345b8e1-5601-4852-89c0-7e01f1b15e04", + "metadata": {}, + "outputs": [], + "source": [ + "# Get a List of all users\n", + "r = requests.get(USER_API_URL, headers=HEADERS)\n", + "users = json.loads(r.content)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "0fb71fe2-9976-4d24-b308-d9f511d01192", + "metadata": {}, + "outputs": [], + "source": [ + "user_dict = {}\n", + "for user in users:\n", + " user_dict[user['_id']] = user" + ] + }, + { + "cell_type": "markdown", + "id": "e8658c5b-dc98-4954-befe-ddfc54668a25", + "metadata": {}, + "source": [ + "## Identify Capitalized Emails\n", + "\n", + "Create a function that identifies which users have capital characters in their email addresses. This function will return a dictionary of user ids hashed to the email that they all share called `duped_emails` and a set of tuples for capitalized emails addresses that don't have multiple user ids called `non_duped_capital_emails_with_ids`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8c5646cc-e708-4212-b280-d56711d71f64", + "metadata": {}, + "outputs": [], + "source": [ + "def identify_problem_users(users):\n", + " users_with_capital_emails = [user for user in users if re.compile('[A-Z]').search(user['email'])]\n", + "\n", + " potential_duplicate_emails = set([user['email'].lower() for user in users_with_capital_emails])\n", + "\n", + " problem_users = {}\n", + " for user in users:\n", + " current_email = user['email'].lower()\n", + " if current_email in potential_duplicate_emails:\n", + " if problem_users.get(current_email, None) is not None:\n", + " problem_users[current_email].append(user['_id'])\n", + " else:\n", + " problem_users[current_email] = [user['_id']]\n", + "\n", + " non_duped_capital_emails_with_ids = set([(email, problem_users[email][0]) for email in problem_users.keys() if len(problem_users[email]) == 1])\n", + "\n", + " for email, user_id in non_duped_capital_emails_with_ids:\n", + " problem_users.pop(email)\n", + "\n", + " return problem_users, non_duped_capital_emails_with_ids" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "feae3b2e-8bb8-43d2-9056-5db90b44708f", + "metadata": {}, + "outputs": [], + "source": [ + "duped_emails, non_duped_capital_emails_with_ids = identify_problem_users(users)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8f0c346-9ac5-4e05-b3d7-25e68d6cbcf7", + "metadata": {}, + "outputs": [], + "source": [ + "duped_emails" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b5d62f5-3625-4693-9471-8d49e7f4b6fe", + "metadata": {}, + "outputs": [], + "source": [ + "non_duped_capital_emails_with_ids" + ] + }, + { + "cell_type": "markdown", + "id": "c762e074-04f9-4590-bef5-f4eaac0d3ac6", + "metadata": {}, + "source": [ + "## Fixing non-duped emails\n", + "\n", + "These functions will use the API to update user documents in the database that have an email with a capitalized character. To fix all such emails, run `fix_non_duped_capital_emails(non_duped_capital_emails_with_ids)`" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "dba2cc1d-2df2-4322-a9c8-dc7351e9a1ac", + "metadata": {}, + "outputs": [], + "source": [ + "def update_user(user_id, user_data):\n", + " r = requests.patch(USER_API_URL + '/' + user_id, json=user_data, headers=HEADERS)\n", + " print(r.content)\n", + " \n", + "def fix_non_duped_capital_emails(emails_with_ids):\n", + " for email, user_id in emails_with_ids:\n", + " print(email, user_id)\n", + " update_user(user_id, {'email': email})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8c5313c-05fd-4121-87ce-b4e175a112d6", + "metadata": {}, + "outputs": [], + "source": [ + "fix_non_duped_capital_emails(non_duped_capital_emails_with_ids)" + ] + }, + { + "cell_type": "markdown", + "id": "75a6a051-8622-49d4-9508-0e6ac0526d6f", + "metadata": {}, + "source": [ + "## Removing duplicate users\n", + "\n", + "These following cells will order the userIds in the duped_emails dict from oldest to newest, merge the information from new user documents into the oldest one, update the original, and then delete the duplicates. It will also keep track of the duplicate user documents' userIds so that we can change any checkins later to have the userId of the original user document." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "3f9e99a4-c67e-4109-913d-ee8cced7bb57", + "metadata": {}, + "outputs": [], + "source": [ + "# Sort ids for each duped email by oldest to newest\n", + "\n", + "for lowercase_email in duped_emails.keys():\n", + " duped_emails[lowercase_email].sort(key=(lambda _id: user_dict[_id]['createdDate']))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "6270f2b8-aa8d-446f-8ee8-7dcbac3a4cc7", + "metadata": {}, + "outputs": [], + "source": [ + "# This will be used later for updating checkins\n", + "ids_to_replace = {}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2e9128e-b338-4456-ae0d-8772621536dd", + "metadata": {}, + "outputs": [], + "source": [ + "def merge_users(older_id, newer_id):\n", + " canonical_user = user_dict[older_id]\n", + " duplicate_user = user_dict[newer_id]\n", + " ids_to_replace[newer_id] = older_id\n", + "\n", + " # For any list fields, combine them\n", + " list_fields = ['skillsToMatch', 'projects', 'managedProjects']\n", + " for field in list_fields:\n", + " all_array_values = set(canonical_user.get(field, []) + duplicate_user.get(field, []))\n", + " canonical_user[field] = list(all_array_values)\n", + "\n", + " # For boolean fields, set to true if either is true\n", + " bool_fields = ['textingOk', 'isActive', 'newMember']\n", + " for field in bool_fields:\n", + " canonical_user[field] = canonical_user[field] or duplicate_user[field]\n", + "\n", + " # For fields about roles, take the most recent information\n", + " take_the_newer_fields = ['currentRole', 'desiredRole']\n", + " for field in take_the_newer_fields:\n", + " if len(duplicate_user.get(field, '')) > 0:\n", + " canonical_user[field] = duplicate_user[field]\n", + "\n", + " # Take the highest access level\n", + " access_level = ['user', 'admin', 'superadmin']\n", + " highest_access_level = max(access_level.index(canonical_user['accessLevel']), access_level.index(duplicate_user['accessLevel']))\n", + " canonical_user['accessLevel'] = access_level[highest_access_level]\n", + "\n", + " # Make user that email is all lower case\n", + " canonical_user['email'] = canonical_user['email'].lower()\n", + " \n", + " \n", + " return older_id" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "78ccbbd6-7fea-4657-bf9a-850bd9e68505", + "metadata": {}, + "outputs": [], + "source": [ + "def delete_user(user_id):\n", + " r = requests.delete(USER_API_URL + '/' + user_id, headers=HEADERS)\n", + " print(r.content)" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "98f86221-5f32-4a1f-8537-bb40e967b17a", + "metadata": {}, + "outputs": [], + "source": [ + "for lowercase_email in duped_emails.keys():\n", + " reduce(merge_users, duped_emails[lowercase_email])\n", + " correct_user_id = duped_emails[lower_case_email][0]\n", + " dupes = duped_emails[lower_case_email][1:]\n", + " update_user(correct_user_id, user_dict[correct_user_id])\n", + " for dupe in dupes:\n", + " delete_user(dupe)" + ] + }, + { + "cell_type": "markdown", + "id": "d57d8cac-0873-42ee-86ca-aa61e8be119f", + "metadata": {}, + "source": [ + "## Correcting Checkins\n", + "\n", + "With the following cells, we use pymongo becuase our API does not expose any endpoints for editing checkins. For each duplicate_id, we will find all checkins with that userId and replace it with the id of the original user document." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "2d6d014b-71c4-44a0-8247-8d10f87a2f1a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ids_to_replace" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5f4ec365-ab7c-45fe-bfbe-b35cdbb0ec94", + "metadata": {}, + "outputs": [], + "source": [ + "from pymongo import MongoClient\n", + "client = MongoClient(DATABASE_URL)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8556cf83-a412-4ee0-bfde-0447b63d6ac4", + "metadata": {}, + "outputs": [], + "source": [ + "db = client['vrms-test']" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "87d77a37-c404-4aa9-9b0a-7db74039db17", + "metadata": {}, + "outputs": [], + "source": [ + "col = db['checkins']" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "ecd00e41-1f4c-4aec-97a9-bf64a92974a4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "UpdateResult({'n': 4, 'electionId': ObjectId('7fffffff0000000000000222'), 'opTime': {'ts': Timestamp(1754280535, 23), 't': 546}, 'nModified': 4, 'ok': 1.0, '$clusterTime': {'clusterTime': Timestamp(1754280535, 23), 'signature': {'hash': b'\\x00n\\x88\\xed\\xcc\\xb1\\x7f\\x99\\xf6@l\\xd4\\xa2N\\xb3\\xfa\\x9b\\xcd\\xec\\x7f', 'keyId': 7488330297243598876}}, 'operationTime': Timestamp(1754280535, 23), 'updatedExisting': True}, acknowledged=True)" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "col.update_many({'userId': '633b9a74d98663001f8b5c46'}, {'$set': {'userId': '5e965e554e2fc70017aa3970'}})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2db985ba-fab9-4820-9d67-ed42f8f1ba03", + "metadata": {}, + "outputs": [], + "source": [ + "for duplicate_user_id in ids_to_replace.keys():\n", + " col.update_many({'userId': duplicate_user_id}, {'$set': {'userId': ids_to_replace[duplicate_user_id]}})" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/backend/scripts/python/env/README.md b/backend/scripts/python/env/README.md new file mode 100644 index 000000000..83fb65def --- /dev/null +++ b/backend/scripts/python/env/README.md @@ -0,0 +1,69 @@ +# Python Virtual Environment + +Welcome to the `scripts\python\env` folder of the VRMS backend. This folder contains a Jupyter notebook, dependencies for setting up the environment, and a `.gitignore` file for managing which files should be ignored by version control. + +## Prerequisites + +Before you begin, make sure you have Python installed on your machine. If you don't have Python installed yet, you can download and install it from the official website: + +[Download Python](https://www.python.org/downloads/) + +Once you have Python installed, you're ready to set up the virtual environment and install the necessary dependencies as described below. + +## Requirements + +Before you can run the Jupyter notebook, you will need to set up a Python virtual environment and install the required dependencies. Here's how you can do that: + +### 1. Set Up a Python Virtual Environment + +From within the `scripts` directory, run the following command to create a virtual environment: + +``` +python -m venv . +``` + +This will create a virtual environment within the current directory. + +### 2. Activate the Virtual Environment + +Once the virtual environment is created, you'll need to activate it. + +- On **Windows**, run: + + ``` + .\Scripts\activate + ``` + +- On **MacOS/Linux**, run: + + ``` + source bin/activate + ``` + +### 3. Install Dependencies + +With the virtual environment activated, you can now install the dependencies listed in `requirements.txt`: + +``` +pip install -r requirements.txt +``` + +### 4. Launch Jupyter Notebook + +After installing the required dependencies, you can start the Jupyter notebook by running the following command: + +``` +jupyter notebook +``` + +This will open the Jupyter notebook interface in your web browser, where you can navigate to and run the script. + +## .gitignore + +The `.gitignore` file in this directory is set to ignore all files, including the virtual environment, so that unnecessary files don't get committed to version control. If you wish to track changes to new files added to this directory, you will need to use a command like: + +``` +git add -f .\backend\scripts\python\env\your-file.file +``` + +where -f forces git to add and begin tracking that file. \ No newline at end of file diff --git a/backend/scripts/python/env/requirements.txt b/backend/scripts/python/env/requirements.txt new file mode 100644 index 000000000..f3c9e906d --- /dev/null +++ b/backend/scripts/python/env/requirements.txt @@ -0,0 +1,104 @@ +anyio==4.9.0 +argon2-cffi==25.1.0 +argon2-cffi-bindings==25.1.0 +arrow==1.3.0 +asttokens==3.0.0 +async-lru==2.0.5 +attrs==25.3.0 +babel==2.17.0 +beautifulsoup4==4.13.4 +bleach==6.2.0 +certifi==2025.7.14 +cffi==1.17.1 +charset-normalizer==3.4.2 +colorama==0.4.6 +comm==0.2.3 +debugpy==1.8.15 +decorator==5.2.1 +defusedxml==0.7.1 +dnspython==2.7.0 +dotenv==0.9.9 +executing==2.2.0 +fastjsonschema==2.21.1 +fqdn==1.5.1 +h11==0.16.0 +httpcore==1.0.9 +httpx==0.28.1 +idna==3.10 +ipykernel==6.30.0 +ipython==9.4.0 +ipython_pygments_lexers==1.1.1 +ipywidgets==8.1.7 +isoduration==20.11.0 +jedi==0.19.2 +Jinja2==3.1.6 +json5==0.12.0 +jsonpointer==3.0.0 +jsonschema==4.25.0 +jsonschema-specifications==2025.4.1 +jupyter==1.1.1 +jupyter-console==6.6.3 +jupyter-events==0.12.0 +jupyter-lsp==2.2.6 +jupyter_client==8.6.3 +jupyter_core==5.8.1 +jupyter_server==2.16.0 +jupyter_server_terminals==0.5.3 +jupyterlab==4.4.5 +jupyterlab_pygments==0.3.0 +jupyterlab_server==2.27.3 +jupyterlab_widgets==3.0.15 +lark==1.2.2 +MarkupSafe==3.0.2 +matplotlib-inline==0.1.7 +mistune==3.1.3 +nbclient==0.10.2 +nbconvert==7.16.6 +nbformat==5.10.4 +nest-asyncio==1.6.0 +notebook==7.4.4 +notebook_shim==0.2.4 +overrides==7.7.0 +packaging==25.0 +pandocfilters==1.5.1 +parso==0.8.4 +platformdirs==4.3.8 +prometheus_client==0.22.1 +prompt_toolkit==3.0.51 +psutil==7.0.0 +pure_eval==0.2.3 +pycparser==2.22 +Pygments==2.19.2 +pymongo==4.13.2 +python-dateutil==2.9.0.post0 +python-dotenv==1.1.1 +python-json-logger==3.3.0 +pywin32==311 +pywinpty==2.0.15 +PyYAML==6.0.2 +pyzmq==27.0.0 +referencing==0.36.2 +requests==2.32.4 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rfc3987-syntax==1.1.0 +rpds-py==0.26.0 +Send2Trash==1.8.3 +setuptools==80.9.0 +six==1.17.0 +sniffio==1.3.1 +soupsieve==2.7 +stack-data==0.6.3 +terminado==0.18.1 +tinycss2==1.4.0 +tornado==6.5.1 +traitlets==5.14.3 +types-python-dateutil==2.9.0.20250708 +typing_extensions==4.14.1 +uri-template==1.3.0 +urllib3==2.5.0 +wcwidth==0.2.13 +webcolors==24.11.1 +webencodings==0.5.1 +websocket-client==1.8.0 +widgetsnbextension==4.0.14 diff --git a/backend/scripts/test-data.json b/backend/scripts/test-data.json deleted file mode 100644 index 5519d4d72..000000000 --- a/backend/scripts/test-data.json +++ /dev/null @@ -1,1116 +0,0 @@ -[ - { - "name": { - "firstName": "John", - "lastName": "Doe" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": ["60d13ff818317127044e7f08"], - "isActive": true, - "_id": "5f1d23fe316d2f00345ef06a", - "email": "johnDoe@civic.org", - "currentRole": "most common human name", - "desiredRole": "most desired human name", - "newMember": false, - "firstAttended": "NOV 2015", - "createdDate": "2020-01-14T02:14:22.407Z", - "__v": 0, - "attendanceReason": "Civic Engagement", - "currentProject": "Undebate" - }, - { - "name": { - "firstName": "Iggy", - "lastName": "Stoic" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e1d2490316d2f00172ef072", - "email": "iggystoic@gmail.com", - "currentRole": "Tech Consulting", - "desiredRole": "Technical Product", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-01-14T02:16:48.597Z", - "__v": 0 - }, - { - "name": { - "firstName": "TEST", - "lastName": "PERSON" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e1e76c20ab172001790f806", - "email": "TEST@GMAIL.com", - "currentRole": "Test Developer", - "desiredRole": "Senior Test Developer", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-01-15T02:19:46.780Z", - "__v": 0 - }, - { - "name": { - "firstName": "Test", - "lastName": "Person" - }, - "accessLevel": "admin", - "skillsToMatch": ["Testing", "Quality Management"], - "projects": [], - "textingOk": false, - "managedProjects": ["60d13ff818317127044e7f09"], - "isActive": true, - "_id": "5f4bfbc8e9f4f121e8c1eb42", - "email": "test@gmail.com", - "currentRole": "Test Student", - "desiredRole": "Software Developer", - "newMember": false, - "attendanceReason": "Environment", - "currentProject": "VRMS", - "firstAttended": "JAN 2019", - "createdDate": "2024-05-10T03:37:30.363Z" - }, - { - "name": { - "firstName": "John", - "lastName": "Atkins" - }, - "accessLevel": "user", - "skillsToMatch": ["acting"], - "projects": ["Mr. Bean"], - "textingOk": true, - "managedProjects": [], - "isActive": true, - "_id": "5e1e74030ab172001790f7ea", - "email": "JOHN.J.ATKINS@GMAIL.COM", - "currentRole": "Mr. Bean", - "desiredRole": "Johnny English", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-01-15T02:08:03.024Z", - "__v": 0 - }, - { - "name": { - "firstName": "Alex", - "lastName": "Chu" - }, - "accessLevel": "admin", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [ - "5edeac78ce228b001778facd", - "60d13ff818317127044e7f08" - ], - "isActive": true, - "_id": "5f164d2839cb9c001736f4cf", - "email": "chu.alex@gmail.com", - "currentRole": "Software engineer", - "desiredRole": "Software engineer", - "newMember": false, - "firstAttended": "JUL 2020", - "createdDate": "2020-07-21T02:04:24.241Z", - "__v": 0 - }, - { - "name": { - "firstName": "Boston", - "lastName": "Langford" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e1d27d9316d2f00172ef090", - "email": "boston@snl.com", - "currentRole": "PM", - "desiredRole": "PM", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-01-14T02:30:49.449Z", - "__v": 0 - }, - { - "name": { - "firstName": "Cole", - "lastName": "Bennett" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e1d2323316d2f00172ef064", - "email": "bennett.cole@gmail.com", - "currentRole": "idk", - "desiredRole": "idk", - "newMember": true, - "firstAttended": "APR 2020", - "createdDate": "2020-01-14T02:10:43.978Z", - "__v": 0 - }, - { - "name": { - "firstName": "Cole", - "lastName": "Bennett" - }, - "accessLevel": "admin", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e1d2081316d2f00172ef052", - "email": "BENNETT.COLE@GMAIL.COM", - "currentRole": "Dir of MUSIC", - "desiredRole": "None", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-01-14T01:59:29.273Z", - "__v": 0, - "attendanceReason": "Social Justice/Equity" - }, - { - "name": { - "firstName": "John", - "lastName": "Atkins" - }, - "accessLevel": "user", - "skillsToMatch": ["comic"], - "projects": ["Johnny English"], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e1d2137316d2f00172ef056", - "email": "john.j.atkins@gmail.com", - "currentRole": "High School Student", - "desiredRole": "Software/Research", - "newMember": false, - "firstAttended": "DEC 2019", - "createdDate": "2020-01-14T02:02:31.455Z", - "__v": 0, - "attendanceReason": "Open Data", - "currentProject": "New Schools Today" - }, - { - "name": { - "firstName": "Greg", - "lastName": "Smith" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5eec3e16411acc00174869a3", - "email": "gregpawpetrol@gmail.com", - "currentRole": "Data Consultant", - "desiredRole": "Data Scientist", - "newMember": false, - "firstAttended": "NOV 2019", - "createdDate": "2020-06-19T04:24:54.887Z", - "__v": 0 - }, - { - "name": { - "firstName": "Ryan", - "lastName": "Gosling" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e30e8a80b9d2300177d3b20", - "email": "rgosling@gmail.com", - "currentRole": "Data Scientist", - "desiredRole": "Data Scientist", - "newMember": false, - "firstAttended": "OCT 2019", - "createdDate": "2020-01-29T02:06:32.192Z", - "__v": 0, - "attendanceReason": "Open Data", - "currentProject": "311 Data" - }, - { - "name": { - "firstName": "Jared", - "lastName": "Maxwell" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e38d3cf8d52770017ae8a91", - "email": "jmax812@max.com", - "currentRole": "freelance dev", - "desiredRole": "employed def", - "newMember": false, - "firstAttended": "JAN 2020", - "createdDate": "2020-02-04T02:15:43.745Z", - "__v": 0, - "attendanceReason": "Civic Engagement", - "currentProject": "VRMS" - }, - { - "name": { - "firstName": "Dexter", - "lastName": "Robinson" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5f28c25206f21000177e690a", - "email": "Dexterlab@gmail.com", - "currentRole": "Software Developer", - "desiredRole": "Frontend Developer", - "newMember": true, - "firstAttended": "AUG 2020", - "createdDate": "2020-08-04T02:05:06.309Z", - "__v": 0 - }, - { - "name": { - "firstName": "Sharon", - "lastName": "Wesley" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e4ca746b73a2a001732f49a", - "email": "sharonwesleycodes@gmail.com", - "currentRole": "Student", - "desiredRole": "Programmer", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-02-19T03:11:02.863Z", - "__v": 0 - }, - { - "name": { - "firstName": "Mr", - "lastName": "Awesome" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e421328ccd154001772603b", - "email": "pseudo.randsome@gmail.clm", - "currentRole": "Engineer", - "desiredRole": "God", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-02-11T02:36:24.529Z", - "__v": 0 - }, - { - "name": { - "firstName": "chichi", - "lastName": "hughes" - }, - "accessLevel": "admin", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5ea74d2720cec100179465cf", - "email": "chichi.hughes@gmail.com", - "currentRole": "UX/UI Designer", - "desiredRole": "UX/UI Designer", - "newMember": false, - "firstAttended": "APR 2020", - "createdDate": "2020-04-27T21:22:47.465Z", - "__v": 0, - "attendanceReason": "Open Data" - }, - { - "name": { - "firstName": "asim", - "lastName": "rahman" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "60d777c20707783dc86d6101", - "email": "asim.radhat@gmail.comdfm34", - "currentRole": "zxc", - "desiredRole": "zxc", - "newMember": true, - "firstAttended": "JUN 2021", - "createdDate": "2021-06-26T18:53:54.935Z", - "__v": 0 - }, - { - "name": { - "firstName": "asim", - "lastName": "rahman" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "60d95ead26878d41f48aa15f", - "email": "asim.rhalskdfm10923knzdst@gmail.com", - "currentRole": "asldkm", - "desiredRole": "sdlkfm", - "newMember": true, - "createdDate": "2021-06-28T05:31:25.482Z", - "__v": 0 - }, - { - "name": { - "firstName": "Glen", - "lastName": "Steven" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "61523ca806ddd96310eb3e49", - "email": "kpop51367@bts123.net", - "currentRole": "Test", - "desiredRole": "Test", - "newMember": true, - "firstAttended": "JAN 2021", - "createdDate": "2021-01-27T21:50:32.255Z", - "__v": 0 - }, - { - "name": { - "firstName": "Glen", - "lastName": "Steven" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": true, - "managedProjects": [], - "isActive": true, - "_id": "61523fa80e0025656e23371d", - "email": "KPOP51367@BTS123.net", - "currentRole": "Test", - "desiredRole": "Test", - "newMember": true, - "firstAttended": "SEP 2021", - "createdDate": "2021-09-27T22:03:20.465Z", - "__v": 0 - }, - { - "name": { - "firstName": "Arthur", - "lastName": "Doyle" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "615cbd3a18c36c001e7b03b1", - "email": "Doyle@atemybread.com", - "currentRole": "baker", - "desiredRole": "better baker", - "newMember": true, - "firstAttended": "OCT 2021", - "createdDate": "2021-10-05T21:01:46.941Z", - "__v": 0 - }, - { - "name": { - "firstName": "rare", - "lastName": "person" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "61947ec1ef53983193f54ae7", - "email": "Rareisreal@fm.com", - "currentRole": "aerga", - "desiredRole": "arga", - "newMember": true, - "firstAttended": "NOV 2021", - "createdDate": "2021-11-17T04:02:09.726Z", - "__v": 0 - }, - { - "name": { - "firstName": "Glen", - "lastName": "Steven" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "6208327f7da35707d018e13c", - "email": "Stevedude73842@pet.com", - "currentRole": "Test", - "desiredRole": "Test", - "newMember": false, - "firstAttended": "FEB 2022", - "createdDate": "2022-02-12T22:19:43.301Z", - "__v": 0 - }, - { - "name": { - "firstName": "Shaun", - "lastName": "Murphy" - }, - "accessLevel": "admin", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [ - "5edeac78ce228b001778facd", - "5edea961ce228b001778faca", - "620859fa46807266c6cbcf20", - "6205ceb5aaf98b0021b3c204", - "619af6c86a8afa609cd5c419" - ], - "isActive": true, - "_id": "620840ad46807266c6cbcf1e", - "email": "smurf@gmail.com", - "currentRole": "dev", - "desiredRole": "dev", - "newMember": false, - "firstAttended": "FEB 2022", - "createdDate": "2022-02-12T23:20:13.331Z", - "__v": 0 - }, - { - "name": { - "firstName": "Tommy", - "lastName": "Smith" - }, - "accessLevel": "admin", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "633b9a74d98663001f8b5c46", - "email": "tommy@thatsfabulous.com", - "currentRole": "Supreme Leader", - "desiredRole": "Front end developer", - "newMember": false, - "firstAttended": "OCT 2022", - "createdDate": "2022-10-04T02:29:08.363Z", - "__v": 0 - }, - { - "name": { - "firstName": "Testing", - "lastName": "test12" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "645986720659c772705c6bcb", - "email": "testrn@gmail.com", - "currentRole": "Test", - "desiredRole": "Test", - "newMember": true, - "firstAttended": "MAY 2023", - "createdDate": "2023-05-08T23:32:02.575Z", - "__v": 0 - }, - { - "name": { - "firstName": "Enola", - "lastName": "Holmes" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e1e764c0ab172001790f804", - "email": "enola@gmail.com", - "currentRole": "front-end web dev", - "desiredRole": "unsure", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-01-15T02:17:48.287Z", - "__v": 0, - "attendanceReason": "Open Data" - }, - { - "name": { - "firstName": "Phoebe", - "lastName": "Phoenix" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e54818892b678001759b45a", - "email": "phoenixcodes@gmail.com", - "currentRole": "Freelance Fullstack JS Dev", - "desiredRole": "Fullstack JS Dev", - "newMember": false, - "firstAttended": "JAN 2020", - "createdDate": "2020-02-25T02:08:08.775Z", - "__v": 0, - "attendanceReason": "Social Justice/Equity", - "currentProject": "VRMS" - }, - { - "name": { - "firstName": "Abby", - "lastName": "Jordan" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5f33508b0d62580017d78228", - "email": "hippyjordan@gmail.com", - "currentRole": "Product Manager", - "desiredRole": "Product Manager", - "newMember": false, - "firstAttended": "AUG 2020", - "createdDate": "2020-08-12T02:14:35.725Z", - "__v": 0 - }, - { - "name": { - "firstName": "Susan", - "lastName": "Lee" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e8bd28080fe360017694654", - "email": "xoxosusy@gmail.com", - "currentRole": "Student", - "desiredRole": "Software Engineer", - "newMember": false, - "firstAttended": "NOV 2019", - "createdDate": "2020-04-07T01:08:16.639Z", - "__v": 0 - }, - { - "name": { - "firstName": "Calvin ", - "lastName": "Klien" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5ed84b1bb68bcc00179b27de", - "email": "info@ck.com", - "currentRole": "PHP Developer", - "desiredRole": "CEO", - "newMember": true, - "firstAttended": "JUN 2020", - "createdDate": "2020-06-04T01:15:07.602Z", - "__v": 0 - }, - { - "name": { - "firstName": "Sophia", - "lastName": "Yang" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e1e74390ab172001790f7ec", - "email": "slice212@gmail.com", - "currentRole": "applying", - "desiredRole": "Data Science", - "newMember": false, - "firstAttended": "JAN 2020", - "createdDate": "2020-01-15T02:08:57.796Z", - "__v": 0, - "attendanceReason": "Homelessness", - "currentProject": "Host Home" - }, - { - "name": { - "firstName": "Aston", - "lastName": "Martin" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5ebdfa8005963b0017c6dd5c", - "email": "rickandmorty@gmail.com", - "currentRole": "Data Analyst/Scientist", - "desiredRole": "Data Analyst/Scientist", - "newMember": false, - "firstAttended": "MAY 2020", - "createdDate": "2020-05-15T02:12:16.545Z", - "__v": 0 - }, - { - "name": { - "firstName": "Selena", - "lastName": "Gomez" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e27ae4b4530cd0017eee422", - "email": "selena.gomez@gmail.com", - "currentRole": "SW Engineer", - "desiredRole": "Developer", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-01-22T02:07:07.734Z", - "__v": 0 - }, - { - "name": { - "firstName": "Amrit", - "lastName": "Mann" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e8bd1aa80fe36001769464d", - "email": "amritmann@gmail.com", - "currentRole": "Dev", - "desiredRole": "Dev", - "newMember": false, - "firstAttended": "APR 2020", - "createdDate": "2020-04-07T01:04:42.306Z", - "__v": 0, - "attendanceReason": "Open Data" - }, - { - "name": { - "firstName": "Jennifer", - "lastName": "Winget" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e4364fdef67e100175c1eff", - "email": "jenny@valorie.com", - "currentRole": "Civic Engagement", - "desiredRole": "Dev Ops", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-02-12T02:37:49.626Z", - "__v": 0 - }, - { - "name": { - "firstName": "asim", - "lastName": "rahman" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "60d7772c0707783dc86d60ff", - "email": "6k1.nyarly636@gmail.com", - "currentRole": "sdfasd", - "desiredRole": "asdasd", - "newMember": true, - "firstAttended": "JUN 2021", - "createdDate": "2021-06-26T18:51:24.004Z", - "__v": 0 - }, - { - "name": { - "firstName": "Glen", - "lastName": "Clark" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "61440e3218c36c001e7b03b0", - "email": "xoxoclark@debate.com", - "currentRole": "Test", - "desiredRole": "Test", - "newMember": true, - "firstAttended": "SEP 2021", - "createdDate": "2021-09-17T03:40:34.500Z", - "__v": 0 - }, - { - "name": { - "firstName": "Glen", - "lastName": "Clark" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "6157d8d979effa437122d670", - "email": "XOXOclark@debate.com", - "currentRole": "Test", - "desiredRole": "Test", - "newMember": true, - "firstAttended": "OCT 2021", - "createdDate": "2021-10-02T03:58:17.700Z", - "__v": 0 - }, - { - "name": { - "firstName": "Larry", - "lastName": "Page" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e435ce7ef67e100175c1ee3", - "email": "Larry@LarryPage.com", - "currentRole": "Student", - "desiredRole": "Python Developer", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-02-12T02:03:19.149Z", - "__v": 0, - "attendanceReason": "Homelessness", - "currentProject": "Food Oasis" - }, - { - "name": { - "firstName": "asim", - "lastName": "rahman" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "60d7765b7eec843150f7cd7d", - "email": "654k1.nyarly636@gmail.com", - "currentRole": "sdfasd", - "desiredRole": "asdasd", - "newMember": true, - "firstAttended": "JUN 2021", - "createdDate": "2021-06-26T18:47:55.487Z", - "__v": 0 - }, - { - "name": { - "firstName": "Shark", - "lastName": "User" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "6101db234815993498437084", - "email": "WE@sharktank.com", - "currentRole": "af", - "desiredRole": "argfg", - "newMember": true, - "firstAttended": "JUL 2021", - "createdDate": "2021-07-28T22:33:07.120Z", - "__v": 0 - }, - { - "name": { - "firstName": "JASON", - "lastName": "YANG" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e38d1568d52770017ae8a86", - "email": "JASC68.JYANG@GMAIL.COM", - "currentRole": "DATA SCIENTIST", - "desiredRole": "DATA SCIENTIST", - "newMember": false, - "firstAttended": "SEP 2019", - "createdDate": "2020-02-04T02:05:10.999Z", - "__v": 0 - }, - { - "name": { - "firstName": "Jonathon", - "lastName": "Dooley" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5f0540b24f31cf00174d7538", - "email": "DooleyJM0902@student.laccd.edu", - "currentRole": "Student", - "desiredRole": "Developer", - "newMember": false, - "firstAttended": "JUL 2020", - "createdDate": "2020-07-08T03:42:42.621Z", - "__v": 0 - }, - { - "name": { - "firstName": "Jason", - "lastName": "Yang" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e66e6fcbe3e0b001761a814", - "email": "jasc68.jyang@gmail.com", - "currentRole": "data scientist", - "desiredRole": "data scientist", - "newMember": false, - "firstAttended": "SEP 2019", - "createdDate": "2020-03-10T01:01:48.651Z", - "__v": 0, - "attendanceReason": "Open Data", - "currentProject": "None" - }, - { - "name": { - "firstName": "Julia", - "lastName": "Fong" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [ - "5ec326c7a973810017c0de0c", - "619af6c86a8afa609cd5c419" - ], - "isActive": true, - "_id": "5e435911ef67e100175c1ecb", - "email": "Juliamzfong@gmail.com", - "currentRole": "fellow", - "desiredRole": "front-end developer", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-02-12T01:46:57.788Z", - "__v": 0 - }, - { - "name": { - "firstName": "RYAN", - "lastName": "COLLINS" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e38d10a8d52770017ae8a81", - "email": "RMCOLLINS95@GMAIL.COM", - "currentRole": "NONE", - "desiredRole": "DATA SCIENTIST", - "newMember": true, - "firstAttended": "JAN 2020", - "createdDate": "2020-02-04T02:03:54.970Z", - "__v": 0 - }, - { - "name": { - "firstName": "asim", - "lastName": "rahman" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "60d775d47eec843150f7cd7b", - "email": "6541.ny636fm@gmail.com", - "currentRole": "sdfasd", - "desiredRole": "asdasd", - "newMember": true, - "firstAttended": "JUN 2021", - "createdDate": "2021-06-26T18:45:40.564Z", - "__v": 0 - }, - { - "name": { - "firstName": "asim", - "lastName": "rahman" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "60d76d8a7eec843150f7cd6c", - "email": "olafake908@gmail.com", - "currentRole": "asd", - "desiredRole": "asd", - "newMember": true, - "firstAttended": "JUN 2021", - "createdDate": "2021-06-26T18:10:18.494Z", - "__v": 0 - }, - { - "name": { - "firstName": "asim", - "lastName": "rahman" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "60d775727eec843150f7cd76", - "email": "6541.ny619@gmail.com", - "currentRole": "sdfasd", - "desiredRole": "asdasd", - "newMember": true, - "firstAttended": "JUN 2021", - "createdDate": "2021-06-26T18:44:02.536Z", - "__v": 0 - }, - { - "name": { - "firstName": "Bojack", - "lastName": "Horseman" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "64163f87ffac46b48a4abc87", - "email": "bojack@gmail.com", - "currentRole": "horse", - "desiredRole": "man", - "newMember": true, - "firstAttended": "MAR 2023", - "createdDate": "2023-03-18T22:47:35.138Z", - "__v": 0 - }, - { - "name": { - "firstName": "Chris", - "lastName": "Schmitz" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "5e30ee120b9d2300177d3b38", - "email": "Christopher.A.Schmitz@gmail.com", - "currentRole": "Mobile Engineering Manager", - "desiredRole": "Mobile Engineering Manager", - "newMember": false, - "firstAttended": "MAY 2017", - "createdDate": "2020-01-29T02:29:38.664Z", - "__v": 0, - "attendanceReason": "Civic Engagement", - "currentProject": "None" - }, - { - "name": { - "firstName": "asim", - "lastName": "rahman" - }, - "accessLevel": "user", - "skillsToMatch": [], - "projects": [], - "textingOk": false, - "managedProjects": [], - "isActive": true, - "_id": "60d77e950707783dc86d6103", - "email": "234asim.radhat@gmail.com34a", - "currentRole": "sdf", - "desiredRole": "sdf", - "newMember": true, - "firstAttended": "JUN 2021", - "createdDate": "2021-06-26T19:23:01.866Z", - "__v": 0 - } - ] \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index 5199d0edd..6c8daf487 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -18,7 +18,7 @@ export default [ { files: ["**/*.js", "**/*.jsx"], languageOptions: { - globals: { ...globals.browser, ...globals.node }, + globals: { ...globals.browser, ...globals.node, ...globals.jest }, parserOptions: { ecmaFeatures: { jsx: true,