iStudy is a web platform designed to help students efficiently organize, manage, and track their study habits. Among its many features are:
- User registration and login;
- Management of subjects and their topics;
- Study tracking, based on registered subjects and topics;
- Study games, such as flashcards and quizzes to reinforce learning;
- Time management tools (Stopwatch and Pomodoro timer);
- Schedule and reminder management;
- Dashboards with metrics of study hours per subject, topic, and category (daily, weekly, and monthly).
istudy-app
: This folder contains the front-end code of the application, built with TypeScript, React.Js and NextJS.istudy-services
: This folder contains the system's back-end (Java/Spring Boot), which follows a microservices architecture using Spring Cloud API Gateway as a request interceptor and Spring Cloud Netflix (Eureka) for service registration and discovery.
-
Java: A high-level, object-oriented programming language widely used for building server-side applications, web services, and Android applications.
-
Spring Boot: A framework that simplifies the development of Java applications by providing built-in features for dependency injection, configuration, and microservices support.
-
Spring Security: A powerful and customizable authentication and access control framework for Java applications.
-
JWT (JSON Web Token): Open standard that allows secure transmission of authentication information.
-
Spring Cloud API Gateway: Serves as the central entry point, handling request routing, authentication, and traffic control between microservices.
-
Spring Cloud Netflix Eureka: Enables automatic registration and discovery of microservices, facilitating dynamic scaling and seamless communication.
-
RabbitMQ: An open-source software that acts as a message broker, or middleman, between producers and consumers of messages.
-
JPA: The Java Persistence API, a specification that provides object-relational mapping (ORM) to manage relational data in Java applications.
-
MapStruct: A Java mapping framework that simplifies object-to-object mapping, reducing boilerplate code and improving maintainability.
-
Flyway: A database migration tool that ensures version control and consistency across database schema changes.
-
Lombok: A Java library that reduces boilerplate code by generating common methods like getters, setters, constructors, and more through annotations.
-
Postman: A tool used for API testing and development, enabling users to send HTTP requests, inspect responses, and automate API tests.
-
TypeScript: A superset of JavaScript that adds static typing, making code easier to read, debug, and maintain.
-
React.js: A JavaScript library for building user interfaces, focusing on creating reusable UI components and managing the view layer in web applications.
-
NextJS: Next. js is a React framework that enables several extra features, including server-side rendering and static rendering.
-
TailwindCSS: A utility-first CSS framework that allows rapid UI development using predefined classes.
-
Material UI (MUI): MUI is a massive library of UI components designers and developers can use to build React applications.
-
Tanstack/React Query: A powerful data-fetching and state management library for React, ideal for managing server state with features like caching, background updates, and retries.
-
JWT Decode: A small library that decodes JSON Web Tokens (JWT) without verifying their signature.
-
Lucide React: A React library that provides access to Lucide’s beautiful and consistent set of SVG icons.
-
React Toastify: A React library for showing toast notifications in a simple and customizable way.
-
Formik: A form management library for React that simplifies form handling, validation, and submission.
-
Yup: A JavaScript schema builder for value parsing and validation, often used with Formik for form validation.
-
DayJs: A lightweight JavaScript library for parsing, validating, manipulating, and formatting dates.
-
Swiper js: A powerful, free, and open-source JavaScript library for creating modern, touch-friendly sliders and carousels.
-
React card flip: A specific library or component that allows you to create a card that animates to reveal content on its back when clicked or interacted withxt.
-
React calendar: A lightweight and easily configurable calendar component.
-
MySQL: A relational database management system used for reliable data storage and management.
-
Docker: A platform that allows developers to automate the deployment of applications inside lightweight containers, ensuring consistency across different environments and simplifying the setup process.
To run the project on your machine, the following tools must be installed and configured beforehand:
- Docker
- Git
Optional for local development or testing:
- Java Development Kit (JDK) 17
- Node.js
- Apache Maven
- MySQL 8.0.34
- MySQL Workbench
- Postman
Follow the steps below to download, configure, and run the project in your environment:
- Clone the repository
git clone https://github.com/ABeatrizSC/istudy.git
- Navigate to the project directory
cd istudy
- Build and initialize the docker container
docker-compose up --build
- Authentication and user management microservice.
- Create a new user.
{
"name": "New user",
"email": "[email protected]",
"password": "12345678"
}
{
"message": "User created successfully!"
}
- Authenticate an user.
{
"email": "[email protected]",
"password": "12345678"
}
{
"token": "ey..."
}
- Microservice responsible for creating, updating, deleting, and generating information about disciplines and their topics.
- Create a new subject.
DisciplineRequestDto
:
{
"name": "Mathematics",
"category": "EXACT_SCIENCES",
"isCompleted": false
}
- Status:
201 Created
. - Returns
List<Discipline>
:
[
{
"id": "0ff67f43-11c2-458c-a88c-753f3c939a33",
"createdBy": "6a93f671-9406-42ea-8b0c-5d7ef65ea9b5",
"name": "Mathematics",
"category": "EXACT_SCIENCES",
"totalTime": "00:00:00",
"timeCompleted": "00:00:00",
"isCompleted": false,
"topics": []
}
]
- Update the subject with the given ID.
DisciplineRequestDto
List<Discipline>
updated.
- Delete the subject with the given ID.
List<Discipline>
updated.
- Returns the subject with the given ID.
Discipline
.
- Returns all of the user's subjects that contain the name provided in the query parameter.
List<Discipline>
- Returns all of the user's subjects with the specified category.
List<Discipline>
- Returns a list of strings with all the categories available in the system.
List<String>
[
"EXACT_SCIENCES",
"HUMAN_SCIENCES",
"BIOLOGICAL_SCIENCES",
"SOCIAL_SCIENCES",
"HEALTH_SCIENCES",
"ARTS_AND_HUMANITIES"
]
- Returns all of the user's subjects with
isCompleted
attribute marked as True.
List<Discipline>
- Create a new topic.
TopicRequestDto
:
{
"name": "New topic",
"time": "03:00",
"isCompleted": false,
"disciplineId": "uuid"
}
List<TopicResponseDto>
updated.
[
{
"id": "uuid",
"name": "Topic 1",
"time": "01:30",
"isCompleted": true,
"disciplineId": "uuid"
},
{
"id": "uuid",
"name": "New topic",
"time": "03:00",
"isCompleted": false,
"disciplineId": "uuid"
}
//...
]
- Update the topic with the given ID.
TopicUpdateDto
:
{
"name": "New topic updated",
"time": "03:00",
"isCompleted": false,
}
List<TopicResponseDto>
updated.
- Delete the topic with the given ID.
List<TopicResponseDto>
updated.
- Returns all of the user's subjects
List<TopicResponseDto>
-
Returns the topic with the given ID.
-
TopicResponseDto
- This microservice is responsible for managing study sessions. It allows users to create, update, retrieve, and delete study records.
- Additionally, it provides analytical insights into study habits based on different time periods.
- Create a new study.
StudyRequestDto
:
{
"disciplineName": "Mathematics",
"topicName": "Linear Algebra",
"time": "01:30:00",
"date": "2025-05-21",
"isCompleted": false
}
List<Study>
[
{
"id": "abc123",
"createdBy": "userId123",
"disciplineName": "Mathematics",
"topicName": "Linear Algebra",
"disciplineCategory": "EXACT_SCIENCES",
"time": "01:30:00",
"date": "2025-05-21",
"isCompleted": false
}
]
- Update a study by ID.
StudyRequestDto
List<Study>
updated
- Delete a study by ID.
List<Study>
updated
- Returns all of the user's studies.
List<Study>
.
- Returns the user's study with the given ID.
Study
- Returns all the user's studies with the
isCompleted
field set to true.
List<Study>
-
Returns all the user's studies on the specified date, week or month.
-
GET
/studies/date?date=2025-05-21
-
GET
/studies/week?year=2025&week=21
-
GET
/studies/month?year=2025&month=5
-
List<Study>
-
Returns information about all the user's studies within the specified time:
-
GET
/studies/date/info?date=2025-04-05
-
GET
/studies/week/info?year=2025&week=21
-
GET
/studies/month/info?year=2025&month=5
-
StudyInfoDto
{
"totalStudies": 6,
"totalCompletedStudies": 4,
"totalStudyTime": "10:00:00",
"completedStudyTime": "06:00:00",
"completedStudyTimeByDiscipline": [
{
"name": "Mathematics",
"completedTime": "03:00:00"
},
{
"name": "Biology",
"completedTime": "00:00:00"
},
{
"name": "Arts",
"completedTime": "03:00:00"
}
],
"completedStudyTimeByDisciplineCategory": [
{
"name": "BIOLOGICAL_SCIENCES",
"completedTime": "00:00:00"
},
{
"name": "SOCIAL_SCIENCES",
"completedTime": "00:00:00"
},
//...
]
}
- Returns all the user's studies that have the specified category.
List<Study>
- Returns the studies status between two given dates.
List<DailyStudyStatusDto>
[
{
"date": "2025-05-20",
"metGoal": true,
"dayStudied": true
},
{
"date": "2025-05-21",
"metGoal": false,
"dayStudied": true
}
]
- Microservice that manages the creation of quizzes and flashcards to enhance user learning.
- Create a new quiz.
QuizRequestDto
:
{
"title": "Java Quiz",
"questions": [
{
"question": "What is Spring Boot?",
"options": [
{ "option": "A programming language", "isCorrect": false },
{ "option": "A framework for Java applications", "isCorrect": true },
{ "option": "A database", "isCorrect": false }
]
},
{
"question": "What is a DTO?",
"answer": "Data Transfer Object",
"options": [
{ "option": "Data Transfer Object", "isCorrect": true },
{ "option": "An entity class", "isCorrect": false }
]
},
// ...
]
}
List<Quiz>
updated.
[
{
"title": "Java Quiz",
"questions": [
{
"question": "What is Spring Boot?",
"options": [
{ "option": "A programming language", "isCorrect": false },
{ "option": "A framework for Java applications", "isCorrect": true },
{ "option": "A database", "isCorrect": false }
]
},
{
"question": "What is a DTO?",
"answer": "Data Transfer Object",
"options": [
{ "option": "Data Transfer Object", "isCorrect": true },
{ "option": "An entity class", "isCorrect": false }
]
},
// ...
]
},
// ...
]
- Update the quiz with the given ID.
QuizRequestDto
List<Quiz>
updated.
- Answer the quiz with the given ID.
QuizAnswerDto
{
"title": "Java Quiz Up",
"questions": [
{
"question": "What is Spring Boot?",
"optionChosen": "A framework for Java applications",
"options": [
{ "option": "A programming language", "isCorrect": false },
{ "option": "A framework for Java applications", "isCorrect": true },
{ "option": "A database", "isCorrect": false }
]
},
{
"question": "What is a DTO?",
"optionChosen": "An entity class",
"answer": "Data Transfer Object",
"options": [
{ "option": "Data Transfer Object", "isCorrect": true },
{ "option": "An entity class", "isCorrect": false }
]
},
// ...
]
}
- Returns a
List<Question>
of all incorrect questions (correctAnswer
attribute marked as false).
[
{
"id": "uuid",
"question": "What is Spring Boot?",
"createdBy": "uuid",
"optionChosen": "question_uuid",
"correctAnswer": false,
"options": [
{
"id": "uuid",
"option": "A framework for Java applications",
"createdBy": "uuid",
"isCorrect": true
},
{
"id": "uuid",
"option": "A programming language",
"createdBy": "uuid",
"isCorrect": false
},
{
"id": "uuid",
"option": "A database",
"createdBy": "uuid",
"isCorrect": false
}
]
},
// ...
]
- Delete the quiz with the given ID.
List<Quiz>
updated.
- Returns all of the user's quizzes.
List<Quiz>
- Returns the user's quiz with the given id.
Quiz
- Returns the user's quiz that contains the title provided in the query parameter.
Optional<Quiz>
- Create a new flashcard.
FlashcardRequestDto
:
{
"title": "Programming Questions",
"cards": [
{
"question": "What does 'HTML' stand for?",
"answer": "HyperText Markup Language"
},
{
"question": "What is the main purpose of CSS?",
"answer": "To style and layout web pages"
},
{
"question": "Which programming language is known as the backbone of Android app development?",
"answer": "Java"
},
{
"question": "What does 'API' stand for?",
"answer": "Application Programming Interface"
},
{
"question": "In JavaScript, which keyword declares a constant variable?",
"answer": "const"
}
]
}
List<Flashcard>
updated.
[
{
"id": "flashcard-uuid",
"createdBy": "user-uuid",
"title": "Programming Questions",
"cards": [
{
"id": "q1-uuid-0001",
"question": "What does 'HTML' stand for?",
"answer": "HyperText Markup Language",
"isHit": false
},
{
"id": "q2-uuid-0002",
"question": "What is the main purpose of CSS?",
"answer": "To style and layout web pages",
"isHit": false
},
{
"id": "q3-uuid-0003",
"question": "Which programming language is known as the backbone of Android app development?",
"answer": "Java",
"isHit": false
},
{
"id": "q4-uuid-0004",
"question": "What does 'API' stand for?",
"answer": "Application Programming Interface",
"isHit": false
},
{
"id": "q5-uuid-0005",
"question": "In JavaScript, which keyword declares a constant variable?",
"answer": "const",
"isHit": false
},
// ...
]
},
// ...
]
- Update the quiz with the given ID.
FlashcardRequestDto
List<Flashcard>
updated.
- Answer the quiz with the given ID.
FlashcardAnswerDto
:
{
"cardsAnswer": [
{
"id": "q1-uuid-0001", //card uuid
"isHit": false
},
{
"id": "q2-uuid-0002",
"isHit": false
},
{
"id": "q3-uuid-0003",
"isHit": true
},
{
"id": "q4-uuid-0004",
"isHit": true
},
{
"id": "q5-uuid-0005",
"isHit": false
}
]
}
- Returns a
List<Card>
of all incorrect questions (isHit
attribute marked as false).
[
{
"id": "q1-uuid-0001",
"question": "What does 'HTML' stand for?",
"answer": "HyperText Markup Language",
"isHit": false
},
{
"id": "q2-uuid-0002",
"question": "What is the main purpose of CSS?",
"answer": "To style and layout web pages",
"isHit": false
},
{
"id": "q5-uuid-0005",
"question": "In JavaScript, which keyword declares a constant variable?",
"answer": "const",
"isHit": false
},
// ...
]
- Delete the flashcard with the given ID.
List<Flashcard>
updated.
- Returns all of the user's flashcards.
List<Flashcard>
- Returns the user's flashcard that contains the given id.
Flashcard
- Returns the user's flashcard that contains the title provided in the query parameter.
Optional<Flashcard>
.
- Manages user reminders and schedules
- Create a new reminder.
ReminderRequestDto
:
{
"task": "Study for the test",
"date": "2025-05-23",
"isCompleted": false
}
List<Reminder>
updated.
[
{
"id": "reminder-uuid-001",
"createdBy": "user-uuid",
"task": "Study for the test",
"date": "2025-05-23",
"isCompleted": false
},
// ...
]
- Update the user's reminder with the given ID.
ReminderRequestDto
List<Reminder>
updated.
- Delete the user's reminder with the given ID.
List<Reminder>
updated.
- Returns all reminders created by the user.
List<Reminder>
- Returns the user's reminder with the given ID.
Reminder
- Returns all reminders of the user filtered by the given date (format:
yyyy-MM-dd
).
List<Reminder>
- Returns all reminders of the user filtered by completion status.
List<Reminder>
- Create a new schedule item.
ScheduleItemRequestDto
:
{
"title": "Math Class",
"dayOfWeek": 1, // sunday: 0, monday: 1, tuesday: 2...
"startTime": "08:00",
"endTime": "09:30"
}
List<ScheduleItem>
updated.
[
{
"id": "schedule-uuid-001",
"createdBy": "user-uuid",
"title": "Math Class",
"dayOfWeek": 1,
"startTime": "08:00:00",
"endTime": "09:30:00"
},
{
"id": "schedule-uuid-002",
"createdBy": "user-uuid",
"title": "Physics Class",
"dayOfWeek": 1,
"startTime": "10:00:00",
"endTime": "11:00:00"
}
]
- Update the schedule item with the given ID.
ScheduleItemRequestDto
List<ScheduleItem>
updated.
- Delete the schedule item with the given ID.
List<ScheduleItem>
updated.
- Returns all schedule items created by the user.
List<ScheduleItem>
- Returns the user's schedule item with the given ID.
ScheduleItem
- Returns all schedule items created by the user filtered by day of the week.
- Sunday = 0; Monday = 1; Tuesday = 3...
List<ScheduleItem>
for the specified day.
- Since it's still under development, I'm sharing just a few previews of the screens/pages that are already finished:
- GitHub: ABeatrizSC
- Linkedin: Ana Beatriz Santucci Carmoni
- Email: [email protected]