Skip to main content

pkg/repository

The repository package provides higher-level CRUD abstractions over the exec and DML packages.

ScannerRepository

import "github.com/yaroher/ratel/pkg/repository"

repo := repository.NewScannerRepository(Users)

Find

// By ID
user, err := repo.FindByID(ctx, db, 1)

// With custom query
users, err := repo.FindAll(ctx, db,
Users.SelectAll().
Where(Users.IsActive.Eq(true)).
OrderByDESC(Users.CreatedAt),
)

Create

created, err := repo.Create(ctx, db, &UsersScanner{
Email: "john@example.com",
Name: "John Doe",
})
// created.ID is populated via RETURNING

Update

updated, err := repo.Update(ctx, db, &UsersScanner{
ID: 1,
Name: "John Smith",
})

Delete

err := repo.Delete(ctx, db, 1)

Transaction Support

All repository methods accept any DB interface, including pgx.Tx:

tx, _ := pool.Begin(ctx)
defer tx.Rollback(ctx)

user, _ := userRepo.Create(ctx, tx, &UsersScanner{...})
order, _ := orderRepo.Create(ctx, tx, &OrdersScanner{UserID: user.ID})

tx.Commit(ctx)