gofasta g repository
Generates a model, migration pair, repository interface, and GORM-based repository implementation for a given resource. The repository layer handles all database operations (CRUD queries) and is the only layer that interacts directly with the database.
Aliases: repo
Usage
gofasta g repository <Name> [field:type ...]This command has no flags.
Examples
Generate a repository with all CRUD methods:
gofasta g repository Product name:string price:floatGenerate a repository for an article:
gofasta g repo Article title:string body:text published:boolWhat It Generates
Running gofasta g repository Product name:string price:float creates the following files:
| File | Description |
|---|---|
app/models/product.model.go | GORM database model |
db/migrations/000006_create_products.up.sql | Create table migration |
db/migrations/000006_create_products.down.sql | Drop table migration |
app/repositories/interfaces/product_repository.go | Repository interface |
app/repositories/product.repository.go | GORM implementation |
Repository Interface
// app/repositories/interfaces/product_repository.go
package interfaces
import "myapp/app/models"
type ProductRepository interface {
Create(product *models.Product) (*models.Product, error)
FindAll(page, limit int) ([]models.Product, int64, error)
FindByID(id string) (*models.Product, error)
Update(id string, product *models.Product) (*models.Product, error)
Delete(id string) error
}Repository Implementation
// app/repositories/product.repository.go
package repositories
import (
"myapp/app/models"
repoInterfaces "myapp/app/repositories/interfaces"
"gorm.io/gorm"
)
type ProductRepositoryImpl struct {
db *gorm.DB
}
func NewProductRepository(db *gorm.DB) repoInterfaces.ProductRepository {
return &ProductRepositoryImpl{db: db}
}
func (r *ProductRepositoryImpl) Create(product *models.Product) (*models.Product, error) {
if err := r.db.Create(product).Error; err != nil {
return nil, err
}
return product, nil
}
func (r *ProductRepositoryImpl) FindAll(page, limit int) ([]models.Product, int64, error) {
var products []models.Product
var total int64
r.db.Model(&models.Product{}).Count(&total)
err := r.db.Offset((page - 1) * limit).Limit(limit).Find(&products).Error
return products, total, err
}
func (r *ProductRepositoryImpl) FindByID(id string) (*models.Product, error) {
var product models.Product
if err := r.db.Where("id = ?", id).First(&product).Error; err != nil {
return nil, err
}
return &product, nil
}
func (r *ProductRepositoryImpl) Update(id string, product *models.Product) (*models.Product, error) {
if err := r.db.Where("id = ?", id).Updates(product).Error; err != nil {
return nil, err
}
return r.FindByID(id)
}
func (r *ProductRepositoryImpl) Delete(id string) error {
return r.db.Where("id = ?", id).Delete(&models.Product{}).Error
}Architecture
The repository sits between the service layer and the database:
Controller --> Service --> Repository --> Database (GORM)- Repositories receive a
*gorm.DBinstance via dependency injection - All methods return domain models, not DTOs
- Soft deletes are used by default (via GORM’s
DeletedAtfield) - Pagination is handled with
OffsetandLimit
Related
- gofasta g model — generate the model this repository operates on
- gofasta g service — generate the service that calls this repository
- gofasta g scaffold — generate all layers at once
Last updated on