LazyDog is a collaborative student resource-sharing platform, designed and built by four developers as part of a continued learning project following a bootcamp.
The platform allows users to share, rate, and comment on educational resources related to various programming and development topics. Our goal is to create a space for students to access, contribute, and engage with high-quality learning materials while reinforcing what we've learned during the bootcamp.
Live Demo OBS Fixa länken! 🚨 🚨 🚨
- Overview
- Core Features
- Technologies
- Installation
- Design Details
- API Overview
- Usage
- Testing
- Contributing
- Deployment
- Credits
- License
LazyDog was built to address the challenge of finding high-quality, categorized educational resources in one place. It is aimed at students and developers looking to discover or contribute valuable content, with features that encourage community engagement through ratings and comments. The platform helps users enhance their learning journey and share insights from a range of development topics.
This section outlines the core functionality of the platform and the key features planned for the Minimum Viable Product (MVP).
-
User Accounts:
-
Users can create an account with a username, email, and password.
-
Logged-in users can submit resources, rate resources, and participate in discussions by leaving comments.
-
-
Resource Categorization:
- Resources are organized into categories like programming languages, frameworks, and tools.
- Each category includes subcategories with various types of resources, such as documentation, articles, YouTube tutorials, and games.
Example of categorized resources:
-
Project 1 - Introduction to Web Dev: HTML, CSS
Subcategories: Docs, Articles, YouTube, Games. -
Project 2 - JavaScript Fundamentals: JavaScript
Subcategories: Docs, Articles, YouTube, Games. -
Project 3 - Python Basics: Python
Subcategories: Docs, Articles, YouTube, Games.
-
Resource Submission:
-
Logged-in users can contribute by submitting new resources through a simple form.
-
The submission includes fields for a URL, title, short description, optional image, category, and tags to ensure proper categorization and relevance.
-
-
Rating & Commenting System:
-
Users can rate resources on a 1-5 star scale.
-
The platform displays the average rating and the total number of ratings for each resource.
-
Users can leave comments to discuss resources, provide feedback, or ask questions.
-
-
User Dashboard:
-
Logged-in users have access to a personal dashboard where they can:
- View and manage their submitted resources.
- See their previous comments and ratings.
- Delete their account and associated data if they choose.
-
-
Community Interaction:
-
Resources are rated and commented on by the community, allowing users to engage with and improve the platform.
-
The number of comments and the average rating help users identify the most valuable resources.
-
-
Flagging Feature:
-
Users can flag inappropriate or harmful content, ensuring the platform remains a safe and respectful space.
-
Admins review flagged resources or comments and take action when necessary (e.g., removing or moderating content).
-
-
Responsive Design:
-
The platform is fully optimized for both desktop and mobile devices, ensuring a seamless experience across all screen sizes.
-
-
Modern UI/UX:
-
A clean, modern interface with accessible design features to ensure ease of use for all users, regardless of their abilities or preferences of dark or light mode. See further accessibility details in the Testing documentation.
-
For more details on features and to view the user stories, visit our Kanban board.
This chapter outlines the structure of the current stable release for our web application. Our goal is to ensure a consistent and reliable interface for interacting with the various data models that form the core of our system, such as Users, Resources, Comments, and more.
Our API provides a stable set of endpoints that facilitate all the necessary CRUD operations for our application's primary models. This version reflects the current data structures, ensuring smooth interaction between the frontend and backend components. Our approach is designed to provide a reliable contract for any client that consumes this API, whether it's our own frontend or third-party integrations.
We recognize that our API will evolve over time to accommodate new features, enhancements, or structural changes. We strive to maintain backward compatibility whenever possible. Major changes—such as modifying existing endpoints, removing fields, or altering the behavior of the API—will be carefully considered to avoid breaking existing integrations and provide a seamless transition for all consumers.
For now, our focus is on delivering a comprehensive, consistent API, with the understanding that any significant changes will be communicated clearly to ensure stability for current and future clients.
Consult our CHANGELOG.md for changes made over time.
Detailed view CRUD operations
| CRUD Operation | Endpoint | Description | Example Data (json) | Response |
|---|---|---|---|---|
| Create | /api/users | Create a new user | json { "username": "john", "password": "secure", "email": "john@mail.com" } |
201 Created |
| Read | /api/users/{id} | Retrieve a user | json { "user_id": 1, "username": "john", "role": "admin" } |
200 OK |
| Update | /api/users/{id} | Update user info | json { "email": "newemail@mail.com" } |
200 OK |
| Delete | /api/users/{id} | Delete a user | - | 204 No Content |
| CRUD Operation | Endpoint | Description | Example Data (json) | Response |
|---|---|---|---|---|
| Create | /api/resources | Create a new resource | json { "title": "Learn Python", "description": "A Python guide", "url": "example.com", "category_id": 1 } |
201 Created |
| Read All | /api/resources | List all resources | json [ { "resource_id": 1, "title": "Learn Python" } ] |
200 OK |
| Read Single | /api/resources/{id} | Retrieve a resource | json { "resource_id": 1, "title": "Learn Python" } |
200 OK |
| Update | /api/resources/{id} | Update a resource | json { "title": "Advanced Python" } |
200 OK |
| Delete | /api/resources/{id} | Delete a resource | - | 204 No Content |
| CRUD Operation | Endpoint | Description | Example Data (json) | Response |
|---|---|---|---|---|
| Create | /api/comments | Create a new comment | json { "resource_id": 1, "content": "Great resource!" } |
201 Created |
| Read All | /api/comments | List all comments | json [ { "comment_id": 1, "content": "Great resource!" } ] |
200 OK |
| Read Single | /api/comments/{id} | Retrieve a comment | json { "comment_id": 1, "content": "Great resource!" } |
200 OK |
| Update | /api/comments/{id} | Update a comment | json { "content": "Updated comment." } |
200 OK |
| Delete | /api/comments/{id} | Delete a comment | - | 204 No Content |
| CRUD Operation | Endpoint | Description | Example Data (json) | Response |
|---|---|---|---|---|
| Create | /api/ratings | Add a rating | json { "resource_id": 1, "score": 5 } |
201 Created |
| Read All | /api/ratings | List all ratings | json [ { "rating_id": 1, "score": 5 } ] |
200 OK |
| Read Single | /api/ratings/{id} | Retrieve a rating | json { "rating_id": 1, "score": 5 } |
200 OK |
| Update | /api/ratings/{id} | Update a rating | json { "score": 4 } |
200 OK |
| Delete | /api/ratings/{id} | Delete a rating | - | 204 No Content |
| CRUD Operation | Endpoint | Description | Example Data (json) | Response |
|---|---|---|---|---|
| Create | /api/flags | Create a new flag | json { "resource_id": 1, "reason": "Inappropriate content" } |
201 Created |
| Read All | /api/flags | List all flags | json [ { "flag_id": 1, "reason": "Inappropriate content" } ] |
200 OK |
| Read Single | /api/flags/{id} | Retrieve a flag | json { "flag_id": 1, "reason": "Inappropriate content" } |
200 OK |
| Update | /api/flags/{id} | Update flag status | json { "status": "Reviewed" } |
200 OK |
| Delete | /api/flags/{id} | Delete a flag | - | 204 No Content |
| CRUD Operation | Endpoint | Description | Example Data (json) | Response |
|---|---|---|---|---|
| Create | /api/bookmarks | Create a new bookmark | json { "resource_id": 1 } |
201 Created |
| Read All | /api/bookmarks | List all bookmarks | json [ { "bookmark_id": 1, "resource_id": 1 } ] |
200 OK |
| Delete | /api/bookmarks/{id} | Delete a bookmark | - | 204 No Content |
| CRUD Operation | Endpoint | Description | Example Data (json) | Response |
|---|---|---|---|---|
| Create | /api/categories | Create a new category | json { "name": "Programming", "description": "Coding-related content" } |
201 Created |
| Read All | /api/categories | List all categories | json [ { "category_id": 1, "name": "Programming" } ] |
200 OK |
| Read Single | /api/categories/{id} | Retrieve a category | json { "category_id": 1, "name": "Programming" } |
200 OK |
| Update | /api/categories/{id} | Update a category | json { "description": "Updated description." } |
200 OK |
| Delete | /api/categories/{id} | Delete a category | - | 204 No Content |
| CRUD Operation | Endpoint | Description | Example Data (json) | Response |
|---|---|---|---|---|
| Create | /api/tags | Create a new tag | json { "name": "Python", "description": "Python-related resources" } |
201 Created |
| Read All | /api/tags | List all tags | json [ { "tag_id": 1, "name": "Python" } ] |
200 OK |
| Read Single | /api/tags/{id} | Retrieve a specific tag | json { "tag_id": 1, "name": "Python", "description": "Python-related" } |
200 OK |
| Update | /api/tags/{id} | Update a tag | json { "description": "Updated tag description." } |
200 OK |
| Delete | /api/tags/{id} | Delete a tag | - | 204 No Content |
| CRUD Operation | Endpoint | Description | Example Data (json) | Response |
|---|---|---|---|---|
| Create | /api/notifications | Create a new notification | json { "user_id": 1, "message": "Your resource has been flagged." } |
201 Created |
| Read All | /api/notifications | List all notifications | json [ { "notification_id": 1, "message": "Your resource has been flagged." } ] |
200 OK |
| Read Single | /api/notifications/{id} | Retrieve a notification | json { "notification_id": 1, "message": "Your resource has been flagged." } |
200 OK |
| Update | /api/notifications/{id} | Update read status | json { "is_read": true } |
200 OK |
| Delete | /api/notifications/{id} | Delete a notification | - | 204 No Content |
| CRUD Operation | Endpoint | Description | Example Data (json) | Response |
|---|---|---|---|---|
| Create | /api/audits | Create an audit record | json { "user_id": 1, "action": "Created resource", "entity_type": "Resource", "entity_id": 5 } |
201 Created |
| Read All | /api/audits | List all audit records | json [ { "audit_id": 1, "action": "Created resource" } ] |
200 OK |
| Read Single | /api/audits/{id} | Retrieve an audit record | json { "audit_id": 1, "action": "Created resource", "entity_type": "Resource", "entity_id": 5 } |
200 OK |
| Delete | /api/audits/{id} | Delete an audit record | - | 204 No Content |
- Frontend:
- React
- Backend:
- Django REST Framework
- Database:
- PostgreSQL
- Deployment:
- Relevant services🚨 OBS Fixa länken!
The development of LazyDog is guided by Agile principles, emphasizing flexibility, continuous improvement, and rapid adaptation to change. While not strictly adhering to traditional Agile practices such as scheduled sprints or scrums, the development process is inspired by Agile methodologies.
Read more
-
Instead of working within defined sprint timelines, the project focuses on milestones that align with the overall vision. This straightforward approach prioritizes the development of core functionalities first, allowing for a solid foundation before expanding into more complex features.
-
Bugs and issues encountered during development are recorded as bug issues and added to the backlog. This strategy allows for continuous progress in other areas while ensuring that the backlog is revisited periodically. Prioritization is based on the severity and impact of the issues, maintaining development momentum while systematically addressing and resolving concerns.
-
User feedback is actively sought and analyzed to identify areas for improvement, ensuring that LazyDog evolves to meet the needs and expectations of its users effectively.
- To assist with task prioritization, labels have been added to user stories.
- The MoSCoW method involves categorizing tasks with the following labels:
- MUST HAVE
- SHOULD HAVE
- COULD HAVE
- WON'T HAVE
- This method helps ensure that essential features are completed first, optimizing resource allocation and effectively guiding the project's development priorities.
For more details, please follow this link to our GitHub Kanban board.
To set up the project locally, follow these steps:
-
Clone the Repository:
git clone https://github.com/your-username/lazydog.git
-
Navigate to the Project Directory:
cd lazydog -
Install Backend Dependencies:
pip install -r requirements.txt
-
Install Frontend Dependencies:
npm install
-
Run the Backend Server:
python manage.py runserver
-
Run the Frontend Development Server:
npm start
For detailed instructions on using the LazyDog platform, refer to the Usage Guide.
This section provides an overview of the core design elements for the platform, with links to detailed documents.
Development Framework - 5 Planes of Web Development
Our design and development process follows the 5 Planes of Web Development: Strategy, Scope, Structure, Skeleton, and Surface. This framework guides our approach to ensure a user-centered design.
Frontend Design
➡️ Design Document - Color Schemes
➡️ Design Document - Typography
➡️ Design Document - Wireframes (Figma design? 🚨🚨🚨)
➡️ Design Document - UI Components
Backend Design
➡️ Design Document - Entity Relationship Diagram
➡️ ERD relationships explained
Workflow & Processes
This section covers both frontend user interactions and backend processes, detailing how data flows through the platform.
User Experience
Defensive Design
Defensive design ensures a smooth user experience by providing clear feedback during user interactions.
Testing is integral to ensuring the application operates as intended. Comprehensive testing documentation, including strategies and results, is available in the Testing Document.
What we tested
- Functionality: Ensured that all features—such as resource submissions, ratings, and comments—work as intended.
- Usability: Validated that users can navigate easily, interact with elements, and complete actions like signing up, logging in, submit and searching for resources.
- Performance: Checked the app's responsiveness, load times, and efficiency, especially on mobile devices.
How we tested
- Unit Testing: Each component and function was tested individually to confirm that they perform correctly in isolation.
- Manual Testing: A hands-on approach was used to simulate real user interactions, validating the flow and behavior of the app in various scenarios.
- Cross-Browser and Device Testing: We ensured the platform works smoothly on different browsers (Chrome, Firefox, Safari) and across multiple screen sizes (mobile, tablet, desktop).
- Code Validation: The code was checked for errors, optimized, and debugged for performance improvements.
Contributions are welcome!
Please review the Contributing Guidelines for more information on how to get involved.
Detailed instructions for deploying the application can be found in the Deployment Guide.
A heartfelt thank you to everyone who contributed to our learning journey. We also appreciate the tools and services that supported us throughout this project.
Code Used
- {{RESOURCE_DESCRIPTION}}, created by {{AUTHOR}} and sourced from {{SOURCE_NAME}}
Acknowledgements
We would like to give special thanks to the tutorials, courses, and communities that provided invaluable guidance and support throughout the development of this project.
This project is licensed under the MIT License. See the LICENSE file for more details.

