Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

124 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

image

Manage tasks and projects effectively through a web-based application. This system enables task creation, assignment, progress tracking, and completion.

πŸ“ Stack

  • Backend: Java, Spring Boot, Hibernate, Maven
  • Database: PostgreSQL
  • Migrations: Liquibase
  • Security: JWT, OAuth2
  • Third-party applications used: Dropbox, WhatsApp, Google Calendar
  • Deployment: AWS, Ngrok

πŸ’‘ Features

  • ACID, CRUD and SOLID adherence
  • PostgreSQL and Dropbox API intercommunication
image
  • Internal security with JWT token and external security with OAuth2 flow
  • Role allocation (ADMIN acts as a project manager who creates and assigns work, USER acts as a developer who executes tasks) πŸ”
  • Soft deletion in almost all entities for data consistency
  • Transactional safety for method changing database state
  • WhatsApp notification usage for user's tasks
  • Integration with third-party application of Google Calendar for tasks assignment
  • Docker and Swagger usage
  • +80% test coverage (both unit and integration testing)
image

Created with JaCoCo

  • CI/CD checkstyle pipeline: custom & Qodana
  • AWS CI for flexible and rapid updates deployment
Π—Π½Ρ–ΠΌΠΎΠΊ Π΅ΠΊΡ€Π°Π½Π° 2026-05-03 165555

πŸ› οΈ Project structure

java

πŸ“Œ API endpoints

πŸ”‘ Auth Controller πŸ”‘

  • POST /api/auth/register β€” User registration
  • POST /api/auth/login β€” User authentication

πŸ“… Google Authentication Controller πŸ“…

  • GET /api/auth/google/authorize β€” Authenticate Google Calendar account as ADMIN to assign tasks for users
  • GET /api/auth/google/callback β€” Google Calendar account url callback

πŸ‘€ Users Controller πŸ‘€

  • PUT /users/{id}/role β€” Update user role (for ADMIN only)
  • GET /users/me β€” Get my profile info (for authorized users)
  • PATCH /users/me β€” Update profile info (for authorized users)

πŸ₯‡ Project Controller πŸ₯‡

  • POST /api/projects β€” Create a new project (for ADMIN only)
  • GET /api/projects β€” Retrieve user's projects (ADMIN retrieves all projects, USER retrieves their own projects)
  • GET /api/projects/{id} β€” Retrieve project details (ADMIN retrieves any project, USER can retrieve only their own project)
  • PUT /api/projects/{id} β€” Update project (ADMIN updates any project, USER can update only their own project)
  • DELETE /api/projects/{id} β€” Delete project (for ADMIN only)
  • GET /api/projects/search?[status/end_date]={[status/end_date]} β€” Search projects by parameter (for ADMIN only)

🎲 Task Controller 🎲

  • POST /api/tasks β€” Create a new task (for ADMIN only)
  • GET /api/tasks?projectId={projectId} β€” Retrieve tasks for a project (ADMIN retrieves any project's tasks, USER can retrieve only their own projects' tasks)
  • GET /api/tasks/{id} β€” Retrieve task details (ADMIN retrieves any task, USER can retrieve only their own task)
  • PUT /api/tasks/{id} β€” Update task (ADMIN updates any task, USER can update only their own task)
  • DELETE /api/tasks/{id} β€” Delete task (for ADMIN only)
  • GET /api/tasks/search?[priority/status]={[priority/status]} β€” Search tasks by parameter (for ADMIN only)

✍️ Comment Controller ✍️

  • POST /api/comments β€” Add a comment to a task (ADMIN comments any task, USER can comment only their own task)
  • GET /api/comments?taskId={taskId} β€” Retrieve comments for a task (ADMIN retrieves any task's comments, USER can retrieve only their own tasks' comments)
  • DELETE /api/comments/{id} β€” Delete comment (ADMIN deletes any comment, USER can delete only their own comment)

πŸ”— Attachment Controller (interaction with Dropbox API) πŸ”—

  • POST /api/attachments?taskId={taskId} β€” Upload an attachment to a task (ADMIN uploads attachment for any task, USER can upload attachment only for their own task)
  • GET /api/attachments?taskId={taskId} β€” Retrieve attachments for a task (ADMIN retrieves any task's attachments, USER can retrieve only their own tasks' attachments)
  • GET /api/attachments/{id} β€” Download attachment (ADMIN retrieves any attachment, USER can retrieve only their own attachment)
  • DELETE /api/attachments/{id} β€” Delete attachment (ADMIN deletes any attachment, USER can delete only their own attachment)

