Directory Structure

Understanding the Goose project structure helps you organize your code effectively.

API Application Structure

myapi/
โ”œโ”€โ”€ .env                    # Environment variables
โ”œโ”€โ”€ .gitignore             # Git ignore rules
โ”œโ”€โ”€ go.mod                 # Go module definition
โ”œโ”€โ”€ go.sum                 # Go dependencies checksum
โ”œโ”€โ”€ main.go                # Application entry point
โ”œโ”€โ”€ config/                # Configuration files (optional)
โ”‚   โ”œโ”€โ”€ app.yaml
โ”‚   โ””โ”€โ”€ database.yaml
โ”œโ”€โ”€ app/                   # Main application module
โ”‚   โ”œโ”€โ”€ app.module.go      # Module definition
โ”‚   โ”œโ”€โ”€ app.controller.go  # Request handlers
โ”‚   โ”œโ”€โ”€ app.service.go     # Business logic
โ”‚   โ”œโ”€โ”€ app.routes.go      # Route definitions
โ”‚   โ”œโ”€โ”€ app.dtos.go        # Data transfer objects
โ”‚   โ”œโ”€โ”€ jobs/              # Background jobs (optional)
โ”‚   โ”‚   โ””โ”€โ”€ sample.job.go
โ”‚   โ””โ”€โ”€ queries/           # Database queries (optional)
โ”‚       โ””โ”€โ”€ sample.query.go
โ””โ”€โ”€ modules/               # Additional modules
    โ””โ”€โ”€ users/
        โ”œโ”€โ”€ users.module.go
        โ”œโ”€โ”€ users.controller.go
        โ”œโ”€โ”€ users.service.go
        โ”œโ”€โ”€ users.routes.go
        โ””โ”€โ”€ users.dtos.go

Web Application Structure

myweb/
โ”œโ”€โ”€ .env
โ”œโ”€โ”€ go.mod
โ”œโ”€โ”€ main.go
โ”œโ”€โ”€ app/
โ”‚   โ”œโ”€โ”€ app.module.go
โ”‚   โ”œโ”€โ”€ app.controller.go
โ”‚   โ”œโ”€โ”€ app.service.go
โ”‚   โ”œโ”€โ”€ app.routes.go
โ”‚   โ”œโ”€โ”€ app.dtos.go
โ”‚   โ””โ”€โ”€ templates/         # HTML templates
โ”‚       โ”œโ”€โ”€ base/
โ”‚       โ”‚   โ””โ”€โ”€ layout.html
โ”‚       โ”œโ”€โ”€ pages/
โ”‚       โ”‚   โ””โ”€โ”€ home.html
โ”‚       โ””โ”€โ”€ partials/
โ”‚           โ”œโ”€โ”€ header.html
โ”‚           โ””โ”€โ”€ footer.html
โ”œโ”€โ”€ static/                # Static assets
โ”‚   โ”œโ”€โ”€ css/
โ”‚   โ”œโ”€โ”€ js/
โ”‚   โ””โ”€โ”€ images/
โ””โ”€โ”€ modules/

CLI Application Structure

mycli/
โ”œโ”€โ”€ .env
โ”œโ”€โ”€ go.mod
โ”œโ”€โ”€ main.go
โ””โ”€โ”€ app/
    โ”œโ”€โ”€ app.module.go
    โ”œโ”€โ”€ app.controller.go
    โ”œโ”€โ”€ app.service.go
    โ”œโ”€โ”€ app.routes.go      # Command definitions
    โ””โ”€โ”€ app.dtos.go

Multi-Platform Structure

