Customer Milestone 2 Report: Fitness and Diet Forum - bounswe/bounswe2024group4 GitHub Wiki
- π΄ Not started
- πΆ In progress
- π΅ Completed (Implemented, Tested, Documented, Deployed)
Requirement | Backend | Web | Mobile |
---|---|---|---|
1.1.1.1.1 Guests shall be able to see only the log-in and sign-up pages. | π΅ | π΅ | π΅ |
1.1.1.1.2 Guests shall be able to sign-up to the platform with an e-mail address, unique username, and a password that contains at least 8 characters which includes at least 1 special character, 1 numerical figure, 1 uppercase letter, and 1 lowercase letter. | π΅ | π΅ | π΅ |
1.1.2.1.1 Members shall be able to log-in to their account by providing their username and password. | π΅ | π΅ | π΅ |
1.1.2.1.2 Members shall be able to change their username to another untaken username when they are logged in. | π΄ | π΄ | πΆ |
1.1.2.1.3 Members shall be able to change their e-mail address when they are logged in. | π΄ | π΄ | πΆ |
1.1.2.1.4 Members shall be able to change their password when they are logged in. | π΄ | π΄ | πΆ |
1.1.2.1.5 Members shall be able to log-out from the platform. | π΅ | π΅ | π΄ |
1.1.2.1.6 Members shall get feedback that specifies the problem when they make unsuccessful log-in attempts. | π΅ | π΅ | π΅ |
1.1.2.1.7 Members should be able to reset their password by providing their username or e-mail address and proving that they have access to their e-mail account. | π΄ | π΄ | π΄ |
1.1.2.1.8 Members should be able to delete their account. | π΄ | π΄ | π΄ |
1.1.2.2.1 Members shall be able to see and edit their account information (username, e-mail, password, profile picture, name, surname, biography). | π΄ | π΄ | πΆ |
1.1.2.2.2 Members should be able to block and unblock other members. | π΄ | π΄ | π΄ |
1.1.2.2.3 Members should be able to make other members unfollow them. | π΄ | π΄ | π΄ |
1.1.2.2.4 Members should be able to keep their body measurements privately in their profiles. | π΅ | πΆ | πΆ |
1.1.2.3.1 Members shall be able to create posts that may contain text, images, links, diet programs, and workout programs. | π΅ | π΄ | πΆ |
1.1.2.3.2 Members shall be able to delete their posts. | π΄ | π΄ | π΄ |
1.1.2.3.3 Members shall be able to create diet and workout programs by combining options provided by the platform. | πΆ | πΆ | πΆ |
1.1.2.3.4 Members shall be able to delete diet and workout programs that they have created. | π΄ | π΄ | π΄ |
1.1.2.3.5 Members shall be able to view other members' posts. | π΅ | πΆ | π΄ |
1.1.2.3.6 Members shall be able to comment on posts. | π΅ | πΆ | πΆ |
1.1.2.3.7 Members shall be able to like and unlike posts. | π΅ | π΅ | πΆ |
1.1.2.3.8 Members shall be able to create direct messaging sessions with other members. | π΄ | π΄ | π΄ |
1.1.2.3.9 Members shall be able to semantically search for posts, users, workout and diet programs. | π΄ | πΆ | π΄ |
1.1.2.3.10 Members shall be able to rank other users for the leaderboard. | π΅ | π΅ | πΆ |
1.1.2.3.11 Members shall be able to receive super-member privileges based on their leaderboard rankings. | π΄ | π΄ | π΄ |
1.1.2.3.12 Members shall be able to follow and unfollow other members. | π΅ | π΅ | πΆ |
1.1.2.3.13 Members shall be able to bookmark and unbookmark content. | π΅ | π΄ | π΄ |
1.1.2.3.14 Members shall be able to make advanced searches using filters provided by the platform. | π΄ | π΄ | π΄ |
1.1.2.3.15 Members should be provided statistics like BMI which will be generated using information they provide. | π΄ | π΄ | π΄ |
1.1.2.3.16 Members should be able to track the change in their body measurements from the platform. | πΆ | π΄ | π΄ |
1.1.2.3.17 Members should be able to track their gym progress from the platform. | πΆ | πΆ | π΄ |
1.1.2.4.1 Super-members shall be subject to all the requirements which are related to members. | π΅ | π΄ | π΄ |
1.1.2.4.2 Super-members shall be able to provide exercise options to the workout database of the platform. | π΄ | π΄ | π΄ |
1.1.2.4.3 Super-members should be able to provide new food options to the food database of the platform. | π΄ | πΆ | π΄ |
1.2.1.1 Main page shall display the latest contents created by the users followed. | π΅ | πΆ | πΆ |
1.2.1.2 Main page shall be able to be scrolled to display older content. | π΅ | π΅ | πΆ |
1.2.1.3 Main page shall include relevant buttons to make users able to access other pages. | π΅ | π΅ | π΅ |
1.2.2.1 Members shall be provided food options which shall be retrieved from the Edamam Nutrition API and platform database to create diet programs. | π΄ | πΆ | πΆ |
1.2.2.2 Diet programs shall be held portable in the database so that they can be displayed on different pages. | π΄ | πΆ | πΆ |
1.2.2.3 The platform shall return the nutritional values of foods which shall be retrieved from the Edamam Nutrition API. | π΄ | πΆ | πΆ |
1.2.2.4 The platform shall provide links to recipes of foods which shall be retrieved from the Edamam Nutrition API. | π΄ | πΆ | πΆ |
1.2.2.5 The platform shall display images of foods which shall be retrieved from the Wikidata API. | π΄ | πΆ | πΆ |
1.2.2.6 The platform database of foods shall include the food options provided by the super-members. | π΄ | πΆ | π΄ |
1.2.3.1 Members shall be provided muscle options to combine in their workout program. | π΅ | π΅ | π΅ |
1.2.3.2 Members shall be provided exercise options for the muscles they have chosen which shall be retrieved from the Ninjas Exercises API and platform database to create exercise programs. | π΅ | π΅ | πΆ |
1.2.3.3 Members shall be provided with the difficulty level and instructions of the exercise options which shall be retrieved from the Ninjas Exercises API and platform database to create exercise programs. | πΆ | πΆ | πΆ |
1.2.3.4 Workout programs shall be held portable in the database so that they can be displayed on different pages. | π΅ | π΅ | πΆ |
1.2.3.5 The platform database of exercises shall include the exercise options provided by the super-members. | π΄ | π΄ | π΄ |
1.2.4.1 Search shall return several results for each query. | π΄ | π΄ | π΄ |
1.2.4.2 Search shall return posts, workout programs, meals, and users. | π΄ | π΄ | π΄ |
1.2.4.3 Search shall provide users filters to narrow their search domain down. | π΄ | π΄ | π΄ |
1.2.4.4 Search should return the possible similar results. | π΄ | π΄ | π΄ |
1.2.5.1 Posts shall support having text, images, diet programs, workout programs, and contain user-curated content. | π΅ | πΆ | πΆ |
1.2.5.2 Posts should have redirections to profile pages of the users who shared the posts. | π΅ | πΆ | πΆ |
1.2.6.1 Each member shall have a profile page. | π΅ | π΅ | π΅ |
1.2.6.2 Each member shall be able to view other membersβ profile pages as well as his/her own including their profile information: that member's profile photo, biography, number of followers, rating, previous posts, workout, and diet programs. | πΆ | πΆ | πΆ |
- We decided to take action to create similar user experience in mobile and web applications.
- We decided to make 3 leaderboards instead of 1. Three leaderboards include one for only meal ratings, one for only exercise ratings and one for both to improve user experience and enable people to choose the best in each area.
- We added weekly exercise tracking system.
This is documented here
- Postman and HTML templates to test the requests and responses
- Directly in the browser or local development environment, where UI and the behavior of components are observed.
- Within the mobile app on simulator or emulator. The focus is on observing how UI is and components react.
- Unit tests to check the endpoints in a more comprehensive manner
- Test the integrated front-end on a local machine
- Unit tests to validate the functionality of individual frontend components, ensuring each part works as expected in isolation.
- Test the integrated frontend on a local machine to check the overall UI and interactions, ensuring everything functions correctly when connected to the backend.
- Implement unit tests to validate the logic and behavior of mobile components, checking each feature individually.
- Test the mobile app on a simulator or emulator to ensure the UI and features work as expected, focusing on responsiveness, navigation, and data interactions.
- Apply and report end-to-end, user tests covering all features to make sure that everything is working correctly.
- User tests that cover the following features will be created:
- Exercise creation
- Meal creation
- Sign-up/Login
- Follow/unfollow
- Create Post
- Like Post
- Search
- Edit Profile
- Comment
- Bookmark/Unbookmark
- See Others' Profile
- Leaderboard
- Rating an exercise/meal
- Comment
We ran 55 tests. 26 tests passed and 29 tests failed.
The reason for that is we had to send user information as an argument in the requests due to a problem we had with CSRF tokens. However, the tests are created considering the true-practice solution which is sending user information secretly in the request and we did not change the tests after this update in the code, the reason behind the big number of failures is this. Before that problem the tests were yielding 100% percent success.
Below we provided the terminal commands we used to generate the test reports. Also, you can see comprehensive screenshots of the report. Below the images you can also see the reason of each failure. We couldn't provide the report directly because it requires hosting.
pip install pytest
pip install allure-pytest
pip install pytest-django
scoop install allure (Windows)
brew install allure (MacOS/Linux)
pytest --alluredir=allure-results
allure serve allure-results
FAILED exercise_program_app/tests.py::WorkoutProgramTestCase::test_workout_program - AssertionError: 400 != 201 FAILED exercise_program_app/tests.py::RateWorkoutTestCase::test_rate_workout_invalid_method - AssertionError: 'detail' not found in {'error': 'Invalid request method'} FAILED exercise_program_app/tests.py::RateWorkoutTestCase::test_rate_workout_invalid_rating - AssertionError: 'Expecting value: line 1 column 1 (char 0)' != 'Rating must be between 0 and 5' FAILED exercise_program_app/tests.py::RateWorkoutTestCase::test_rate_workout_no_user - AssertionError: 'Expecting value: line 1 column 1 (char 0)' != 'No user found' FAILED exercise_program_app/tests.py::RateWorkoutTestCase::test_rate_workout_success - AssertionError: 400 != 200 FAILED exercise_program_app/tests.py::GetWorkoutsByUserIdTestCase::test_get_workouts_by_user_id_invalid_method - django.urls.exceptions.NoReverseMatch: Reverse for 'get_workouts_by_user_id' not found. 'get_workouts_by_user_id' is not a valid view function or pattern name. FAILED exercise_program_app/tests.py::GetWorkoutsByUserIdTestCase::test_get_workouts_by_user_id_no_workouts - django.urls.exceptions.NoReverseMatch: Reverse for 'get_workouts_by_user_id' not found. 'get_workouts_by_user_id' is not a valid view function or pattern name. FAILED exercise_program_app/tests.py::GetWorkoutsByUserIdTestCase::test_get_workouts_by_user_id_success - django.urls.exceptions.NoReverseMatch: Reverse for 'get_workouts_by_user_id' not found. 'get_workouts_by_user_id' is not a valid view function or pattern name. FAILED posts_app/tests.py::ToggleLikeViewTestCase::test_toggle_like_post_not_found - AssertionError: 500 != 404 FAILED posts_app/tests.py::ToggleLikeViewTestCase::test_toggle_like_success - AssertionError: 500 != 200 FAILED posts_app/tests.py::CommentViewTestCase::test_comment_post_not_found - AssertionError: 500 != 404 FAILED posts_app/tests.py::CommentViewTestCase::test_comment_success - AssertionError: 500 != 201 FAILED posts_app/tests.py::ToggleBookmarkViewTestCase::test_toggle_bookmark_post_not_found - AssertionError: 500 != 404 FAILED posts_app/tests.py::ToggleBookmarkViewTestCase::test_toggle_bookmark_success - AssertionError: 500 != 200 FAILED posts_app/tests.py::LikedPostsViewTestCase::test_liked_posts_success - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED posts_app/tests.py::BookmarkedPostsViewTestCase::test_bookmarked_posts_success - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED profiles_app/tests.py::TestProfile::test_edit_profile - AssertionError: 400 != 200 FAILED profiles_app/tests.py::TestProfile::test_view_profile_not_found - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED profiles_app/tests.py::TestProfile::test_view_profile_other_user - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED profiles_app/tests.py::TestProfile::test_view_profile_yourself - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED simple_features_app/tests.py::TestFollowUnfollow::test_follow - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED simple_features_app/tests.py::TestFollowUnfollow::test_follow_already_following - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED simple_features_app/tests.py::TestFollowUnfollow::test_follow_nonexistent_user - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED simple_features_app/tests.py::TestFollowUnfollow::test_follow_yourself - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED simple_features_app/tests.py::TestFollowUnfollow::test_unfollow - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED simple_features_app/tests.py::TestFollowUnfollow::test_unfollow_nonexistent_user - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED simple_features_app/tests.py::TestFollowUnfollow::test_unfollow_not_following - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED simple_features_app/tests.py::TestFollowUnfollow::test_unfollow_yourself - user_auth_app.models.User.DoesNotExist: User matching query does not exist. FAILED social_feed_app/tests.py::FollowingFeedViewTestCase::test_following_feed_success - user_auth_app.models.User.DoesNotExist: User matching query does not exist.
{ "numFailedTestSuites":0, "numFailedTests":0, "numPassedTestSuites":2, "numPassedTests":2, "numPendingTestSuites":0, "numPendingTests":0, "numRuntimeErrorTestSuites":0, "numTodoTests":0, "numTotalTestSuites":2, "numTotalTests":2, "openHandles":[ ], "snapshot":{ "added":0, "didUpdate":false, "failure":false, "filesAdded":0, "filesRemoved":0, "filesRemovedList":[ ], "filesUnmatched":0, "filesUpdated":0, "matched":0, "total":0, "unchecked":0, "uncheckedKeysByFile":[ ], "unmatched":0, "updated":0 }, "startTime":1732874691197, "success":true, "testResults":[ { "assertionResults":[ { "ancestorTitles":[ ], "failureMessages":[ ], "fullName":"renders Loading...", "location":null, "status":"passed", "title":"renders Loading..." } ], "endTime":1732874692051, "message":"", "name":"/Users/buseaydin/Desktop/451/bounswe2024group4/frontend/fitness-diet-forum/src/__tests__/LeaderBoard.test.js", "startTime":1732874691742, "status":"passed", "summary":"" }, { "assertionResults":[ { "ancestorTitles":[ ], "failureMessages":[ ], "fullName":"renders ExerciseProgram component and submits rating", "location":null, "status":"passed", "title":"renders ExerciseProgram component and submits rating" } ], "endTime":1732874692059, "message":"", "name":"/Users/buseaydin/Desktop/451/bounswe2024group4/frontend/fitness-diet-forum/src/__tests__/ExerciseProgram.test.js", "startTime":1732874691718, "status":"passed", "summary":"" } ], "wasInterrupted":false }
{ "numFailedTestSuites":0, "numFailedTests":0, "numPassedTestSuites":3, "numPassedTests":11, "numPendingTestSuites":0, "numPendingTests":0, "numRuntimeErrorTestSuites":0, "numTodoTests":0, "numTotalTestSuites":3, "numTotalTests":11, "openHandles":[ ], "snapshot":{ "added":0, "didUpdate":false, "failure":false, "filesAdded":0, "filesRemoved":0, "filesRemovedList":[ ], "filesUnmatched":0, "filesUpdated":0, "matched":0, "total":0, "unchecked":0, "uncheckedKeysByFile":[ ], "unmatched":0, "updated":0 }, "startTime":1732879325799, "success":true, "testResults":[ { "assertionResults":[ { "ancestorTitles":[ "HomeScreen" ], "duration":388, "failureDetails":[ ], "failureMessages":[ ], "fullName":"HomeScreen renders correctly", "invocations":1, "location":null, "numPassingAsserts":4, "retryReasons":[ ], "status":"passed", "title":"renders correctly" }, { "ancestorTitles":[ "HomeScreen" ], "duration":4, "failureDetails":[ ], "failureMessages":[ ], "fullName":"HomeScreen navigates to login screen on Log In button press", "invocations":1, "location":null, "numPassingAsserts":1, "retryReasons":[ ], "status":"passed", "title":"navigates to login screen on Log In button press" }, { "ancestorTitles":[ "HomeScreen" ], "duration":5, "failureDetails":[ ], "failureMessages":[ ], "fullName":"HomeScreen navigates to signup screen on Sign Up button press", "invocations":1, "location":null, "numPassingAsserts":1, "retryReasons":[ ], "status":"passed", "title":"navigates to signup screen on Sign Up button press" } ], "endTime":1732879326889, "message":"", "name":"/Users/nurullahucan/Documents/GitHub/bounswe2024group4/mobile/__tests__/home-test.tsx", "startTime":1732879326094, "status":"passed", "summary":"" }, { "assertionResults":[ { "ancestorTitles":[ "EditProfileScreen" ], "duration":386, "failureDetails":[ ], "failureMessages":[ ], "fullName":"EditProfileScreen renders the component correctly", "invocations":1, "location":null, "numPassingAsserts":3, "retryReasons":[ ], "status":"passed", "title":"renders the component correctly" }, { "ancestorTitles":[ "EditProfileScreen" ], "duration":14, "failureDetails":[ ], "failureMessages":[ ], "fullName":"EditProfileScreen validates email format and shows an error message for invalid input", "invocations":1, "location":null, "numPassingAsserts":1, "retryReasons":[ ], "status":"passed", "title":"validates email format and shows an error message for invalid input" }, { "ancestorTitles":[ "EditProfileScreen" ], "duration":17, "failureDetails":[ ], "failureMessages":[ ], "fullName":"EditProfileScreen shows an error message when passwords do not match", "invocations":1, "location":null, "numPassingAsserts":1, "retryReasons":[ ], "status":"passed", "title":"shows an error message when passwords do not match" }, { "ancestorTitles":[ "EditProfileScreen" ], "duration":54, "failureDetails":[ ], "failureMessages":[ ], "fullName":"EditProfileScreen opens the image picker when \"Change Photo\" is pressed", "invocations":1, "location":null, "numPassingAsserts":1, "retryReasons":[ ], "status":"passed", "title":"opens the image picker when \"Change Photo\" is pressed" } ], "endTime":1732879326965, "message":"", "name":"/Users/nurullahucan/Documents/GitHub/bounswe2024group4/mobile/__tests__/EditProfileScreen-test.tsx", "startTime":1732879326094, "status":"passed", "summary":"" }, { "assertionResults":[ { "ancestorTitles":[ "Leaderboard" ], "duration":354, "failureDetails":[ ], "failureMessages":[ ], "fullName":"Leaderboard renders loading indicator initially", "invocations":1, "location":null, "numPassingAsserts":2, "retryReasons":[ ], "status":"passed", "title":"renders loading indicator initially" }, { "ancestorTitles":[ "Leaderboard" ], "duration":65, "failureDetails":[ ], "failureMessages":[ ], "fullName":"Leaderboard renders leaderboard data on successful fetch", "invocations":1, "location":null, "numPassingAsserts":4, "retryReasons":[ ], "status":"passed", "title":"renders leaderboard data on successful fetch" }, { "ancestorTitles":[ "Leaderboard" ], "duration":54, "failureDetails":[ ], "failureMessages":[ ], "fullName":"Leaderboard displays error message on fetch failure", "invocations":1, "location":null, "numPassingAsserts":1, "retryReasons":[ ], "status":"passed", "title":"displays error message on fetch failure" }, { "ancestorTitles":[ "Leaderboard" ], "duration":161, "failureDetails":[ ], "failureMessages":[ ], "fullName":"Leaderboard switches tabs correctly and fetches corresponding data", "invocations":1, "location":null, "numPassingAsserts":10, "retryReasons":[ ], "status":"passed", "title":"switches tabs correctly and fetches corresponding data" } ], "endTime":1732879327164, "message":"", "name":"/Users/nurullahucan/Documents/GitHub/bounswe2024group4/mobile/__tests__/leaderboard-test.tsx", "startTime":1732879326094, "status":"passed", "summary":"" } ], "wasInterrupted":false }
Change:
The team decided to integrate the Activity Streams 2.0 standard into the project after reviewing the W3C standards. This includes using a NoSQL database to store JSON values for the standard.
Impact:
- Improved data interoperability and alignment with web standards.
- Enhanced scalability and structure for handling activity streams across platforms.
- Clearer direction in development, leading to a more structured backend design.
Change:
Tasks were more explicitly divided among frontend, backend, and mobile teams, with deadlines set for each team member.
Impact:
- Increased clarity and focus for individual contributors.
- Improved task tracking, ensuring each deliverable aligns with the project timeline.
- Avoided overlaps in responsibilities, reducing potential delays.
Change:
Added three separate leaderboards (meals, exercises, combined) and a weekly exercise tracking system.
Impact:
- Improved user engagement by allowing more granular tracking and ranking.
- Enhanced user interface consistency across web and mobile platforms.
Change:
The testing strategy now includes:
- Unit tests for 60% of the mobile and frontend code.
- Backend unit tests for all endpoints.
- Comprehensive user testing for core features like exercise creation, meal creation, and leaderboard functionality.
Impact:
- Improved reliability and reduced the risk of bugs in production.
- Better alignment with quality assurance practices.
Change:
Defined detailed demo scenarios, focusing on the leaderboard, weekly exercises, and exercise tracking.
Impact:
- Improved focus on showcasing high-impact features.
- Enhanced readiness for stakeholder presentations and feedback.
Plan:
Create and implement detailed user stories for each major feature, aligning frontend and backend work with these stories.
Impact:
- Improved coordination between teams, ensuring features are developed end-to-end.
- Faster resolution of dependencies between teams.
Plan:
Continue implementing and refining endpoints for features like weekly programs, meals, and the leaderboard. Modularize frontend and mobile components for easier integration.
Impact:
- Enhanced maintainability and scalability of the codebase.
- Faster feature rollouts as reusable components reduce duplication.
Plan:
Implement automation strategies for generating sample data, reducing manual effort for testing and demo preparation.
Impact:
- Saved time during testing and development.
- Consistent and realistic test data for demos and quality assurance.
Plan:
Ensure UX/UI consistency between mobile and web platforms through design reviews and collaborative discussions.
Impact:
- Enhanced user experience by maintaining a unified design language.
- Streamlined development with shared design systems.
- Complete the meal and exercise program components for mobile and web.
- Finalize all backend endpoints related to user, workout, and weekly programs.
- Conduct the first round of unit testing for all critical features.
- Prepare the milestone demo with finalized scenarios and test data.
- Integrate frontend and backend for all features, ensuring seamless data flow.
- Finalize the leaderboard feature with all three categories (meals, exercises, combined).
- Complete UX/UI consistency adjustments between mobile and web.
- Conduct user testing and incorporate feedback.
- Optimize performance across all platforms (web, mobile, backend).
- Finalize documentation for standards (Activity Streams 2.0) and overall project.
- Conduct a comprehensive review of testing coverage to ensure robustness.
- Prepare the project for final deployment and submission.
The changes made since Milestone 1 focus on standardization, clearer task allocation, and enhanced testing strategies, which will collectively improve the efficiency and quality of the development process. The planned changes aim to address any remaining gaps in feature development, testing, and user experience. The team is on track to complete the project within the defined timeline while meeting high standards for quality and functionality.
- Exercise instructions should be shorter.
- Instructions should have media such as images and videos that shows how to do an exercise as at the moment only text information is provided.
- Rating actions should have sanity checks.
- Workout creation should have sanity checks.
- Commenting on workouts should be possible.
Frontend and backend parts of our software accomplished vast majority of our planned second milestone targets, including the leaderboard page, exercise creation and rating. We couldn't implement some of these in our mobile application, which will be addressed before the third milestone. Excluding this, we are on track with our project plan.
- DigitalOcean
We are continuing to use DigitalOcean as our cloud provider, even though now the project consumes more resources as frontend and backend is connected the machine we spinned up before Milestone I is still working well.
- Testing frameworks
In this milestone we added unit tests to our repository. For backend we used Django's own testing framework while we used Jest for both frontend and mobile. We found each of these frameworks easy to use and we are pleased with our decision to use them.
- Swagger
In this milestone, we integrated Swagger into our project to streamline API documentation and improve collaboration between team members. Swagger allowed us to create an interactive and detailed API documentation that accurately represents the functionality of our backend endpoints. It provided a user-friendly interface where team members could easily explore, test, and understand API behaviors without needing to inspect code directly.
Member: Zeynep Buse AydΔ±n
During this milestone, I served as a frontend developer, focusing on implementing and enhancing key features of our project. My primary responsibilities included designing and developing new frontend components and integrating them with backend to ensure functionality. I actively participated in reviewing and merging pull requests to maintain code quality and consistency across the project. Post-deployment, I worked on identifying and fixing bugs to improve the user experience. Throughout the milestone, I collaborated closely with team members to address technical challenges, such as resolving conflicts.
Until Customer Milestone 2, I made significant contributions to both the technical and organizational aspects of the project. On the technical side, I implemented several key features, including the profile page and follow/unfollow functionality on the frontend. I finalized the exercise components, adding functionality for exercise creation and integrating these components with the backend. I also developed the rating functionality for exercises, although the meal ratings were deprioritized due to backend unavailability. Another significant feature I worked on was implementing leaderboards for exercises, meals, and overall performance.
In addition to new feature development, I played a vital role in resolving deployment-related bugs in collaboration with Kaan, ensuring the application ran smoothly post-deployment. I also contributed to improving the frontend user experience by enhancing the UI of exercise tracking. To maintain code quality, I wrote unit tests for the Leaderboard page and the ExerciseProgram component, and I reviewed multiple pull requests from teammates, including those for the signup/login implementation and exercise tracking UI. My reviews ensured consistency and alignment with the projectβs overall goals. I also resolved a challenging conflict involving migration files by aligning my branch with the most recent main branch changes.
On the organizational side, I was responsible for scheduling team meetings, ensuring that communication and planning were well-organized. I attended every lab session and contributed to every decision made, helping drive the project forward. I also collaborated with Kaan to write the testing section of the Milestone 2 report, providing clear and comprehensive documentation of our processes. My work on the integration of the workout_program endpoint, which enables users to create exercise programs, stood out as one of the most important features in this milestone.
As a frontend developer, the most complex endpoint I used during this milestone was workout_program. This endpoint corresponds to one of our most important features which is to create an exercise program. Given the list of exercises and workout name, the exercise program is created for the user.
workout_program/
{ workout_name: "upper body day-1β, username: βbuseβ, exercises: [ { equipment: "dumbbellβ, instruction: "Seat yourself on an incline bench with a dumbbell in each hand. You should pressed firmly against he back with your feet together. Allow the dumbbells to hang straight down at your side, holding them with a neutral grip. This will be your starting position. Initiate the movement by flexing at the elbow, attempting to keep the upper arm stationary. Continue to the top of the movement and pause, then slowly return to the start position.β, muscle: "bicepsβ, name: "Incline Hammer Curlsβ, reps: "15β, sets: β2β, type: "strength" }, { equipment: "machineβ, instruction: "Load the pins to an appropriate weight. Position yourself directly between the handles. Grasp the top handles with a comfortable grip, and then lower your hips as you take a breath. Look forward with your head and keep your chest up. Drive through the floor with your heels, extending your hips and knees as you rise to a standing position. Keep your arms straight throughout the movement, finishing with your shoulders back. This will be your starting position. Raise the weight by shrugging the shoulders towards your ears, moving straight up and down. Pause at the top of the motion, and then return the weight to the starting position.", muscle: "trapsβ, name: "Leverage Shrugβ, reps: "15β, sets: β3β, type: "strength" }, ] }
{ "message": "Workout program created successfully", "workout_id": 11, "workout_name": "upper body day-1", "created_by": βbuseβ, "exercises_count": 2 }
- #419 I implemented the profile page in frontend.
- #425 I finalized the exercises components and connected backend, implemented exercise creation functionality in frontend.
- #438 I implemented the rating functionality for exercises, couldnβt do meals since it was not ready in backend and we deprioritized.
- #439 I implemented follow/unfollow feature in frontend.
- #440 I implemented leaderboards (overall, meals and exercises) in frontend.
- #506 I worked on fixing the bugs after our first deployment with Kaan.
- #507 I wrote the testing part in Milestone2 Report with Kaan.
- #431 #455 I reviewed and merged Batuhanβs PRs on signup and login frontend implementation.
- #456 I implemented the profile page in frontend. Here I struggled a lot since there was a conflict regarding the migration files. At last to solve it, I got the most recent versions from the main branch and did not change anything on those files on my branch.
- #468 #482 I implemented leaderboards (overall, meals and exercises) in frontend.
- #470 #483 I implemented follow/unfollow feature in frontend.
- #471 I reviewed Kaanβs PR on changing the way we get username from the requests.
- #476 I reviewed Batuhanβs PR on the exercise tracking UI in frontend.
- #477 I reviewed Kaanβs PR on adding number of repetitions and sets attributes to the exercises.
- #478 I finalized the exercises components and connected backend, implemented exercise creation functionality in frontend.
- #481 I reviewed Kaanβs PR on fixing a bug in view_profile endpoint.
- #484 I implemented exercise program rating feature in frontend.
- #493 I wrote frontend unit tests for Leaderboard page loading and ExerciseProgram component.
- #495 I enhanced the UI of exercise tracking in frontend.
I presented the customer demo. I designed the presentation (the scenario) with my teammates. I was always available to communicate with my teammates if there is anything to discuss, decide or solve. I was present in all lab sessions and meetings. Additionally, I am the communicator for our group, attending classes and gathering insights for lab sessions.
Member: Bilge Kaan GΓΌneyli
In this milestone, my main responsibility was developing endpoints for the backend part of the project. I created the endpoints for profile pages and some simple features and I worked on database concurrency across team members. I also reviewed some PR's of the backend team. After the completion of the backend, I actively communicated with the front-end team and handled the bugs that appeared in backend-frontend connection process. Also, after the deployment I tested the program and worked on fixing errors that occurred at the deployed environment.
Technical part of my contributions can be divided into two parts. First part is my responsibilities which are assigned in general or backend team meetings that mostly covers the endpoint implementations. My contributions in this part are retrieving exercises from Exercises API, view and edit pages for profiles, leaderboards and following feature. Also, creating unit tests and swagger schemas can be considered under this part.
Second part of my technical contribution is solving the bugs that are faced by other teams. Most of time, I was available for frontend/mobile teams in case they have an issue while using the endpoints of backend and I was the person of contact between our teams. In this milestone, I was very active in solving the big issues of CSRF token problem which occurred during frontend connection and unresponsive endpoints problem which occurred after the deployment with Buse from frontend team. I also solved relatively small problems related to swagger and database migrations.
In the organizational part, I attended all the team meetings/labs and I was mostly active in the meetings. I was also affective in the communication between teams. Additionally, I created a visually enhanced report for unit tests of backend and added it to the testing part of the milestone report which we have created with Buse.
As a backend engineer the most complex I have created in this milestone is view_profile
. Which gets called when a user clicks profile button or a users username from the leaderboard. The endpoint retrieves the chosen users information and returns them to the frontend, then frontend filters the information based on whether a user is accessing profile of themselves or not.
view_profile
/profile/?viewing_username=sinanengin&viewed_username=kaan
{ "username": "kaan", "email": "[email protected]", "bio": "", "profile_picture": "media/profile_pictures/kaan.jpg", "score": 4.833333333333333, "weight_history": [ {"weight": 92, "date": "2024-11-15T08:30:00Z"}, {"weight": 98, "date": "2024-11-10T08:30:00Z"} ], "height": 190.0, "following_count": 1, "followers_count": 0, "is_following": false, "posts": [ { "post_id": 1 }, ], "workouts": [ { "workout_id": 10 }, { "workout_id": 3 }, { "workout_id": 2 }, { "workout_id": 1 } ] }
- #420 Implemented leaderboard, follow and unfollow endpoints
- #447 Implemented domain specific sub-leaderboards
- #505 Fixed the issue in authentication
- #506 Fixed the issues in POST requests with help from Buse
- #507 Created Testing part of Milestone Report with Buse
- #422 Implemented view and edit profile features and initiated the swagger tool
- #442 Implemented leaderboard, follow and unfollow features
- #461 Implemented domain specific sub-leaderboards
- #449 #469 Created swagger schemas and unit tests
- #464 #466 #481 #486 #496 Small updates or bug fixes
- #471 Handled the user authentication problem
- #477 Enhanced workouts to include number of sets and reps
- #479 Enhanced the directory structure for profile pictures feature
- #501 Handled the errors occurred after the deployment
- #427 Reviewed Talha's PR for enhancing workouts in backend
- #428 Reviewed Can's PR for creating weekly programs in backend
- #456 Reviewed Buse's PR for creating profile pages in frontend
- #459 Reviewed Can's PR for enhancing workouts and weekly programs in backend
- #495 Reviewed Buse's PR for user authentication bug-fix in frontend
- I actively participated all the labs and meetings and did my best to help the team in the decision making processes. Also, I was always reachable for my teammates and I was quick in checking the issues they reported in order to prevent the coding process from any setbacks.
Member: Murat Can Kocakulak
In this milestone, my core responsibilities were implementing weekly workout programs and handling the logic of tracking individual workouts inside the weekly programs, also setting the correct input and endpoints that the frontend can take. Besides that, I have also worked on optimizing other backend views functions and models like workout program, workout program creation, workout program rating, workout program bookmarking, getting all workouts of user, getting all workout logs of user, and workout program deleting. I also decided on which road we are going to use in order to keep the Activity Stream data of user in a proper way. I also reviewed other PRβs of my backend teammates. I also communicated with the frontend team in order to keep the endpoint connections to the frontend clean and understandable
My main contributions are with the exercise program parts: I have checked every view function via postman to make sure they are compatible with the frontend, also created view functions like delete_workout_by_id, toggle_bookmark_workout, get_bookmarked_workouts, create_program, get_programs_by_username, workout_log, get_workout_logs_by_username, error_response, success_response, get_user_data, validate_workout, validate_date. I also actively optimized and checked the other functions created by my teammates like get_workouts_by_username, get_workout_by_id, rate_workout, workout_program, get_exercises. I also reviewed and approved other works of my teammates in backend on different apps. I also worked actively on solving problems in the database migration parts.
Besides these, I attended all the team meetings/labs and participated when needed.
In the backend part, one of the complex Apiβs I have created was the βcreate_programβ api. This api makes the user be able to create weekly programs and display it. In order the function to work, proper json file with the ids of workouts and days should be given in the input.
create_program
/create-program/ Input body: { "workouts": { "1": 9, // Monday, workout_id 9 "3": 10, // Wednesday, workout_id 10 } }
{ 'program_id': 6, 'user': { 'user_id': 1, 'username': βmcankkβ }, 'days': [ { 'day': 'Monday', 'workout': { 'id': 9, 'name': βFull βBody Workout by Mcan } }, { 'day': 'Wednesday', 'workout': { 'id': 10, 'name': βPush βWorkout by Mcan } } ] }
- #441 Create weekly program api
- #442 Implement tracking down workouts inside weekly programs
- #508 Implement (un)bookmarking of workouts
- #510 Decided on the Activity Stream storage and categorization of the project
- #494*bookmarking added: workouts/toggle-bookmark/ seeing bookmarked workouts added: get-bookmarked-workouts/ *workout deletion added: 'workouts/delete/int:workout_id/' *minor improvements on workout logs, get workout programs by username and get workout logs of the user *Get methods contain url params now *Code urls part refactored for a more proper view
- #459 Minor changes made inside workout_program, rate_workout, get_workout_by_id. get_programs_by_user_id added for getting the weekly programs the spesific user created workout_log added for being able to mark a spesific workout and its exercises as "done" or "undone" with date date providing, making able to get_workout_logs_by_user added to get spesific users logs to use in the streak *unnecessary functions from profile app deleted
- #428 *weekly program addition *day-workout log addition *weekly programs and day-workout logs of the authenticated user
- #477 Reviewed Kaanβs work on enhancing workouts to include number of sets and reps
- #427 Reviewed Talha's PR for enhancing workouts in backend
- I actively participated all the labs and meetings and did my best to help the team in the decision making processes.
Member: Nurullah Uçan
I worked as a mobile developer, focusing on the design, implementation, and improvement of key features in the mobile application. My primary responsibilities included developing user-facing components, enhancing usability, and ensuring functionality through testing. Additionally, I collaborated with the team to plan milestones, manage tasks, and address technical challenges.
I focused on key areas of the mobile application to enhance both functionality and user experience:
- EditProfileScreen Implementation: I designed and developed the Edit Profile page, where users can update their personal details such as profile picture, bio, email, height, and password. I conducted extensive testing to handle edge cases and ensure reliability. The design was responsive and optimized for different devices.
- Usability Features: I improved the Signup and Login screens by implementing essential features such as input validation to prevent incorrect data entry, password visibility toggles for better accessibility, and a success modal to confirm successful account creation. These enhancements greatly improved the user onboarding experience.
- Component Development: I created standalone components for SignupScreen, LoginScreen, and HomeScreen. These components provided better navigation and usability, ensuring a smooth and intuitive experience for users.
- Profile Page Implementation: I developed a user-friendly Profile page that enables users to view and manage their account details seamlessly. The focus was on creating a simple yet functional design to make profile management intuitive for users.
- Unit Testing: I wrote unit test for the EditProfileScreen to verify its functionality and maintain code quality. These tests helped ensure that the application continues to function correctly as new updates are introduced.
- Updates to Roadmap for Milestone Report: Updated the roadmap to align with current project progress, enhance task prioritization, and include new feature requirements, ensuring a more streamlined and efficient development process.
- #414 Implement UI for login and signup pages in mobile
- #446 Implement Profile Page for Mobile
- #453 Enhance Login and Signup Screens with Usability Improvements in Mobile
- #462 Implement and Enhance Edit Profile Page in Mobile
- #497 Add unit tests for EditProfileScreen component to mobile
- #511 Updates to Roadmap for Milestone Report
- #454 N.ucan/login signup UI
- #492 N.ucan/profile page
- #475 Adding leaderboard screen to mobile (Reviewed)
- #473 Fixed signup login navigation (Reviewed)
- #429 Fix edit workout (Reviewed)
I attended all lab sessions and team meetings, actively contributing to discussions and providing input to align tasks and priorities.
Member: Ahmet Batuhan CanlΔ±
Creating login and signup pages and connecting them with the backend, Implementing exercise tracking mechanism for frontend.
I created login and signup pages and connected them with the backend also I implemented exercise tracking mechanism.
As a frontend developer, the most complex endpoint I used during this milestone was workout_program. This endpoint corresponds to one of our most important features which is to create an exercise program. Given the list of exercises and workout name, the exercise program is created for the user.
get-workouts/
const fetchPrograms = async () => { try { const response = await axios.get(`${baseURL}/get-workouts/?username=${username}`); console.log('get workout response', response); setPrograms(response.data); setLoading(false); } catch (error) { console.error("Error fetching user programs:", error); } }; fetchPrograms(); }, []);
get workout response ExerciseProgramList.js:28 β’ Object config: {transitional: {silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false}, adapter: ["xhr", "http", "fetch"], transformRequest: Array, transformResponse: Array, timeout: 0, ...} data: [Object, Object, Object, Object, Object, Objectl (6) headers: AxiosHeaders {content-length: "11188", content-type: "application/json"} request: XMLHttpRequest {listeners: Object, onreadystatechange: null, readyState: 4, timeout: 0, withCredentials: true, .. status: 200 statusText: "OK" β’ Object Prototype
- #430 Creating login and signup page
- #435 connecting signup and login pages with the backend
- #475 implementing exercise tracking mechanism
Pull requests that I created and merged:
- #431 login and signup page ui
- #455 connecting them with the backend
- #476 exercise tracking ui β It has a little conflict that I solved. I removed 1 paranthesis and conflict is solved.
- #485 connecting with backend
- #487 connection finalized.
Pull requests that I reviewed:
I actively communicated with my team to determine features of the project . Also I contributed to presentation planning.
Member: Talha Ordukaya
In this milestone, my responsibilities as a backend developer focused on implementing key features and ensuring the robustness of the system. I developed endpoints for managing workouts, including creating, retrieving, and rating workouts, as well as functionalities for user interaction such as post creation, liking/unliking, commenting, and bookmarking. I also implemented the home feed feature to deliver a personalized and dynamic content experience. Additionally, I wrote comprehensive unit tests for critical functionalities, including user authentication and workout-related operations, to ensure reliability and maintainability. Collaborating closely with the team, I resolved technical challenges, improved code quality through feedback and reviews. My contributions emphasized testing, refinement, and enhancing the overall performance and user experience.
Main Contributions:
During this milestone, I made significant contributions to both the technical and organizational aspects of the project. On the technical side, I implemented several core backend features, including creating, retrieving, and rating workouts, which formed the foundation for user interaction within the platform. I developed the functionality to create and manage posts, enabling users to like, comment, and bookmark content. Another key feature I implemented was the home feed, providing users with a personalized content experience. I also wrote comprehensive unit tests for critical functionalities such as login, signup, logout, workout rating, and user-specific workout retrieval, ensuring reliability and robustness.
Additionally, I focused on optimizing the integration between the backend and frontend by ensuring that endpoints were well-documented and easy to use for other team members. I actively resolved challenges related to backend functionality, improving user interaction features and ensuring consistency across modules. My contributions played a key role in enhancing the user experience by delivering reliable and well-tested backend solutions. Throughout the milestone, I collaborated closely with team members, participated in team meetings, and provided technical guidance to ensure smooth project progress.
One of the APIs I implemented was the create_post endpoint, which allows users to create posts and optionally link them to a workout or meal. This endpoint enhances the platformβs engagement features by enabling users to share their progress or experiences.
{ "content": "Just completed an intense upper body workout!", "workoutId": 15, "mealId": 8 }
{ "message": "Post created successfully", "post_id": 42 }
- #426: Implemented endpoints for managing workouts, including rating workouts, retrieving a specific workout by its ID, and fetching workouts associated with a specific user ID.
- #443: Developed the home feed and following feed functionalities, enabling users to view posts and activities from all users or just the ones they follow.
- #444: Implemented post functionalities, such as creating posts, liking/unliking posts, commenting on posts, and bookmarking posts, to enhance user engagement.
- #445: Wrote unit tests for critical backend features, including user authentication (login, signup, logout) and workout-related operations, ensuring reliability and code quality.
- #427: Implemented endpoints for managing workouts, including rating workouts, retrieving a specific workout by its ID, and fetching user-specific workouts.
- #448: Added Swagger documentation for workout endpoints and updated user information in models.
- #451: Implemented post functionalities, including creating, liking, commenting, and bookmarking posts.
- #452: Developed the feed and following feed functionalities, enabling users to view posts and interactions from all users or just their followings.
- #463: Added endpoints for managing token and session functionalities, improving user authentication and session handling.
- #465: Updated terminology in posts, replacing references to βexerciseβ with βworkoutβ to ensure consistency across the platform.
- #467: Wrote unit tests for critical endpoints, ensuring reliability and maintainability of the implemented features.
- #472: Enhanced Swagger documentation, updated existing endpoints, and resolved bugs for a smoother development experience.
Member: Berat YΔ±lmaz
I worked as a mobile developer, and contributed on navigation of the pages, some backend connections and APK creation. Additionally, I did the initial re-deployment of the software to the remote machine for the new milestone, while my teammate Kaan handled the deployments done after latest fixes.
Signup and login pages that were implemented by my teammate Nurullah were not integrated into navigation of the application, and I fixed this issue. Additionally, I partially connected the backend to the "Exercises" tab so that it can display the workouts created by that user. I also wrote unit tests for the home page that can redirect to signup and login pages.
Following endpoint is used in the "Exercises" tab of the mobile app.
http://68.183.213.92:8000/get-workouts/?username=kaan
[{"id": 1, "workout_name": "Kaan's Push Workout", "created_by": "kaan", "rating": 5.0, "rating_count": 2, "exercises": [{"type": "strength", "name": "Incline dumbbell bench press", "muscle": "chest", "equipment": "dumbbell", "instruction": "Lie back on an incline bench with a dumbbell in each hand atop your thighs. The palms of your hands will be facing each other. Then, using your thighs to help push the dumbbells up, lift the dumbbells one at a time so that you can hold them at shoulder width. Once you have the dumbbells raised to shoulder width, rotate your wrists forward so that the palms of your hands are facing away from you. This will be your starting position. Be sure to keep full control of the dumbbells at all times. Then breathe out and push the dumbbells up with your chest. Lock your arms at the top, hold for a second, and then start slowly lowering the weight. Tip Ideally, lowering the weights should take about twice as long as raising them. Repeat the movement for the prescribed amount of repetitions. When you are done, place the dumbbells back on your thighs and then on the floor. This is the safest manner to release the dumbbells. Variations: You can use several angles on the incline bench if the bench you are using is adjustable. Another variation of this exercise is to perform it with the palms of the hands facing each other. Also, you can perform the exercise with the palms facing each other and then twisting the wrist as you lift the dumbbells so that at the top of the movement the palms are facing away from the body. I personally do not use this variation very often as it seems to be hard on my shoulders.", "sets": 4, "reps": 12}, {"type": "strength", "name": "Dumbbell Flyes", "muscle": "chest", "equipment": "dumbbell", "instruction": "Lie down on a flat bench with a dumbbell on each hand resting on top of your thighs. The palms of your hand will be facing each other. Then using your thighs to help raise the dumbbells, lift the dumbbells one at a time so you can hold them in front of you at shoulder width with the palms of your hands facing each other. Raise the dumbbells up like you're pressing them, but stop and hold just before you lock out. This will be your starting position. With a slight bend on your elbows in order to prevent stress at the biceps tendon, lower your arms out at both sides in a wide arc until you feel a stretch on your chest. Breathe in as you perform this portion of the movement. Tip: Keep in mind that throughout the movement, the arms should remain stationary; the movement should only occur at the shoulder joint. Return your arms back to the starting position as you squeeze your chest muscles and breathe out. Tip: Make sure to use the same arc of motion used to lower the weights. Hold for a second at the contracted position and repeat the movement for the prescribed amount of repetitions. Variations: You may want to use a palms facing forward version for different stimulation.", "sets": 3, "reps": 15}, {"type": "strength", "name": "Standing dumbbell upright row", "muscle": "traps", "equipment": "dumbbell", "instruction": "Grasp a dumbbell in each hand with a pronated (palms forward) grip that is slightly less than shoulder width. The dumbbells should be resting on top of your thighs. Your arms should be extended with a slight bend at the elbows and your back should be straight. This will be your starting position. Use your side shoulders to lift the dumbbells as you exhale. The dumbbells should be close to the body as you move it up and the elbows should drive the motion. Continue to lift them until they nearly touch your chin. Tip: Your elbows should drive the motion. As you lift the dumbbells, your elbows should always be higher than your forearms. Also, keep your torso stationary and pause for a second at the top of the movement. Lower the dumbbells back down slowly to the starting position. Inhale as you perform this portion of the movement. Repeat for the recommended amount of repetitions. Caution: Be very careful with how much weight you use in this exercise. Too much weight leads to bad form, which in turn can cause shoulder injury. I've seen this too many times so please no jerking, swinging and cheating. Also, if you suffer from shoulder problems, you may want to stay away from upright rows and substitute by some form of lateral raises. Variations: This exercise can also be performed using a straight bar attached to a low pulley and it can also be performed using an e-z bar.", "sets": 4, "reps": 12}, {"type": "strength", "name": "EZ-Bar Skullcrusher", "muscle": "triceps", "equipment": "e-z_curl_bar", "instruction": "Using a close grip, lift the EZ bar and hold it with your elbows in as you lie on the bench. Your arms should be perpendicular to the floor. This will be your starting position. Keeping the upper arms stationary, lower the bar by allowing the elbows to flex. Inhale as you perform this portion of the movement. Pause once the bar is directly above the forehead. Lift the bar back to the starting position by extending the elbow and exhaling. Repeat.", "sets": 4, "reps": 15}]}, {"id": 2, "workout_name": "Kaan's Pull Workout", "created_by": "kaan", "rating": 4.5, "rating_count": 2, "exercises": [{"type": "strength", "name": "Pullups", "muscle": "lats", "equipment": "body_only", "instruction": "Grab the pull-up bar with the palms facing forward using the prescribed grip. Note on grips: For a wide grip, your hands need to be spaced out at a distance wider than your shoulder width. For a medium grip, your hands need to be spaced out at a distance equal to your shoulder width and for a close grip at a distance smaller than your shoulder width. As you have both arms extended in front of you holding the bar at the chosen grip width, bring your torso back around 30 degrees or so while creating a curvature on your lower back and sticking your chest out. This is your starting position. Pull your torso up until the bar touches your upper chest by drawing the shoulders and the upper arms down and back. Exhale as you perform this portion of the movement. Tip: Concentrate on squeezing the back muscles once you reach the full contracted position. The upper torso should remain stationary as it moves through space and only the arms should move. The forearms should do no other work other than hold the bar. After a second on the contracted position, start to inhale and slowly lower your torso back to the starting position when your arms are fully extended and the lats are fully stretched. Repeat this motion for the prescribed amount of repetitions. Variations: If you are new at this exercise and do not have the strength to perform it, use a chin assist machine if available. These machines use weight to help you push your bodyweight. Otherwise, a spotter holding your legs can help. On the other hand, more advanced lifters can add weight to the exercise by using a weight belt that allows the addition of weighted plates. The behind the neck variation is not recommended as it can be hard on the rotator cuff due to the hyperextension created by bringing the bar behind the neck.", "sets": 3, "reps": 12}, {"type": "strength", "name": "T-Bar Row", "muscle": "middle_back", "equipment": "other", "instruction": "Load the bar to an appropriate weight for your training. Stand astride the bar and bend at the hips to take a pronated grip on the handles. Ensure that your back remains flat, and then remove the weight from the rests, letting the bar hang at arms length. This will be your starting position. Perform the movement by flexing the elbows and retracting the shoulder blades, pulling the weight to your chest. After a brief pause at the top of the motion, return to the starting position.", "sets": 3, "reps": 8}, {"type": "strength", "name": "Back extension", "muscle": "lower_back", "equipment": "body_only", "instruction": "Lie face down on a hyperextension bench, tucking your ankles securely under the footpads. Adjust the upper pad if possible so your upper thighs lie flat across the wide pad, leaving enough room for you to bend at the waist without any restriction. With your body straight, cross your arms in front of you (my preference) or behind your head. This will be your starting position. Tip: You can also hold a weight plate for extra resistance in front of you under your crossed arms. Start bending forward slowly at the waist as far as you can while keeping your back flat. Inhale as you perform this movement. Keep moving forward until you feel a nice stretch on the hamstrings and you can no longer keep going without a rounding of the back. Tip: Never round the back as you perform this exercise. Also, some people can go farther than others. The key thing is that you go as far as your body allows you to without rounding the back. Slowly raise your torso back to the initial position as you inhale. Tip: Avoid the temptation to arch your back past a straight line. Also, do not swing the torso at any time in order to protect the back from injury. Repeat for the recommended amount of repetitions. Variations: This exercise can also be performed without a hyperextension bench, but in this case you will need a spotter. Also, a similar exercise to this one is the good morning and the stiff-legged deadlift.", "sets": 3, "reps": 15}, {"type": "strength", "name": "Concentration curl", "muscle": "biceps", "equipment": "dumbbell", "instruction": "Sit down on a flat bench with one dumbbell in front of you between your legs. Your legs should be spread with your knees bent and feet on the floor. Use your right arm to pick the dumbbell up. Place the back of your right upper arm on the top of your inner right thigh. Rotate the palm of your hand until it is facing forward away from your thigh. Tip: Your arm should be extended and the dumbbell should be above the floor. This will be your starting position. While holding the upper arm stationary, curl the weights forward while contracting the biceps as you breathe out. Only the forearms should move. Continue the movement until your biceps are fully contracted and the dumbbells are at shoulder level. Tip: At the top of the movement make sure that the little finger of your arm is higher than your thumb. This guarantees a good contraction. Hold the contracted position for a second as you squeeze the biceps. Slowly begin to bring the dumbbells back to starting position as your breathe in. Caution: Avoid swinging motions at any time. Repeat for the recommended amount of repetitions. Then repeat the movement with the left arm. Variations: This exercise can be performed standing with the torso bent forward and the arm in front of you. In this case, no leg support is used for the back of your arm so you will need to make extra effort to ensure no movement of the upper arm. This is a more challenging version of the exercise and is not recommended for people with lower back issues.", "sets": 4, "reps": 12}, {"type": "strength", "name": "Hammer Curls", "muscle": "biceps", "equipment": "dumbbell", "instruction": "Stand up with your torso upright and a dumbbell on each hand being held at arms length. The elbows should be close to the torso. The palms of the hands should be facing your torso. This will be your starting position. Now, while holding your upper arm stationary, exhale and curl the weight forward while contracting the biceps. Continue to raise the weight until the biceps are fully contracted and the dumbbell is at shoulder level. Hold the contracted position for a brief moment as you squeeze the biceps. Tip: Focus on keeping the elbow stationary and only moving your forearm. After the brief pause, inhale and slowly begin the lower the dumbbells back down to the starting position. Repeat for the recommended amount of repetitions. Variations: There are many possible variations for this movement. For instance, you can perform the exercise sitting down on a bench with or without back support and you can also perform it by alternating arms; first lift the right arm for one repetition, then the left, then the right, etc.", "sets": 3, "reps": 8}]}, {"id": 3, "workout_name": "Kaan's Leg&Abs Workout", "created_by": "kaan", "rating": 5.0, "rating_count": 2, "exercises": [{"type": "strength", "name": "Barbell Full Squat", "muscle": "quadriceps", "equipment": "barbell", "instruction": "This exercise is best performed inside a squat rack for safety purposes. To begin, first set the bar on a rack just above shoulder level. Once the correct height is chosen and the bar is loaded, step under the bar and place the back of your shoulders (slightly below the neck) across it. Hold on to the bar using both arms at each side and lift it off the rack by first pushing with your legs and at the same time straightening your torso. Step away from the rack and position your legs using a shoulder-width medium stance with the toes slightly pointed out. Keep your head up at all times and maintain a straight back. This will be your starting position. Begin to slowly lower the bar by bending the knees and sitting back with your hips as you maintain a straight posture with the head up. Continue down until your hamstrings are on your calves. Inhale as you perform this portion of the movement. Begin to raise the bar as you exhale by pushing the floor with the heel or middle of your foot as you straighten the legs and extend the hips to go back to the starting position. Repeat for the recommended amount of repetitions. This type of squat allows a greater range of motion, and allows the trunk to maintain a more vertical position than other types of squats, due to foot position and the higher bar position.", "sets": 4, "reps": 8}, {"type": "strength", "name": "Romanian Deadlift With Dumbbells", "muscle": "hamstrings", "equipment": "dumbbell", "instruction": "Begin in a standing position with a dumbbell in each hand. Ensure that your back is straight and stays that way for the duration of the exercise. Allow your arms to hang perpendicular to the floor, with the wrists pronated and the elbows pointed to your sides. This will be your starting position. Initiate the movement by flexing your hips, slowly pushing your butt as far back as you can. This should entail a horizontal movement of the hips, rather than a downward movement. The knees should only partially bend, and your weight should remain on your heels. Drive your butt back as far as you can, which should generate tension in your hamstrings as your hands approach knee level. Maintain an arch in your back throughout the exercise. When your hips cannot perform any further backward movement, pause, and then slowly return to the starting position by extending the hips.", "sets": 4, "reps": 12}, {"type": "strength", "name": "Single-Leg Press", "muscle": "quadriceps", "equipment": "machine", "instruction": "Load the sled to an appropriate weight. Seat yourself on the machine, planting one foot on the platform in line with your hip. Your free foot can be placed on the ground. Maintain good spinal position with your head and chest up. Supporting the weight, fully extend the knee and unlock the sled. This will be your starting position. Lower the weight by flexing the hip and knee, continuing as far as flexibility allows. Do not allow your lumbar to take the load by moving your pelvis. At the bottom of the motion pause briefly and then return to the starting position by extending the hip and knee. Complete all repetitions for one leg before switching to the other.", "sets": 3, "reps": 15}, {"type": "strength", "name": "Seated Calf Raise", "muscle": "calves", "equipment": "machine", "instruction": "Sit on the machine and place your toes on the lower portion of the platform provided with the heels extending off. Choose the toe positioning of your choice (forward, in, or out) as per the beginning of this chapter. Place your lower thighs under the lever pad, which will need to be adjusted according to the height of your thighs. Now place your hands on top of the lever pad in order to prevent it from slipping forward. Lift the lever slightly by pushing your heels up and release the safety bar. This will be your starting position. Slowly lower your heels by bending at the ankles until the calves are fully stretched. Inhale as you perform this movement. Raise the heels by extending the ankles as high as possible as you contract the calves and breathe out. Hold the top contraction for a second. Repeat for the recommended amount of repetitions.", "sets": 4, "reps": 15}, {"type": "strength", "name": "Elbow plank", "muscle": "abdominals", "equipment": "body_only", "instruction": "Get into a prone position on the floor, supporting your weight on your toes and your forearms. Your arms are bent and directly below the shoulder. Keep your body straight at all times, and hold this position as long as possible. To increase difficulty, an arm or leg can be raised.", "sets": 3, "reps": 30}]}, {"id": 10, "workout_name": "leg day", "created_by": "kaan", "rating": 0.0, "rating_count": 0, "exercises": [{"type": "strength", "name": "Single-Leg Press", "muscle": "quadriceps", "equipment": "machine", "instruction": "Load the sled to an appropriate weight. Seat yourself on the machine, planting one foot on the platform in line with your hip. Your free foot can be placed on the ground. Maintain good spinal position with your head and chest up. Supporting the weight, fully extend the knee and unlock the sled. This will be your starting position. Lower the weight by flexing the hip and knee, continuing as far as flexibility allows. Do not allow your lumbar to take the load by moving your pelvis. At the bottom of the motion pause briefly and then return to the starting position by extending the hip and knee. Complete all repetitions for one leg before switching to the other.", "sets": 2, "reps": 10}, {"type": "olympic_weightlifting", "name": "Clean Deadlift", "muscle": "hamstrings", "equipment": "barbell", "instruction": "Begin standing with a barbell close to your shins. Your feet should be directly under your hips with your feet turned out slightly. Grip the bar with a double overhand grip or hook grip, about shoulder width apart. Squat down to the bar. Your spine should be in full extension, with a back angle that places your shoulders in front of the bar and your back as vertical as possible. Begin by driving through the floor through the front of your heels. As the bar travels upward, maintain a constant back angle. Flare your knees out to the side to help keep them out of the bar's path. After the bar crosses the knees, complete the lift by driving the hips into the bar until your hips and knees are extended.", "sets": 3, "reps": 15}]}]
- #473 I fixed the navigation for signup and login pages.
- #489 I connected the exercise tab to backend to display the workouts created by the user.
- #491 I added unit tests for the home page that redirects to signup and login pages.
- #475 Adding leaderboard screen to mobile (Reviewed)
- #480 baseURL for mobile (Reviewed)
- #488 Signup and login for mobile (Reviewed)
Member: Ceyhun SonyΓΌrek
As a member of the mobile team, my primary responsibility is developing the mobile application by implementing new features, designing user interfaces, and adding components. I also ensure seamless integration of necessary APIs and database management functionalities in coordination with the backend team. Beyond my main duties, I contribute to the overall design and development efforts of the project, actively participate in team meetings to support decision-making processes, and fulfill tasks assigned by the team for successful project execution.
Between Customer Milestone 1 and Customer Milestone 2, my main contributions were centered around enhancing the mobile application by adding new features, resolving bugs, improving existing functionalities, and reviewing my teammatesβ work to provide feedback.
One of my key tasks was implementing a leaderboard page in the mobile app. This page allows users to view rankings based on their ratings, which are fetched from the backend. To ensure the feature worked correctly, I wrote a unit test to validate its functionality. Additionally, I added the ability to view the user's profile after clicked them in the leaderboard.
I also made significant updates to the profile page, which was initially designed by Nurullah. I enhanced it to display user information retrieved from the backend and improved its functionality so that the page's behavior dynamically adjusts depending on whether the profile being viewed belongs to the current user or another user. Additionally, I ensured that the backend endpoint for profile data was properly integrated, allowing the profile page to manage critical settings for both personal and external profiles.
Another important contribution was integrating backend functionality into the login and signup pages, also designed by Nurullah. This integration enabled users to register and log in to the app seamlessly, ensuring a smooth authentication process and full access to the app's features.
These contributions collectively strengthened the mobile app's functionality and improved the user experience, aligning the project with its goals.
I used the get_leaderboard endpoint as most complex similar to the get_workout_leaderboard and get_meal_leaderboard that are used in the same screen. This end points returns the all user's rating scores with a sorted list.
get_leaderboard/
useEffect(() => { const endpoints = { combined: baseURL + '/get_leaderboard/', workout: baseURL + '/get_workout_leaderboard/', meal: baseURL + '/get_meal_leaderboard/', }; fetchLeaderboard(endpoints[activeTab]); }, [activeTab]); const fetchLeaderboard = async (endpoint: string) => { try { setLoading(true); setError(null); const response = await axios.get(endpoint); if (response.status === 200) { const dataKey = activeTab === 'combined' ? 'leaderboard' : activeTab === 'workout' ? 'workout_leaderboard' : 'meal_leaderboard'; setLeaderboardData(response.data[dataKey]); } else { setError('Failed to fetch leaderboard data.'); } } catch (err) { setError('Something went wrong. Please try again later.'); } finally { setLoading(false); }
{ "leaderboard": [ { "username": "kaan", "profile_picture": "", "rating": 4.83333333333333 }, { "username": "buseaydin", "profile_picture": "", "rating": 4 }, { "username": "sinanengin", "profile_picture": "", "rating": 3.71428571428571 }, { "username": "batu", "profile_picture": "", "rating": 3.25 }, { "username": "Mcankk", "profile_picture": "", "rating": 3 }, { "username": "muratcank", "profile_picture": "", "rating": null } ] }
- #429 I fixed a bug which crushes app while editing a workout.
- #475 I added leaderboard UI design for mobile.
- #480 I changed to backend calls to a more simple form.
- #488 I added to signup and login functionalities.
- #491 I added test for leaderboard screen.
- #502 I connected to profile page backend and made it callable from the leaderboard screen.
- #454 Reviewed
- #473 Reviewed
- #489 Reviewed
- #490 Reviewed
- #492 Reviewed
Attended all labs, worked hard, implemented lots of codes and contributed to our strong teamwork. Also reviewed and gave feedback nearly all pull requests developed by mobile team.