# 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 doesn’t 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"

```
