HongJot is a mobile app that helps spenders to track their expenses. Spenders can take a picture of their receipts and the app will extract the expense information from the image. The app will then store the expense information in a database and provide a summary of the expenses to the spender.
Acceptance Criteria:
- The spender can upload an image of their receipt.
- The image is stored in an S3 bucket.
- The spender receives a success message after the image is uploaded.
Technical Requirements:
- REST API to upload an image to an S3 bucket.
- Endpoint POST /upload to upload an image.
- Response 200 OK with a success message.
- should handle any error and response appropriate error message and status code.
Story 2: As a Admin, I want to view a all of expenses list so that I can manupulate the expenses for spender.
Acceptance Criteria:
- The Admin can view a list of all their expenses.
Technical Requirements:
- REST API to get a list of all expenses.
- Endpoint GET /expenses to get a list of all expenses.
- Response 200 OK with a list of expenses.
- should handle any error and response appropriate error message and status code.
Story 3: As a Admin, I want pagging and filtering for expenses list so that I can view the expenses in a more organized way.
Acceptance Criteria:
- The Admin can view a list of all their expenses with pagging and filtering.
- The Admin can filter the expenses by date, amount, or category.
- The Admin can view the expenses in pages of 10 items each page.
- The Admin can navigate to the next or previous page.
Technical Requirements:
- REST API to get a list of all expenses with pagging and filtering.
- Endpoint GET /expenses to get a list of all expenses with pagging and filtering.
- Response 200 OK with a list of expenses.
- should handle any error and response appropriate error message and status code.
Story 4: As a Tech Lead, I want to provide an API to create a new expense and store it into database so that lambda function can use it to store the expense information that get from Amazon Textract.
Acceptance Criteria:
- The Labmda can create a new expense and store it in the database.
- The expense should have the following fields: date, amount, category, and image URL.
Technical Requirements:
- REST API to create a new expense.
- Endpoint POST /expenses to create a new expense.
- Request body should contain the date, amount, category, and image URL.
- Response 200 OK with the created expense.
- should handle any error and response appropriate error message and status code.
Acceptance Criteria:
- The spender can record their expenses by providing the date, amount, category, and image URL.
- The expense is stored in the database.
- The spender receives a success message after the expense is recorded.
Technical Requirements:
- REST API to record an expense.
- Endpoint POST /expenses to record an expense.
- Request body should contain the date, amount, category, and image URL.
- Response 200 OK with a success message.
Acceptance Criteria:
- The spender can record their income by providing the date, amount, category, and image URL.
- The income is stored in the database.
- The spender receives a success message after the income is recorded.
Technical Requirements:
- REST API to record an income.
- Endpoint POST /incomes to record an income.
- Request body should contain the date, amount, category, and image URL.
- Response 200 OK with a success message.
- should handle any error and response appropriate error message and status code.
Story 7: As a Spender, I want to view a detailed list of my expenses so that I can see the details of each expense.
Acceptance Criteria:
- The spender can view a detailed list of their expenses.
- The detailed list should include the date, amount, category, and image URL of each expense.
Technical Requirements:
- REST API to get a detailed list of expenses.
- Endpoint GET /expenses/detail to get a detailed list of expenses.
- Response 200 OK with the detailed list of expenses.
- should handle any error and response appropriate error message and status code.
Story 8: As a Spender, I want to view a summary of my expenses so that I can see how much I have spent.
Acceptance Criteria:
- The spender can view a summary of their expenses.
- The summary should include the total amount spent, the average amount spent per day, and the total number of expenses.
Technical Requirements:
- REST API to get a summary of expenses.
- Endpoint GET /expenses/summary to get a summary of expenses.
- Response 200 OK with the summary of expenses.
Story 9: As a Spender, I want to view a summary of my income so that I can see how much I have earned.
Acceptance Criteria:
- The spender can view a summary of their income.
- The summary should include the total amount earned, the average amount earned per day, and the total number of income.
Technical Requirements:
- REST API to get a summary of income.
- Endpoint GET /incomes/summary to get a summary of income.
- Response 200 OK with the summary of income.
- should handle any error and response appropriate error message and status code.
Story 10: As a Spender, I want viw a summary balance of my income and expenses so that I can see how much I have saved.
Acceptance Criteria:
- The spender can view a summary balance of their income and expenses.
- The summary should include the total amount earned, the total amount spent, and the total amount saved.
- The total amount saved is calculated as the total amount earned minus the total amount spent.
Technical Requirements:
- REST API to get a summary balance of income and expenses.
- Endpoint GET /balance to get a summary balance of income and expenses.
- Response 200 OK with the summary balance of income and expenses.
- should handle any error and response appropriate error message and status code.
Acceptance Criteria:
- The spender can edit an expense by providing the date, amount, category, and image URL.
- The expense is updated in the database.
- The spender receives a success message after the expense is updated.
Technical Requirements:
- REST API to edit an expense.
- Endpoint PUT /expenses/{id} to edit an expense.
- Request body should contain the date, amount, category, and image URL.
- Response 200 OK with a success message.
- should handle any error and response appropriate error message and status code.
Acceptance Criteria:
- The spender can delete an expense.
- The expense is removed from the database.
- The spender receives a success message after the expense is deleted.
Technical Requirements:
- REST API to delete an expense.
- Endpoint DELETE /expenses/{id} to delete an expense.
- Response 200 OK with a success message.
- should handle any error and response appropriate error message and status code.
Story 13: As a Spender, I want to view a expense by category so that I can see the expenses by category.
Acceptance Criteria:
- The spender can view a list of expenses by category.
- The list should include the date, amount, and image URL of each expense.
Technical Requirements:
- REST API to get a list of expenses by category.
- Endpoint GET /expenses/category/{category} to get a list of expenses by category.
- Response 200 OK with the list of expenses by category.
- should handle any error and response appropriate error message and status code.
Acceptance Criteria:
- The spender can view a list of expenses by date.
- The list should include the amount, category, and image URL of each expense.
Technical Requirements:
- REST API to get a list of expenses by date.
- Endpoint GET /expenses/start/{startdate}/end/enddate to get a list of expenses by date.
- Response 200 OK with the list of expenses by date.
- should handle any error and response appropriate error message and status code.
Technical hints: อย่าพึ่งเปิดให้คิดเองก่อน
1. GET /api/v1/transactions- Description: Retrieves a list of all transactions.
- Response:
- Status Code: 200 OK
- Content Type: application/json
- Example Response Body:
{
"transactions": [
{
"id": 1,
"date": "2024-04-30T09:00:00.000Z",
"amount": 1000,
"category": "Food",
"transaction_type": "expense",
"note": "Lunch",
"image_url": "https://example.com/image1.jpg",
"spender_id": 1
},
{
"id": 2,
"date": "2024-04-29T19:00:00.000Z",
"amount": 2000,
"category": "Transport",
"transaction_type": "income",
"note": "Salary",
"image_url": "https://example.com/image2.jpg",
"spender_id": 1
}
]
}
- GET /api/v1/transactions?page=1&limit=10&date=2024-04-30&amount=1000&category=Food&transaction_type=expense|income
- Description: Retrieves a list of all transactions with paging and filtering.
- Query Parameters:
- page: The page number to retrieve. Default is 1.
- limit: The number of items per page. Default is 10.
- date: Filter by date. Format is YYYY-MM-DD.
- amount: Filter by amount.
- category: Filter by category.
- transaction_type: Filter by transaction type (income or expense).
- Response:
- Status Code: 200 OK
- Content Type: application/json
- Example Response Body:
{
"transactions": [
{
"id": 1,
"date": "2024-04-30T09:00:00.000Z",
"amount": 1000,
"category": "Food",
"transaction_type": "expense",
"note": "Lunch",
"image_url": "https://example.com/image1.jpg",
"spender_id": 1
},
{
"id": 2,
"date": "2024-04-29T19:00:00.000Z",
"amount": 2000,
"category": "Transport",
"transaction_type": "income",
"note": "Salary",
"image_url": "https://example.com/image2.jpg",
"spender_id": 1
}
],
"summary": {
"total_income": 2000,
"total_expenses": 1000,
"current_balance": 1000
},
"pagination": {
"current_page": 1,
"total_pages": 1,
"per_page": 10
}
}
- POST /api/v1/transactions
- Description: Creates a new transactions so that can record the income or expense.
- Request Body:
- Content Type: application/json
- Example Response Body:
{
"date": "2024-04-30T09:00:00.000Z",
"amount": 1000,
"category": "Food",
"transaction_type": "expense",
"note": "Lunch",
"image_url": "https://example.com/image1.jpg",
"spender_id": 1
}
- Response:
- Status Code: 201 Created
- Content Type: application/json
- Example Response Body:
{
"id": 1,
"date": "2024-04-30T09:00:00.000Z",
"amount": 1000,
"category": "Food",
"transaction_type": "expense",
"note": "Lunch",
"image_url": "https://example.com/image1.jpg",
"spender_id": 1
}
- PUT /api/v1/transactions/{id}
- Description: Updates an existing transaction so that can edit the income or expense.
- Request Body:
- Content Type: application/json
- Example Response Body:
{
"date": "2024-04-30T09:00:00.000Z",
"amount": 1000,
"category": "Food",
"transaction_type": "expense",
"note": "Lunch",
"image_url": "https://example.com/image1.jpg",
"spender_id": 1
}
- Response:
- Status Code: 200 OK
- Content Type: application/json
- Example Response Body:
{
"id": 1,
"date": "2024-04-30T09:00:00.000Z",
"amount": 1000,
"category": "Food",
"transaction_type": "expense",
"note": "Lunch",
"image_url": "https://example.com/image1.jpg",
"spender_id": 1
}
- GET /api/v1/spenders/{id}/transactions
- Description: Retrieves a list of all transactions for a specific spender.
- Response:
- Status Code: 200 OK
- Content Type: application/json
- Example Response Body:
{
"transactions": [
{
"id": 1,
"date": "2024-04-30T09:00:00.000Z",
"amount": 1000,
"category": "Food",
"transaction_type": "expense",
"note": "Lunch",
"image_url": "https://example.com/image1.jpg",
"spender_id": 1
},
{
"id": 2,
"date": "2024-04-29T19:00:00.000Z",
"amount": 2000,
"category": "Transport",
"transaction_type": "income",
"note": "Salary",
"image_url": "https://example.com/image2.jpg",
"spender_id": 1
}
],
"summary": {
"total_income": 2000,
"total_expenses": 1000,
"current_balance": 1000
},
"pagination": {
"current_page": 1,
"total_pages": 1,
"per_page": 10
}
}
- GET /api/v1/spenders/{id}/transactions/summary
- Description: Retrieves a summary of all transactions for a specific spender.
- Response:
- Status Code: 200 OK
- Content Type: application/json
- Example Response Body:
{
"summary": {
"total_income": 2000,
"total_expenses": 1000,
"current_balance": 1000
}
}
- GET /api/v1/spenders
- Description: Retrieves a list of all spenders.
- Response:
- Status Code: 200 OK
- Content Type: application/json
- Example Response Body:
{
"spenders": [
{
"id": 1,
"name": "John Doe",
"email": "[email protected]"
}
]
}
9 GET /api/v1/spenders/{id}
- Description: Retrieves a specific spender.
- Response:
- Status Code: 200 OK
- Content Type: application/json
- Example Response Body:
{
"id": 1,
"name": "John Doe",
"email": "[email protected]"
}
- POST /api/v1/spenders
- Description: Creates a new spender.
- Request Body:
- Content Type: application/json
- Example Response Body:
{
"name": "John Doe",
"email": "[email protected]"
}
- Response:
- Status Code: 201 Created
- Content Type: application/json
- Example Response Body:
{
"id": 1,
"name": "John Doe",
"email": "[email protected]"
}
- GET /api/v1/categorize
-
Description: Retrieves a list expense by category.
-
Response:
-
Status Code: 200 OK
-
Content Type: application/json
-
Example Payload:
{
"Food": [
{
"id": 1,
"date": "2024-04-30T09:00:00.000Z",
"amount": 1000,
"category": "Food",
"transaction_type": "expense",
"note": "Lunch",
"image_url": "https://example.com/image1.jpg",
"spender_id": 1
}
],
"Transport": [
{
"id": 2,
"date": "2024-04-29T19:00:00.000Z",
"amount": 2000,
"category": "Transport",
"transaction_type": "income",
"note": "Salary",
"image_url": "https://example.com/image2.jpg",
"spender_id": 1
}
]
"Other": [
{
"id": 3,
"date": "2024-04-29T19:00:00.000Z",
"amount": 2000,
"category": "Other",
"transaction_type": "income",
"note": "Salary",
"image_url": "https://example.com/image2.jpg",
"spender_id": 1
}
]
}
- GET /api/v1/categories
-
Description: Retrieves a list of all categories.
-
Response:
-
Status Code: 200 OK
-
Content Type: application/json
-
Example Payload:
{
"categories": [
"Food",
"Transport",
"Other"
]
}
NOTE:
- Cross-functional requirements
- Authentication (Gen JWT token)
- Authorization (Gen JWT token)
Model Spender -> Expense (1 to many)
- DB Schema
- Solution hints
sequenceDiagram
Mobile App->>HongJot API: Upload Image to S3 Bucket
activate Mobile App
HongJot API->>S3 Bucket: Store Image
HongJot API->>Mobile App: success
deactivate Mobile App
S3 Bucket->>Lambda Function: (Event Trigger)
Lambda Function->>Amazon Textract: Extract Text from Image
Amazon Textract->>Lambda Function: Slip Expense info
Lambda Function->>HongJot API: Send Slip Expense info
HongJot API->>PostgreSQL Database: Store Expense info
Mobile App->>HongJot API: Get Expense Summary (Spender Requests Summary) Retrieve Expense Summary
activate Mobile App
HongJot API->>PostgreSQL Database: Get Expense Summary Data
PostgreSQL Database->>HongJot API: Return Summary Data
HongJot API->>Mobile App: Show Expense Summary Data
deactivate Mobile App