boxes-api/ApplicationDescription.md

112 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Application Overview:
I want to build a back-end application using Go that provides an API for managing boxes and items stored in those boxes. The app should be hosted in a Docker container and use SQLite3 as the database. Additionally, I want a config.yaml file to manage configuration (database path, JWT secret, and image storage directory). It should also support JWT-based authentication with a default user of 'boxuser' and password 'boxuser'.
I would like it to log all logins, box creation/deletion, and item creation/deletion to a local log file, specified in config.yaml.
## Database Tables
- `boxes`: A table containing an ID and a name.
- `items`: A table containing an item name, description, the ID of the box it is stored in, and an optional path to an image of the item.
- `users`: A table containing usernames and passwords (hashed) for authentication.
## API Endpoints
1. Authentication:
- POST `/login`: Authenticates a user and returns a JWT.
2. Boxes:
- GET `/boxes`: Retrieves all boxes.
- POST `/boxes`: Creates a new box.
- DELETE :`/boxes/{id}`: Deletes a box by its ID.
- GET `/boxes/{id}/items`: Retrieves all items in box with this id.
3. Items:
- GET `/items`: Retrieves all items, optionally searchable by description.
- POST `/items`: Adds a new item to a box.
- GET `/items/{id}`: Retrieves an item by its ID.
- PUT `/items/{id}`: Updates an existing item.
- DELETE `/items/{id}`: Deletes an item by its ID.
- GET `/items/{id}/image`: Retrieves the image of an item.
## Additional Details
- If the database doesnt exist, it should be created automatically when the app starts.
- Images should be stored locally, and their paths should be saved in the database.
- The default user for the app should be 'boxuser' with a password of 'boxuser'.
Here's clarification in yaml format:
```yaml
app_overview:
language: Go
database: SQLite3
docker: true
authentication: JWT
config_file: config.yaml
database_tables:
boxes:
columns:
- id
- name
items:
columns:
- id
- name
- description
- box_id
- image_path
users:
columns:
- id
- username
- password
api_endpoints:
login:
method: POST
path: /login
description: "Authenticate a user and return a JWT."
boxes:
- method: GET
path: /boxes
description: "Retrieve all boxes."
- method: POST
path: /boxes
description: "Create a new box."
items:
- method: GET
path: /items
description: "Retrieve all items, searchable by description."
- method: POST
path: /items
description: "Add a new item to a box."
- method: GET
path: /items/{id}
description: "Retrieve an item by its ID."
- method: GET
path: /items/{id}/items
description: "Retrieve all items in box with this id."
- method: PUT
path: /items/{id}
description: "Update an existing item."
- method: DELETE
path: /items/{id}
description: "Delete an item by its ID."
- method: GET
path: /items/{id}/image
description: "Retrieve the image of an item."
config_file:
database_path: "data/boxes.db"
jwt_secret: "super_secret_key"
image_storage_dir: "images/"
listening_port: 8080
log_file: "boxes.log"
default_user:
username: "boxuser"
password: "boxuser"
```