🚩 Label Controller 🚩

  • POST /api/labels β€” Create a new label (for ADMIN only)
  • GET /api/labels β€” Retrieve labels (for authorized users)
  • PUT /api/labels/{id} β€” Update label (for ADMIN only)
  • DELETE /api/labels/{id} β€” Delete label (for ADMIN only)

We allow labels to be assigned to tasks for better organization. In our migrations we have default label colors, which are possible Google Calendar event colors (i.e. 11 TOMATO, 6 TANGERINE, 2 SAGE). You can set any label to any task. Mind: correspondence between label color and task priority is on user since user can create their own labels. However, we highly recommend setting 2 SAGE for LOW priority tasks, 6 TANGERINE for MEDIUM priority tasks and 11 TOMATO for HIGH priority tasks.

Π—Π½Ρ–ΠΌΠΎΠΊ Π΅ΠΊΡ€Π°Π½Π° 2026-05-01 115510

Due to Google Calendar's policy, task's label color is visible only for ADMIN (assigner), but it can be changed in assignee's calendar manually as well.

πŸ“¦ Setup

Docker configuration

Steps to reproduce below.

  1. Copy .env.sample file to new .env file
  2. Fill your .env file with required environment variables
  3. Run Docker application

Mind: for prod stage, you may need to get ngrok host for appropriate callback. For this, enter ngrok http 35.153.183.93:80 into your ngrok terminal.

Third-party API integration

⭐ Dropbox Database

Just fill your .env file with appropriate variable by generating your own Dropbox access token

image

You can also join Dropbox in the way like we join Google Calendar API now (see below). OAuth 2.0 can give you more flexibility and safety; nevertheless, Dropbox API access token is easier to implement and works quicker locally.

⭐ WhatsApp notification

Task assignment notifications are sent via WhatsApp Business API (Meta Cloud API). Also, we use Meta API message template with Google Calendar event reference in such messages.

image

Due to Meta's policy, the system can only send free-form text messages to a user within a 24-hour window after that user sends a message to the business account first. Each assignee must send any message to the business WhatsApp number before they can receive task notifications.

  1. Do not forget to fill your .env file with appropriate variables by setting up your own Meta API
  2. Open WhatsApp
  3. Add the business number to your contacts: +1 555 145 2899 (or your configured number)
  4. Send any message, for example start
  5. After that, task assignment notifications will be delivered automatically

If the 24-hour window expires, you must send a message again to reactivate notifications.

⭐ Google Calendar event invitation

Due to Google's policy, the system can join the feature of sending Google Calendar event (task) invitation to users only manually through OAuth 2.0 standard.

Steps to reproduce below.

  1. Do not forget to fill your .env file with appropriate variables by setting up your own Google Cloud API. Mind to add your /api/auth/google/callback endpoint as GOOGLE_REDIRECT_URI (for prod stage, we have link generated by Ngrok technology here)
  2. Log into the system as an ADMIN
  3. Apply for GET /api/auth/google/authorize endpoint to get special link for Google Calendar integration into your profile (as a project manager)
  4. After successful page message return to the app's main page and test the system with assigning tasks to some users
image
πŸ”Ž Build your project with mvn clean package and use mvn clean verify for CI check

πŸ‘£ Postman API

API endpoints collection is available at https://www.postman.com/astashenkova-katya-2138811/task-management-app

Documentation is available at https://documenter.getpostman.com/view/51183420/2sBXqKp1Ap

Steps to reproduce below.

  1. Authenticate β€” Run the authentication request first to obtain a token
  2. Connect Google Calendar β€” Run the authentication request first in order to get your connection link, past this link into your browser and select your email, after successfull message return back
  3. Explore available requests β€” Browse the collection folders to find grouped endpoints; each request includes a description of its purpose and expected parameters
  4. Send requests β€” Select any request, adjust path parameters or the request body as needed, click Send to interact with the API directly
  5. Use it for testing β€” The collection can be run as a full test suite via the Collection Runner or with Newman for automated testing

πŸš€ Swagger API

Documentation API is available at http://35.153.183.93/api/swagger-ui/index.html

Steps to reproduce below.

  1. Authenticate β€” Run the authentication request first to obtain a token
  2. Connect Google Calendar β€” Run the authentication request first in order to get your connection link, past this link into your browser and select your email, after successfull message return back
  3. Explore available requests β€” Each controller includes a short description of its purpose
  4. Send requests β€” Select any request, click Try it out, adjust path parameters or the request body as needed, click Execute to interact with the API directly

πŸŽ₯ Demo video

https://www.loom.com/share/e7d685da17f44ff4bea51d4158ecc051

About

Portfolio project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages