A platform connecting freelancers and clients for job postings, proposals, and real-time chat.
Use Docker to create a PostgreSQL container:
docker run --name <container-name> -p 5432:5432 -e POSTGRES_PASSWORD=<password> -e POSTGRES_DB=<database-name> -e POSTGRES_USER=<username> -d postgres
Make sure to replace <container-name>
, <password>
, <database-name>
, and <username>
with your desired values.
- For testing purposes, you can use this command:
docker run --name Upwork -p 5432:5432 -e POSTGRES_PASSWORD=root -e POSTGRES_DB=upwork -e POSTGRES_USER=postgres -d postgres
Configure Spring Boot to Connect to the Database:
Create a src/main/resources/env.properties
file with the following content:
POSTGRES_USER=<username>
POSTGRES_PASSWORD=<password>
POSTGRES_DB=<database-name>
Replace <username>
, <password>
, and <database-name>
with the values you used when creating the PostgreSQL container.
Flyway is used to manage database migrations. The SQL scripts are located in src/main/resources/db/migration
. When you run the application, Flyway will automatically create the necessary tables in the database.
Register a new user
- URL:
/api/auth/register
- Method:
POST
- Description: Register a new user.
- Request Body:
{ "firstName": "string", "lastName": "string", "email": "string", "password": "string", "roles": ["string"] }
- Response:
{ "status": "OK", "success": true, "data": { "message": "User registered successfully, please verify your email" }, "error": null }
Login
- URL:
/api/auth/login
- Method:
POST
- Description: Login a user.
- Request Body:
{ "email": "string", "password": "string" }
- Response:
Login successful: User: hello@gmail.com
- Note: The JWT and Refresh tokens are now sent as HttpOnly cookies.
Logout
- URL:
/api/auth/logout
- Method:
POST
- Description: Logout a user.
- Response:
{ "status": "OK", "success": true, "data": "User logged out successfully!", "error": null }
Get all users
- URL:
/api/users
- Method:
GET
- Description: Retrieve a paginated list of all users. Only accessible by users with the ROLE_ADMIN role.
- Query Parameters:
pageNo
(optional, default: 0): Page numberpageSize
(optional, default: 10): Page sizesortBy
(optional, default: "id"): Sort by fieldsortDir
(optional, default: "asc"): Sort direction
- Response: A
ResponseDto
object containing the paginated list of users.
Deactivate user
- URL:
/api/auth/{id}/deactivate
- Method:
POST
- Description: Deactivate a user account.
- Path Parameters:
id
: The ID of the user to deactivate
- Response: A
ResponseDto
object containing the result of the operation.
Reactivate user
- URL:
/api/auth/{id}/reactivate
- Method:
POST
- Description: Reactivate a deactivated user account.
- Path Parameters:
id
: The ID of the user to reactivate
- Response: A
ResponseDto
object containing the result of the operation.
Get user profile
- URL:
/api/users/profile/{userId}
- Method:
GET
- Description: Retrieve the profile information for a specific user.
- Path Parameters:
id
(required): The ID of the user whose profile is to be retrieved.- Response:
- Status Code:
200 OK
- Body:
{ "status": "OK", "success": true, "data": { "id": 160, "firstName": "Teddy", "lastName": "Johnson", "title": null, "description": null, "hourlyRate": null, "location": null }, "error": null }
- Status Code:
- Response:
Update user profile
- URL:
/api/users/profile/{id}
- Method:
PUT
- Description: Update the profile information for a specific user.
- Path Parameters:
id
(required): The ID of the user whose currently logged in.- Request Body:
- Content-Type:
application/json
- Body Example:
{ "id": 160, "firstName": "string", "lastName": "string", "title": "string", "description": "string", "hourlyRate": 0, "location": "string" }
- Body Example:
- Content-Type:
- Request Body:
- Response:
- Status Code:
200 OK
- Body Example:
{ "status": "OK", "success": true, "data": { "id": 160, "firstName": "string", "lastName": "string", "title": "string", "description": "string", "hourlyRate": 0, "location": "string" }, "error": null }
- Status Code:
Forgot password
- URL:
/api/auth/forgot-password
- Method:
POST
- Description: Initiate the forgot password process.
- Note: This endpoint is to be implemented.
Reset password
- URL:
/api/auth/reset-password
- Method:
POST
- Description: Reset the user's password.
- Note: This endpoint is to be implemented.
Refresh token
- URL:
/api/auth/refresh-token
- Method:
POST
- Description: Refresh the authentication token.
- Response:
{ "status": "OK", "success": true, "data": "Token is refreshed successfully!", "error": null }
- Note: The new JWT and Refresh tokens are sent as HttpOnly cookies. The Refresh token is also stored in the database for better security.
Verify email
- URL:
/api/auth/verify
- Method:
GET
- Description: Verify the user's email address.
- Query Parameters:
token
: The verification token sent to the user's email
- Response: A string indicating the result of the verification process.
Resend verification email
- URL:
/api/auth/resend-verification
- Method:
POST
- Description: Resend the verification email to the user.
- Query Parameters:
email
: The email address of the user
- Response: A string indicating the result of the operation.
Delete token
- URL:
/api/auth/delete-token/{id}
- Method:
POST
- Description: Delete a specific token.
- Path Parameters:
id
: The ID of the token to delete
- Response: An object indicating the result of the operation.
These endpoints are likely for testing purposes and may be removed in production:
/api/test/all
: Accessible to all users/api/test/user
: Accessible to authenticated users/api/test/admin
: Accessible to users with admin role/api/test/client
: Accessible to users with client role/api/test/freelancer
: Accessible to users with freelancer role
You can access the Swagger UI documentation for this API at: http://localhost:8080/swagger-ui/index.html
- Implement the forgot password functionality.
- Implement the reset password functionality.
- Add more comprehensive error handling and validation.
- Add unit and integration tests for all endpoints.
- Implement logging and monitoring solutions.
- Create a Dockerfile and build a Docker image for the application.
- Set up Docker Compose and document Docker setup for the frontend team.