diff --git a/mern-template.CodeCanvas b/mern-template.CodeCanvas
new file mode 100644
index 0000000..b25aeee
--- /dev/null
+++ b/mern-template.CodeCanvas
@@ -0,0 +1,3009 @@
+{
+ "drawioXML": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n",
+ "fileName": "",
+ "fileURL": "local",
+ "repo": "mern-template",
+ "branch": "main",
+ "owner": "BenElferink",
+ "simulations": {
+ "User Registration and Account Creation": {
+ "name": "User Registration and Account Creation",
+ "simSteps": [
+ {
+ "simStepId": "9a365f8b-4c43-45fd-be23-489dd8db1993",
+ "diagramNodeId": "c8d3b6e7-da7d-4f44-b5b2-140478164e6d",
+ "simStepLabel": "Initiate Registration",
+ "simStepDescription": "The user clicks on the 'Register' button, which triggers the `clickRegister` function. This function calls `setCurrentModal('REGISTER')` to update the global state, signaling that the registration modal should be displayed.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/components/Header.tsx",
+ "startLine": "32",
+ "endLine": "35",
+ "relevantVariables": [
+ "clickRegister",
+ "setCurrentModal"
+ ]
+ },
+ "inputDataExample": "{}",
+ "outputDataExample": "{\"currentModal\": \"REGISTER\"}"
+ },
+ {
+ "simStepId": "97aec2c0-b4b5-43aa-8d8f-1d5210e2dc05",
+ "diagramNodeId": "8948504f-8858-43a0-b450-18c53f0463c4",
+ "simStepLabel": "State Update: Show Modal",
+ "simStepDescription": "The state change from the `useModalStore` is propagated to components that use this hook, specifically the `AuthModal` component.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/store/useModalStore.ts",
+ "startLine": "1",
+ "endLine": "11",
+ "relevantVariables": [
+ "useModalStore",
+ "setCurrentModal"
+ ]
+ },
+ "inputDataExample": "{\"currentModal\": \"REGISTER\"}",
+ "outputDataExample": "{\"currentModal\": \"REGISTER\"}"
+ },
+ {
+ "simStepId": "29ca8194-0e30-457f-8b12-b5c109f7fc3e",
+ "diagramNodeId": "24bcd8ba-03ae-4d18-8f76-cf62a230e3bb",
+ "simStepLabel": "Render Registration Form",
+ "simStepDescription": "The `AuthModal` component, listening to the `useModalStore`, detects the state change. The `isOpen` and `isRegisterMode` variables become true, causing the modal to render with a registration form containing 'Username' and 'Password' fields.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/components/AuthModal.tsx",
+ "startLine": "13",
+ "endLine": "15",
+ "relevantVariables": [
+ "currentModal",
+ "isRegisterMode",
+ "isOpen",
+ "onClose"
+ ]
+ },
+ "inputDataExample": "{\"currentModal\": \"REGISTER\"}",
+ "outputDataExample": "{\"formData\": {\"username\": \"\", \"password\": \"\"}}"
+ },
+ {
+ "simStepId": "e9270f42-ded3-406e-8554-0bba453c251a",
+ "diagramNodeId": "19930381-fb52-49ee-acf4-26b601c4e472",
+ "simStepLabel": "Form Submission",
+ "simStepDescription": "The user fills out the form and clicks the 'Register' button, triggering the `clickSubmit` function, which in turn calls the `register` function from the `AuthContext` with the user's credentials.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/components/AuthModal.tsx",
+ "startLine": "27",
+ "endLine": "35",
+ "relevantVariables": [
+ "clickSubmit",
+ "register",
+ "formData"
+ ]
+ },
+ "inputDataExample": "{\"username\": \"new_user\", \"password\": \"strongpassword123\"}",
+ "outputDataExample": "{\"username\": \"new_user\", \"password\": \"strongpassword123\"}"
+ },
+ {
+ "simStepId": "cecc2553-623f-4636-ab51-c15dcaa69ad1",
+ "diagramNodeId": "1e35d36b-a724-4061-9544-2c7244be44e4",
+ "simStepLabel": "Client-Side: Send API Request",
+ "simStepDescription": "The `register` function within `AuthContext` is called. It uses `axios` to send an HTTP POST request to the `/auth/register` endpoint on the server, with the form data (username and password) as the payload.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "36",
+ "endLine": "45",
+ "relevantVariables": [
+ "register",
+ "axios.post",
+ "formData"
+ ]
+ },
+ "inputDataExample": "{\"username\": \"new_user\", \"password\": \"strongpassword123\"}",
+ "outputDataExample": "{\"config\": {\"method\": \"post\", \"url\": \"/auth/register\", \"data\": {\"username\": \"new_user\", \"password\": \"strongpassword123\"}}}"
+ },
+ {
+ "simStepId": "32795267-714e-4e31-b6cb-9e5f9df0870f",
+ "diagramNodeId": "4dbc65b6-c709-4d7b-ac3b-70a09a8bb298",
+ "simStepLabel": "API Call: Client to Server",
+ "simStepDescription": "The user's registration data is transmitted over the network via an HTTP POST request to the backend server.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/routes/auth.ts",
+ "startLine": "12",
+ "endLine": "12",
+ "relevantVariables": [
+ "router.post"
+ ]
+ },
+ "inputDataExample": "{\"method\": \"POST\", \"url\": \"/auth/register\", \"body\": {\"username\": \"new_user\", \"password\": \"strongpassword123\"}}",
+ "outputDataExample": "{\"method\": \"POST\", \"url\": \"/auth/register\", \"body\": {\"username\": \"new_user\", \"password\": \"strongpassword123\"}}"
+ },
+ {
+ "simStepId": "4b16ca26-0458-43aa-b290-f110383ba37a",
+ "diagramNodeId": "54507d90-4f4e-402d-b303-2b406ed8164c",
+ "simStepLabel": "Server-Side: Route Handling",
+ "simStepDescription": "The Express server receives the incoming request. The router configured in `auth.ts` matches the `POST /register` route and forwards the request to the `register` controller.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/routes/auth.ts",
+ "startLine": "12",
+ "endLine": "12",
+ "relevantVariables": [
+ "router",
+ "register"
+ ]
+ },
+ "inputDataExample": "{\"path\": \"/register\", \"method\": \"POST\", \"body\": {\"username\": \"new_user\", \"password\": \"strongpassword123\"}}",
+ "outputDataExample": "{\"req\": {}, \"res\": {}}"
+ },
+ {
+ "simStepId": "0bd9de78-7906-4448-bf16-71d3773e97b3",
+ "diagramNodeId": "2fc7a9d8-03fc-4024-b4b6-e4d5a410cbcb",
+ "simStepLabel": "Database Query: Check Uniqueness",
+ "simStepDescription": "The controller executes a query against the 'accounts' collection in MongoDB to ensure that the provided username does not already exist.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/controllers/auth/register.ts",
+ "startLine": "24",
+ "endLine": "24",
+ "relevantVariables": [
+ "Account.findOne"
+ ]
+ },
+ "inputDataExample": "{\"query\": {\"username\": \"new_user\"}}",
+ "outputDataExample": "{\"query\": {\"username\": \"new_user\"}}"
+ },
+ {
+ "simStepId": "2fa6cc67-8d85-4c55-9beb-0f72732745a2",
+ "diagramNodeId": "92b8002e-ce3e-4996-b91a-4cceb4252bf6",
+ "simStepLabel": "Server-Side: Account Creation",
+ "simStepDescription": "Assuming the username is unique, the controller hashes the user's password using `bcrypt` and creates a new `Account` instance with the username and hashed password. It then saves this new account to the database.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/controllers/auth/register.ts",
+ "startLine": "33",
+ "endLine": "37",
+ "relevantVariables": [
+ "crypt.hash",
+ "Account",
+ "account.save"
+ ]
+ },
+ "inputDataExample": "{\"username\": \"new_user\", \"password\": \"strongpassword123\"}",
+ "outputDataExample": "{\"_id\": \"64e8a5a5c3b3d4f8b8e0a2c1\", \"username\": \"new_user\", \"password\": \"$2b$10$abcdefghijklmnopqrstuv\"}"
+ },
+ {
+ "simStepId": "8567ff6e-fd44-4c3f-90c0-9717ba3d68f8",
+ "diagramNodeId": "679c7f85-e590-47c6-8c24-563ccf724809",
+ "simStepLabel": "Database Write: Persist Account",
+ "simStepDescription": "The new account document, including the hashed password and default role, is sent to the MongoDB server for persistence.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/controllers/auth/register.ts",
+ "startLine": "37",
+ "endLine": "37",
+ "relevantVariables": [
+ "account.save"
+ ]
+ },
+ "inputDataExample": "{\"document\": {\"username\": \"new_user\", \"password\": \"$2b$10$abcdefghijklmnopqrstuv\", \"role\": \"user\"}, \"collection\": \"accounts\"}",
+ "outputDataExample": "{\"document\": {\"username\": \"new_user\", \"password\": \"$2b$10$abcdefghijklmnopqrstuv\", \"role\": \"user\"}, \"collection\": \"accounts\"}"
+ },
+ {
+ "simStepId": "efe94557-4475-4b7d-aec7-738c0af8db4a",
+ "diagramNodeId": "2772c0d7-97e2-4233-ab82-6cd3f877cba3",
+ "simStepLabel": "Server-Side: Generate Token and Respond",
+ "simStepDescription": "After successfully saving the account, the server generates a JSON Web Token (JWT) for the new user session. It then sends a 201 Created response back to the client, containing a success message, the new account data (excluding the password), and the JWT.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/controllers/auth/register.ts",
+ "startLine": "40",
+ "endLine": "47",
+ "relevantVariables": [
+ "jwt.signToken",
+ "res.status",
+ "res.json"
+ ]
+ },
+ "inputDataExample": "{\"account\": {\"_id\": \"64e8a5a5c3b3d4f8b8e0a2c1\", \"username\": \"new_user\", \"role\": \"user\"}}",
+ "outputDataExample": "{\"status\": 201, \"body\": {\"message\": \"Succesfully registered\", \"data\": {\"_id\": \"64e8a5a5c3b3d4f8b8e0a2c1\", \"username\": \"new_user\", \"role\": \"user\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}"
+ },
+ {
+ "simStepId": "a02e8369-01da-45fd-bc1f-0e0d8e3f9259",
+ "diagramNodeId": "9095a876-c605-4cdd-805e-783859a4af66",
+ "simStepLabel": "API Response: Server to Client",
+ "simStepDescription": "The server's JSON response is transmitted over the network back to the client's waiting `axios` call.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "38",
+ "endLine": "38",
+ "relevantVariables": [
+ "axios.post.then"
+ ]
+ },
+ "inputDataExample": "{\"status\": 201, \"body\": {\"message\": \"Succesfully registered\", \"data\": {\"_id\": \"64e8a5a5c3b3d4f8b8e0a2c1\", \"username\": \"new_user\", \"role\": \"user\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}",
+ "outputDataExample": "{\"status\": 201, \"body\": {\"message\": \"Succesfully registered\", \"data\": {\"_id\": \"64e8a5a5c3b3d4f8b8e0a2c1\", \"username\": \"new_user\", \"role\": \"user\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}"
+ },
+ {
+ "simStepId": "21ad8fa0-ef6c-4a4e-91ab-4e2d27202293",
+ "diagramNodeId": "1d511c6e-e17f-442b-9c53-2707ce018d0e",
+ "simStepLabel": "Client-Side: Process Response and Update State",
+ "simStepDescription": "The client receives the successful response. The `.then()` block of the `axios` promise in `AuthContext` executes, updating the application's state by setting the account data, the token (which is also stored in `localStorage`), and setting the logged-in status to true.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "39",
+ "endLine": "43",
+ "relevantVariables": [
+ "setAccount",
+ "setToken",
+ "setIsLoggedIn",
+ "resolve"
+ ]
+ },
+ "inputDataExample": "{\"data\": {\"data\": {\"_id\": \"64e8a5a5c3b3d4f8b8e0a2c1\", \"username\": \"new_user\", \"role\": \"user\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}",
+ "outputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\", \"account\": {\"_id\": \"64e8a5a5c3b3d4f8b8e0a2c1\", \"username\": \"new_user\", \"role\": \"user\"}, \"isLoggedIn\": true}"
+ },
+ {
+ "simStepId": "08615c0c-4ead-49ed-a46c-32e614961175",
+ "diagramNodeId": "d957fcef-0c6a-43f3-b916-ac2ae153c01a",
+ "simStepLabel": "React Context Propagation",
+ "simStepDescription": "The updated values from the `AuthContext` (account, token, isLoggedIn) are propagated to all consuming components throughout the React application.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "112",
+ "endLine": "114",
+ "relevantVariables": [
+ "Provider",
+ "value"
+ ]
+ },
+ "inputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\", \"account\": {\"_id\": \"64e8a5a5c3b3d4f8b8e0a2c1\", \"username\": \"new_user\", \"role\": \"user\"}, \"isLoggedIn\": true}",
+ "outputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\", \"account\": {\"_id\": \"64e8a5a5c3b3d4f8b8e0a2c1\", \"username\": \"new_user\", \"role\": \"user\"}, \"isLoggedIn\": true}"
+ },
+ {
+ "simStepId": "fc6b748f-e289-4599-b554-485a008a7ec2",
+ "diagramNodeId": "1318001f-496b-4d35-a409-e9a663af2ab6",
+ "simStepLabel": "UI Update: Reflect Authenticated State",
+ "simStepDescription": "Components like `LoggedInStatus` consume the updated `AuthContext`. Now that `isLoggedIn` is true and `account` is populated, the UI re-renders to show a personalized welcome message, confirming successful registration and login.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/App.tsx",
+ "startLine": "35",
+ "endLine": "37",
+ "relevantVariables": [
+ "LoggedInStatus",
+ "isLoggedIn",
+ "account"
+ ]
+ },
+ "inputDataExample": "{\"isLoggedIn\": true, \"account\": {\"_id\": \"64e8a5a5c3b3d4f8b8e0a2c1\", \"username\": \"new_user\", \"role\": \"user\"}}",
+ "outputDataExample": "{\"renderedUI\": \"
Hey, new_user! I'm happy to let you know: you are authenticated!
\"}"
+ }
+ ],
+ "description": "- This use case allows a new user to create an account
- It includes client-side forms and server-side logic for validation and persistence
- - The user interacts with a registration form presented in a modal (
client/src/components/AuthModal - tsx)
- - The client sends the username and password to the
/auth/register endpoint (server/src/routes/auth - ts)
- - The backend controller (
server/src/controllers/auth/register - ts) validates the input, ensures the username is unique, hashes the password using
bcrypt, and creates a new Account in the MongoDB database - - Upon success, a JSON Web Token (JWT) is generated and returned to the user, logging them in immediately
",
+ "simulationNodesAndEdges": {
+ "c8d3b6e7-da7d-4f44-b5b2-140478164e6d": {
+ "simStepIds": [
+ "9a365f8b-4c43-45fd-be23-489dd8db1993"
+ ]
+ },
+ "24bcd8ba-03ae-4d18-8f76-cf62a230e3bb": {
+ "simStepIds": [
+ "29ca8194-0e30-457f-8b12-b5c109f7fc3e"
+ ]
+ },
+ "1e35d36b-a724-4061-9544-2c7244be44e4": {
+ "simStepIds": [
+ "cecc2553-623f-4636-ab51-c15dcaa69ad1"
+ ]
+ },
+ "54507d90-4f4e-402d-b303-2b406ed8164c": {
+ "simStepIds": [
+ "4b16ca26-0458-43aa-b290-f110383ba37a"
+ ]
+ },
+ "92b8002e-ce3e-4996-b91a-4cceb4252bf6": {
+ "simStepIds": [
+ "2fa6cc67-8d85-4c55-9beb-0f72732745a2"
+ ]
+ },
+ "2772c0d7-97e2-4233-ab82-6cd3f877cba3": {
+ "simStepIds": [
+ "efe94557-4475-4b7d-aec7-738c0af8db4a"
+ ]
+ },
+ "1d511c6e-e17f-442b-9c53-2707ce018d0e": {
+ "simStepIds": [
+ "21ad8fa0-ef6c-4a4e-91ab-4e2d27202293"
+ ]
+ },
+ "1318001f-496b-4d35-a409-e9a663af2ab6": {
+ "simStepIds": [
+ "fc6b748f-e289-4599-b554-485a008a7ec2"
+ ]
+ },
+ "8948504f-8858-43a0-b450-18c53f0463c4": {
+ "simStepIds": [
+ "97aec2c0-b4b5-43aa-8d8f-1d5210e2dc05"
+ ]
+ },
+ "19930381-fb52-49ee-acf4-26b601c4e472": {
+ "simStepIds": [
+ "e9270f42-ded3-406e-8554-0bba453c251a"
+ ]
+ },
+ "4dbc65b6-c709-4d7b-ac3b-70a09a8bb298": {
+ "simStepIds": [
+ "32795267-714e-4e31-b6cb-9e5f9df0870f"
+ ]
+ },
+ "2fc7a9d8-03fc-4024-b4b6-e4d5a410cbcb": {
+ "simStepIds": [
+ "0bd9de78-7906-4448-bf16-71d3773e97b3"
+ ]
+ },
+ "679c7f85-e590-47c6-8c24-563ccf724809": {
+ "simStepIds": [
+ "8567ff6e-fd44-4c3f-90c0-9717ba3d68f8"
+ ]
+ },
+ "9095a876-c605-4cdd-805e-783859a4af66": {
+ "simStepIds": [
+ "a02e8369-01da-45fd-bc1f-0e0d8e3f9259"
+ ]
+ },
+ "d957fcef-0c6a-43f3-b916-ac2ae153c01a": {
+ "simStepIds": [
+ "08615c0c-4ead-49ed-a46c-32e614961175"
+ ]
+ }
+ },
+ "isAIGenerated": true,
+ "keywords": "register, Account, AuthModal"
+ },
+ "User Login and Persistent Sessions": {
+ "name": "User Login and Persistent Sessions",
+ "simSteps": [
+ {
+ "simStepId": "7bc6bab8-0745-401e-b151-412beaa566f5",
+ "diagramNodeId": "a0845367-b17f-4546-aa1b-b022d86c06ec",
+ "simStepLabel": "[Login Flow] User Submits Credentials",
+ "simStepDescription": "The user enters their username and password into the `AuthModal` component and clicks the login button, which triggers the `clickSubmit` function. This function prevents default form submission, sets a loading state, and calls the `login` function provided by `useAuth` context.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/components/AuthModal.tsx",
+ "startLine": "26",
+ "endLine": "36",
+ "relevantVariables": [
+ "clickSubmit",
+ "setLoading",
+ "setError",
+ "isRegisterMode",
+ "register",
+ "login",
+ "formData",
+ "onClose"
+ ]
+ },
+ "inputDataExample": "{\"formData\": {\"username\": \"test_user\", \"password\": \"password123\"}}",
+ "outputDataExample": "{}"
+ },
+ {
+ "simStepId": "c9187bf3-692d-42ed-a5af-e68375797b88",
+ "diagramNodeId": "c2f8b323-50b0-4f30-bfdc-0dad0fcb16ad",
+ "simStepLabel": "[Login Flow] Call Context Login Function",
+ "simStepDescription": "The `formData` state, containing the user's credentials, is passed as an argument to the `login` function from the `AuthContext`.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/components/AuthModal.tsx",
+ "startLine": "32",
+ "endLine": "32",
+ "relevantVariables": [
+ "login",
+ "formData"
+ ]
+ },
+ "inputDataExample": "{\"formData\": {\"username\": \"test_user\", \"password\": \"password123\"}}",
+ "outputDataExample": "{\"formData\": {\"username\": \"test_user\", \"password\": \"password123\"}}"
+ },
+ {
+ "simStepId": "ed630bcc-8c95-497c-a9ec-1c1e662df7dc",
+ "diagramNodeId": "8e1c07ba-d9a3-4430-88ef-2e5a81305e6e",
+ "simStepLabel": "[Login Flow] Send Login Request to Backend",
+ "simStepDescription": "The `login` function in `AuthContext` makes a POST request to the `/auth/login` endpoint using axios, sending the user's credentials. Upon a successful response, it updates the application's state with the received account data and JWT, and sets the login status to true.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "51",
+ "endLine": "62",
+ "relevantVariables": [
+ "login",
+ "axios",
+ "setAccount",
+ "setToken",
+ "setIsLoggedIn"
+ ]
+ },
+ "inputDataExample": "{\"formData\": {\"username\": \"test_user\", \"password\": \"password123\"}}",
+ "outputDataExample": "{\"data\": {\"data\": {\"_id\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"username\": \"test_user\", \"role\": \"user\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}"
+ },
+ {
+ "simStepId": "f216b206-0ee5-4bd4-8144-b52a67ca71ce",
+ "diagramNodeId": "1c3cacce-e2c7-4e4e-b029-b8c6b938b2d5",
+ "simStepLabel": "[Login Flow] API Call: POST /auth/login",
+ "simStepDescription": "An HTTP POST request is sent from the client to the server's `/auth/login` endpoint with the user's credentials in the request body.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "53",
+ "endLine": "54",
+ "relevantVariables": [
+ "axios.post"
+ ]
+ },
+ "inputDataExample": "{\"username\": \"test_user\", \"password\": \"password123\"}",
+ "outputDataExample": "{\"username\": \"test_user\", \"password\": \"password123\"}"
+ },
+ {
+ "simStepId": "b81f2a41-79d7-4c62-b0c1-bd2e1a543861",
+ "diagramNodeId": "b74fd5c5-7266-45c7-a495-4590578d6c54",
+ "simStepLabel": "[Login Flow] Route Request to Login Controller",
+ "simStepDescription": "The Express router on the server receives the POST request for `/auth/login` and directs it to the `login` controller for processing.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/routes/auth.ts",
+ "startLine": "15",
+ "endLine": "15",
+ "relevantVariables": [
+ "router",
+ "login"
+ ]
+ },
+ "inputDataExample": "{\"method\": \"POST\", \"path\": \"/auth/login\", \"body\": {\"username\": \"test_user\", \"password\": \"password123\"}}",
+ "outputDataExample": "{\"requestToController\": \"login\"}"
+ },
+ {
+ "simStepId": "6b68301e-36b5-4928-9bb4-d4d34b0fad35",
+ "diagramNodeId": "ae7fd8be-e838-47e3-9cae-b608370098b1",
+ "simStepLabel": "[Login Flow] Invoke Login Controller",
+ "simStepDescription": "The Express router invokes the `login` controller, passing the request and response objects for handling the authentication logic.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/routes/auth.ts",
+ "startLine": "15",
+ "endLine": "15",
+ "relevantVariables": [
+ "login"
+ ]
+ },
+ "inputDataExample": "{\"req\": {\"body\": {\"username\": \"test_user\", \"password\": \"password123\"}}, \"res\": {}}",
+ "outputDataExample": "{\"req\": {\"body\": {\"username\": \"test_user\", \"password\": \"password123\"}}, \"res\": {}}"
+ },
+ {
+ "simStepId": "ad5973a3-40f5-4ca0-9052-23ad8dbca59c",
+ "diagramNodeId": "967b3ba0-a170-4ffa-8e55-fc1d4ac5d176",
+ "simStepLabel": "[Login Flow] Verify Credentials and Generate JWT",
+ "simStepDescription": "The `login` controller validates the request body, finds the user account in the database, verifies the provided password against the stored hash using `crypt.comparePassword`, and if successful, generates a new JWT using `jwt.signToken`.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/controllers/auth/login.ts",
+ "startLine": "8",
+ "endLine": "59",
+ "relevantVariables": [
+ "login",
+ "joi.validate",
+ "Account.findOne",
+ "crypt.comparePassword",
+ "jwt.signToken"
+ ]
+ },
+ "inputDataExample": "{\"body\": {\"username\": \"test_user\", \"password\": \"password123\"}}",
+ "outputDataExample": "{\"accountData\": {\"_id\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"username\": \"test_user\", \"role\": \"user\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}"
+ },
+ {
+ "simStepId": "153e8dcd-f7a5-4677-b430-b8136526d0c2",
+ "diagramNodeId": "e1dead14-1180-40d8-b879-d95f0d335bc4",
+ "simStepLabel": "[Login Flow] Sign JWT",
+ "simStepDescription": "The `login` controller calls `jwt.signToken`, passing a payload containing the user's ID and role to be encoded into a JWT.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/controllers/auth/login.ts",
+ "startLine": "43",
+ "endLine": "43",
+ "relevantVariables": [
+ "jwt.signToken"
+ ]
+ },
+ "inputDataExample": "{\"payload\": {\"uid\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"role\": \"user\"}}",
+ "outputDataExample": "{\"payload\": {\"uid\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"role\": \"user\"}}"
+ },
+ {
+ "simStepId": "ff0f0893-0790-4bb9-9261-8f0adbe4c74e",
+ "diagramNodeId": "73b9f32d-e3ff-44a1-9aa6-19a0c6e850e2",
+ "simStepLabel": "[Login Flow] JWT Generation",
+ "simStepDescription": "The `JWT` utility class uses the `jsonwebtoken` library and a secret key to sign the payload and create a secure JSON Web Token.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/utils/jwt.ts",
+ "startLine": "12",
+ "endLine": "16",
+ "relevantVariables": [
+ "signToken",
+ "this.instance.sign",
+ "JWT_SECRET"
+ ]
+ },
+ "inputDataExample": "{\"payload\": {\"uid\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"role\": \"user\"}, \"expiresIn\": \"12h\"}",
+ "outputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI2NWE4ZTNiMWM4YTVhNGU3ZTZhM2Q2ZjciLCJyb2xlIjoidXNlciIsImlhdCI6MTY3NzY0NzM3MCwiZXhwIjoxNjc3NjkzMzcwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"}"
+ },
+ {
+ "simStepId": "0f5f2efe-b610-42c7-b307-2b8cf725310b",
+ "diagramNodeId": "94fcc1ad-5f35-48c0-934a-f5d45f9a6b81",
+ "simStepLabel": "[Login Flow] Return Generated Token",
+ "simStepDescription": "The newly created JWT is returned from the `signToken` method back to the `login` controller.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/utils/jwt.ts",
+ "startLine": "14",
+ "endLine": "14",
+ "relevantVariables": [
+ "token"
+ ]
+ },
+ "inputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI2NWE4ZTNiMWM4YTVhNGU3ZTZhM2Q2ZjciLCJyb2xlIjoidXNlciIsImlhdCI6MTY3NzY0NzM3MCwiZXhwIjoxNjc3NjkzMzcwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"}",
+ "outputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI2NWE4ZTNiMWM4YTVhNGU3ZTZhM2Q2ZjciLCJyb2xlIjoidXNlciIsImlhdCI6MTY3NzY0NzM3MCwiZXhwIjoxNjc3NjkzMzcwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"}"
+ },
+ {
+ "simStepId": "eac75eff-2f15-4831-965d-f552810bd842",
+ "diagramNodeId": "48b49746-8d01-4c7d-a33f-29b19e5ec82b",
+ "simStepLabel": "[Login Flow] Send Success Response to Client",
+ "simStepDescription": "After successful authentication and token generation, the controller sends a 200 OK response back to the client, containing a success message, the user's account data (without the password), and the JWT.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/controllers/auth/login.ts",
+ "startLine": "49",
+ "endLine": "54",
+ "relevantVariables": [
+ "res",
+ "accountData",
+ "token"
+ ]
+ },
+ "inputDataExample": "{\"accountData\": {\"_id\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"username\": \"test_user\", \"role\": \"user\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}",
+ "outputDataExample": "{\"status\": 200, \"body\": {\"message\": \"Succesfully logged-in\", \"data\": {\"_id\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"username\": \"test_user\", \"role\": \"user\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}"
+ },
+ {
+ "simStepId": "ab9e9e78-9f0b-4b2b-8790-fdee77dbb424",
+ "diagramNodeId": "4325d0e4-e23a-4103-a1d8-ef31166e85b7",
+ "simStepLabel": "[Login Flow] Client Receives Auth Data",
+ "simStepDescription": "The client receives the successful HTTP response. The promise in `AuthContext` resolves, providing the account data and token to the `.then()` block.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "54",
+ "endLine": "54",
+ "relevantVariables": [
+ "axios.post.then"
+ ]
+ },
+ "inputDataExample": "{\"data\": {\"data\": {\"_id\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"username\": \"test_user\", \"role\": \"user\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}",
+ "outputDataExample": "{\"data\": {\"data\": {\"_id\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"username\": \"test_user\", \"role\": \"user\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}"
+ },
+ {
+ "simStepId": "a8da8463-2a18-4570-82b6-979af6e157f3",
+ "diagramNodeId": "2aa4105f-fcf1-467f-ac6e-a9bbebc9ce20",
+ "simStepLabel": "[Login Flow] Update Client State and Storage",
+ "simStepDescription": "The `AuthContext` updates its internal state by calling `setAccount`, `setToken`, and `setIsLoggedIn`. The `setToken` function, being a state setter from `useState`, also triggers a side effect that persists the new token to `localStorage` for session persistence.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "55",
+ "endLine": "58",
+ "relevantVariables": [
+ "setAccount",
+ "setToken",
+ "setIsLoggedIn"
+ ]
+ },
+ "inputDataExample": "{\"accountData\": {\"_id\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"username\": \"test_user\", \"role\": \"user\"}, \"accessToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}",
+ "outputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\", \"account\": {\"_id\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"username\": \"test_user\", \"role\": \"user\"}, \"isLoggedIn\": true}"
+ },
+ {
+ "simStepId": "41a361f7-9dc1-4fb0-a9d1-4fa9ef5f3dab",
+ "diagramNodeId": "4741e371-9e7c-4e39-ab01-b1184618f3e8",
+ "simStepLabel": "[Login Flow] Propagate Auth State via Context",
+ "simStepDescription": "The updated auth state (`token`, `account`, `isLoggedIn`) is passed down through the React Context Provider to all consuming components.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "112",
+ "endLine": "112",
+ "relevantVariables": [
+ "value",
+ "useMemo",
+ "token",
+ "account",
+ "isLoggedIn"
+ ]
+ },
+ "inputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\", \"account\": {\"_id\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"username\": \"test_user\", \"role\": \"user\"}, \"isLoggedIn\": true}",
+ "outputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\", \"account\": {\"_id\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"username\": \"test_user\", \"role\": \"user\"}, \"isLoggedIn\": true}"
+ },
+ {
+ "simStepId": "0c6452b2-276a-492f-9699-9ae419104110",
+ "diagramNodeId": "a3928a32-8a71-4158-81fa-e9f80859e080",
+ "simStepLabel": "[Login Flow] UI Re-renders with Logged-In State",
+ "simStepDescription": "Components subscribed to the `AuthContext`, like `Header`, re-render based on the new state. The UI now shows a 'Logout' button instead of 'Login' and 'Register', reflecting the user's authenticated status.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/components/Header.tsx",
+ "startLine": "56",
+ "endLine": "64",
+ "relevantVariables": [
+ "isLoggedIn",
+ "logout",
+ "clickLogin",
+ "clickRegister"
+ ]
+ },
+ "inputDataExample": "{\"isLoggedIn\": true}",
+ "outputDataExample": "{\"renderedComponent\": \"Logout\"}"
+ },
+ {
+ "simStepId": "bdf35532-987a-43b7-8728-7bf2aac68635",
+ "diagramNodeId": "6f87a835-d97b-4900-807e-d2411bec2555",
+ "simStepLabel": "[Session Persistence Flow] App Load and State Initialization",
+ "simStepDescription": "When the application loads, the `AuthProvider` component initializes its state. The `token` state is set by attempting to read a value from `localStorage.getItem('token')`. On a fresh load after a previous login, this will find a token.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "29",
+ "endLine": "29",
+ "relevantVariables": [
+ "useState",
+ "setToken",
+ "localStorage.getItem"
+ ]
+ },
+ "inputDataExample": "{\"localStorage\": {\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}",
+ "outputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}"
+ },
+ {
+ "simStepId": "40b090eb-e7a6-479d-88a8-8093d1809b92",
+ "diagramNodeId": "be90e1b5-be9a-4a51-a655-5d54b360e946",
+ "simStepLabel": "[Session Persistence Flow] Token Read from Local Storage",
+ "simStepDescription": "The token string is retrieved from the browser's local storage and passed into the `useState` hook to initialize the `token` state variable.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "29",
+ "endLine": "29",
+ "relevantVariables": [
+ "localStorage.getItem"
+ ]
+ },
+ "inputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}",
+ "outputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}"
+ },
+ {
+ "simStepId": "774e6c94-7869-47f9-af7b-0aedb89583b0",
+ "diagramNodeId": "ee37c2a5-645e-47c6-88ef-1fc178afd61b",
+ "simStepLabel": "[Session Persistence Flow] Trigger Re-authentication",
+ "simStepDescription": "A `useEffect` hook runs, checking the dependencies `isLoggedIn`, `account`, and `token`. On app reload, `isLoggedIn` and `account` are initially falsy, but `token` is truthy (from localStorage). This condition triggers a call to the `loginWithToken` function to re-authenticate the user.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "107",
+ "endLine": "109",
+ "relevantVariables": [
+ "useEffect",
+ "isLoggedIn",
+ "account",
+ "token",
+ "loginWithToken"
+ ]
+ },
+ "inputDataExample": "{\"isLoggedIn\": false, \"account\": null, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}",
+ "outputDataExample": "{}"
+ },
+ {
+ "simStepId": "22eca662-3cd3-496d-af97-581a6ef20ac4",
+ "diagramNodeId": "5328217c-abc7-45ba-8b2f-d41278eeb9bb",
+ "simStepLabel": "[Session Persistence Flow] Call loginWithToken Function",
+ "simStepDescription": "The `useEffect` hook invokes the `loginWithToken` function to validate the existing token with the backend.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "108",
+ "endLine": "108",
+ "relevantVariables": [
+ "loginWithToken"
+ ]
+ },
+ "inputDataExample": "{}",
+ "outputDataExample": "{}"
+ },
+ {
+ "simStepId": "eea281fd-43b3-4a7b-88fa-0ba67052ac9d",
+ "diagramNodeId": "27695e56-23c6-428c-a6d6-40e2ff2a405e",
+ "simStepLabel": "[Session Persistence Flow] Send Token for Verification",
+ "simStepDescription": "The `loginWithToken` function makes an asynchronous GET request to `/auth/login`. It includes the token from the component's state in the `Authorization` header as a Bearer token.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "74",
+ "endLine": "88",
+ "relevantVariables": [
+ "loginWithToken",
+ "axios.get",
+ "token"
+ ]
+ },
+ "inputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}",
+ "outputDataExample": "{\"request\": {\"method\": \"GET\", \"url\": \"/auth/login\", \"headers\": {\"authorization\": \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}}"
+ },
+ {
+ "simStepId": "d2be7e38-2e5a-4d75-b228-0ff3e6a7dfee",
+ "diagramNodeId": "bfb9019d-ef6b-4aa4-8dfc-13d1c4e4670c",
+ "simStepLabel": "[Session Persistence Flow] API Call: GET /auth/login",
+ "simStepDescription": "An HTTP GET request with an `Authorization` header containing the bearer token is sent to the server's `/auth/login` endpoint to fetch user data.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "77",
+ "endLine": "82",
+ "relevantVariables": [
+ "axios.get"
+ ]
+ },
+ "inputDataExample": "{\"headers\": {\"authorization\": \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}",
+ "outputDataExample": "{\"headers\": {\"authorization\": \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}"
+ },
+ {
+ "simStepId": "79ebe914-3f55-4963-b7d0-9aa9e9e846ab",
+ "diagramNodeId": "a9176022-b548-4b88-b654-7a9c8a8a3c4a",
+ "simStepLabel": "[Session Persistence Flow] Route Request through Middleware",
+ "simStepDescription": "The Express server's router matches the GET request to `/auth/login`. Before passing it to the final controller (`loginWithToken`), it first routes the request through the `checkBearerToken` middleware.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/routes/auth.ts",
+ "startLine": "18",
+ "endLine": "18",
+ "relevantVariables": [
+ "router",
+ "checkBearerToken",
+ "loginWithToken"
+ ]
+ },
+ "inputDataExample": "{\"method\": \"GET\", \"path\": \"/auth/login\"}",
+ "outputDataExample": "{\"requestToMiddleware\": \"checkBearerToken\"}"
+ },
+ {
+ "simStepId": "9e7a46e5-ecbd-4122-abc4-e1d87c040b4e",
+ "diagramNodeId": "c6a1a053-d8c1-4373-98fb-e5f1d6eadbf6",
+ "simStepLabel": "[Session Persistence Flow] Invoke Token Verification Middleware",
+ "simStepDescription": "The router invokes the `checkBearerToken` middleware, passing the request and response objects. This middleware is responsible for validating the JWT.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/routes/auth.ts",
+ "startLine": "18",
+ "endLine": "18",
+ "relevantVariables": [
+ "checkBearerToken"
+ ]
+ },
+ "inputDataExample": "{\"req\": {\"headers\": {\"authorization\": \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}}",
+ "outputDataExample": "{\"req\": {\"headers\": {\"authorization\": \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}}"
+ },
+ {
+ "simStepId": "1f10910e-0c81-4d5a-8b09-6ac1b71da146",
+ "diagramNodeId": "b70bf149-2d0a-4d6b-8330-a0fbb67bec21",
+ "simStepLabel": "[Session Persistence Flow] Verify Bearer Token",
+ "simStepDescription": "The `checkBearerToken` middleware extracts the token from the `Authorization` header, calls `jwt.verifyToken` to validate it, and if successful, attaches the decoded authentication payload to the `req.auth` property. It then calls `next()` to pass control to the next handler.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/middlewares/check-bearer-token.ts",
+ "startLine": "4",
+ "endLine": "35",
+ "relevantVariables": [
+ "checkBearerToken",
+ "req.headers.authorization",
+ "jwt.verifyToken",
+ "req.auth",
+ "next"
+ ]
+ },
+ "inputDataExample": "{\"headers\": {\"authorization\": \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"}}",
+ "outputDataExample": "{\"req.auth\": {\"uid\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"role\": \"user\"}}"
+ },
+ {
+ "simStepId": "a8368508-94e9-405e-9201-36ad2d4d04ab",
+ "diagramNodeId": "1e690fca-603a-4c1b-9547-c0ab060a6eb8",
+ "simStepLabel": "[Session Persistence Flow] Pass Control to Controller",
+ "simStepDescription": "After successful token validation, the `checkBearerToken` middleware calls `next()`, passing the modified request object (now including `req.auth`) to the `loginWithToken` controller.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/middlewares/check-bearer-token.ts",
+ "startLine": "28",
+ "endLine": "28",
+ "relevantVariables": [
+ "next"
+ ]
+ },
+ "inputDataExample": "{\"req\": {\"auth\": {\"uid\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"role\": \"user\"}}}",
+ "outputDataExample": "{\"req\": {\"auth\": {\"uid\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"role\": \"user\"}}}"
+ },
+ {
+ "simStepId": "25236aad-75ed-4584-aaaf-abfd6cd53d8a",
+ "diagramNodeId": "8807bc2c-ee2e-4362-8c17-9c3fbf6f3e96",
+ "simStepLabel": "[Session Persistence Flow] Fetch Account and Refresh Token",
+ "simStepDescription": "The `loginWithToken` controller uses the `uid` from `req.auth` to fetch the full user account from the database. Since the user is already authenticated via the token, no password check is needed. It then generates a new, refreshed JWT and sends a 200 OK response with the account data and the new token.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/controllers/auth/login-with-token.ts",
+ "startLine": "5",
+ "endLine": "32",
+ "relevantVariables": [
+ "loginWithToken",
+ "req.auth",
+ "Account.findById",
+ "jwt.signToken"
+ ]
+ },
+ "inputDataExample": "{\"req\": {\"auth\": {\"uid\": \"65a8e3b1c8a5a4e7e6a3d6f7\", \"role\": \"user\"}}}",
+ "outputDataExample": "{\"status\": 200, \"body\": {\"message\": \"Succesfully got account\", \"data\": {\"...\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(new)\"}}"
+ },
+ {
+ "simStepId": "790d8fc0-c549-4e18-90f2-6577a2ad8293",
+ "diagramNodeId": "96c507f5-0c17-49eb-bea0-74f09e19dc8d",
+ "simStepLabel": "[Session Persistence Flow] Client Receives Refreshed Auth Data",
+ "simStepDescription": "The client receives the successful HTTP response from the server, containing the user's account data and a refreshed JWT.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "75",
+ "endLine": "82",
+ "relevantVariables": [
+ "axios.get"
+ ]
+ },
+ "inputDataExample": "{\"data\": {\"data\": {\"...\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(new)\"}}",
+ "outputDataExample": "{\"data\": {\"data\": {\"...\"}, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(new)\"}}"
+ },
+ {
+ "simStepId": "69a33bcc-2d0f-412d-95b8-91bb19f8d324",
+ "diagramNodeId": "38460399-e6b8-4b73-a4f2-e1c95e45dffe",
+ "simStepLabel": "[Session Persistence Flow] Update Client State and Storage",
+ "simStepDescription": "Inside the `loginWithToken` function's `try` block, the `AuthContext` updates its state with the received account data and the new token by calling `setAccount`, `setToken`, and `setIsLoggedIn`. The new token is automatically persisted to `localStorage`, replacing the old one.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/contexts/AuthContext.tsx",
+ "startLine": "83",
+ "endLine": "87",
+ "relevantVariables": [
+ "setAccount",
+ "setToken",
+ "setIsLoggedIn",
+ "accountData",
+ "accessToken"
+ ]
+ },
+ "inputDataExample": "{\"accountData\": {\"...\"}, \"accessToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(new)\"}",
+ "outputDataExample": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(new)\", \"account\": {\"...\"}, \"isLoggedIn\": true}"
+ }
+ ],
+ "description": "- This feature enables a registered user to authenticate and maintain their session across browser refreshes and restarts
- - A user enters their credentials into a login form (
client/src/components/AuthModal - tsx)
- - The backend's
/auth/login endpoint (server/src/controllers/auth/login - ts) verifies the credentials against the hashed password in the database
- - A JWT is issued upon successful login
- The client stores this token in
localStorage for persistence, managed by client/src/contexts/AuthContext - tsx
- - When the application is reloaded, the
AuthContext uses the stored token to re-authenticate with the backend via the /auth/login GET endpoint, which is handled by login-with-token - ts
",
+ "simulationNodesAndEdges": {
+ "a0845367-b17f-4546-aa1b-b022d86c06ec": {
+ "simStepIds": [
+ "7bc6bab8-0745-401e-b151-412beaa566f5"
+ ]
+ },
+ "8e1c07ba-d9a3-4430-88ef-2e5a81305e6e": {
+ "simStepIds": [
+ "ed630bcc-8c95-497c-a9ec-1c1e662df7dc"
+ ]
+ },
+ "b74fd5c5-7266-45c7-a495-4590578d6c54": {
+ "simStepIds": [
+ "b81f2a41-79d7-4c62-b0c1-bd2e1a543861"
+ ]
+ },
+ "967b3ba0-a170-4ffa-8e55-fc1d4ac5d176": {
+ "simStepIds": [
+ "ad5973a3-40f5-4ca0-9052-23ad8dbca59c"
+ ]
+ },
+ "73b9f32d-e3ff-44a1-9aa6-19a0c6e850e2": {
+ "simStepIds": [
+ "ff0f0893-0790-4bb9-9261-8f0adbe4c74e"
+ ]
+ },
+ "48b49746-8d01-4c7d-a33f-29b19e5ec82b": {
+ "simStepIds": [
+ "eac75eff-2f15-4831-965d-f552810bd842"
+ ]
+ },
+ "2aa4105f-fcf1-467f-ac6e-a9bbebc9ce20": {
+ "simStepIds": [
+ "a8da8463-2a18-4570-82b6-979af6e157f3"
+ ]
+ },
+ "a3928a32-8a71-4158-81fa-e9f80859e080": {
+ "simStepIds": [
+ "0c6452b2-276a-492f-9699-9ae419104110"
+ ]
+ },
+ "6f87a835-d97b-4900-807e-d2411bec2555": {
+ "simStepIds": [
+ "bdf35532-987a-43b7-8728-7bf2aac68635"
+ ]
+ },
+ "ee37c2a5-645e-47c6-88ef-1fc178afd61b": {
+ "simStepIds": [
+ "774e6c94-7869-47f9-af7b-0aedb89583b0"
+ ]
+ },
+ "27695e56-23c6-428c-a6d6-40e2ff2a405e": {
+ "simStepIds": [
+ "eea281fd-43b3-4a7b-88fa-0ba67052ac9d"
+ ]
+ },
+ "a9176022-b548-4b88-b654-7a9c8a8a3c4a": {
+ "simStepIds": [
+ "79ebe914-3f55-4963-b7d0-9aa9e9e846ab"
+ ]
+ },
+ "b70bf149-2d0a-4d6b-8330-a0fbb67bec21": {
+ "simStepIds": [
+ "1f10910e-0c81-4d5a-8b09-6ac1b71da146"
+ ]
+ },
+ "8807bc2c-ee2e-4362-8c17-9c3fbf6f3e96": {
+ "simStepIds": [
+ "25236aad-75ed-4584-aaaf-abfd6cd53d8a"
+ ]
+ },
+ "38460399-e6b8-4b73-a4f2-e1c95e45dffe": {
+ "simStepIds": [
+ "69a33bcc-2d0f-412d-95b8-91bb19f8d324"
+ ]
+ },
+ "c2f8b323-50b0-4f30-bfdc-0dad0fcb16ad": {
+ "simStepIds": [
+ "c9187bf3-692d-42ed-a5af-e68375797b88"
+ ]
+ },
+ "1c3cacce-e2c7-4e4e-b029-b8c6b938b2d5": {
+ "simStepIds": [
+ "f216b206-0ee5-4bd4-8144-b52a67ca71ce"
+ ]
+ },
+ "ae7fd8be-e838-47e3-9cae-b608370098b1": {
+ "simStepIds": [
+ "6b68301e-36b5-4928-9bb4-d4d34b0fad35"
+ ]
+ },
+ "e1dead14-1180-40d8-b879-d95f0d335bc4": {
+ "simStepIds": [
+ "153e8dcd-f7a5-4677-b430-b8136526d0c2"
+ ]
+ },
+ "94fcc1ad-5f35-48c0-934a-f5d45f9a6b81": {
+ "simStepIds": [
+ "0f5f2efe-b610-42c7-b307-2b8cf725310b"
+ ]
+ },
+ "4325d0e4-e23a-4103-a1d8-ef31166e85b7": {
+ "simStepIds": [
+ "ab9e9e78-9f0b-4b2b-8790-fdee77dbb424"
+ ]
+ },
+ "4741e371-9e7c-4e39-ab01-b1184618f3e8": {
+ "simStepIds": [
+ "41a361f7-9dc1-4fb0-a9d1-4fa9ef5f3dab"
+ ]
+ },
+ "be90e1b5-be9a-4a51-a655-5d54b360e946": {
+ "simStepIds": [
+ "40b090eb-e7a6-479d-88a8-8093d1809b92"
+ ]
+ },
+ "5328217c-abc7-45ba-8b2f-d41278eeb9bb": {
+ "simStepIds": [
+ "22eca662-3cd3-496d-af97-581a6ef20ac4"
+ ]
+ },
+ "bfb9019d-ef6b-4aa4-8dfc-13d1c4e4670c": {
+ "simStepIds": [
+ "d2be7e38-2e5a-4d75-b228-0ff3e6a7dfee"
+ ]
+ },
+ "c6a1a053-d8c1-4373-98fb-e5f1d6eadbf6": {
+ "simStepIds": [
+ "9e7a46e5-ecbd-4122-abc4-e1d87c040b4e"
+ ]
+ },
+ "1e690fca-603a-4c1b-9547-c0ab060a6eb8": {
+ "simStepIds": [
+ "a8368508-94e9-405e-9201-36ad2d4d04ab"
+ ]
+ },
+ "96c507f5-0c17-49eb-bea0-74f09e19dc8d": {
+ "simStepIds": [
+ "790d8fc0-c549-4e18-90f2-6577a2ad8293"
+ ]
+ }
+ },
+ "isAIGenerated": true,
+ "keywords": "login, jwt, AuthContext"
+ },
+ "Full-Stack Project Scaffolding for Rapid Development": {
+ "name": "Full-Stack Project Scaffolding for Rapid Development",
+ "simSteps": [
+ {
+ "simStepId": "f289db0f-2fc7-4bae-90b2-b65b93165514",
+ "diagramNodeId": "402d5462-d4b2-4dca-9792-3bdc9924d62d",
+ "simStepLabel": "Server Setup: Install Dependencies",
+ "simStepDescription": "As per the README instructions, the developer navigates to the `server` directory and installs the required Node.js packages using `npm install`. This command reads the `package.json` file in the server directory and downloads the dependencies (like Express, Mongoose, etc.) into the `node_modules` folder.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "README.md",
+ "startLine": "34",
+ "endLine": "37",
+ "relevantVariables": [
+ "npm i"
+ ]
+ },
+ "inputDataExample": "{ \"command\": \"cd ./server && npm i\" }",
+ "outputDataExample": "{ \"status\": \"success\", \"installed_dependencies\": [\"express\", \"mongoose\", \"dotenv\", \"cors\", \"joi\", \"jsonwebtoken\", \"bcrypt\"] }"
+ },
+ {
+ "simStepId": "17a3edec-f328-46e7-99ed-1a434c69e424",
+ "diagramNodeId": "54d4abe9-937d-4ba9-97b7-107f6c48de2f",
+ "simStepLabel": "Data Flow: Environment Configuration Prompt",
+ "simStepDescription": "After installing dependencies, the developer needs to configure the environment variables for the server. The `README.md` directs the user to prepare the MongoDB connection URI.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "README.md",
+ "startLine": "46",
+ "endLine": "49",
+ "relevantVariables": []
+ },
+ "inputDataExample": "{ \"next_step\": \"Configure MONGO_URI\" }",
+ "outputDataExample": "{ \"next_step\": \"Configure MONGO_URI\" }"
+ },
+ {
+ "simStepId": "25a4c26f-27de-42be-b2dd-811b38ffd3cb",
+ "diagramNodeId": "8771af61-1959-41a0-8e72-8756637f8f6b",
+ "simStepLabel": "Server Setup: Configure Environment",
+ "simStepDescription": "The developer creates a `.env` file in the `server` directory, typically by copying `server/.env.example`. They then add the connection string for their MongoDB database to the `MONGO_URI` variable.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/.env.example",
+ "startLine": "1",
+ "endLine": "1",
+ "relevantVariables": [
+ "MONGO_URI"
+ ]
+ },
+ "inputDataExample": "{ \"action\": \"create .env file\", \"source\": \"server/.env.example\" }",
+ "outputDataExample": "{ \"file_created\": \"server/.env\", \"content\": \"MONGO_URI=mongodb+srv://user:password@cluster0.mongodb.net/myFirstDatabase?retryWrites=true&w=majority\" }"
+ },
+ {
+ "simStepId": "f0cd3ca0-3d66-4a26-8a8f-7c8043809171",
+ "diagramNodeId": "272af1ab-8c2b-443b-9568-56685efb5ce5",
+ "simStepLabel": "Data Flow: Environment Variables Loaded",
+ "simStepDescription": "The `MONGO_URI` value from the `.env` file is prepared to be loaded as an environment variable when the server starts.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/utils/mongo.ts",
+ "startLine": "1",
+ "endLine": "10",
+ "relevantVariables": [
+ "MONGO_URI"
+ ]
+ },
+ "inputDataExample": "{ \"env_variable\": { \"MONGO_URI\": \"mongodb+srv://user:password@cluster0.mongodb.net/myFirstDatabase?retryWrites=true&w=majority\" } }",
+ "outputDataExample": "{ \"env_variable\": { \"MONGO_URI\": \"mongodb+srv://user:password@cluster0.mongodb.net/myFirstDatabase?retryWrites=true&w=majority\" } }"
+ },
+ {
+ "simStepId": "060778c4-20d2-4702-ba2e-e2925e45ef71",
+ "diagramNodeId": "83e47a5d-b6da-410b-b9c4-0e97028193b5",
+ "simStepLabel": "Server Setup: Start Development Server",
+ "simStepDescription": "The developer runs `npm run dev` in the `server` directory. This command starts the Node.js application using a tool like `ts-node-dev` for automatic reloading, executing the entrypoint file `src/index.ts`.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "README.md",
+ "startLine": "52",
+ "endLine": "54",
+ "relevantVariables": [
+ "npm run dev"
+ ]
+ },
+ "inputDataExample": "{ \"command\": \"npm run dev\" }",
+ "outputDataExample": "{ \"status\": \"process started\", \"entrypoint\": \"server/src/index.ts\" }"
+ },
+ {
+ "simStepId": "a21f3189-0ea9-4c24-a4b0-03ac9098b4bc",
+ "diagramNodeId": "bbb03333-e082-49e2-944e-84d060ac4287",
+ "simStepLabel": "Server Execution: Initiate App",
+ "simStepDescription": "The running Node.js process begins execution at `server/src/index.ts`. This file orchestrates the application startup, including setting up the database connection and starting the HTTP server.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/index.ts",
+ "startLine": "1",
+ "endLine": "10",
+ "relevantVariables": [
+ "app",
+ "mongo"
+ ]
+ },
+ "inputDataExample": "{ \"event\": \"process_start\", \"entrypoint\": \"server/src/index.ts\" }",
+ "outputDataExample": "{ \"event\": \"process_start\", \"entrypoint\": \"server/src/index.ts\" }"
+ },
+ {
+ "simStepId": "245a5b16-55a2-49dd-9c98-f24cf04ba37a",
+ "diagramNodeId": "d09bdb0d-f63c-4704-b187-ed94ba5f3513",
+ "simStepLabel": "Server Execution: Connect to MongoDB",
+ "simStepDescription": "The server application calls the MongoDB connection logic. This code reads the `MONGO_URI` from the environment variables and uses the Mongoose library to establish a connection to the database.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "server/src/utils/mongo.ts",
+ "startLine": "1",
+ "endLine": "10",
+ "relevantVariables": [
+ "mongoose.connect",
+ "MONGO_URI"
+ ]
+ },
+ "inputDataExample": "{ \"MONGO_URI\": \"mongodb+srv://user:password@cluster0.mongodb.net/myFirstDatabase?retryWrites=true&w=majority\" }",
+ "outputDataExample": "{ \"connectionStatus\": \"connected\", \"message\": \"MongoDB successfully connected\" }"
+ },
+ {
+ "simStepId": "f8909b27-6fb3-4149-9daa-870169b694f6",
+ "diagramNodeId": "b4b5fd99-d66d-4784-b841-6663327cb40e",
+ "simStepLabel": "Server Ready: Listening for Requests",
+ "simStepDescription": "Once the database connection is successful, the application starts the Express server, which begins listening for incoming HTTP requests on the configured port. At this point, the backend is fully running.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "server/src/index.ts",
+ "startLine": "8",
+ "endLine": "10",
+ "relevantVariables": [
+ "app.listen",
+ "PORT"
+ ]
+ },
+ "inputDataExample": "{ \"event\": \"start_listening\", \"port\": 5000 }",
+ "outputDataExample": "{ \"event\": \"start_listening\", \"port\": 5000 }"
+ },
+ {
+ "simStepId": "10d915e4-650f-4602-bcbb-8584ef379390",
+ "diagramNodeId": "20ceddd6-660a-4670-bf3d-4bde35f11a21",
+ "simStepLabel": "Client Setup: Install Dependencies",
+ "simStepDescription": "In a separate terminal, the developer navigates to the `client` directory and installs the React app's dependencies with `npm install`. This downloads packages like React, ReactDOM, and Axios.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "README.md",
+ "startLine": "39",
+ "endLine": "42",
+ "relevantVariables": [
+ "npm i"
+ ]
+ },
+ "inputDataExample": "{ \"command\": \"cd ./client && npm i\" }",
+ "outputDataExample": "{ \"status\": \"success\", \"installed_dependencies\": [\"react\", \"react-dom\", \"axios\", \"@tanstack/react-query\"] }"
+ },
+ {
+ "simStepId": "9d1af39a-4c6f-4bc9-911b-588dda27baa3",
+ "diagramNodeId": "340539c6-be61-4592-96b0-a26933b2ab1d",
+ "simStepLabel": "Data Flow: Client Environment Configuration",
+ "simStepDescription": "Similar to the server, the client requires environment configuration. The developer needs to specify the backend API's URL.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/.env.example",
+ "startLine": "1",
+ "endLine": "1",
+ "relevantVariables": []
+ },
+ "inputDataExample": "{ \"next_step\": \"Configure REACT_APP_API_URL\" }",
+ "outputDataExample": "{ \"next_step\": \"Configure REACT_APP_API_URL\" }"
+ },
+ {
+ "simStepId": "a9d7adbe-ce82-4917-a3fa-ed537983df5a",
+ "diagramNodeId": "dc187b3c-9951-43c2-9eb7-0e2df3f3b32b",
+ "simStepLabel": "Client Setup: Configure Environment",
+ "simStepDescription": "The developer creates a `.env` file in the `client` directory from `client/.env.example` and sets the `REACT_APP_API_URL` variable to point to the running server's address (e.g., `http://localhost:5000/api`).",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/.env.example",
+ "startLine": "1",
+ "endLine": "1",
+ "relevantVariables": [
+ "REACT_APP_API_URL"
+ ]
+ },
+ "inputDataExample": "{ \"action\": \"create .env file\", \"source\": \"client/.env.example\" }",
+ "outputDataExample": "{ \"file_created\": \"client/.env\", \"content\": \"REACT_APP_API_URL=http://localhost:5000/api\" }"
+ },
+ {
+ "simStepId": "ad20b5a5-cd6d-4c5f-a874-21603900fa94",
+ "diagramNodeId": "c21a4385-acb6-4379-b0fc-b064418b41f9",
+ "simStepLabel": "Data Flow: Client Environment Loaded",
+ "simStepDescription": "The `REACT_APP_API_URL` is passed into the React application's build process, making it available under `process.env`.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/utils/axios.ts",
+ "startLine": "1",
+ "endLine": "7",
+ "relevantVariables": [
+ "process.env.REACT_APP_API_URL"
+ ]
+ },
+ "inputDataExample": "{ \"env_variable\": { \"REACT_APP_API_URL\": \"http://localhost:5000/api\" } }",
+ "outputDataExample": "{ \"env_variable\": { \"REACT_APP_API_URL\": \"http://localhost:5000/api\" } }"
+ },
+ {
+ "simStepId": "1b9179ad-6de3-4826-a403-1ea50460c329",
+ "diagramNodeId": "2a19acc2-3c48-4fb7-aa10-62a907ae8b1f",
+ "simStepLabel": "Client Setup: Start Development Server",
+ "simStepDescription": "The developer runs `npm run dev` (or `npm start`) in the `client` directory. This launches the React development server, which compiles the application and serves it on a local port (e.g., 3000).",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "README.md",
+ "startLine": "57",
+ "endLine": "59",
+ "relevantVariables": [
+ "npm run dev"
+ ]
+ },
+ "inputDataExample": "{ \"command\": \"npm run dev\" }",
+ "outputDataExample": "{ \"status\": \"Client dev server running at http://localhost:3000\" }"
+ },
+ {
+ "simStepId": "61813dc3-50a3-4ed1-8248-cf1976947d8d",
+ "diagramNodeId": "2c935c41-0451-4f6a-b475-696f0df2d9c6",
+ "simStepLabel": "Client Execution: App Mounting",
+ "simStepDescription": "The browser loads the application, and the entrypoint `client/src/index.tsx` is executed, which finds the root DOM element and renders the main `` component into it.",
+ "isEdge": 1,
+ "sourceCodeMapping": {
+ "filePath": "client/src/index.tsx",
+ "startLine": "1",
+ "endLine": "12",
+ "relevantVariables": [
+ "ReactDOM.createRoot",
+ "root.render",
+ "App"
+ ]
+ },
+ "inputDataExample": "{ \"event\": \"render\", \"component\": \"\", \"target_element\": \"#root\" }",
+ "outputDataExample": "{ \"event\": \"render\", \"component\": \"\", \"target_element\": \"#root\" }"
+ },
+ {
+ "simStepId": "91e5baad-f212-4102-ad32-c126b83e9222",
+ "diagramNodeId": "7fb1005d-c3f4-4787-b18f-86daf7d53fb8",
+ "simStepLabel": "Client Execution: Configure API Client",
+ "simStepDescription": "As the application loads, the Axios HTTP client is configured. An instance of Axios is created with the `baseURL` set to the `REACT_APP_API_URL` from the environment variables. This instance will be used for all subsequent API calls to the backend.",
+ "isEdge": 0,
+ "sourceCodeMapping": {
+ "filePath": "client/src/utils/axios.ts",
+ "startLine": "1",
+ "endLine": "7",
+ "relevantVariables": [
+ "axios.create",
+ "baseURL",
+ "process.env.REACT_APP_API_URL"
+ ]
+ },
+ "inputDataExample": "{ \"baseURL_from_env\": \"http://localhost:5000/api\" }",
+ "outputDataExample": "{ \"axios_instance_config\": { \"baseURL\": \"http://localhost:5000/api\" } }"
+ }
+ ],
+ "description": "- The core value of the repository is providing a pre-configured, ready-to-use template for MERN stack applications
- - Establishes a clear project structure with separate
client and server directories, each with its own dependencies and configuration - - Includes example environment files (
- env
- example) for both client and server to manage critical variables like database URIs and API keys
- - Offers simple
npm install and npm run dev commands to get both the frontend and backend running locally, as described in the main README - md
",
+ "simulationNodesAndEdges": {
+ "402d5462-d4b2-4dca-9792-3bdc9924d62d": {
+ "simStepIds": [
+ "f289db0f-2fc7-4bae-90b2-b65b93165514"
+ ]
+ },
+ "8771af61-1959-41a0-8e72-8756637f8f6b": {
+ "simStepIds": [
+ "25a4c26f-27de-42be-b2dd-811b38ffd3cb"
+ ]
+ },
+ "83e47a5d-b6da-410b-b9c4-0e97028193b5": {
+ "simStepIds": [
+ "060778c4-20d2-4702-ba2e-e2925e45ef71"
+ ]
+ },
+ "d09bdb0d-f63c-4704-b187-ed94ba5f3513": {
+ "simStepIds": [
+ "245a5b16-55a2-49dd-9c98-f24cf04ba37a"
+ ]
+ },
+ "20ceddd6-660a-4670-bf3d-4bde35f11a21": {
+ "simStepIds": [
+ "10d915e4-650f-4602-bcbb-8584ef379390"
+ ]
+ },
+ "dc187b3c-9951-43c2-9eb7-0e2df3f3b32b": {
+ "simStepIds": [
+ "a9d7adbe-ce82-4917-a3fa-ed537983df5a"
+ ]
+ },
+ "2a19acc2-3c48-4fb7-aa10-62a907ae8b1f": {
+ "simStepIds": [
+ "1b9179ad-6de3-4826-a403-1ea50460c329"
+ ]
+ },
+ "7fb1005d-c3f4-4787-b18f-86daf7d53fb8": {
+ "simStepIds": [
+ "91e5baad-f212-4102-ad32-c126b83e9222"
+ ]
+ },
+ "54d4abe9-937d-4ba9-97b7-107f6c48de2f": {
+ "simStepIds": [
+ "17a3edec-f328-46e7-99ed-1a434c69e424"
+ ]
+ },
+ "272af1ab-8c2b-443b-9568-56685efb5ce5": {
+ "simStepIds": [
+ "f0cd3ca0-3d66-4a26-8a8f-7c8043809171"
+ ]
+ },
+ "bbb03333-e082-49e2-944e-84d060ac4287": {
+ "simStepIds": [
+ "a21f3189-0ea9-4c24-a4b0-03ac9098b4bc"
+ ]
+ },
+ "b4b5fd99-d66d-4784-b841-6663327cb40e": {
+ "simStepIds": [
+ "f8909b27-6fb3-4149-9daa-870169b694f6"
+ ]
+ },
+ "340539c6-be61-4592-96b0-a26933b2ab1d": {
+ "simStepIds": [
+ "9d1af39a-4c6f-4bc9-911b-588dda27baa3"
+ ]
+ },
+ "c21a4385-acb6-4379-b0fc-b064418b41f9": {
+ "simStepIds": [
+ "ad20b5a5-cd6d-4c5f-a874-21603900fa94"
+ ]
+ },
+ "2c935c41-0451-4f6a-b475-696f0df2d9c6": {
+ "simStepIds": [
+ "61813dc3-50a3-4ed1-8248-cf1976947d8d"
+ ]
+ }
+ },
+ "isAIGenerated": true,
+ "keywords": "mern-template, README.md, package.json"
+ },
+ "Secure API Endpoints with JWT Authentication": {
+ "name": "Secure API Endpoints with JWT Authentication",
+ "simSteps": [],
+ "description": "- The template provides a robust system for securing backend API endpoints, ensuring only authenticated users can access protected resources
- - Implements a
check-bearer-token - ts middleware that intercepts requests to protected routes
- - The middleware validates the
Authorization: Bearer header, using jsonwebtoken to verify the token's signature and validity - - If the token is valid, the decoded payload (containing user ID and role) is attached to the request object (
req - auth) for use in downstream controllers
- - This provides a reusable pattern for developers to apply security to any new endpoints they build
",
+ "simulationNodesAndEdges": {},
+ "isAIGenerated": true,
+ "keywords": "check-bearer-token, jwt, authorization"
+ },
+ "Extensible Backend API Architecture": {
+ "name": "Extensible Backend API Architecture",
+ "simSteps": [],
+ "description": "- The backend is structured to be easily extendable, following common best practices for Express
- js applications
- - Logic is separated into layers: routes define endpoints, controllers handle business logic, and utilities provide reusable functions
- -
server/src/index - ts acts as the entry point, mounting modular route files like
server/src/routes/auth - ts
- - Developers can add new features by creating new route files and corresponding controllers, following the existing pattern for a clean and maintainable codebase
",
+ "simulationNodesAndEdges": {},
+ "isAIGenerated": true,
+ "keywords": "routes, controllers, app.use"
+ },
+ "Centralized Frontend State Management": {
+ "name": "Centralized Frontend State Management",
+ "simSteps": [],
+ "description": "- The frontend application uses modern state management patterns to handle shared data and UI state efficiently
- - React's Context API is used via
client/src/contexts/AuthContext - tsx to provide global access to authentication status, user account data, and login/logout functions
- - The Zustand library is used for more granular, specific UI state, such as managing the visibility of modals (
client/src/store/useModalStore - ts)
- - This approach avoids prop-drilling and makes the application state predictable and easy to debug
",
+ "simulationNodesAndEdges": {},
+ "isAIGenerated": true,
+ "keywords": "AuthContext, useModalStore, Zustand"
+ },
+ "Database Interaction and Data Modeling with MongoDB": {
+ "name": "Database Interaction and Data Modeling with MongoDB",
+ "simSteps": [],
+ "description": "- The template includes a complete setup for connecting to and interacting with a MongoDB database using Mongoose
- - A dedicated utility,
server/src/utils/mongo - ts, manages the database connection lifecycle
- - The
server/src/models/Account - ts file defines the Mongoose schema for the
accounts collection, specifying data types, required fields, and unique constraints - - This serves as a clear example for developers on how to define and interact with their own data models for new application features
",
+ "simulationNodesAndEdges": {},
+ "isAIGenerated": true,
+ "keywords": "Account.ts, mongo.ts, mongoose"
+ },
+ "Automated Build and Continuous Integration Workflows": {
+ "name": "Automated Build and Continuous Integration Workflows",
+ "simSteps": [],
+ "description": "- The project is equipped with pre-configured CI/CD pipelines using GitHub Actions to automate builds and ensure code quality
- - Two separate workflows,
build-backend - yml and
build-frontend - yml, are defined in the
- github/workflows directory
- - These workflows are triggered automatically on any pull request to the
main branch - - They install all dependencies and run the production build command (
npm run build) for both the client and server to catch potential build errors before code is merged
",
+ "simulationNodesAndEdges": {},
+ "isAIGenerated": true,
+ "keywords": "build-frontend.yml, build-backend.yml, actions"
+ },
+ "Robust API Input Validation and Error Handling": {
+ "name": "Robust API Input Validation and Error Handling",
+ "simSteps": [],
+ "description": "- The backend is fortified with systematic input validation and a centralized error handling mechanism to create a more stable and secure API
- - The Joi library is used via a wrapper (
server/src/utils/joi - ts) to define and enforce schemas for incoming request bodies, as seen in the
register and login controllers - - A global middleware,
server/src/middlewares/error-handler - ts, catches any errors thrown within the application
- - It standardizes error responses, sending back a consistent JSON object with an appropriate status code and message to the client
",
+ "simulationNodesAndEdges": {},
+ "isAIGenerated": true,
+ "keywords": "joi.ts, error-handler.ts, validate"
+ },
+ "Component-Based UI with a Modern Component Library": {
+ "name": "Component-Based UI with a Modern Component Library",
+ "simSteps": [],
+ "description": "- The frontend is built using a modern component-based architecture and integrates a popular UI library for a polished user experience
- - The UI is composed of reusable React components like
Header - tsx,
AuthModal - tsx, and
OnlineIndicator - tsx
- - It leverages Material-UI (
@mui/material) for pre-styled components such as buttons, dialogs, avatars, and popovers - - The UI is dynamic, with components like
Header - tsx conditionally rendering different elements based on the user's authentication state
",
+ "simulationNodesAndEdges": {},
+ "isAIGenerated": true,
+ "keywords": "AuthModal.tsx, Header.tsx, @mui/material"
+ }
+ },
+ "cellToPath": {
+ "665eb622-621d-4a77-bf0d-28f9052cd3bf": "client",
+ "d711f501-12e6-41d3-a198-bac932a59e43": "server",
+ "da8fb510-86a0-412d-b5f6-bebf4b7b684e": "client/src",
+ "d7c20839-7648-4b2e-980c-34451d5fe2f5": "server/src",
+ "b2d0f981-e7ca-4198-8667-cea6223eec55": "client/src/components",
+ "a5c7ee46-66da-4ad8-b8b4-3736b05c52fe": "client/src/store",
+ "371b34ae-cbaa-4e87-840e-d0c9402151ee": "client/src/contexts",
+ "35307dbb-2b39-4bd6-8292-83ef929f2753": "client/src/App.tsx",
+ "fe3b543a-b777-4de4-a701-fb6e32f40856": "server/src/routes",
+ "ad9178c9-0c30-487e-9d00-8d2365103d3e": "server/src/controllers",
+ "649326d9-9708-4ec9-ac72-a2a42e4940a8": "client/src/components/Header.tsx",
+ "edbf8a7c-c30e-4cdb-9f1a-a644e288545a": "client/src/components/AuthModal.tsx",
+ "368f4d45-c375-4deb-a743-d41954e70e60": "client/src/store/useModalStore.ts",
+ "e913aa23-2ff5-4d6d-a9d6-8daca5868608": "client/src/contexts/AuthContext.tsx",
+ "54b2bbbe-bc90-49dc-b3d0-54f065f50de6": "server/src/routes/auth.ts",
+ "72eb881f-a369-4cd8-849e-826913bc6b0d": "server/src/controllers/auth",
+ "08d59670-ec4f-4067-8d41-516fe342a0d0": "server/src/controllers/auth/register.ts",
+ "c8d3b6e7-da7d-4f44-b5b2-140478164e6d": "client/src/components/Header.tsx-simstep-9a365f8b-4c43-45fd-be23-489dd8db1993",
+ "24bcd8ba-03ae-4d18-8f76-cf62a230e3bb": "client/src/components/AuthModal.tsx-simstep-29ca8194-0e30-457f-8b12-b5c109f7fc3e",
+ "1e35d36b-a724-4061-9544-2c7244be44e4": "client/src/contexts/AuthContext.tsx-simstep-cecc2553-623f-4636-ab51-c15dcaa69ad1",
+ "54507d90-4f4e-402d-b303-2b406ed8164c": "server/src/routes/auth.ts-simstep-4b16ca26-0458-43aa-b290-f110383ba37a",
+ "92b8002e-ce3e-4996-b91a-4cceb4252bf6": "server/src/controllers/auth/register.ts-simstep-2fa6cc67-8d85-4c55-9beb-0f72732745a2",
+ "2772c0d7-97e2-4233-ab82-6cd3f877cba3": "server/src/controllers/auth/register.ts-simstep-efe94557-4475-4b7d-aec7-738c0af8db4a",
+ "1d511c6e-e17f-442b-9c53-2707ce018d0e": "client/src/contexts/AuthContext.tsx-simstep-21ad8fa0-ef6c-4a4e-91ab-4e2d27202293",
+ "1318001f-496b-4d35-a409-e9a663af2ab6": "client/src/App.tsx-simstep-fc6b748f-e289-4599-b554-485a008a7ec2",
+ "8948504f-8858-43a0-b450-18c53f0463c4": "generated-edge-simstep-97aec2c0-b4b5-43aa-8d8f-1d5210e2dc05-8948504f-8858-43a0-b450-18c53f0463c4",
+ "19930381-fb52-49ee-acf4-26b601c4e472": "generated-edge-simstep-e9270f42-ded3-406e-8554-0bba453c251a-19930381-fb52-49ee-acf4-26b601c4e472",
+ "4dbc65b6-c709-4d7b-ac3b-70a09a8bb298": "generated-edge-simstep-32795267-714e-4e31-b6cb-9e5f9df0870f-4dbc65b6-c709-4d7b-ac3b-70a09a8bb298",
+ "2fc7a9d8-03fc-4024-b4b6-e4d5a410cbcb": "generated-edge-simstep-0bd9de78-7906-4448-bf16-71d3773e97b3-2fc7a9d8-03fc-4024-b4b6-e4d5a410cbcb",
+ "679c7f85-e590-47c6-8c24-563ccf724809": "generated-edge-simstep-8567ff6e-fd44-4c3f-90c0-9717ba3d68f8-679c7f85-e590-47c6-8c24-563ccf724809",
+ "9095a876-c605-4cdd-805e-783859a4af66": "generated-edge-simstep-a02e8369-01da-45fd-bc1f-0e0d8e3f9259-9095a876-c605-4cdd-805e-783859a4af66",
+ "d957fcef-0c6a-43f3-b916-ac2ae153c01a": "generated-edge-simstep-08615c0c-4ead-49ed-a46c-32e614961175-d957fcef-0c6a-43f3-b916-ac2ae153c01a",
+ "6b0c8c10-99c4-4025-a1de-3533aabc2706": "server/src/utils",
+ "ba6bef99-6bad-4ad3-ba64-470387cc82a0": "server/src/middlewares",
+ "ca4e5909-a14c-4fbf-82ce-d6b7563996aa": "server/src/utils/jwt.ts",
+ "60e6ddfc-955b-4d32-88f4-b72717755ca0": "server/src/middlewares/check-bearer-token.ts",
+ "d0af3c91-2239-4bcf-963a-46b46e53df15": "server/src/controllers/auth/login.ts",
+ "9996e9fc-8310-4af7-8bf0-e522654ce609": "server/src/controllers/auth/login-with-token.ts",
+ "a0845367-b17f-4546-aa1b-b022d86c06ec": "client/src/components/AuthModal.tsx-simstep-7bc6bab8-0745-401e-b151-412beaa566f5",
+ "8e1c07ba-d9a3-4430-88ef-2e5a81305e6e": "client/src/contexts/AuthContext.tsx-simstep-ed630bcc-8c95-497c-a9ec-1c1e662df7dc",
+ "b74fd5c5-7266-45c7-a495-4590578d6c54": "server/src/routes/auth.ts-simstep-b81f2a41-79d7-4c62-b0c1-bd2e1a543861",
+ "967b3ba0-a170-4ffa-8e55-fc1d4ac5d176": "server/src/controllers/auth/login.ts-simstep-ad5973a3-40f5-4ca0-9052-23ad8dbca59c",
+ "73b9f32d-e3ff-44a1-9aa6-19a0c6e850e2": "server/src/utils/jwt.ts-simstep-ff0f0893-0790-4bb9-9261-8f0adbe4c74e",
+ "48b49746-8d01-4c7d-a33f-29b19e5ec82b": "server/src/controllers/auth/login.ts-simstep-eac75eff-2f15-4831-965d-f552810bd842",
+ "2aa4105f-fcf1-467f-ac6e-a9bbebc9ce20": "client/src/contexts/AuthContext.tsx-simstep-a8da8463-2a18-4570-82b6-979af6e157f3",
+ "a3928a32-8a71-4158-81fa-e9f80859e080": "client/src/components/Header.tsx-simstep-0c6452b2-276a-492f-9699-9ae419104110",
+ "6f87a835-d97b-4900-807e-d2411bec2555": "client/src/contexts/AuthContext.tsx-simstep-bdf35532-987a-43b7-8728-7bf2aac68635",
+ "ee37c2a5-645e-47c6-88ef-1fc178afd61b": "client/src/contexts/AuthContext.tsx-simstep-774e6c94-7869-47f9-af7b-0aedb89583b0",
+ "27695e56-23c6-428c-a6d6-40e2ff2a405e": "client/src/contexts/AuthContext.tsx-simstep-eea281fd-43b3-4a7b-88fa-0ba67052ac9d",
+ "a9176022-b548-4b88-b654-7a9c8a8a3c4a": "server/src/routes/auth.ts-simstep-79ebe914-3f55-4963-b7d0-9aa9e9e846ab",
+ "b70bf149-2d0a-4d6b-8330-a0fbb67bec21": "server/src/middlewares/check-bearer-token.ts-simstep-1f10910e-0c81-4d5a-8b09-6ac1b71da146",
+ "8807bc2c-ee2e-4362-8c17-9c3fbf6f3e96": "server/src/controllers/auth/login-with-token.ts-simstep-25236aad-75ed-4584-aaaf-abfd6cd53d8a",
+ "38460399-e6b8-4b73-a4f2-e1c95e45dffe": "client/src/contexts/AuthContext.tsx-simstep-69a33bcc-2d0f-412d-95b8-91bb19f8d324",
+ "c2f8b323-50b0-4f30-bfdc-0dad0fcb16ad": "generated-edge-simstep-c9187bf3-692d-42ed-a5af-e68375797b88-c2f8b323-50b0-4f30-bfdc-0dad0fcb16ad",
+ "1c3cacce-e2c7-4e4e-b029-b8c6b938b2d5": "generated-edge-simstep-f216b206-0ee5-4bd4-8144-b52a67ca71ce-1c3cacce-e2c7-4e4e-b029-b8c6b938b2d5",
+ "ae7fd8be-e838-47e3-9cae-b608370098b1": "generated-edge-simstep-6b68301e-36b5-4928-9bb4-d4d34b0fad35-ae7fd8be-e838-47e3-9cae-b608370098b1",
+ "e1dead14-1180-40d8-b879-d95f0d335bc4": "generated-edge-simstep-153e8dcd-f7a5-4677-b430-b8136526d0c2-e1dead14-1180-40d8-b879-d95f0d335bc4",
+ "94fcc1ad-5f35-48c0-934a-f5d45f9a6b81": "generated-edge-simstep-0f5f2efe-b610-42c7-b307-2b8cf725310b-94fcc1ad-5f35-48c0-934a-f5d45f9a6b81",
+ "4325d0e4-e23a-4103-a1d8-ef31166e85b7": "generated-edge-simstep-ab9e9e78-9f0b-4b2b-8790-fdee77dbb424-4325d0e4-e23a-4103-a1d8-ef31166e85b7",
+ "4741e371-9e7c-4e39-ab01-b1184618f3e8": "generated-edge-simstep-41a361f7-9dc1-4fb0-a9d1-4fa9ef5f3dab-4741e371-9e7c-4e39-ab01-b1184618f3e8",
+ "be90e1b5-be9a-4a51-a655-5d54b360e946": "generated-edge-simstep-40b090eb-e7a6-479d-88a8-8093d1809b92-be90e1b5-be9a-4a51-a655-5d54b360e946",
+ "5328217c-abc7-45ba-8b2f-d41278eeb9bb": "generated-edge-simstep-22eca662-3cd3-496d-af97-581a6ef20ac4-5328217c-abc7-45ba-8b2f-d41278eeb9bb",
+ "bfb9019d-ef6b-4aa4-8dfc-13d1c4e4670c": "generated-edge-simstep-d2be7e38-2e5a-4d75-b228-0ff3e6a7dfee-bfb9019d-ef6b-4aa4-8dfc-13d1c4e4670c",
+ "c6a1a053-d8c1-4373-98fb-e5f1d6eadbf6": "generated-edge-simstep-9e7a46e5-ecbd-4122-abc4-e1d87c040b4e-c6a1a053-d8c1-4373-98fb-e5f1d6eadbf6",
+ "1e690fca-603a-4c1b-9547-c0ab060a6eb8": "generated-edge-simstep-a8368508-94e9-405e-9201-36ad2d4d04ab-1e690fca-603a-4c1b-9547-c0ab060a6eb8",
+ "96c507f5-0c17-49eb-bea0-74f09e19dc8d": "generated-edge-simstep-790d8fc0-c549-4e18-90f2-6577a2ad8293-96c507f5-0c17-49eb-bea0-74f09e19dc8d",
+ "e154e166-10fd-48f9-ae35-ea2268431ae3": "README.md",
+ "822c947c-b5ab-406b-b912-317a6e1d2d2d": "server/.env.example",
+ "b9af25a3-630c-4566-ad2a-9703672a9784": "client/.env.example",
+ "cd5ab2f6-addd-406c-869f-2af315413aa9": "server/src/index.ts",
+ "5bd9bd98-3928-4e13-92bb-24d1ed63767e": "client/src/utils",
+ "85f99289-abb1-4c89-99a2-7bb71225a8fd": "client/src/index.tsx",
+ "a20d5a28-d673-40cf-9167-7521637cd90f": "server/src/utils/mongo.ts",
+ "7737e2a8-9862-40d1-b963-5b48eb79c4dd": "client/src/utils/axios.ts",
+ "402d5462-d4b2-4dca-9792-3bdc9924d62d": "README.md-simstep-f289db0f-2fc7-4bae-90b2-b65b93165514",
+ "8771af61-1959-41a0-8e72-8756637f8f6b": "server/.env.example-simstep-25a4c26f-27de-42be-b2dd-811b38ffd3cb",
+ "83e47a5d-b6da-410b-b9c4-0e97028193b5": "README.md-simstep-060778c4-20d2-4702-ba2e-e2925e45ef71",
+ "d09bdb0d-f63c-4704-b187-ed94ba5f3513": "server/src/utils/mongo.ts-simstep-245a5b16-55a2-49dd-9c98-f24cf04ba37a",
+ "20ceddd6-660a-4670-bf3d-4bde35f11a21": "README.md-simstep-10d915e4-650f-4602-bcbb-8584ef379390",
+ "dc187b3c-9951-43c2-9eb7-0e2df3f3b32b": "client/.env.example-simstep-a9d7adbe-ce82-4917-a3fa-ed537983df5a",
+ "2a19acc2-3c48-4fb7-aa10-62a907ae8b1f": "README.md-simstep-1b9179ad-6de3-4826-a403-1ea50460c329",
+ "7fb1005d-c3f4-4787-b18f-86daf7d53fb8": "client/src/utils/axios.ts-simstep-91e5baad-f212-4102-ad32-c126b83e9222",
+ "54d4abe9-937d-4ba9-97b7-107f6c48de2f": "generated-edge-simstep-17a3edec-f328-46e7-99ed-1a434c69e424-54d4abe9-937d-4ba9-97b7-107f6c48de2f",
+ "272af1ab-8c2b-443b-9568-56685efb5ce5": "generated-edge-simstep-f0cd3ca0-3d66-4a26-8a8f-7c8043809171-272af1ab-8c2b-443b-9568-56685efb5ce5",
+ "bbb03333-e082-49e2-944e-84d060ac4287": "generated-edge-simstep-a21f3189-0ea9-4c24-a4b0-03ac9098b4bc-bbb03333-e082-49e2-944e-84d060ac4287",
+ "b4b5fd99-d66d-4784-b841-6663327cb40e": "generated-edge-simstep-f8909b27-6fb3-4149-9daa-870169b694f6-b4b5fd99-d66d-4784-b841-6663327cb40e",
+ "340539c6-be61-4592-96b0-a26933b2ab1d": "generated-edge-simstep-9d1af39a-4c6f-4bc9-911b-588dda27baa3-340539c6-be61-4592-96b0-a26933b2ab1d",
+ "c21a4385-acb6-4379-b0fc-b064418b41f9": "generated-edge-simstep-ad20b5a5-cd6d-4c5f-a874-21603900fa94-c21a4385-acb6-4379-b0fc-b064418b41f9",
+ "2c935c41-0451-4f6a-b475-696f0df2d9c6": "generated-edge-simstep-61813dc3-50a3-4ed1-8248-cf1976947d8d-2c935c41-0451-4f6a-b475-696f0df2d9c6"
+ },
+ "repoData": {
+ "README.md": {
+ "path": "README.md",
+ "fileName": "README.md",
+ "cellName": "README.md",
+ "cellId": "e154e166-10fd-48f9-ae35-ea2268431ae3",
+ "visible": true,
+ "children": [
+ "README.md-simstep-f289db0f-2fc7-4bae-90b2-b65b93165514",
+ "README.md-simstep-060778c4-20d2-4702-ba2e-e2925e45ef71",
+ "README.md-simstep-10d915e4-650f-4602-bcbb-8584ef379390",
+ "README.md-simstep-1b9179ad-6de3-4826-a403-1ea50460c329"
+ ]
+ },
+ "client": {
+ "path": "client",
+ "fileName": "client",
+ "cellName": "client",
+ "cellId": "665eb622-621d-4a77-bf0d-28f9052cd3bf",
+ "visible": true,
+ "children": [
+ "client/src",
+ "client/.env.example"
+ ]
+ },
+ "client/.env.example": {
+ "path": "client/.env.example",
+ "fileName": ".env.example",
+ "cellName": ".env.example",
+ "cellId": "b9af25a3-630c-4566-ad2a-9703672a9784",
+ "visible": true,
+ "parentCellId": "665eb622-621d-4a77-bf0d-28f9052cd3bf",
+ "children": [
+ "client/.env.example-simstep-a9d7adbe-ce82-4917-a3fa-ed537983df5a"
+ ]
+ },
+ "client/src": {
+ "path": "client/src",
+ "fileName": "src",
+ "cellName": "src",
+ "cellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e",
+ "visible": true,
+ "parentCellId": "665eb622-621d-4a77-bf0d-28f9052cd3bf",
+ "children": [
+ "client/src/components",
+ "client/src/store",
+ "client/src/contexts",
+ "client/src/App.tsx",
+ "client/src/utils",
+ "client/src/index.tsx"
+ ]
+ },
+ "client/src/App.tsx": {
+ "path": "client/src/App.tsx",
+ "fileName": "App.tsx",
+ "cellName": "App.tsx",
+ "cellId": "35307dbb-2b39-4bd6-8292-83ef929f2753",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e",
+ "children": [
+ "client/src/App.tsx-simstep-fc6b748f-e289-4599-b554-485a008a7ec2"
+ ]
+ },
+ "client/src/components": {
+ "path": "client/src/components",
+ "fileName": "components",
+ "cellName": "components",
+ "cellId": "b2d0f981-e7ca-4198-8667-cea6223eec55",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e",
+ "children": [
+ "client/src/components/Header.tsx",
+ "client/src/components/AuthModal.tsx"
+ ]
+ },
+ "client/src/components/AuthModal.tsx": {
+ "path": "client/src/components/AuthModal.tsx",
+ "fileName": "AuthModal.tsx",
+ "cellName": "AuthModal.tsx",
+ "cellId": "edbf8a7c-c30e-4cdb-9f1a-a644e288545a",
+ "visible": true,
+ "parentCellId": "b2d0f981-e7ca-4198-8667-cea6223eec55",
+ "children": [
+ "client/src/components/AuthModal.tsx-simstep-29ca8194-0e30-457f-8b12-b5c109f7fc3e",
+ "client/src/components/AuthModal.tsx-simstep-7bc6bab8-0745-401e-b151-412beaa566f5"
+ ]
+ },
+ "client/src/components/Header.tsx": {
+ "path": "client/src/components/Header.tsx",
+ "fileName": "Header.tsx",
+ "cellName": "Header.tsx",
+ "cellId": "649326d9-9708-4ec9-ac72-a2a42e4940a8",
+ "visible": true,
+ "parentCellId": "b2d0f981-e7ca-4198-8667-cea6223eec55",
+ "children": [
+ "client/src/components/Header.tsx-simstep-9a365f8b-4c43-45fd-be23-489dd8db1993",
+ "client/src/components/Header.tsx-simstep-0c6452b2-276a-492f-9699-9ae419104110"
+ ]
+ },
+ "client/src/contexts": {
+ "path": "client/src/contexts",
+ "fileName": "contexts",
+ "cellName": "contexts",
+ "cellId": "371b34ae-cbaa-4e87-840e-d0c9402151ee",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e",
+ "children": [
+ "client/src/contexts/AuthContext.tsx"
+ ]
+ },
+ "client/src/contexts/AuthContext.tsx": {
+ "path": "client/src/contexts/AuthContext.tsx",
+ "fileName": "AuthContext.tsx",
+ "cellName": "AuthContext.tsx",
+ "cellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "visible": true,
+ "parentCellId": "371b34ae-cbaa-4e87-840e-d0c9402151ee",
+ "children": [
+ "client/src/contexts/AuthContext.tsx-simstep-cecc2553-623f-4636-ab51-c15dcaa69ad1",
+ "client/src/contexts/AuthContext.tsx-simstep-21ad8fa0-ef6c-4a4e-91ab-4e2d27202293",
+ "client/src/contexts/AuthContext.tsx-simstep-ed630bcc-8c95-497c-a9ec-1c1e662df7dc",
+ "client/src/contexts/AuthContext.tsx-simstep-a8da8463-2a18-4570-82b6-979af6e157f3",
+ "client/src/contexts/AuthContext.tsx-simstep-bdf35532-987a-43b7-8728-7bf2aac68635",
+ "client/src/contexts/AuthContext.tsx-simstep-774e6c94-7869-47f9-af7b-0aedb89583b0",
+ "client/src/contexts/AuthContext.tsx-simstep-eea281fd-43b3-4a7b-88fa-0ba67052ac9d",
+ "client/src/contexts/AuthContext.tsx-simstep-69a33bcc-2d0f-412d-95b8-91bb19f8d324"
+ ]
+ },
+ "client/src/index.tsx": {
+ "path": "client/src/index.tsx",
+ "fileName": "index.tsx",
+ "cellName": "index.tsx",
+ "cellId": "85f99289-abb1-4c89-99a2-7bb71225a8fd",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "client/src/store": {
+ "path": "client/src/store",
+ "fileName": "store",
+ "cellName": "store",
+ "cellId": "a5c7ee46-66da-4ad8-b8b4-3736b05c52fe",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e",
+ "children": [
+ "client/src/store/useModalStore.ts"
+ ]
+ },
+ "client/src/store/useModalStore.ts": {
+ "path": "client/src/store/useModalStore.ts",
+ "fileName": "useModalStore.ts",
+ "cellName": "useModalStore.ts",
+ "cellId": "368f4d45-c375-4deb-a743-d41954e70e60",
+ "visible": true,
+ "parentCellId": "a5c7ee46-66da-4ad8-b8b4-3736b05c52fe"
+ },
+ "client/src/utils": {
+ "path": "client/src/utils",
+ "fileName": "utils",
+ "cellName": "utils",
+ "cellId": "5bd9bd98-3928-4e13-92bb-24d1ed63767e",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e",
+ "children": [
+ "client/src/utils/axios.ts"
+ ]
+ },
+ "client/src/utils/axios.ts": {
+ "path": "client/src/utils/axios.ts",
+ "fileName": "axios.ts",
+ "cellName": "axios.ts",
+ "cellId": "7737e2a8-9862-40d1-b963-5b48eb79c4dd",
+ "visible": true,
+ "parentCellId": "5bd9bd98-3928-4e13-92bb-24d1ed63767e",
+ "children": [
+ "client/src/utils/axios.ts-simstep-91e5baad-f212-4102-ad32-c126b83e9222"
+ ]
+ },
+ "server": {
+ "path": "server",
+ "fileName": "server",
+ "cellName": "server",
+ "cellId": "d711f501-12e6-41d3-a198-bac932a59e43",
+ "visible": true,
+ "children": [
+ "server/src",
+ "server/.env.example"
+ ]
+ },
+ "server/.env.example": {
+ "path": "server/.env.example",
+ "fileName": ".env.example",
+ "cellName": ".env.example",
+ "cellId": "822c947c-b5ab-406b-b912-317a6e1d2d2d",
+ "visible": true,
+ "parentCellId": "d711f501-12e6-41d3-a198-bac932a59e43",
+ "children": [
+ "server/.env.example-simstep-25a4c26f-27de-42be-b2dd-811b38ffd3cb"
+ ]
+ },
+ "server/src": {
+ "path": "server/src",
+ "fileName": "src",
+ "cellName": "src",
+ "cellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5",
+ "visible": true,
+ "parentCellId": "d711f501-12e6-41d3-a198-bac932a59e43",
+ "children": [
+ "server/src/routes",
+ "server/src/controllers",
+ "server/src/utils",
+ "server/src/middlewares",
+ "server/src/index.ts"
+ ]
+ },
+ "server/src/controllers": {
+ "path": "server/src/controllers",
+ "fileName": "controllers",
+ "cellName": "controllers",
+ "cellId": "ad9178c9-0c30-487e-9d00-8d2365103d3e",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5",
+ "children": [
+ "server/src/controllers/auth"
+ ]
+ },
+ "server/src/controllers/auth": {
+ "path": "server/src/controllers/auth",
+ "fileName": "auth",
+ "cellName": "auth",
+ "cellId": "72eb881f-a369-4cd8-849e-826913bc6b0d",
+ "visible": true,
+ "parentCellId": "ad9178c9-0c30-487e-9d00-8d2365103d3e",
+ "children": [
+ "server/src/controllers/auth/register.ts",
+ "server/src/controllers/auth/login.ts",
+ "server/src/controllers/auth/login-with-token.ts"
+ ]
+ },
+ "server/src/controllers/auth/login-with-token.ts": {
+ "path": "server/src/controllers/auth/login-with-token.ts",
+ "fileName": "login-with-token.ts",
+ "cellName": "login-with-token.ts",
+ "cellId": "9996e9fc-8310-4af7-8bf0-e522654ce609",
+ "visible": true,
+ "parentCellId": "72eb881f-a369-4cd8-849e-826913bc6b0d",
+ "children": [
+ "server/src/controllers/auth/login-with-token.ts-simstep-25236aad-75ed-4584-aaaf-abfd6cd53d8a"
+ ]
+ },
+ "server/src/controllers/auth/login.ts": {
+ "path": "server/src/controllers/auth/login.ts",
+ "fileName": "login.ts",
+ "cellName": "login.ts",
+ "cellId": "d0af3c91-2239-4bcf-963a-46b46e53df15",
+ "visible": true,
+ "parentCellId": "72eb881f-a369-4cd8-849e-826913bc6b0d",
+ "children": [
+ "server/src/controllers/auth/login.ts-simstep-ad5973a3-40f5-4ca0-9052-23ad8dbca59c",
+ "server/src/controllers/auth/login.ts-simstep-eac75eff-2f15-4831-965d-f552810bd842"
+ ]
+ },
+ "server/src/controllers/auth/register.ts": {
+ "path": "server/src/controllers/auth/register.ts",
+ "fileName": "register.ts",
+ "cellName": "register.ts",
+ "cellId": "08d59670-ec4f-4067-8d41-516fe342a0d0",
+ "visible": true,
+ "parentCellId": "72eb881f-a369-4cd8-849e-826913bc6b0d",
+ "children": [
+ "server/src/controllers/auth/register.ts-simstep-2fa6cc67-8d85-4c55-9beb-0f72732745a2",
+ "server/src/controllers/auth/register.ts-simstep-efe94557-4475-4b7d-aec7-738c0af8db4a"
+ ]
+ },
+ "server/src/index.ts": {
+ "path": "server/src/index.ts",
+ "fileName": "index.ts",
+ "cellName": "index.ts",
+ "cellId": "cd5ab2f6-addd-406c-869f-2af315413aa9",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "server/src/middlewares": {
+ "path": "server/src/middlewares",
+ "fileName": "middlewares",
+ "cellName": "middlewares",
+ "cellId": "ba6bef99-6bad-4ad3-ba64-470387cc82a0",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5",
+ "children": [
+ "server/src/middlewares/check-bearer-token.ts"
+ ]
+ },
+ "server/src/middlewares/check-bearer-token.ts": {
+ "path": "server/src/middlewares/check-bearer-token.ts",
+ "fileName": "check-bearer-token.ts",
+ "cellName": "check-bearer-token.ts",
+ "cellId": "60e6ddfc-955b-4d32-88f4-b72717755ca0",
+ "visible": true,
+ "parentCellId": "ba6bef99-6bad-4ad3-ba64-470387cc82a0",
+ "children": [
+ "server/src/middlewares/check-bearer-token.ts-simstep-1f10910e-0c81-4d5a-8b09-6ac1b71da146"
+ ]
+ },
+ "server/src/routes": {
+ "path": "server/src/routes",
+ "fileName": "routes",
+ "cellName": "routes",
+ "cellId": "fe3b543a-b777-4de4-a701-fb6e32f40856",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5",
+ "children": [
+ "server/src/routes/auth.ts"
+ ]
+ },
+ "server/src/routes/auth.ts": {
+ "path": "server/src/routes/auth.ts",
+ "fileName": "auth.ts",
+ "cellName": "auth.ts",
+ "cellId": "54b2bbbe-bc90-49dc-b3d0-54f065f50de6",
+ "visible": true,
+ "parentCellId": "fe3b543a-b777-4de4-a701-fb6e32f40856",
+ "children": [
+ "server/src/routes/auth.ts-simstep-4b16ca26-0458-43aa-b290-f110383ba37a",
+ "server/src/routes/auth.ts-simstep-b81f2a41-79d7-4c62-b0c1-bd2e1a543861",
+ "server/src/routes/auth.ts-simstep-79ebe914-3f55-4963-b7d0-9aa9e9e846ab"
+ ]
+ },
+ "server/src/utils": {
+ "path": "server/src/utils",
+ "fileName": "utils",
+ "cellName": "utils",
+ "cellId": "6b0c8c10-99c4-4025-a1de-3533aabc2706",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5",
+ "children": [
+ "server/src/utils/jwt.ts",
+ "server/src/utils/mongo.ts"
+ ]
+ },
+ "server/src/utils/jwt.ts": {
+ "path": "server/src/utils/jwt.ts",
+ "fileName": "jwt.ts",
+ "cellName": "jwt.ts",
+ "cellId": "ca4e5909-a14c-4fbf-82ce-d6b7563996aa",
+ "visible": true,
+ "parentCellId": "6b0c8c10-99c4-4025-a1de-3533aabc2706",
+ "children": [
+ "server/src/utils/jwt.ts-simstep-ff0f0893-0790-4bb9-9261-8f0adbe4c74e"
+ ]
+ },
+ "server/src/utils/mongo.ts": {
+ "path": "server/src/utils/mongo.ts",
+ "fileName": "mongo.ts",
+ "cellName": "mongo.ts",
+ "cellId": "a20d5a28-d673-40cf-9167-7521637cd90f",
+ "visible": true,
+ "parentCellId": "6b0c8c10-99c4-4025-a1de-3533aabc2706",
+ "children": [
+ "server/src/utils/mongo.ts-simstep-245a5b16-55a2-49dd-9c98-f24cf04ba37a"
+ ]
+ },
+ "665eb622-621d-4a77-bf0d-28f9052cd3bf": {
+ "path": "665eb622-621d-4a77-bf0d-28f9052cd3bf",
+ "cellName": "client",
+ "cellId": "665eb622-621d-4a77-bf0d-28f9052cd3bf",
+ "visible": true
+ },
+ "d711f501-12e6-41d3-a198-bac932a59e43": {
+ "path": "d711f501-12e6-41d3-a198-bac932a59e43",
+ "cellName": "server",
+ "cellId": "d711f501-12e6-41d3-a198-bac932a59e43",
+ "visible": true
+ },
+ "da8fb510-86a0-412d-b5f6-bebf4b7b684e": {
+ "path": "da8fb510-86a0-412d-b5f6-bebf4b7b684e",
+ "cellName": "src",
+ "cellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e",
+ "visible": true,
+ "parentCellId": "665eb622-621d-4a77-bf0d-28f9052cd3bf"
+ },
+ "d7c20839-7648-4b2e-980c-34451d5fe2f5": {
+ "path": "d7c20839-7648-4b2e-980c-34451d5fe2f5",
+ "cellName": "src",
+ "cellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5",
+ "visible": true,
+ "parentCellId": "d711f501-12e6-41d3-a198-bac932a59e43"
+ },
+ "b2d0f981-e7ca-4198-8667-cea6223eec55": {
+ "path": "b2d0f981-e7ca-4198-8667-cea6223eec55",
+ "cellName": "components",
+ "cellId": "b2d0f981-e7ca-4198-8667-cea6223eec55",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "a5c7ee46-66da-4ad8-b8b4-3736b05c52fe": {
+ "path": "a5c7ee46-66da-4ad8-b8b4-3736b05c52fe",
+ "cellName": "store",
+ "cellId": "a5c7ee46-66da-4ad8-b8b4-3736b05c52fe",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "371b34ae-cbaa-4e87-840e-d0c9402151ee": {
+ "path": "371b34ae-cbaa-4e87-840e-d0c9402151ee",
+ "cellName": "contexts",
+ "cellId": "371b34ae-cbaa-4e87-840e-d0c9402151ee",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "35307dbb-2b39-4bd6-8292-83ef929f2753": {
+ "path": "35307dbb-2b39-4bd6-8292-83ef929f2753",
+ "cellName": "App.tsx",
+ "cellId": "35307dbb-2b39-4bd6-8292-83ef929f2753",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "fe3b543a-b777-4de4-a701-fb6e32f40856": {
+ "path": "fe3b543a-b777-4de4-a701-fb6e32f40856",
+ "cellName": "routes",
+ "cellId": "fe3b543a-b777-4de4-a701-fb6e32f40856",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "ad9178c9-0c30-487e-9d00-8d2365103d3e": {
+ "path": "ad9178c9-0c30-487e-9d00-8d2365103d3e",
+ "cellName": "controllers",
+ "cellId": "ad9178c9-0c30-487e-9d00-8d2365103d3e",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "649326d9-9708-4ec9-ac72-a2a42e4940a8": {
+ "path": "649326d9-9708-4ec9-ac72-a2a42e4940a8",
+ "cellName": "Header.tsx",
+ "cellId": "649326d9-9708-4ec9-ac72-a2a42e4940a8",
+ "visible": true,
+ "parentCellId": "b2d0f981-e7ca-4198-8667-cea6223eec55"
+ },
+ "edbf8a7c-c30e-4cdb-9f1a-a644e288545a": {
+ "path": "edbf8a7c-c30e-4cdb-9f1a-a644e288545a",
+ "cellName": "AuthModal.tsx",
+ "cellId": "edbf8a7c-c30e-4cdb-9f1a-a644e288545a",
+ "visible": true,
+ "parentCellId": "b2d0f981-e7ca-4198-8667-cea6223eec55"
+ },
+ "368f4d45-c375-4deb-a743-d41954e70e60": {
+ "path": "368f4d45-c375-4deb-a743-d41954e70e60",
+ "cellName": "useModalStore.ts",
+ "cellId": "368f4d45-c375-4deb-a743-d41954e70e60",
+ "visible": true,
+ "parentCellId": "a5c7ee46-66da-4ad8-b8b4-3736b05c52fe"
+ },
+ "e913aa23-2ff5-4d6d-a9d6-8daca5868608": {
+ "path": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "cellName": "AuthContext.tsx",
+ "cellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "visible": true,
+ "parentCellId": "371b34ae-cbaa-4e87-840e-d0c9402151ee"
+ },
+ "54b2bbbe-bc90-49dc-b3d0-54f065f50de6": {
+ "path": "54b2bbbe-bc90-49dc-b3d0-54f065f50de6",
+ "cellName": "auth.ts",
+ "cellId": "54b2bbbe-bc90-49dc-b3d0-54f065f50de6",
+ "visible": true,
+ "parentCellId": "fe3b543a-b777-4de4-a701-fb6e32f40856"
+ },
+ "72eb881f-a369-4cd8-849e-826913bc6b0d": {
+ "path": "72eb881f-a369-4cd8-849e-826913bc6b0d",
+ "cellName": "auth",
+ "cellId": "72eb881f-a369-4cd8-849e-826913bc6b0d",
+ "visible": true,
+ "parentCellId": "ad9178c9-0c30-487e-9d00-8d2365103d3e"
+ },
+ "08d59670-ec4f-4067-8d41-516fe342a0d0": {
+ "path": "08d59670-ec4f-4067-8d41-516fe342a0d0",
+ "cellName": "register.ts",
+ "cellId": "08d59670-ec4f-4067-8d41-516fe342a0d0",
+ "visible": true,
+ "parentCellId": "72eb881f-a369-4cd8-849e-826913bc6b0d"
+ },
+ "c8d3b6e7-da7d-4f44-b5b2-140478164e6d": {
+ "path": "c8d3b6e7-da7d-4f44-b5b2-140478164e6d",
+ "cellName": "Initiate Registration - Header.tsx:L32-35",
+ "cellId": "c8d3b6e7-da7d-4f44-b5b2-140478164e6d",
+ "visible": true,
+ "parentCellId": "649326d9-9708-4ec9-ac72-a2a42e4940a8"
+ },
+ "client/src/components/Header.tsx-simstep-9a365f8b-4c43-45fd-be23-489dd8db1993": {
+ "path": "client/src/components/Header.tsx-simstep-9a365f8b-4c43-45fd-be23-489dd8db1993",
+ "fileName": "Header.tsx",
+ "cellName": "Initiate Registration - Header.tsx:L32-35",
+ "cellId": "c8d3b6e7-da7d-4f44-b5b2-140478164e6d",
+ "visible": true,
+ "startLine": 32,
+ "endLine": 35,
+ "parentCellId": "649326d9-9708-4ec9-ac72-a2a42e4940a8",
+ "parentPath": "client/src/components/Header.tsx"
+ },
+ "24bcd8ba-03ae-4d18-8f76-cf62a230e3bb": {
+ "path": "24bcd8ba-03ae-4d18-8f76-cf62a230e3bb",
+ "cellName": "Render Registration Form - AuthModal.tsx:L13-15",
+ "cellId": "24bcd8ba-03ae-4d18-8f76-cf62a230e3bb",
+ "visible": true,
+ "parentCellId": "edbf8a7c-c30e-4cdb-9f1a-a644e288545a"
+ },
+ "client/src/components/AuthModal.tsx-simstep-29ca8194-0e30-457f-8b12-b5c109f7fc3e": {
+ "path": "client/src/components/AuthModal.tsx-simstep-29ca8194-0e30-457f-8b12-b5c109f7fc3e",
+ "fileName": "AuthModal.tsx",
+ "cellName": "Render Registration Form - AuthModal.tsx:L13-15",
+ "cellId": "24bcd8ba-03ae-4d18-8f76-cf62a230e3bb",
+ "visible": true,
+ "startLine": 13,
+ "endLine": 15,
+ "parentCellId": "edbf8a7c-c30e-4cdb-9f1a-a644e288545a",
+ "parentPath": "client/src/components/AuthModal.tsx"
+ },
+ "1e35d36b-a724-4061-9544-2c7244be44e4": {
+ "path": "1e35d36b-a724-4061-9544-2c7244be44e4",
+ "cellName": "Client-Side: Send API Request - AuthContext.tsx:L36-45",
+ "cellId": "1e35d36b-a724-4061-9544-2c7244be44e4",
+ "visible": true,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608"
+ },
+ "client/src/contexts/AuthContext.tsx-simstep-cecc2553-623f-4636-ab51-c15dcaa69ad1": {
+ "path": "client/src/contexts/AuthContext.tsx-simstep-cecc2553-623f-4636-ab51-c15dcaa69ad1",
+ "fileName": "AuthContext.tsx",
+ "cellName": "Client-Side: Send API Request - AuthContext.tsx:L36-45",
+ "cellId": "1e35d36b-a724-4061-9544-2c7244be44e4",
+ "visible": true,
+ "startLine": 36,
+ "endLine": 45,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "parentPath": "client/src/contexts/AuthContext.tsx"
+ },
+ "54507d90-4f4e-402d-b303-2b406ed8164c": {
+ "path": "54507d90-4f4e-402d-b303-2b406ed8164c",
+ "cellName": "Server-Side: Route Handling - auth.ts:L12",
+ "cellId": "54507d90-4f4e-402d-b303-2b406ed8164c",
+ "visible": true,
+ "parentCellId": "54b2bbbe-bc90-49dc-b3d0-54f065f50de6"
+ },
+ "server/src/routes/auth.ts-simstep-4b16ca26-0458-43aa-b290-f110383ba37a": {
+ "path": "server/src/routes/auth.ts-simstep-4b16ca26-0458-43aa-b290-f110383ba37a",
+ "fileName": "auth.ts",
+ "cellName": "Server-Side: Route Handling - auth.ts:L12",
+ "cellId": "54507d90-4f4e-402d-b303-2b406ed8164c",
+ "visible": true,
+ "startLine": 12,
+ "endLine": 12,
+ "parentCellId": "54b2bbbe-bc90-49dc-b3d0-54f065f50de6",
+ "parentPath": "server/src/routes/auth.ts"
+ },
+ "92b8002e-ce3e-4996-b91a-4cceb4252bf6": {
+ "path": "92b8002e-ce3e-4996-b91a-4cceb4252bf6",
+ "cellName": "Server-Side: Account Creation - register.ts:L33-37",
+ "cellId": "92b8002e-ce3e-4996-b91a-4cceb4252bf6",
+ "visible": true,
+ "parentCellId": "08d59670-ec4f-4067-8d41-516fe342a0d0"
+ },
+ "server/src/controllers/auth/register.ts-simstep-2fa6cc67-8d85-4c55-9beb-0f72732745a2": {
+ "path": "server/src/controllers/auth/register.ts-simstep-2fa6cc67-8d85-4c55-9beb-0f72732745a2",
+ "fileName": "register.ts",
+ "cellName": "Server-Side: Account Creation - register.ts:L33-37",
+ "cellId": "92b8002e-ce3e-4996-b91a-4cceb4252bf6",
+ "visible": true,
+ "startLine": 33,
+ "endLine": 37,
+ "parentCellId": "08d59670-ec4f-4067-8d41-516fe342a0d0",
+ "parentPath": "server/src/controllers/auth/register.ts"
+ },
+ "2772c0d7-97e2-4233-ab82-6cd3f877cba3": {
+ "path": "2772c0d7-97e2-4233-ab82-6cd3f877cba3",
+ "cellName": "Server-Side: Generate Token and Respond - register.ts:L40-47",
+ "cellId": "2772c0d7-97e2-4233-ab82-6cd3f877cba3",
+ "visible": true,
+ "parentCellId": "08d59670-ec4f-4067-8d41-516fe342a0d0"
+ },
+ "server/src/controllers/auth/register.ts-simstep-efe94557-4475-4b7d-aec7-738c0af8db4a": {
+ "path": "server/src/controllers/auth/register.ts-simstep-efe94557-4475-4b7d-aec7-738c0af8db4a",
+ "fileName": "register.ts",
+ "cellName": "Server-Side: Generate Token and Respond - register.ts:L40-47",
+ "cellId": "2772c0d7-97e2-4233-ab82-6cd3f877cba3",
+ "visible": true,
+ "startLine": 40,
+ "endLine": 47,
+ "parentCellId": "08d59670-ec4f-4067-8d41-516fe342a0d0",
+ "parentPath": "server/src/controllers/auth/register.ts"
+ },
+ "1d511c6e-e17f-442b-9c53-2707ce018d0e": {
+ "path": "1d511c6e-e17f-442b-9c53-2707ce018d0e",
+ "cellName": "Client-Side: Process Response and Update State - AuthContext.tsx:L39-43",
+ "cellId": "1d511c6e-e17f-442b-9c53-2707ce018d0e",
+ "visible": true,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608"
+ },
+ "client/src/contexts/AuthContext.tsx-simstep-21ad8fa0-ef6c-4a4e-91ab-4e2d27202293": {
+ "path": "client/src/contexts/AuthContext.tsx-simstep-21ad8fa0-ef6c-4a4e-91ab-4e2d27202293",
+ "fileName": "AuthContext.tsx",
+ "cellName": "Client-Side: Process Response and Update State - AuthContext.tsx:L39-43",
+ "cellId": "1d511c6e-e17f-442b-9c53-2707ce018d0e",
+ "visible": true,
+ "startLine": 39,
+ "endLine": 43,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "parentPath": "client/src/contexts/AuthContext.tsx"
+ },
+ "1318001f-496b-4d35-a409-e9a663af2ab6": {
+ "path": "1318001f-496b-4d35-a409-e9a663af2ab6",
+ "cellName": "UI Update: Reflect Authenticated State - App.tsx:L35-37",
+ "cellId": "1318001f-496b-4d35-a409-e9a663af2ab6",
+ "visible": true,
+ "parentCellId": "35307dbb-2b39-4bd6-8292-83ef929f2753"
+ },
+ "client/src/App.tsx-simstep-fc6b748f-e289-4599-b554-485a008a7ec2": {
+ "path": "client/src/App.tsx-simstep-fc6b748f-e289-4599-b554-485a008a7ec2",
+ "fileName": "App.tsx",
+ "cellName": "UI Update: Reflect Authenticated State - App.tsx:L35-37",
+ "cellId": "1318001f-496b-4d35-a409-e9a663af2ab6",
+ "visible": true,
+ "startLine": 35,
+ "endLine": 37,
+ "parentCellId": "35307dbb-2b39-4bd6-8292-83ef929f2753",
+ "parentPath": "client/src/App.tsx"
+ },
+ "8948504f-8858-43a0-b450-18c53f0463c4": {
+ "path": "8948504f-8858-43a0-b450-18c53f0463c4",
+ "cellName": "State Update:\nShow Modal",
+ "cellId": "8948504f-8858-43a0-b450-18c53f0463c4",
+ "visible": true,
+ "parentCellId": "b2d0f981-e7ca-4198-8667-cea6223eec55"
+ },
+ "generated-edge-simstep-97aec2c0-b4b5-43aa-8d8f-1d5210e2dc05-8948504f-8858-43a0-b450-18c53f0463c4": {
+ "path": "generated-edge-simstep-97aec2c0-b4b5-43aa-8d8f-1d5210e2dc05-8948504f-8858-43a0-b450-18c53f0463c4",
+ "cellName": "State Update: Show Modal",
+ "cellId": "8948504f-8858-43a0-b450-18c53f0463c4",
+ "visible": true
+ },
+ "19930381-fb52-49ee-acf4-26b601c4e472": {
+ "path": "19930381-fb52-49ee-acf4-26b601c4e472",
+ "cellName": "Form Submission",
+ "cellId": "19930381-fb52-49ee-acf4-26b601c4e472",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "generated-edge-simstep-e9270f42-ded3-406e-8554-0bba453c251a-19930381-fb52-49ee-acf4-26b601c4e472": {
+ "path": "generated-edge-simstep-e9270f42-ded3-406e-8554-0bba453c251a-19930381-fb52-49ee-acf4-26b601c4e472",
+ "cellName": "Form Submission",
+ "cellId": "19930381-fb52-49ee-acf4-26b601c4e472",
+ "visible": true
+ },
+ "4dbc65b6-c709-4d7b-ac3b-70a09a8bb298": {
+ "path": "4dbc65b6-c709-4d7b-ac3b-70a09a8bb298",
+ "cellName": "API Call:\nClient to\nServer",
+ "cellId": "4dbc65b6-c709-4d7b-ac3b-70a09a8bb298",
+ "visible": true
+ },
+ "generated-edge-simstep-32795267-714e-4e31-b6cb-9e5f9df0870f-4dbc65b6-c709-4d7b-ac3b-70a09a8bb298": {
+ "path": "generated-edge-simstep-32795267-714e-4e31-b6cb-9e5f9df0870f-4dbc65b6-c709-4d7b-ac3b-70a09a8bb298",
+ "cellName": "API Call: Client to Server",
+ "cellId": "4dbc65b6-c709-4d7b-ac3b-70a09a8bb298",
+ "visible": true
+ },
+ "2fc7a9d8-03fc-4024-b4b6-e4d5a410cbcb": {
+ "path": "2fc7a9d8-03fc-4024-b4b6-e4d5a410cbcb",
+ "cellName": "Database Query:\nCheck Uniqueness",
+ "cellId": "2fc7a9d8-03fc-4024-b4b6-e4d5a410cbcb",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "generated-edge-simstep-0bd9de78-7906-4448-bf16-71d3773e97b3-2fc7a9d8-03fc-4024-b4b6-e4d5a410cbcb": {
+ "path": "generated-edge-simstep-0bd9de78-7906-4448-bf16-71d3773e97b3-2fc7a9d8-03fc-4024-b4b6-e4d5a410cbcb",
+ "cellName": "Database Query: Check Uniqueness",
+ "cellId": "2fc7a9d8-03fc-4024-b4b6-e4d5a410cbcb",
+ "visible": true
+ },
+ "679c7f85-e590-47c6-8c24-563ccf724809": {
+ "path": "679c7f85-e590-47c6-8c24-563ccf724809",
+ "cellName": "Database Write:\nPersist Account",
+ "cellId": "679c7f85-e590-47c6-8c24-563ccf724809",
+ "visible": true,
+ "parentCellId": "08d59670-ec4f-4067-8d41-516fe342a0d0"
+ },
+ "generated-edge-simstep-8567ff6e-fd44-4c3f-90c0-9717ba3d68f8-679c7f85-e590-47c6-8c24-563ccf724809": {
+ "path": "generated-edge-simstep-8567ff6e-fd44-4c3f-90c0-9717ba3d68f8-679c7f85-e590-47c6-8c24-563ccf724809",
+ "cellName": "Database Write: Persist Account",
+ "cellId": "679c7f85-e590-47c6-8c24-563ccf724809",
+ "visible": true
+ },
+ "9095a876-c605-4cdd-805e-783859a4af66": {
+ "path": "9095a876-c605-4cdd-805e-783859a4af66",
+ "cellName": "API Response:\nServer to\nClient",
+ "cellId": "9095a876-c605-4cdd-805e-783859a4af66",
+ "visible": true
+ },
+ "generated-edge-simstep-a02e8369-01da-45fd-bc1f-0e0d8e3f9259-9095a876-c605-4cdd-805e-783859a4af66": {
+ "path": "generated-edge-simstep-a02e8369-01da-45fd-bc1f-0e0d8e3f9259-9095a876-c605-4cdd-805e-783859a4af66",
+ "cellName": "API Response: Server to Client",
+ "cellId": "9095a876-c605-4cdd-805e-783859a4af66",
+ "visible": true
+ },
+ "d957fcef-0c6a-43f3-b916-ac2ae153c01a": {
+ "path": "d957fcef-0c6a-43f3-b916-ac2ae153c01a",
+ "cellName": "React Context\nPropagation",
+ "cellId": "d957fcef-0c6a-43f3-b916-ac2ae153c01a",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "generated-edge-simstep-08615c0c-4ead-49ed-a46c-32e614961175-d957fcef-0c6a-43f3-b916-ac2ae153c01a": {
+ "path": "generated-edge-simstep-08615c0c-4ead-49ed-a46c-32e614961175-d957fcef-0c6a-43f3-b916-ac2ae153c01a",
+ "cellName": "React Context Propagation",
+ "cellId": "d957fcef-0c6a-43f3-b916-ac2ae153c01a",
+ "visible": true
+ },
+ "6b0c8c10-99c4-4025-a1de-3533aabc2706": {
+ "path": "6b0c8c10-99c4-4025-a1de-3533aabc2706",
+ "cellName": "utils",
+ "cellId": "6b0c8c10-99c4-4025-a1de-3533aabc2706",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "ba6bef99-6bad-4ad3-ba64-470387cc82a0": {
+ "path": "ba6bef99-6bad-4ad3-ba64-470387cc82a0",
+ "cellName": "middlewares",
+ "cellId": "ba6bef99-6bad-4ad3-ba64-470387cc82a0",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "ca4e5909-a14c-4fbf-82ce-d6b7563996aa": {
+ "path": "ca4e5909-a14c-4fbf-82ce-d6b7563996aa",
+ "cellName": "jwt.ts",
+ "cellId": "ca4e5909-a14c-4fbf-82ce-d6b7563996aa",
+ "visible": true,
+ "parentCellId": "6b0c8c10-99c4-4025-a1de-3533aabc2706"
+ },
+ "60e6ddfc-955b-4d32-88f4-b72717755ca0": {
+ "path": "60e6ddfc-955b-4d32-88f4-b72717755ca0",
+ "cellName": "check-bearer-token.ts",
+ "cellId": "60e6ddfc-955b-4d32-88f4-b72717755ca0",
+ "visible": true,
+ "parentCellId": "ba6bef99-6bad-4ad3-ba64-470387cc82a0"
+ },
+ "d0af3c91-2239-4bcf-963a-46b46e53df15": {
+ "path": "d0af3c91-2239-4bcf-963a-46b46e53df15",
+ "cellName": "login.ts",
+ "cellId": "d0af3c91-2239-4bcf-963a-46b46e53df15",
+ "visible": true,
+ "parentCellId": "72eb881f-a369-4cd8-849e-826913bc6b0d"
+ },
+ "9996e9fc-8310-4af7-8bf0-e522654ce609": {
+ "path": "9996e9fc-8310-4af7-8bf0-e522654ce609",
+ "cellName": "login-with-token.ts",
+ "cellId": "9996e9fc-8310-4af7-8bf0-e522654ce609",
+ "visible": true,
+ "parentCellId": "72eb881f-a369-4cd8-849e-826913bc6b0d"
+ },
+ "a0845367-b17f-4546-aa1b-b022d86c06ec": {
+ "path": "a0845367-b17f-4546-aa1b-b022d86c06ec",
+ "cellName": "[Login Flow] User Submits Credentials - AuthModal.tsx:L26-36",
+ "cellId": "a0845367-b17f-4546-aa1b-b022d86c06ec",
+ "visible": true,
+ "parentCellId": "edbf8a7c-c30e-4cdb-9f1a-a644e288545a"
+ },
+ "client/src/components/AuthModal.tsx-simstep-7bc6bab8-0745-401e-b151-412beaa566f5": {
+ "path": "client/src/components/AuthModal.tsx-simstep-7bc6bab8-0745-401e-b151-412beaa566f5",
+ "fileName": "AuthModal.tsx",
+ "cellName": "[Login Flow] User Submits Credentials - AuthModal.tsx:L26-36",
+ "cellId": "a0845367-b17f-4546-aa1b-b022d86c06ec",
+ "visible": true,
+ "startLine": 26,
+ "endLine": 36,
+ "parentCellId": "edbf8a7c-c30e-4cdb-9f1a-a644e288545a",
+ "parentPath": "client/src/components/AuthModal.tsx"
+ },
+ "8e1c07ba-d9a3-4430-88ef-2e5a81305e6e": {
+ "path": "8e1c07ba-d9a3-4430-88ef-2e5a81305e6e",
+ "cellName": "[Login Flow] Send Login Request to Backend - AuthContext.tsx:L51-62",
+ "cellId": "8e1c07ba-d9a3-4430-88ef-2e5a81305e6e",
+ "visible": true,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608"
+ },
+ "client/src/contexts/AuthContext.tsx-simstep-ed630bcc-8c95-497c-a9ec-1c1e662df7dc": {
+ "path": "client/src/contexts/AuthContext.tsx-simstep-ed630bcc-8c95-497c-a9ec-1c1e662df7dc",
+ "fileName": "AuthContext.tsx",
+ "cellName": "[Login Flow] Send Login Request to Backend - AuthContext.tsx:L51-62",
+ "cellId": "8e1c07ba-d9a3-4430-88ef-2e5a81305e6e",
+ "visible": true,
+ "startLine": 51,
+ "endLine": 62,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "parentPath": "client/src/contexts/AuthContext.tsx"
+ },
+ "b74fd5c5-7266-45c7-a495-4590578d6c54": {
+ "path": "b74fd5c5-7266-45c7-a495-4590578d6c54",
+ "cellName": "[Login Flow] Route Request to Login Controller - auth.ts:L15",
+ "cellId": "b74fd5c5-7266-45c7-a495-4590578d6c54",
+ "visible": true,
+ "parentCellId": "54b2bbbe-bc90-49dc-b3d0-54f065f50de6"
+ },
+ "server/src/routes/auth.ts-simstep-b81f2a41-79d7-4c62-b0c1-bd2e1a543861": {
+ "path": "server/src/routes/auth.ts-simstep-b81f2a41-79d7-4c62-b0c1-bd2e1a543861",
+ "fileName": "auth.ts",
+ "cellName": "[Login Flow] Route Request to Login Controller - auth.ts:L15",
+ "cellId": "b74fd5c5-7266-45c7-a495-4590578d6c54",
+ "visible": true,
+ "startLine": 15,
+ "endLine": 15,
+ "parentCellId": "54b2bbbe-bc90-49dc-b3d0-54f065f50de6",
+ "parentPath": "server/src/routes/auth.ts"
+ },
+ "967b3ba0-a170-4ffa-8e55-fc1d4ac5d176": {
+ "path": "967b3ba0-a170-4ffa-8e55-fc1d4ac5d176",
+ "cellName": "[Login Flow] Verify Credentials and Generate JWT - login.ts:L8-59",
+ "cellId": "967b3ba0-a170-4ffa-8e55-fc1d4ac5d176",
+ "visible": true,
+ "parentCellId": "d0af3c91-2239-4bcf-963a-46b46e53df15"
+ },
+ "server/src/controllers/auth/login.ts-simstep-ad5973a3-40f5-4ca0-9052-23ad8dbca59c": {
+ "path": "server/src/controllers/auth/login.ts-simstep-ad5973a3-40f5-4ca0-9052-23ad8dbca59c",
+ "fileName": "login.ts",
+ "cellName": "[Login Flow] Verify Credentials and Generate JWT - login.ts:L8-59",
+ "cellId": "967b3ba0-a170-4ffa-8e55-fc1d4ac5d176",
+ "visible": true,
+ "startLine": 8,
+ "endLine": 59,
+ "parentCellId": "d0af3c91-2239-4bcf-963a-46b46e53df15",
+ "parentPath": "server/src/controllers/auth/login.ts"
+ },
+ "73b9f32d-e3ff-44a1-9aa6-19a0c6e850e2": {
+ "path": "73b9f32d-e3ff-44a1-9aa6-19a0c6e850e2",
+ "cellName": "[Login Flow] JWT Generation - jwt.ts:L12-16",
+ "cellId": "73b9f32d-e3ff-44a1-9aa6-19a0c6e850e2",
+ "visible": true,
+ "parentCellId": "ca4e5909-a14c-4fbf-82ce-d6b7563996aa"
+ },
+ "server/src/utils/jwt.ts-simstep-ff0f0893-0790-4bb9-9261-8f0adbe4c74e": {
+ "path": "server/src/utils/jwt.ts-simstep-ff0f0893-0790-4bb9-9261-8f0adbe4c74e",
+ "fileName": "jwt.ts",
+ "cellName": "[Login Flow] JWT Generation - jwt.ts:L12-16",
+ "cellId": "73b9f32d-e3ff-44a1-9aa6-19a0c6e850e2",
+ "visible": true,
+ "startLine": 12,
+ "endLine": 16,
+ "parentCellId": "ca4e5909-a14c-4fbf-82ce-d6b7563996aa",
+ "parentPath": "server/src/utils/jwt.ts"
+ },
+ "48b49746-8d01-4c7d-a33f-29b19e5ec82b": {
+ "path": "48b49746-8d01-4c7d-a33f-29b19e5ec82b",
+ "cellName": "[Login Flow] Send Success Response to Client - login.ts:L49-54",
+ "cellId": "48b49746-8d01-4c7d-a33f-29b19e5ec82b",
+ "visible": true,
+ "parentCellId": "d0af3c91-2239-4bcf-963a-46b46e53df15"
+ },
+ "server/src/controllers/auth/login.ts-simstep-eac75eff-2f15-4831-965d-f552810bd842": {
+ "path": "server/src/controllers/auth/login.ts-simstep-eac75eff-2f15-4831-965d-f552810bd842",
+ "fileName": "login.ts",
+ "cellName": "[Login Flow] Send Success Response to Client - login.ts:L49-54",
+ "cellId": "48b49746-8d01-4c7d-a33f-29b19e5ec82b",
+ "visible": true,
+ "startLine": 49,
+ "endLine": 54,
+ "parentCellId": "d0af3c91-2239-4bcf-963a-46b46e53df15",
+ "parentPath": "server/src/controllers/auth/login.ts"
+ },
+ "2aa4105f-fcf1-467f-ac6e-a9bbebc9ce20": {
+ "path": "2aa4105f-fcf1-467f-ac6e-a9bbebc9ce20",
+ "cellName": "[Login Flow] Update Client State and Storage - AuthContext.tsx:L55-58",
+ "cellId": "2aa4105f-fcf1-467f-ac6e-a9bbebc9ce20",
+ "visible": true,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608"
+ },
+ "client/src/contexts/AuthContext.tsx-simstep-a8da8463-2a18-4570-82b6-979af6e157f3": {
+ "path": "client/src/contexts/AuthContext.tsx-simstep-a8da8463-2a18-4570-82b6-979af6e157f3",
+ "fileName": "AuthContext.tsx",
+ "cellName": "[Login Flow] Update Client State and Storage - AuthContext.tsx:L55-58",
+ "cellId": "2aa4105f-fcf1-467f-ac6e-a9bbebc9ce20",
+ "visible": true,
+ "startLine": 55,
+ "endLine": 58,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "parentPath": "client/src/contexts/AuthContext.tsx"
+ },
+ "a3928a32-8a71-4158-81fa-e9f80859e080": {
+ "path": "a3928a32-8a71-4158-81fa-e9f80859e080",
+ "cellName": "[Login Flow] UI Re-renders with Logged-In State - Header.tsx:L56-64",
+ "cellId": "a3928a32-8a71-4158-81fa-e9f80859e080",
+ "visible": true,
+ "parentCellId": "649326d9-9708-4ec9-ac72-a2a42e4940a8"
+ },
+ "client/src/components/Header.tsx-simstep-0c6452b2-276a-492f-9699-9ae419104110": {
+ "path": "client/src/components/Header.tsx-simstep-0c6452b2-276a-492f-9699-9ae419104110",
+ "fileName": "Header.tsx",
+ "cellName": "[Login Flow] UI Re-renders with Logged-In State - Header.tsx:L56-64",
+ "cellId": "a3928a32-8a71-4158-81fa-e9f80859e080",
+ "visible": true,
+ "startLine": 56,
+ "endLine": 64,
+ "parentCellId": "649326d9-9708-4ec9-ac72-a2a42e4940a8",
+ "parentPath": "client/src/components/Header.tsx"
+ },
+ "6f87a835-d97b-4900-807e-d2411bec2555": {
+ "path": "6f87a835-d97b-4900-807e-d2411bec2555",
+ "cellName": "[Session Persistence Flow] App Load and State Initialization - AuthContext.tsx:L29",
+ "cellId": "6f87a835-d97b-4900-807e-d2411bec2555",
+ "visible": true,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608"
+ },
+ "client/src/contexts/AuthContext.tsx-simstep-bdf35532-987a-43b7-8728-7bf2aac68635": {
+ "path": "client/src/contexts/AuthContext.tsx-simstep-bdf35532-987a-43b7-8728-7bf2aac68635",
+ "fileName": "AuthContext.tsx",
+ "cellName": "[Session Persistence Flow] App Load and State Initialization - AuthContext.tsx:L29",
+ "cellId": "6f87a835-d97b-4900-807e-d2411bec2555",
+ "visible": true,
+ "startLine": 29,
+ "endLine": 29,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "parentPath": "client/src/contexts/AuthContext.tsx"
+ },
+ "ee37c2a5-645e-47c6-88ef-1fc178afd61b": {
+ "path": "ee37c2a5-645e-47c6-88ef-1fc178afd61b",
+ "cellName": "[Session Persistence Flow] Trigger Re-authentication - AuthContext.tsx:L107-109",
+ "cellId": "ee37c2a5-645e-47c6-88ef-1fc178afd61b",
+ "visible": true,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608"
+ },
+ "client/src/contexts/AuthContext.tsx-simstep-774e6c94-7869-47f9-af7b-0aedb89583b0": {
+ "path": "client/src/contexts/AuthContext.tsx-simstep-774e6c94-7869-47f9-af7b-0aedb89583b0",
+ "fileName": "AuthContext.tsx",
+ "cellName": "[Session Persistence Flow] Trigger Re-authentication - AuthContext.tsx:L107-109",
+ "cellId": "ee37c2a5-645e-47c6-88ef-1fc178afd61b",
+ "visible": true,
+ "startLine": 107,
+ "endLine": 109,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "parentPath": "client/src/contexts/AuthContext.tsx"
+ },
+ "27695e56-23c6-428c-a6d6-40e2ff2a405e": {
+ "path": "27695e56-23c6-428c-a6d6-40e2ff2a405e",
+ "cellName": "[Session Persistence Flow] Send Token for Verification - AuthContext.tsx:L74-88",
+ "cellId": "27695e56-23c6-428c-a6d6-40e2ff2a405e",
+ "visible": true,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608"
+ },
+ "client/src/contexts/AuthContext.tsx-simstep-eea281fd-43b3-4a7b-88fa-0ba67052ac9d": {
+ "path": "client/src/contexts/AuthContext.tsx-simstep-eea281fd-43b3-4a7b-88fa-0ba67052ac9d",
+ "fileName": "AuthContext.tsx",
+ "cellName": "[Session Persistence Flow] Send Token for Verification - AuthContext.tsx:L74-88",
+ "cellId": "27695e56-23c6-428c-a6d6-40e2ff2a405e",
+ "visible": true,
+ "startLine": 74,
+ "endLine": 88,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "parentPath": "client/src/contexts/AuthContext.tsx"
+ },
+ "a9176022-b548-4b88-b654-7a9c8a8a3c4a": {
+ "path": "a9176022-b548-4b88-b654-7a9c8a8a3c4a",
+ "cellName": "[Session Persistence Flow] Route Request through Middleware - auth.ts:L18",
+ "cellId": "a9176022-b548-4b88-b654-7a9c8a8a3c4a",
+ "visible": true,
+ "parentCellId": "54b2bbbe-bc90-49dc-b3d0-54f065f50de6"
+ },
+ "server/src/routes/auth.ts-simstep-79ebe914-3f55-4963-b7d0-9aa9e9e846ab": {
+ "path": "server/src/routes/auth.ts-simstep-79ebe914-3f55-4963-b7d0-9aa9e9e846ab",
+ "fileName": "auth.ts",
+ "cellName": "[Session Persistence Flow] Route Request through Middleware - auth.ts:L18",
+ "cellId": "a9176022-b548-4b88-b654-7a9c8a8a3c4a",
+ "visible": true,
+ "startLine": 18,
+ "endLine": 18,
+ "parentCellId": "54b2bbbe-bc90-49dc-b3d0-54f065f50de6",
+ "parentPath": "server/src/routes/auth.ts"
+ },
+ "b70bf149-2d0a-4d6b-8330-a0fbb67bec21": {
+ "path": "b70bf149-2d0a-4d6b-8330-a0fbb67bec21",
+ "cellName": "[Session Persistence Flow] Verify Bearer Token - check-bearer-token.ts:L4-35",
+ "cellId": "b70bf149-2d0a-4d6b-8330-a0fbb67bec21",
+ "visible": true,
+ "parentCellId": "60e6ddfc-955b-4d32-88f4-b72717755ca0"
+ },
+ "server/src/middlewares/check-bearer-token.ts-simstep-1f10910e-0c81-4d5a-8b09-6ac1b71da146": {
+ "path": "server/src/middlewares/check-bearer-token.ts-simstep-1f10910e-0c81-4d5a-8b09-6ac1b71da146",
+ "fileName": "check-bearer-token.ts",
+ "cellName": "[Session Persistence Flow] Verify Bearer Token - check-bearer-token.ts:L4-35",
+ "cellId": "b70bf149-2d0a-4d6b-8330-a0fbb67bec21",
+ "visible": true,
+ "startLine": 4,
+ "endLine": 35,
+ "parentCellId": "60e6ddfc-955b-4d32-88f4-b72717755ca0",
+ "parentPath": "server/src/middlewares/check-bearer-token.ts"
+ },
+ "8807bc2c-ee2e-4362-8c17-9c3fbf6f3e96": {
+ "path": "8807bc2c-ee2e-4362-8c17-9c3fbf6f3e96",
+ "cellName": "[Session Persistence Flow] Fetch Account and Refresh Token - login-with-token.ts:L5-32",
+ "cellId": "8807bc2c-ee2e-4362-8c17-9c3fbf6f3e96",
+ "visible": true,
+ "parentCellId": "9996e9fc-8310-4af7-8bf0-e522654ce609"
+ },
+ "server/src/controllers/auth/login-with-token.ts-simstep-25236aad-75ed-4584-aaaf-abfd6cd53d8a": {
+ "path": "server/src/controllers/auth/login-with-token.ts-simstep-25236aad-75ed-4584-aaaf-abfd6cd53d8a",
+ "fileName": "login-with-token.ts",
+ "cellName": "[Session Persistence Flow] Fetch Account and Refresh Token - login-with-token.ts:L5-32",
+ "cellId": "8807bc2c-ee2e-4362-8c17-9c3fbf6f3e96",
+ "visible": true,
+ "startLine": 5,
+ "endLine": 32,
+ "parentCellId": "9996e9fc-8310-4af7-8bf0-e522654ce609",
+ "parentPath": "server/src/controllers/auth/login-with-token.ts"
+ },
+ "38460399-e6b8-4b73-a4f2-e1c95e45dffe": {
+ "path": "38460399-e6b8-4b73-a4f2-e1c95e45dffe",
+ "cellName": "[Session Persistence Flow] Update Client State and Storage - AuthContext.tsx:L83-87",
+ "cellId": "38460399-e6b8-4b73-a4f2-e1c95e45dffe",
+ "visible": true,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608"
+ },
+ "client/src/contexts/AuthContext.tsx-simstep-69a33bcc-2d0f-412d-95b8-91bb19f8d324": {
+ "path": "client/src/contexts/AuthContext.tsx-simstep-69a33bcc-2d0f-412d-95b8-91bb19f8d324",
+ "fileName": "AuthContext.tsx",
+ "cellName": "[Session Persistence Flow] Update Client State and Storage - AuthContext.tsx:L83-87",
+ "cellId": "38460399-e6b8-4b73-a4f2-e1c95e45dffe",
+ "visible": true,
+ "startLine": 83,
+ "endLine": 87,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608",
+ "parentPath": "client/src/contexts/AuthContext.tsx"
+ },
+ "c2f8b323-50b0-4f30-bfdc-0dad0fcb16ad": {
+ "path": "c2f8b323-50b0-4f30-bfdc-0dad0fcb16ad",
+ "cellName": "[Login Flow]\nCall Context\nLogin Function",
+ "cellId": "c2f8b323-50b0-4f30-bfdc-0dad0fcb16ad",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "generated-edge-simstep-c9187bf3-692d-42ed-a5af-e68375797b88-c2f8b323-50b0-4f30-bfdc-0dad0fcb16ad": {
+ "path": "generated-edge-simstep-c9187bf3-692d-42ed-a5af-e68375797b88-c2f8b323-50b0-4f30-bfdc-0dad0fcb16ad",
+ "cellName": "[Login Flow] Call Context Login Function",
+ "cellId": "c2f8b323-50b0-4f30-bfdc-0dad0fcb16ad",
+ "visible": true
+ },
+ "1c3cacce-e2c7-4e4e-b029-b8c6b938b2d5": {
+ "path": "1c3cacce-e2c7-4e4e-b029-b8c6b938b2d5",
+ "cellName": "[Login Flow]\nAPI Call:\nPOST /auth/login",
+ "cellId": "1c3cacce-e2c7-4e4e-b029-b8c6b938b2d5",
+ "visible": true
+ },
+ "generated-edge-simstep-f216b206-0ee5-4bd4-8144-b52a67ca71ce-1c3cacce-e2c7-4e4e-b029-b8c6b938b2d5": {
+ "path": "generated-edge-simstep-f216b206-0ee5-4bd4-8144-b52a67ca71ce-1c3cacce-e2c7-4e4e-b029-b8c6b938b2d5",
+ "cellName": "[Login Flow] API Call: POST /auth/login",
+ "cellId": "1c3cacce-e2c7-4e4e-b029-b8c6b938b2d5",
+ "visible": true
+ },
+ "ae7fd8be-e838-47e3-9cae-b608370098b1": {
+ "path": "ae7fd8be-e838-47e3-9cae-b608370098b1",
+ "cellName": "[Login Flow]\nInvoke Login\nController",
+ "cellId": "ae7fd8be-e838-47e3-9cae-b608370098b1",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "generated-edge-simstep-6b68301e-36b5-4928-9bb4-d4d34b0fad35-ae7fd8be-e838-47e3-9cae-b608370098b1": {
+ "path": "generated-edge-simstep-6b68301e-36b5-4928-9bb4-d4d34b0fad35-ae7fd8be-e838-47e3-9cae-b608370098b1",
+ "cellName": "[Login Flow] Invoke Login Controller",
+ "cellId": "ae7fd8be-e838-47e3-9cae-b608370098b1",
+ "visible": true
+ },
+ "e1dead14-1180-40d8-b879-d95f0d335bc4": {
+ "path": "e1dead14-1180-40d8-b879-d95f0d335bc4",
+ "cellName": "[Login Flow]\nSign JWT",
+ "cellId": "e1dead14-1180-40d8-b879-d95f0d335bc4",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "generated-edge-simstep-153e8dcd-f7a5-4677-b430-b8136526d0c2-e1dead14-1180-40d8-b879-d95f0d335bc4": {
+ "path": "generated-edge-simstep-153e8dcd-f7a5-4677-b430-b8136526d0c2-e1dead14-1180-40d8-b879-d95f0d335bc4",
+ "cellName": "[Login Flow] Sign JWT",
+ "cellId": "e1dead14-1180-40d8-b879-d95f0d335bc4",
+ "visible": true
+ },
+ "94fcc1ad-5f35-48c0-934a-f5d45f9a6b81": {
+ "path": "94fcc1ad-5f35-48c0-934a-f5d45f9a6b81",
+ "cellName": "[Login Flow]\nReturn Generated\nToken",
+ "cellId": "94fcc1ad-5f35-48c0-934a-f5d45f9a6b81",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "generated-edge-simstep-0f5f2efe-b610-42c7-b307-2b8cf725310b-94fcc1ad-5f35-48c0-934a-f5d45f9a6b81": {
+ "path": "generated-edge-simstep-0f5f2efe-b610-42c7-b307-2b8cf725310b-94fcc1ad-5f35-48c0-934a-f5d45f9a6b81",
+ "cellName": "[Login Flow] Return Generated Token",
+ "cellId": "94fcc1ad-5f35-48c0-934a-f5d45f9a6b81",
+ "visible": true
+ },
+ "4325d0e4-e23a-4103-a1d8-ef31166e85b7": {
+ "path": "4325d0e4-e23a-4103-a1d8-ef31166e85b7",
+ "cellName": "[Login Flow]\nClient Receives\nAuth Data",
+ "cellId": "4325d0e4-e23a-4103-a1d8-ef31166e85b7",
+ "visible": true
+ },
+ "generated-edge-simstep-ab9e9e78-9f0b-4b2b-8790-fdee77dbb424-4325d0e4-e23a-4103-a1d8-ef31166e85b7": {
+ "path": "generated-edge-simstep-ab9e9e78-9f0b-4b2b-8790-fdee77dbb424-4325d0e4-e23a-4103-a1d8-ef31166e85b7",
+ "cellName": "[Login Flow] Client Receives Auth Data",
+ "cellId": "4325d0e4-e23a-4103-a1d8-ef31166e85b7",
+ "visible": true
+ },
+ "4741e371-9e7c-4e39-ab01-b1184618f3e8": {
+ "path": "4741e371-9e7c-4e39-ab01-b1184618f3e8",
+ "cellName": "[Login Flow]\nPropagate Auth\nState via\nContext",
+ "cellId": "4741e371-9e7c-4e39-ab01-b1184618f3e8",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "generated-edge-simstep-41a361f7-9dc1-4fb0-a9d1-4fa9ef5f3dab-4741e371-9e7c-4e39-ab01-b1184618f3e8": {
+ "path": "generated-edge-simstep-41a361f7-9dc1-4fb0-a9d1-4fa9ef5f3dab-4741e371-9e7c-4e39-ab01-b1184618f3e8",
+ "cellName": "[Login Flow] Propagate Auth State via Context",
+ "cellId": "4741e371-9e7c-4e39-ab01-b1184618f3e8",
+ "visible": true
+ },
+ "be90e1b5-be9a-4a51-a655-5d54b360e946": {
+ "path": "be90e1b5-be9a-4a51-a655-5d54b360e946",
+ "cellName": "[Session Persistence\nFlow] Token\nRead from\nLocal Storage",
+ "cellId": "be90e1b5-be9a-4a51-a655-5d54b360e946",
+ "visible": true,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608"
+ },
+ "generated-edge-simstep-40b090eb-e7a6-479d-88a8-8093d1809b92-be90e1b5-be9a-4a51-a655-5d54b360e946": {
+ "path": "generated-edge-simstep-40b090eb-e7a6-479d-88a8-8093d1809b92-be90e1b5-be9a-4a51-a655-5d54b360e946",
+ "cellName": "[Session Persistence Flow] Token Read from Local Storage",
+ "cellId": "be90e1b5-be9a-4a51-a655-5d54b360e946",
+ "visible": true
+ },
+ "5328217c-abc7-45ba-8b2f-d41278eeb9bb": {
+ "path": "5328217c-abc7-45ba-8b2f-d41278eeb9bb",
+ "cellName": "[Session Persistence\nFlow] Call\nloginWithToken Function",
+ "cellId": "5328217c-abc7-45ba-8b2f-d41278eeb9bb",
+ "visible": true,
+ "parentCellId": "e913aa23-2ff5-4d6d-a9d6-8daca5868608"
+ },
+ "generated-edge-simstep-22eca662-3cd3-496d-af97-581a6ef20ac4-5328217c-abc7-45ba-8b2f-d41278eeb9bb": {
+ "path": "generated-edge-simstep-22eca662-3cd3-496d-af97-581a6ef20ac4-5328217c-abc7-45ba-8b2f-d41278eeb9bb",
+ "cellName": "[Session Persistence Flow] Call loginWithToken Function",
+ "cellId": "5328217c-abc7-45ba-8b2f-d41278eeb9bb",
+ "visible": true
+ },
+ "bfb9019d-ef6b-4aa4-8dfc-13d1c4e4670c": {
+ "path": "bfb9019d-ef6b-4aa4-8dfc-13d1c4e4670c",
+ "cellName": "[Session Persistence\nFlow] API\nCall: GET\n/auth/login",
+ "cellId": "bfb9019d-ef6b-4aa4-8dfc-13d1c4e4670c",
+ "visible": true
+ },
+ "generated-edge-simstep-d2be7e38-2e5a-4d75-b228-0ff3e6a7dfee-bfb9019d-ef6b-4aa4-8dfc-13d1c4e4670c": {
+ "path": "generated-edge-simstep-d2be7e38-2e5a-4d75-b228-0ff3e6a7dfee-bfb9019d-ef6b-4aa4-8dfc-13d1c4e4670c",
+ "cellName": "[Session Persistence Flow] API Call: GET /auth/login",
+ "cellId": "bfb9019d-ef6b-4aa4-8dfc-13d1c4e4670c",
+ "visible": true
+ },
+ "c6a1a053-d8c1-4373-98fb-e5f1d6eadbf6": {
+ "path": "c6a1a053-d8c1-4373-98fb-e5f1d6eadbf6",
+ "cellName": "[Session Persistence\nFlow] Invoke\nToken Verification\nMiddleware",
+ "cellId": "c6a1a053-d8c1-4373-98fb-e5f1d6eadbf6",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "generated-edge-simstep-9e7a46e5-ecbd-4122-abc4-e1d87c040b4e-c6a1a053-d8c1-4373-98fb-e5f1d6eadbf6": {
+ "path": "generated-edge-simstep-9e7a46e5-ecbd-4122-abc4-e1d87c040b4e-c6a1a053-d8c1-4373-98fb-e5f1d6eadbf6",
+ "cellName": "[Session Persistence Flow] Invoke Token Verification Middleware",
+ "cellId": "c6a1a053-d8c1-4373-98fb-e5f1d6eadbf6",
+ "visible": true
+ },
+ "1e690fca-603a-4c1b-9547-c0ab060a6eb8": {
+ "path": "1e690fca-603a-4c1b-9547-c0ab060a6eb8",
+ "cellName": "[Session Persistence\nFlow] Pass\nControl to\nController",
+ "cellId": "1e690fca-603a-4c1b-9547-c0ab060a6eb8",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "generated-edge-simstep-a8368508-94e9-405e-9201-36ad2d4d04ab-1e690fca-603a-4c1b-9547-c0ab060a6eb8": {
+ "path": "generated-edge-simstep-a8368508-94e9-405e-9201-36ad2d4d04ab-1e690fca-603a-4c1b-9547-c0ab060a6eb8",
+ "cellName": "[Session Persistence Flow] Pass Control to Controller",
+ "cellId": "1e690fca-603a-4c1b-9547-c0ab060a6eb8",
+ "visible": true
+ },
+ "96c507f5-0c17-49eb-bea0-74f09e19dc8d": {
+ "path": "96c507f5-0c17-49eb-bea0-74f09e19dc8d",
+ "cellName": "[Session Persistence\nFlow] Client\nReceives Refreshed\nAuth Data",
+ "cellId": "96c507f5-0c17-49eb-bea0-74f09e19dc8d",
+ "visible": true
+ },
+ "generated-edge-simstep-790d8fc0-c549-4e18-90f2-6577a2ad8293-96c507f5-0c17-49eb-bea0-74f09e19dc8d": {
+ "path": "generated-edge-simstep-790d8fc0-c549-4e18-90f2-6577a2ad8293-96c507f5-0c17-49eb-bea0-74f09e19dc8d",
+ "cellName": "[Session Persistence Flow] Client Receives Refreshed Auth Data",
+ "cellId": "96c507f5-0c17-49eb-bea0-74f09e19dc8d",
+ "visible": true
+ },
+ "e154e166-10fd-48f9-ae35-ea2268431ae3": {
+ "path": "e154e166-10fd-48f9-ae35-ea2268431ae3",
+ "cellName": "README.md",
+ "cellId": "e154e166-10fd-48f9-ae35-ea2268431ae3",
+ "visible": true
+ },
+ "822c947c-b5ab-406b-b912-317a6e1d2d2d": {
+ "path": "822c947c-b5ab-406b-b912-317a6e1d2d2d",
+ "cellName": ".env.example",
+ "cellId": "822c947c-b5ab-406b-b912-317a6e1d2d2d",
+ "visible": true,
+ "parentCellId": "d711f501-12e6-41d3-a198-bac932a59e43"
+ },
+ "b9af25a3-630c-4566-ad2a-9703672a9784": {
+ "path": "b9af25a3-630c-4566-ad2a-9703672a9784",
+ "cellName": ".env.example",
+ "cellId": "b9af25a3-630c-4566-ad2a-9703672a9784",
+ "visible": true,
+ "parentCellId": "665eb622-621d-4a77-bf0d-28f9052cd3bf"
+ },
+ "cd5ab2f6-addd-406c-869f-2af315413aa9": {
+ "path": "cd5ab2f6-addd-406c-869f-2af315413aa9",
+ "cellName": "index.ts",
+ "cellId": "cd5ab2f6-addd-406c-869f-2af315413aa9",
+ "visible": true,
+ "parentCellId": "d7c20839-7648-4b2e-980c-34451d5fe2f5"
+ },
+ "5bd9bd98-3928-4e13-92bb-24d1ed63767e": {
+ "path": "5bd9bd98-3928-4e13-92bb-24d1ed63767e",
+ "cellName": "utils",
+ "cellId": "5bd9bd98-3928-4e13-92bb-24d1ed63767e",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "85f99289-abb1-4c89-99a2-7bb71225a8fd": {
+ "path": "85f99289-abb1-4c89-99a2-7bb71225a8fd",
+ "cellName": "index.tsx",
+ "cellId": "85f99289-abb1-4c89-99a2-7bb71225a8fd",
+ "visible": true,
+ "parentCellId": "da8fb510-86a0-412d-b5f6-bebf4b7b684e"
+ },
+ "a20d5a28-d673-40cf-9167-7521637cd90f": {
+ "path": "a20d5a28-d673-40cf-9167-7521637cd90f",
+ "cellName": "mongo.ts",
+ "cellId": "a20d5a28-d673-40cf-9167-7521637cd90f",
+ "visible": true,
+ "parentCellId": "6b0c8c10-99c4-4025-a1de-3533aabc2706"
+ },
+ "7737e2a8-9862-40d1-b963-5b48eb79c4dd": {
+ "path": "7737e2a8-9862-40d1-b963-5b48eb79c4dd",
+ "cellName": "axios.ts",
+ "cellId": "7737e2a8-9862-40d1-b963-5b48eb79c4dd",
+ "visible": true,
+ "parentCellId": "5bd9bd98-3928-4e13-92bb-24d1ed63767e"
+ },
+ "402d5462-d4b2-4dca-9792-3bdc9924d62d": {
+ "path": "402d5462-d4b2-4dca-9792-3bdc9924d62d",
+ "cellName": "Server Setup: Install Dependencies - README.md:L34-37",
+ "cellId": "402d5462-d4b2-4dca-9792-3bdc9924d62d",
+ "visible": true,
+ "parentCellId": "e154e166-10fd-48f9-ae35-ea2268431ae3"
+ },
+ "README.md-simstep-f289db0f-2fc7-4bae-90b2-b65b93165514": {
+ "path": "README.md-simstep-f289db0f-2fc7-4bae-90b2-b65b93165514",
+ "fileName": "README.md",
+ "cellName": "Server Setup: Install Dependencies - README.md:L34-37",
+ "cellId": "402d5462-d4b2-4dca-9792-3bdc9924d62d",
+ "visible": true,
+ "startLine": 34,
+ "endLine": 37,
+ "parentCellId": "e154e166-10fd-48f9-ae35-ea2268431ae3",
+ "parentPath": "README.md"
+ },
+ "8771af61-1959-41a0-8e72-8756637f8f6b": {
+ "path": "8771af61-1959-41a0-8e72-8756637f8f6b",
+ "cellName": "Server Setup: Configure Environment - .env.example:L1",
+ "cellId": "8771af61-1959-41a0-8e72-8756637f8f6b",
+ "visible": true,
+ "parentCellId": "822c947c-b5ab-406b-b912-317a6e1d2d2d"
+ },
+ "server/.env.example-simstep-25a4c26f-27de-42be-b2dd-811b38ffd3cb": {
+ "path": "server/.env.example-simstep-25a4c26f-27de-42be-b2dd-811b38ffd3cb",
+ "fileName": ".env.example",
+ "cellName": "Server Setup: Configure Environment - .env.example:L1",
+ "cellId": "8771af61-1959-41a0-8e72-8756637f8f6b",
+ "visible": true,
+ "startLine": 1,
+ "endLine": 1,
+ "parentCellId": "822c947c-b5ab-406b-b912-317a6e1d2d2d",
+ "parentPath": "server/.env.example"
+ },
+ "83e47a5d-b6da-410b-b9c4-0e97028193b5": {
+ "path": "83e47a5d-b6da-410b-b9c4-0e97028193b5",
+ "cellName": "Server Setup: Start Development Server - README.md:L52-54",
+ "cellId": "83e47a5d-b6da-410b-b9c4-0e97028193b5",
+ "visible": true,
+ "parentCellId": "e154e166-10fd-48f9-ae35-ea2268431ae3"
+ },
+ "README.md-simstep-060778c4-20d2-4702-ba2e-e2925e45ef71": {
+ "path": "README.md-simstep-060778c4-20d2-4702-ba2e-e2925e45ef71",
+ "fileName": "README.md",
+ "cellName": "Server Setup: Start Development Server - README.md:L52-54",
+ "cellId": "83e47a5d-b6da-410b-b9c4-0e97028193b5",
+ "visible": true,
+ "startLine": 52,
+ "endLine": 54,
+ "parentCellId": "e154e166-10fd-48f9-ae35-ea2268431ae3",
+ "parentPath": "README.md"
+ },
+ "d09bdb0d-f63c-4704-b187-ed94ba5f3513": {
+ "path": "d09bdb0d-f63c-4704-b187-ed94ba5f3513",
+ "cellName": "Server Execution: Connect to MongoDB - mongo.ts:L1-10",
+ "cellId": "d09bdb0d-f63c-4704-b187-ed94ba5f3513",
+ "visible": true,
+ "parentCellId": "a20d5a28-d673-40cf-9167-7521637cd90f"
+ },
+ "server/src/utils/mongo.ts-simstep-245a5b16-55a2-49dd-9c98-f24cf04ba37a": {
+ "path": "server/src/utils/mongo.ts-simstep-245a5b16-55a2-49dd-9c98-f24cf04ba37a",
+ "fileName": "mongo.ts",
+ "cellName": "Server Execution: Connect to MongoDB - mongo.ts:L1-10",
+ "cellId": "d09bdb0d-f63c-4704-b187-ed94ba5f3513",
+ "visible": true,
+ "startLine": 1,
+ "endLine": 10,
+ "parentCellId": "a20d5a28-d673-40cf-9167-7521637cd90f",
+ "parentPath": "server/src/utils/mongo.ts"
+ },
+ "20ceddd6-660a-4670-bf3d-4bde35f11a21": {
+ "path": "20ceddd6-660a-4670-bf3d-4bde35f11a21",
+ "cellName": "Client Setup: Install Dependencies - README.md:L39-42",
+ "cellId": "20ceddd6-660a-4670-bf3d-4bde35f11a21",
+ "visible": true,
+ "parentCellId": "e154e166-10fd-48f9-ae35-ea2268431ae3"
+ },
+ "README.md-simstep-10d915e4-650f-4602-bcbb-8584ef379390": {
+ "path": "README.md-simstep-10d915e4-650f-4602-bcbb-8584ef379390",
+ "fileName": "README.md",
+ "cellName": "Client Setup: Install Dependencies - README.md:L39-42",
+ "cellId": "20ceddd6-660a-4670-bf3d-4bde35f11a21",
+ "visible": true,
+ "startLine": 39,
+ "endLine": 42,
+ "parentCellId": "e154e166-10fd-48f9-ae35-ea2268431ae3",
+ "parentPath": "README.md"
+ },
+ "dc187b3c-9951-43c2-9eb7-0e2df3f3b32b": {
+ "path": "dc187b3c-9951-43c2-9eb7-0e2df3f3b32b",
+ "cellName": "Client Setup: Configure Environment - .env.example:L1",
+ "cellId": "dc187b3c-9951-43c2-9eb7-0e2df3f3b32b",
+ "visible": true,
+ "parentCellId": "b9af25a3-630c-4566-ad2a-9703672a9784"
+ },
+ "client/.env.example-simstep-a9d7adbe-ce82-4917-a3fa-ed537983df5a": {
+ "path": "client/.env.example-simstep-a9d7adbe-ce82-4917-a3fa-ed537983df5a",
+ "fileName": ".env.example",
+ "cellName": "Client Setup: Configure Environment - .env.example:L1",
+ "cellId": "dc187b3c-9951-43c2-9eb7-0e2df3f3b32b",
+ "visible": true,
+ "startLine": 1,
+ "endLine": 1,
+ "parentCellId": "b9af25a3-630c-4566-ad2a-9703672a9784",
+ "parentPath": "client/.env.example"
+ },
+ "2a19acc2-3c48-4fb7-aa10-62a907ae8b1f": {
+ "path": "2a19acc2-3c48-4fb7-aa10-62a907ae8b1f",
+ "cellName": "Client Setup: Start Development Server - README.md:L57-59",
+ "cellId": "2a19acc2-3c48-4fb7-aa10-62a907ae8b1f",
+ "visible": true,
+ "parentCellId": "e154e166-10fd-48f9-ae35-ea2268431ae3"
+ },
+ "README.md-simstep-1b9179ad-6de3-4826-a403-1ea50460c329": {
+ "path": "README.md-simstep-1b9179ad-6de3-4826-a403-1ea50460c329",
+ "fileName": "README.md",
+ "cellName": "Client Setup: Start Development Server - README.md:L57-59",
+ "cellId": "2a19acc2-3c48-4fb7-aa10-62a907ae8b1f",
+ "visible": true,
+ "startLine": 57,
+ "endLine": 59,
+ "parentCellId": "e154e166-10fd-48f9-ae35-ea2268431ae3",
+ "parentPath": "README.md"
+ },
+ "7fb1005d-c3f4-4787-b18f-86daf7d53fb8": {
+ "path": "7fb1005d-c3f4-4787-b18f-86daf7d53fb8",
+ "cellName": "Client Execution: Configure API Client - axios.ts:L1-7",
+ "cellId": "7fb1005d-c3f4-4787-b18f-86daf7d53fb8",
+ "visible": true,
+ "parentCellId": "7737e2a8-9862-40d1-b963-5b48eb79c4dd"
+ },
+ "client/src/utils/axios.ts-simstep-91e5baad-f212-4102-ad32-c126b83e9222": {
+ "path": "client/src/utils/axios.ts-simstep-91e5baad-f212-4102-ad32-c126b83e9222",
+ "fileName": "axios.ts",
+ "cellName": "Client Execution: Configure API Client - axios.ts:L1-7",
+ "cellId": "7fb1005d-c3f4-4787-b18f-86daf7d53fb8",
+ "visible": true,
+ "startLine": 1,
+ "endLine": 7,
+ "parentCellId": "7737e2a8-9862-40d1-b963-5b48eb79c4dd",
+ "parentPath": "client/src/utils/axios.ts"
+ },
+ "54d4abe9-937d-4ba9-97b7-107f6c48de2f": {
+ "path": "54d4abe9-937d-4ba9-97b7-107f6c48de2f",
+ "cellName": "Data Flow:\nEnvironment Configuration\nPrompt",
+ "cellId": "54d4abe9-937d-4ba9-97b7-107f6c48de2f",
+ "visible": true
+ },
+ "generated-edge-simstep-17a3edec-f328-46e7-99ed-1a434c69e424-54d4abe9-937d-4ba9-97b7-107f6c48de2f": {
+ "path": "generated-edge-simstep-17a3edec-f328-46e7-99ed-1a434c69e424-54d4abe9-937d-4ba9-97b7-107f6c48de2f",
+ "cellName": "Data Flow: Environment Configuration Prompt",
+ "cellId": "54d4abe9-937d-4ba9-97b7-107f6c48de2f",
+ "visible": true
+ },
+ "272af1ab-8c2b-443b-9568-56685efb5ce5": {
+ "path": "272af1ab-8c2b-443b-9568-56685efb5ce5",
+ "cellName": "Data Flow:\nEnvironment Variables\nLoaded",
+ "cellId": "272af1ab-8c2b-443b-9568-56685efb5ce5",
+ "visible": true
+ },
+ "generated-edge-simstep-f0cd3ca0-3d66-4a26-8a8f-7c8043809171-272af1ab-8c2b-443b-9568-56685efb5ce5": {
+ "path": "generated-edge-simstep-f0cd3ca0-3d66-4a26-8a8f-7c8043809171-272af1ab-8c2b-443b-9568-56685efb5ce5",
+ "cellName": "Data Flow: Environment Variables Loaded",
+ "cellId": "272af1ab-8c2b-443b-9568-56685efb5ce5",
+ "visible": true
+ },
+ "bbb03333-e082-49e2-944e-84d060ac4287": {
+ "path": "bbb03333-e082-49e2-944e-84d060ac4287",
+ "cellName": "Server Execution:\nInitiate App",
+ "cellId": "bbb03333-e082-49e2-944e-84d060ac4287",
+ "visible": true
+ },
+ "generated-edge-simstep-a21f3189-0ea9-4c24-a4b0-03ac9098b4bc-bbb03333-e082-49e2-944e-84d060ac4287": {
+ "path": "generated-edge-simstep-a21f3189-0ea9-4c24-a4b0-03ac9098b4bc-bbb03333-e082-49e2-944e-84d060ac4287",
+ "cellName": "Server Execution: Initiate App",
+ "cellId": "bbb03333-e082-49e2-944e-84d060ac4287",
+ "visible": true
+ },
+ "b4b5fd99-d66d-4784-b841-6663327cb40e": {
+ "path": "b4b5fd99-d66d-4784-b841-6663327cb40e",
+ "cellName": "Server Ready:\nListening for\nRequests",
+ "cellId": "b4b5fd99-d66d-4784-b841-6663327cb40e",
+ "visible": true
+ },
+ "generated-edge-simstep-f8909b27-6fb3-4149-9daa-870169b694f6-b4b5fd99-d66d-4784-b841-6663327cb40e": {
+ "path": "generated-edge-simstep-f8909b27-6fb3-4149-9daa-870169b694f6-b4b5fd99-d66d-4784-b841-6663327cb40e",
+ "cellName": "Server Ready: Listening for Requests",
+ "cellId": "b4b5fd99-d66d-4784-b841-6663327cb40e",
+ "visible": true
+ },
+ "340539c6-be61-4592-96b0-a26933b2ab1d": {
+ "path": "340539c6-be61-4592-96b0-a26933b2ab1d",
+ "cellName": "Data Flow:\nClient Environment\nConfiguration",
+ "cellId": "340539c6-be61-4592-96b0-a26933b2ab1d",
+ "visible": true
+ },
+ "generated-edge-simstep-9d1af39a-4c6f-4bc9-911b-588dda27baa3-340539c6-be61-4592-96b0-a26933b2ab1d": {
+ "path": "generated-edge-simstep-9d1af39a-4c6f-4bc9-911b-588dda27baa3-340539c6-be61-4592-96b0-a26933b2ab1d",
+ "cellName": "Data Flow: Client Environment Configuration",
+ "cellId": "340539c6-be61-4592-96b0-a26933b2ab1d",
+ "visible": true
+ },
+ "c21a4385-acb6-4379-b0fc-b064418b41f9": {
+ "path": "c21a4385-acb6-4379-b0fc-b064418b41f9",
+ "cellName": "Data Flow:\nClient Environment\nLoaded",
+ "cellId": "c21a4385-acb6-4379-b0fc-b064418b41f9",
+ "visible": true
+ },
+ "generated-edge-simstep-ad20b5a5-cd6d-4c5f-a874-21603900fa94-c21a4385-acb6-4379-b0fc-b064418b41f9": {
+ "path": "generated-edge-simstep-ad20b5a5-cd6d-4c5f-a874-21603900fa94-c21a4385-acb6-4379-b0fc-b064418b41f9",
+ "cellName": "Data Flow: Client Environment Loaded",
+ "cellId": "c21a4385-acb6-4379-b0fc-b064418b41f9",
+ "visible": true
+ },
+ "2c935c41-0451-4f6a-b475-696f0df2d9c6": {
+ "path": "2c935c41-0451-4f6a-b475-696f0df2d9c6",
+ "cellName": "Client Execution:\nApp Mounting",
+ "cellId": "2c935c41-0451-4f6a-b475-696f0df2d9c6",
+ "visible": true
+ },
+ "generated-edge-simstep-61813dc3-50a3-4ed1-8248-cf1976947d8d-2c935c41-0451-4f6a-b475-696f0df2d9c6": {
+ "path": "generated-edge-simstep-61813dc3-50a3-4ed1-8248-cf1976947d8d-2c935c41-0451-4f6a-b475-696f0df2d9c6",
+ "cellName": "Client Execution: App Mounting",
+ "cellId": "2c935c41-0451-4f6a-b475-696f0df2d9c6",
+ "visible": true
+ }
+ }
+}
\ No newline at end of file