mymulti/
โ”œโ”€โ”€ .env
โ”œโ”€โ”€ go.mod
โ”œโ”€โ”€ main.go
โ””โ”€โ”€ app/
    โ”œโ”€โ”€ api/               # API platform
    โ”‚   โ”œโ”€โ”€ api.module.go
    โ”‚   โ”œโ”€โ”€ api.controller.go
    โ”‚   โ”œโ”€โ”€ api.routes.go
    โ”‚   โ””โ”€โ”€ api.service.go
    โ”œโ”€โ”€ web/               # Web platform
    โ”‚   โ”œโ”€โ”€ web.module.go
    โ”‚   โ”œโ”€โ”€ web.controller.go
    โ”‚   โ”œโ”€โ”€ web.routes.go
    โ”‚   โ”œโ”€โ”€ web.service.go
    โ”‚   โ””โ”€โ”€ templates/
    โ”œโ”€โ”€ cli/               # CLI platform
    โ”‚   โ”œโ”€โ”€ cli.module.go
    โ”‚   โ”œโ”€โ”€ cli.controller.go
    โ”‚   โ”œโ”€โ”€ cli.routes.go
    โ”‚   โ””โ”€โ”€ cli.service.go
    โ””โ”€โ”€ shared/            # Shared components
        โ”œโ”€โ”€ shared.module.go
        โ”œโ”€โ”€ shared.service.go
        โ””โ”€โ”€ entities/

Module Structure

Plain Module

A basic module for simple functionality:

users/
โ”œโ”€โ”€ users.module.go        # Module definition
โ”œโ”€โ”€ users.controller.go    # Request handlers
โ”œโ”€โ”€ users.service.go       # Business logic
โ”œโ”€โ”€ users.routes.go        # Route definitions
โ””โ”€โ”€ users.dtos.go          # Data transfer objects

Resource Module

A module with database entity:

products/
โ”œโ”€โ”€ products.module.go
โ”œโ”€โ”€ products.controller.go
โ”œโ”€โ”€ products.service.go
โ”œโ”€โ”€ products.routes.go
โ”œโ”€โ”€ products.dtos.go
โ”œโ”€โ”€ products.entity.go     # Database entity
โ”œโ”€โ”€ migrations/            # Database migrations
โ”‚   โ””โ”€โ”€ 001_create_products.go
โ””โ”€โ”€ seeds/                 # Seed data
    โ””โ”€โ”€ products.seed.go

File Naming Conventions

File Purpose Example
*.module.go Module definition app.module.go
*.controller.go Request handlers app.controller.go
*.service.go Business logic app.service.go
*.routes.go Route definitions app.routes.go
*.dtos.go Data transfer objects app.dtos.go
*.entity.go Database entities user.entity.go
*.middleware.go Middleware auth.middleware.go
*.job.go Background jobs email.job.go

Key Files Explained

main.go

The entry point of your application:

package main

import (
    "myapp/app"
    "github.com/awesome-goose/goose"
    "github.com/awesome-goose/goose/platforms/api"
)

func main() {
    platform := api.NewPlatform()
    module := &app.AppModule{}

    stop, err := goose.Start(goose.API(platform, module, nil))
    if err != nil {
        panic(err)
    }
    defer stop()
}

app.module.go

Defines the module structure:

package app

import "github.com/awesome-goose/goose/types"

type AppModule struct{}

func (m *AppModule) Imports() []types.Module {
    return []types.Module{
        // Import other modules
    }
}

func (m *AppModule) Exports() []any {
    return []any{
        // Export services for other modules
    }
}

func (m *AppModule) Declarations() []any {
    return []any{
        &AppController{},
        &AppService{},
    }
}

.env

Environment configuration:

APP_NAME=myapp
APP_ENV=development
HOST=localhost
PORT=8080

Organizing Large Applications

For large applications, organize by feature:

app/
โ”œโ”€โ”€ app.module.go          # Root module
โ”œโ”€โ”€ auth/                  # Authentication feature
โ”‚   โ”œโ”€โ”€ auth.module.go
โ”‚   โ”œโ”€โ”€ auth.controller.go
โ”‚   โ”œโ”€โ”€ auth.service.go
โ”‚   โ””โ”€โ”€ auth.middleware.go
โ”œโ”€โ”€ users/                 # Users feature
โ”œโ”€โ”€ products/              # Products feature
โ”œโ”€โ”€ orders/                # Orders feature
โ””โ”€โ”€ shared/                # Shared utilities
    โ”œโ”€โ”€ shared.module.go
    โ”œโ”€โ”€ validators/
    โ””โ”€โ”€ helpers/

Next Steps