# About This Project This project is used to create invoices from Gitea issues and send them to customers. It can be operated via a CLI or a REST API. # Development Workflow ## Dependencies This project requires a running instance of Gotenberg for PDF generation. You can start it with Docker: ```sh docker run --rm -p 3030:3000 gotenberg/gotenberg:8 ``` ## Running the Application The project contains two main applications: - **API Server:** `go run ./cmd/invoiceapi/main.go` - **CLI Tool:** `go run ./cmd/invoicer/main.go ` Alternatively, you can use Docker for a containerized environment: ```sh docker-compose up --build ``` ## Running Tests To run all tests for the project, use the following command: ```sh go test ./... ``` ## Code Formatting To format the code according to the project's standards, run: ```sh go fmt ./... ``` # Project Conventions ## Commit Messages This project follows the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification. Please ensure your commit messages adhere to this format. ## Dependencies and Libraries - Prefer the Go standard library over external dependencies whenever possible. - Do not add any third-party testing libraries. All tests should use the built-in `testing` package. # Directory Structure This section provides an overview of the project's directory structure to guide you on where to place new code. - **/cmd**: Main application entry points. Each subdirectory is a separate executable. - `invoiceapi`: The REST API server. - `invoicer`: The command-line interface (CLI) tool. - **/internal**: Contains all the private application and business logic. Code in this directory is not meant to be imported by other projects. - `api`: Defines the API layer, including HTTP handlers, routes, and request/response models. - `config`: Handles loading and parsing of application configuration. - `email`: Logic for sending emails. - `pdf`: Contains the logic for generating PDF documents, acting as a client for a service like Gotenberg. - **/pkg**: Contains shared libraries that are okay to be imported by other projects. - `invoice`: The core domain logic for creating and managing invoices. If you are adding business logic related to invoices, it likely belongs here. ## Where to Put New Code - **New reusable library:** If you are creating a new, self-contained library that could be used by other projects, create a new directory inside `/pkg`. - **New invoice-related feature:** If you are extending the core invoice functionality, add it to the appropriate module within `/pkg/invoice`. - **New internal logic:** For features specific to the API or CLI that are not reusable libraries, add a new module inside `/internal`. - **New executable:** If you are creating a new binary (e.g., a worker or another tool), create a new directory inside `/cmd`.