Skip to content
Closed
Show file tree
Hide file tree
Changes from 72 commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
fdd9925
Implement backend static functionality and cookies.
Oct 24, 2024
0265c56
Merge pull request #39 from spe-uob/returnBasicHTML
vladislav-k1 Oct 25, 2024
d489c51
Update maven.yml
vladislav-k1 Oct 29, 2024
cadb01a
Revert "Supply static pages, assign / delete users."
vladislav-k1 Oct 29, 2024
820deeb
Merge pull request #45 from spe-uob/returnBasicHTML
vladislav-k1 Oct 29, 2024
b818791
Update README.md
vladislav-k1 Oct 30, 2024
ea02b81
Added Chatbot Interaction Flow diagram
GerardChabaBristol Oct 30, 2024
80633d8
Added Chatbot Interaction Flow diagram to docs
GerardChabaBristol Oct 30, 2024
74b046a
Updated link to Chatbot Interaction Flowchart in README
GerardChabaBristol Oct 30, 2024
e43bb2e
Remove "frontend" branch
vladislav-k1 Oct 30, 2024
503baef
Merge pull request #56 from spe-uob/chatbot_interaction_flowchart
vladislav-k1 Oct 30, 2024
4b3a3ff
Merge pull request #44 from spe-uob/revert-39-returnBasicHTML
vladislav-k1 Oct 30, 2024
b29f93e
Merge pull request #47 from spe-uob/readme-new-team-member
vladislav-k1 Oct 30, 2024
ab4d36c
Merge pull request #60 from spe-uob/github-maven-runner-fix
vladislav-k1 Nov 1, 2024
f3fbbf7
Add Bearer token requestor.
Nov 3, 2024
8110dd9
Merge pull request #59 from spe-uob/frontend
Siyuan106 Nov 5, 2024
76a972e
Add Watsonx API Controller.
Nov 5, 2024
fe705ab
Improve User.java
Nov 5, 2024
354c15b
Add Chat.java
Nov 6, 2024
54a939e
Refactor DatabaseController and StringTools
Nov 6, 2024
45ff1c6
Add the right AI system prompt.
Nov 6, 2024
56f5df3
Improve SpringContoller.java
Nov 6, 2024
cf84265
refactor: Temporary disable AI API tests.
Nov 7, 2024
45d9513
chore: add backend documentation.
Nov 7, 2024
9995a5d
Merge pull request #72 from spe-uob/feature/issue-46/watsonx-integration
Siyuan106 Nov 7, 2024
735aef0
refactor: Change folder structure (for merge into 'dev').
Nov 7, 2024
53c8d79
chore: resolving merge conflict for the pull request #73.
Nov 8, 2024
ce076f7
fix: Disable 'dependency graph'
vladislav-k1 Nov 8, 2024
52a5857
Merge pull request #73 from spe-uob/feature/issue-71/backend-unit-tests
vladislav-k1 Nov 8, 2024
84af9ec
Update AiLearningToolApplication.java
RainBOY-ZZX Nov 9, 2024
0ac2f1e
Update application.properties
RainBOY-ZZX Nov 9, 2024
da4a0a0
bugfix: Import missing classes in AiLearningToolApplication class.
Nov 10, 2024
9a7c4ef
Merge pull request #75 from spe-uob/dev-patch-1
vladislav-k1 Nov 11, 2024
8698b12
Create OpenAIAPIController.java
GerardChabaBristol Nov 11, 2024
99f8b93
Create OpenAIAuthenticator.java
GerardChabaBristol Nov 11, 2024
8146f33
refactor: added the OpenAI API Key
GerardChabaBristol Nov 12, 2024
04c7f92
Update CookieAPI.js
Siyuan106 Nov 12, 2024
8b76a63
Update Login.vue
Siyuan106 Nov 12, 2024
d54c8eb
Merge pull request #80 from spe-uob/feature/issue-58/frontend
Siyuan106 Nov 12, 2024
cee19b9
feature: update the dev instructions and project structure
GerardChabaBristol Nov 12, 2024
195a071
feature: add watsonxToOpenAI method.
Nov 12, 2024
79a331e
feature: created OpenAIAPIController.java
GerardChabaBristol Nov 12, 2024
6c8c5f1
fix: Debug OpenAIAPIController; debug unit tests for OpenAIAPIControl…
Nov 13, 2024
2d0789f
refactor: Adapt SpringController to work with OpenAIAPIController.
Nov 13, 2024
7bb58e9
chore: Remove unnecessary comments from StringTools class.
Nov 13, 2024
5909b49
chore: Add more comments to OpenAIAPIController.
Nov 13, 2024
a9a9afe
feature: updated Team Members and Developer Instructions
GerardChabaBristol Nov 13, 2024
cc0cdc8
Merge pull request #84 from spe-uob/feature/issue-77/OpenAI-API
vladislav-k1 Nov 13, 2024
b6b8606
feature: create enable_https.sh
GerardChabaBristol Nov 13, 2024
9606ad5
feature: add Siyuan to MIT License
GerardChabaBristol Nov 13, 2024
1ba7af1
Merge pull request #88 from spe-uob/feature/issue-87/update-MIT-license
GerardChabaBristol Nov 13, 2024
dbc243a
fix: Debug enable_https.sh
Nov 13, 2024
59fc8dc
feat: Add startserver.sh
Nov 13, 2024
cb9a8d9
Merge pull request #85 from spe-uob/feature/issue-81/update-README
GerardChabaBristol Nov 13, 2024
86e8b42
Merge pull request #89 from spe-uob/feature/issue-86/shell-script-int…
GerardChabaBristol Nov 13, 2024
c7ffa08
feat: Add emergency frontend files.
Nov 14, 2024
6426f05
refactor: Change URLs to localhost.
Nov 14, 2024
10ca338
Merge pull request #92 from spe-uob/hotfix/issue-91/temporary-frontend
Liuwf4319 Nov 14, 2024
2c6c5d4
feature: update-readme
GerardChabaBristol Nov 19, 2024
44edde5
Merge pull request #97 from spe-uob/feature/issue-96/update-readme-be…
vladislav-k1 Nov 19, 2024
e82a901
Create pull_request_template.md
vladislav-k1 Nov 27, 2024
579188f
Update maven.yml
Siyuan106 Nov 27, 2024
e6d1cab
Update maven.yml
Siyuan106 Nov 27, 2024
0652e79
Update pom.xml
Siyuan106 Nov 27, 2024
161707e
Update maven.yml
Siyuan106 Nov 27, 2024
1e2a4ac
Update pom.xml
Siyuan106 Nov 27, 2024
eba3745
Update maven.yml
Siyuan106 Nov 27, 2024
6577e46
Update maven.yml
Siyuan106 Nov 27, 2024
09b9d51
Update pom.xml
Siyuan106 Nov 27, 2024
ee95c26
Merge pull request #107 from spe-uob/bugfix/issue-106/add-pr-template
vladislav-k1 Nov 27, 2024
47a6c93
从spe-uob/separate-BuildingAndTesting合并取请求#109
Liuwf4319 Jan 13, 2025
6341d13
Add files via upload
Liuwf4319 Jan 15, 2025
6220d8e
Update main.js
Liuwf4319 Jan 15, 2025
6dd118b
Update SettingSidebar.vue
Liuwf4319 Jan 15, 2025
269ef6e
Update App.vue
RainBOY-ZZX Jan 15, 2025
57b96c4
Update MainView.vue
RainBOY-ZZX Jan 15, 2025
45597ee
Update HistorySidebar.vue
RainBOY-ZZX Jan 15, 2025
384808a
Update MainContent.vue
RainBOY-ZZX Jan 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@ jobs:
distribution: 'temurin'
cache: maven
- name: Build with Maven
run: mvn -B package --file pom.xml
run: mvn -B clean compile --file pom.xml
- name: Test with Maven
run: mvn -B test --file pom.xml

# Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
- name: Update dependency graph
uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
backend/target
target
backend/.idea
.idea

File renamed without changes.
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2024 Gerard Chaba, Vladislavs Kirilovics, Zixuan Zhu, Mohammed Elzobair Eltayeb, Weifan Liu
Copyright (c) 2024 Gerard Chaba, Vladislavs Kirilovics, Zixuan Zhu, Mohammed Elzobair Eltayeb, Weifan Liu, Siyuan Zhang

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
52 changes: 42 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
- [Project Structure](#project-structure)
- [Tech Stack](#tech-stack)
- [User Instructions](#user-instructions)
- [Chatbot Interaction Flow](#chatbot-interaction-flow)
- [Developer Instructions](#developer-instructions)
- [Team Members](#team-members)

Expand Down Expand Up @@ -83,17 +84,29 @@ As a university student, I want the AI chatbot to explain course concepts and fo
## Project Structure:
Below is an overview of the key components of the system:

- docs: Contains all project-related documentation. Notable files include:
- ETHICS.md
- LICENSE: Includes the project's MIT license file.
- [workflows](/.github/workflows): Contains Maven Continuous Integration.
- [docs](/docs): Contains all project-related documentation. Notable files include:
- [ETHICS.md](/docs/ETHICS.md): Includes the date of the ethics pre-approval request.
- All diagrams/flowcharts.
- [frontend](/frontend): Contains all of the front-end code (in Vue 3 and Yarn) and documents (not used in the MVP stage):
- [api](/frontend/api): Includes the cookies API.
- [public](/frontend/public): Includes some front-end documents.
- [src](/frontend/src): Includes the front-end code.
- [src](/src): Contains all of the back-end code (in Java) and documents:
- [main](/src/main): Includes the back-end code.
- [static](/src/main/resources/static): Includes all static documents, including index.html of the front-end.
- [test/java/com/UoB/AILearningTool](/src/test/java/com/UoB/AILearningTool): Includes all of the unit tests.
- [LICENSE](/LICENSE): Includes the project's MIT license file.
- [mvnw](/mvnw) and [pom.xml](/pom.xml): Documents for Maven.

## Tech Stack:
### Frontend
The frontend is a JavaScript Vue 3-based web application. It makes requests to the backend using HTTP requests.
The front end is a JavaScript Vue 3-based web application. It makes requests to the backend using HTTP requests.
### Backend
The backend is based on Spring Boot (open-source Java framework).
Data will be stored in a MariaDB database.
User prompts for the chatbot will be sent using API requests from the Spring Boot backend to the IBM Watsonx language model.\
User prompts for the chatbot will be sent using API requests from the Spring Boot backend to the IBM Watsonx language model.

![Architecture diagram, showing the technologies used in the project.](/docs/architecture_diagram.png)

## User Instructions:
Expand Down Expand Up @@ -134,6 +147,12 @@ User prompts for the chatbot will be sent using API requests from the Spring Boo

If you accepted the optional cookies, your conversation history will be saved for 30 days. You can return to the web app at any time within that period to continue where you left off or ask follow-up questions based on previous conversations.

## Chatbot Interaction Flow:

This flowchart outlines the interaction pathways within the chatbot, guiding users through key topics such as SkillsBuild courses, university life questions, and IBM SkillsBuild platform information. Each pathway details the chatbot's prompts, and user responses, providing an overview of the chatbot’s functionality.

![watson_flow](/docs/watson_flow.png)

## Developer Instructions:
To get started with developing or contributing to this project, follow the steps below:

Expand All @@ -151,12 +170,25 @@ To get started with developing or contributing to this project, follow the steps
4. **Install Maven**:
This project uses Maven as the build automation tool. If you don't have Maven installed, download the latest stable release [here](https://maven.apache.org/download.cgi).

5. **Install Vue and Yarn**:
The front end of this project is built using Vue 3 and Yarn, so make sure you have them installed:
- Vue 3 installation guide [here](https://v3.ru.vuejs.org/guide/installation.html)
- Yarn installation guide [here](https://classic.yarnpkg.com/lang/en/docs/install/#windows-stable)

6. **Open the Project in Your IDE**:
Open the cloned repository in your preferred Integrated Development Environment (IDE) (we recommend IntelliJ) for further development.

7. **Test and Run the Server**:
- To run the unit tests, use the command ```mvn test```
- To start the server, use the command ```mvn spring-boot:run```

## Team Members:
Vlad Kirlovics (fi23561) \
Gerard Chaba (tl23383) \
Mohammed Elzobair (yi23484) \
Weifan Liu (au22116) \
Zixuan Zhu (kh23199)

| Name | GitHub | Email |
|-------------------|-----------------------------------------------------------------------------------------------------------|-----------------------|
| Vlad Kirilovics | [vladislav-k1](https://github.com/vladislav-k1) and [kirilovich-vlad](https://github.com/kirilovich-vlad) | fi23561@bristol.ac.uk |
| Gerard Chaba | [GerardChabaBristol](https://github.com/GerardChabaBristol) | tl23383@bristol.ac.uk |
| Mohammed Elzobair | [yi23484](https://github.com/yi23484) | yi23484@bristol.ac.uk |
| Weifan Liu | [Liuwf4319](https://github.com/Liuwf4319) | au22116@bristol.ac.uk |
| Zixuan Zhu | [RainBOY-ZZX](https://github.com/RainBOY-ZZX) | kh23199@bristol.ac.uk |
| Siyuan Zhang | [Siyuan106](https://github.com/Siyuan106) | gr23994@bristol.ac.uk |
1 change: 0 additions & 1 deletion backend/src/main/resources/application.properties

This file was deleted.

This file was deleted.

67 changes: 67 additions & 0 deletions docs/backendHTTPMethods.drawio
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64; rv:132.0) Gecko/20100101 Firefox/132.0" version="24.8.4">
<diagram name="Page-1" id="D5iIy3KWxEPgB1KizNsA">
<mxGraphModel dx="1468" dy="892" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="2koVdJtbBCh85IIp-lrr-1" value="&lt;font style=&quot;font-size: 15px;&quot;&gt;GET /signup&lt;font&gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fontSize=24;fillColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="74" y="375" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-2" value="&lt;div&gt;Receives:&lt;/div&gt;&lt;div&gt;optionalConsent cookie&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="74" y="415" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-5" value="&lt;div&gt;Returns:&lt;/div&gt;&lt;div&gt;userID cookie&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="74" y="495" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-6" value="&lt;font size=&quot;3&quot;&gt;GET /revokeConsent&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fontSize=24;fillColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="314" y="375" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-7" value="&lt;div&gt;Receives:&lt;/div&gt;&lt;div&gt;optionalConsent cookie&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="314" y="415" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-8" value="&lt;div&gt;Returns:&lt;/div&gt;&lt;div&gt;userID cookie&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="314" y="495" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-9" value="&lt;font size=&quot;3&quot;&gt;GET /createChat&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fontSize=24;fillColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="554" y="375" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-10" value="&lt;div&gt;Receives:&lt;/div&gt;&lt;div&gt;userID cookie&lt;/div&gt;&lt;div&gt;initialMessage string&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="554" y="415" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-11" value="&lt;div&gt;Returns:&lt;/div&gt;&lt;div&gt;chatID text/plain&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="554" y="495" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-12" value="&lt;font size=&quot;3&quot;&gt;GET /sendMessage&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fontSize=24;fillColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="74" y="655" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-13" value="&lt;div&gt;Receives:&lt;/div&gt;&lt;div&gt;userID cookie&lt;/div&gt;&lt;div&gt;newMessage string&lt;/div&gt;&lt;div&gt;chatID string&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="74" y="695" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-14" value="&lt;div&gt;Returns:&lt;/div&gt;&lt;div&gt;responseText text/plain&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="74" y="775" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-15" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;GET /sendIncognitoMessage&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fontSize=24;fillColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="314" y="655" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-16" value="&lt;div&gt;Receives:&lt;/div&gt;&lt;div&gt;userID cookie&lt;/div&gt;&lt;div&gt;inputString string&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="314" y="695" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-17" value="&lt;div&gt;Returns:&lt;/div&gt;&lt;div&gt;responseText text/plain&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="314" y="775" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-18" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;GET /getChatHistory&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fontSize=24;fillColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="554" y="655" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-19" value="&lt;div&gt;Receives:&lt;/div&gt;&lt;div&gt;userID cookie&lt;/div&gt;&lt;div&gt;chatID string&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="554" y="695" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-20" value="&lt;div&gt;Returns:&lt;/div&gt;&lt;div&gt;responseText text/plain&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#E6E6E6;fontSize=15;" vertex="1" parent="1">
<mxGeometry x="554" y="775" width="200" height="80" as="geometry" />
</mxCell>
<mxCell id="2koVdJtbBCh85IIp-lrr-21" value="&lt;font style=&quot;font-size: 32px;&quot;&gt;Backend HTTP methods&lt;br&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="240" y="210" width="360" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file added docs/backendHTTPMethods.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions docs/backendHTTPMethods.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions docs/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
### Issue(s):
#issueNumber

### Type of change: (choose required ones)
- Bug fix
- New feature
- Breaking change
- Documentation update
- Refactor/Optimization

### Description:
One or more sentences of description.

### Additional context:
Some additional, important things about the code (eg. the code contains a temporary solution that will soon be refactored).

### Testing instructions:
Commands and other guidance on how to test your new code.
Loading
Loading