QuestForge is a project created by Aston Martinez and based on the style of Habitica. It serves to gamify your habits, daily tasks, and productivity to keep you on track and ensure your well-being. By allowing you to visualize your tasks and goals, as well as the impact of sticking to them or falling behind (via health, experience, and gold for your avatar), QuestForge helps increase motivation and sets you up for success.
You can access the live app here: https://questforge-capstone.onrender.com
-
Flask
-
Alembic
-
SQLAlchemy
- React.js
- Redux
- Habits
- Registered users can create new Habits, which appear on their user dashboard.
- Registered users can view their Habit details from within their user dashboard.
- Registered users can edit/update their Habit details from within a modal on the user dashboard by clicking on a specific Habit.
- Registered users can delete Habits from their user dashboard by clicking on the Habit and viewing its details.
- Dailies
- Registered users can create new Dailies, which appear on their user dashboard.
- Registered users can view their Daily details from within their user dashboard.
- Registered users can edit/update their Daily details from within a modal on the user dashboard by clicking on a specific Daily.
- Registered users can delete Dailies from their user dashboard by clicking on the Daily and viewing its details.
- To-Dos
- Registered users can create new To-Dos, which appear on their user dashboard.
- Registered users can view their To-Do details from within their user dashboard.
- Registered users can edit/update their To-Dp details from within a modal on the user dashboard by clicking on a specific To-Do.
- Registered users can delete To-Dos from their user dashboard by clicking on the To-Do and viewing its details.
- Avatar Customization
- Registered users are assigned a default avatar, which they can then customize by clicking the 'Edit Avatar' button within the user dropdown in the top right corner.
- Rewards
- Registered users can create new Rewards, which appear on their user dashboard.
- Registered users can view their Reward details from within their user dashboard.
- Registered users can edit/update their Reward details from within a modal on the user dashboard by clicking on a specific Reward.
- Registered users can delete Rewards from their user dashboard by clicking on the Reward and viewing its details.
- Shops
- Registered users can buy new items for their avatar, which will later have uses (by equipping or using a specified item).
- Quests:
- Registered users will be able to go on epic quests to increase their stats, find new equipment, and level up.
- Parties
- Registered users will be able to join parties with other users, go on quests together, and increase their rewards.
- Drag and Drop
- Registered users will be able to drag and drop items within the same list (i.e., Habits, Dailies, To-Dos, Rewards)
- More Shop items
- Registered users will have more item options to purchase with the gold they earn.
You can contact Aston via email, GitHub, or LinkedIn:
- Email: aston.martinez1614@gmail.com
- GitHub: https://github.com/AstonMartinez
- LinkedIn: https://www.linkedin.com/in/aston-martinez-0716/
Request | Purpose | Return Value |
---|---|---|
GET /api/auth/ | This fetch is sent upon initial load and on subsequent refreshes. It returns an object representing the current user, if user is logged in | { 'id': INT, 'username': STRING, 'email': STRING, 'bio': STRING, 'experience_points': INT, 'level': INT, 'date_joined': DATE, 'gold': INT, 'health': INT 'avatar': { 'id': INT, 'user_id': INT, 'shirt': STRING, 'hair': STRING, 'bangs': STRING, 'skin': STRING, 'background': STRING } } |
POST /api/auth/login | This fetch attempts to log in a user with the provided credentials. It returns an object representing the current user, if validation succeeds. | { 'id': INT, 'username': STRING, 'email': STRING, 'bio': STRING, 'experience_points': INT, 'level': INT, 'date_joined': DATE, 'gold': INT, 'health': INT 'avatar': { 'id': INT, 'user_id': INT, 'shirt': STRING, 'hair': STRING, 'bangs': STRING, 'skin': STRING, 'background': STRING } } |
GET /api/auth/logout | Logs out a user. | { 'message': 'User logged out' } |
POST /api/auth/signup | Creates a new user and logs them in. Returns an object representing the newly created user. | { 'id': INT, 'username': STRING, 'email': STRING, 'bio': STRING, 'experience_points': INT, 'level': INT, 'date_joined': DATE, 'gold': INT, 'health': INT 'avatar': { 'id': INT, 'user_id': INT, 'shirt': STRING, 'hair': STRING, 'bangs': STRING, 'skin': STRING, 'background': STRING } } |
GET /api/auth/unauthorized | Returns unauthorized JSON when flask-login authentication fails. | { 'errors': [ 'Unauthorized' ] } |
GET /api/avatar/current | Fetches a logged-in user's avatar details. | { 'id': INT, 'user_id': INT, 'shirt': STRING, 'hair': STRING, 'bangs': STRING, 'skin': STRING, 'background': STRING } |
PUT /api/avatar/update | Updates a logged-in user's avatar details after changing them in the customization modal. | { 'id': INT, 'user_id': INT, 'shirt': STRING, 'hair': STRING, 'bangs': STRING, 'skin': STRING, 'background': STRING } |
GET /api/dailies/:id | Fetches the details of a specified Daily. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'checklist': STRING, 'difficulty': STRING, 'start_date': DATE, 'repeats': STRING, 'num_repeats': INT, 'day_of_repeat': STRING, 'count': INT, 'tags': STRING, 'status': STRING } |
DELETE /api/dailies/:id/delete | Deletes a logged-in user's specified Daily. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'checklist': STRING, 'difficulty': STRING, 'start_date': DATE, 'repeats': STRING, 'num_repeats': INT, 'day_of_repeat': STRING, 'count': INT, 'tags': STRING, 'status': STRING } |
PUT /api/dailies/:id/update | Updates the details of user's specified Daily. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'checklist': STRING, 'difficulty': STRING, 'start_date': DATE, 'repeats': STRING, 'num_repeats': INT, 'day_of_repeat': STRING, 'count': INT, 'tags': STRING, 'status': STRING } |
POST /api/dailies/new | Creates a new Daily. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'checklist': STRING, 'difficulty': STRING, 'start_date': DATE, 'repeats': STRING, 'num_repeats': INT, 'day_of_repeat': STRING, 'count': INT, 'tags': STRING, 'status': STRING } |
GET /api/docs | Returns all API routes and their doc strings. | { "route": [ [ "method" ], [ "purpose" ] ] } |
POST /api/equipment/:id/buy | Allows a user to purchase an item, then adds the item to their inventory. Returns an object with the user's id and the equipment item's id. | { 'id': INT, 'user_id': INT, 'equipment_id': INT } |
POST /api/features/new | Allows a user to create and submit a new Feature Request. | { 'id': INT, 'email': STRING, 'category': STRING, 'response': STRING, 'description': STRING } |
GET /api/habits/:id | Fetches the details of a specific Habit. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'type': STRING, 'difficulty': STRING, 'tags': STRING, 'pos_count': INT, 'neg_count': INT, 'status': STRING } |
GET /api/habits/:id | Fetches the details of a specific Habit. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'type': STRING, 'difficulty': STRING, 'tags': STRING, 'pos_count': INT, 'neg_count': INT, 'status': STRING } |
DELETE /api/habits/:id/delete | Allows a user to delete a specified Habit. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'type': STRING, 'difficulty': STRING, 'tags': STRING, 'pos_count': INT, 'neg_count': INT, 'status': STRING } |
PUT /api/habits/:id/update | Updates the details of a specified Habit. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'type': STRING, 'difficulty': STRING, 'tags': STRING, 'pos_count': INT, 'neg_count': INT, 'status': STRING } |
POST /api/habits/new | Allows a logged-in user to create a new Habit. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'type': STRING, 'difficulty': STRING, 'tags': STRING, 'pos_count': INT, 'neg_count': INT, 'status': STRING } |
PUT /api/reports/:id/status | Updates a Bug Report's status to resolved or unresolved. | { 'id': INT, 'user_email': STRING, 'bug_description': STRING, 'status': STRING } |
POST /api/reports/new | Allows a user to create a new Bug Report. | { 'id': INT, 'user_email': STRING, 'bug_description': STRING, 'status': STRING } |
GET /api/rewards/:id | Fetches the details of a specified Reward. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'cost': INT, 'tags': STRING } |
DELETE /api/rewards/:id/delete | Allows a user to delete a specified Reward. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'cost': INT, 'tags': STRING } |
PUT /api/rewards/:id/update | Updates the details of a specified Reward. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'cost': INT, 'tags': STRING } |
POST /api/rewards/new | Allows a user to create a new Reward. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'cost': INT, 'tags': STRING } |
GET /api/search/:tags | Filters a user's Habits, Dailies, To-Dos, and Rewards based on the specified tags. | { 'habits': { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'type': STRING, 'difficulty': STRING, 'tags': STRING, 'pos_count': INT, 'neg_count': INT, 'status': STRING } 'dailies': { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'checklist': STRING, 'difficulty': STRING, 'start_date': DATE, 'repeats': STRING, 'num_repeats': INT, 'day_of_repeat': STRING, 'count': INT, 'tags': STRING, 'status': STRING } 'toDos': { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'difficulty': STRING, 'checklist': STRING, 'due_date': DATE, 'tags': STRING, 'status': STRING } 'rewards': { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'cost': INT, 'tags': STRING } } |
GET /api/search/custom/:query | Filters a user's Habits, Dailies, To-Dos, and Rewards based on keywords in the item's title or notes. | { 'habits': { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'type': STRING, 'difficulty': STRING, 'tags': STRING, 'pos_count': INT, 'neg_count': INT, 'status': STRING } 'dailies': { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'checklist': STRING, 'difficulty': STRING, 'start_date': DATE, 'repeats': STRING, 'num_repeats': INT, 'day_of_repeat': STRING, 'count': INT, 'tags': STRING, 'status': STRING } 'toDos': { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'difficulty': STRING, 'checklist': STRING, 'due_date': DATE, 'tags': STRING, 'status': STRING } 'rewards': { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'cost': INT, 'tags': STRING } } |
GET /api/todos/:id | Fetches the details of a specified To-Do. | { 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'difficulty': STRING, 'checklist': STRING, 'due_date': DATE, 'tags': STRING, 'status': STRING } |
DELETE /api/todos/:id/delete | Allows users to delete a specified To-Do. | 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'difficulty': STRING, 'checklist': STRING, 'due_date': DATE, 'tags': STRING, 'status': STRING } |
PUT /api/todos/:id/update | Updates the details of a specified To-Do. | 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'difficulty': STRING, 'checklist': STRING, 'due_date': DATE, 'tags': STRING, 'status': STRING } |
POST /api/todos/new | Allows a user to create a new To-Do. | 'id': INT, 'user_id': INT, 'title': STRING, 'notes': STRING, 'difficulty': STRING, 'checklist': STRING, 'due_date': DATE, 'tags': STRING, 'status': STRING } |
GET /api/todos/user-to-dos | Fetches all of a logged-in user's To-Dos. | Fetches all of a logged-in user's To-Dos. |
GET /api/users | Query for all users and returns them in a list of user dictionaries. | [ { 'id': INT, 'username': STRING, 'email': STRING, 'bio': STRING, 'experience_points': INT, 'level': INT, 'date_joined': DATE, 'gold': INT, 'health': INT 'avatar': { 'id': INT, 'user_id': INT, 'shirt': STRING, 'hair': STRING, 'bangs': STRING, 'skin': STRING, 'background': STRING } } ] |
GET /api/users/:id | Query for a user by id and returns that user in a dictionary object. | { 'id': INT, 'username': STRING, 'email': STRING, 'bio': STRING, 'experience_points': INT, 'level': INT, 'date_joined': DATE, 'gold': INT, 'health': INT 'avatar': { 'id': INT, 'user_id': INT, 'shirt': STRING, 'hair': STRING, 'bangs': STRING, 'skin': STRING, 'background': STRING } } |
GET /api/users/inventory | Fetches all of a logged-in user's inventory items. | { 'id': { 'id': INT, 'name': STRING, 'description': STRING, 'strength': INT, 'str_gear_num': INT, 'str_class_bonus': INT, 'constitution': INT, 'const_gear_num': INT, 'const_class_bonus': INT, 'intelligence': INT, 'int_gear_num': INT, 'int_class_bonus': INT, 'perception': INT, 'perc_gear_num': INT, 'perc_class_bonus': INT, 'cost': INT, 'image': STRING } } |
PUT /api/users/update-user-stats | Updates a user's stats and information. | { 'id': INT, 'username': STRING, 'email': STRING, 'bio': STRING, 'experience_points': INT, 'level': INT, 'date_joined': DATE, 'gold': INT, 'health': INT 'avatar': { 'id': INT, 'user_id': INT, 'shirt': STRING, 'hair': STRING, 'bangs': STRING, 'skin': STRING, 'background': STRING } } |