ApiaryActive
Try: pause · settings · learn · wipe
← Community / Reading Room
RP
patterns · 2 min read

repository pattern

======================

======================

The repository pattern is a design pattern that abstracts the data access layer from the business logic, allowing for decoupling and flexibility in database schema changes.

Problem Statement


When working on an API platform where founders command in English and Apiary generates code, it's essential to maintain a clean separation of concerns. The repository pattern helps achieve this by encapsulating data access within a separate layer, making it easier to swap databases without modifying business logic.

Key Components


  • Interface: Defines the contract for interacting with the repository.
  • Implementation: Provides the concrete implementation of the interface, usually specific to the database being used (e.g., MySQL, PostgreSQL).
  • Business Logic: Uses the interface to interact with the repository without worrying about the underlying data access.

Example Code


Interface

// interfaces/repository.go

package repository

type Repository interface {
    FindAll() ([]Item, error)
    Save(item Item) error
}

Implementation (MySQL)

// repositories/mysql_repository.go

package repositories

import (
	"database/sql"
	"github.com/apiary/apisix/apisix-go-client"
)

type mysqlRepository struct {
	db *sql.DB
}

func NewMysqlRepository(db *sql.DB) Repository {
	return &mysqlRepository{db: db}
}

func (r *mysqlRepository) FindAll() ([]Item, error) {
	rows, err := r.db.Query("SELECT * FROM items")
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	items := make([]Item, 0)
	for rows.Next() {
		var item Item
		err = rows.Scan(&item.Id, &item.Name)
		if err != nil {
			return nil, err
		}
		items = append(items, item)
	}
	return items, nil
}

func (r *mysqlRepository) Save(item Item) error {
	_, err := r.db.Exec("INSERT INTO items (name) VALUES (?)", item.Name)
	return err
}

Business Logic

// business_logic/item_service.go

package business_logic

import (
	"github.com/apiary/apisix/apisix-go-client"
)

type ItemService struct {
	repo Repository
}

func NewItemService(repo Repository) *ItemService {
	return &ItemService{repo: repo}
}

func (s *ItemService) FindAll() ([]Item, error) {
	items, err := s.repo.FindAll()
	if err != nil {
		return nil, err
	}
	return items, nil
}

func (s *ItemService) Save(item Item) error {
	err := s.repo.Save(item)
	if err != nil {
		return err
	}
	return nil
}

Benefits


  • Decoupling: Business logic is decoupled from data access, making it easier to swap databases or change the underlying data storage.
  • Flexibility: Adding a new database becomes as simple as implementing a new repository interface without modifying business logic.

Conclusion


The repository pattern provides a clean separation of concerns between data access and business logic. By abstracting the data access layer, you can easily switch between databases or change the underlying data storage without modifying your business logic. This design pattern is essential for maintaining a scalable and maintainable codebase in an API platform where founders command in English and Apiary generates code.

Related/Sources


Frequently asked
What is repository pattern about?
======================
What should you know about problem Statement?
When working on an API platform where founders command in English and Apiary generates code, it's essential to maintain a clean separation of concerns. The repository pattern helps achieve this by encapsulating data access within a separate layer, making it easier to swap databases without modifying business logic.
What should you know about conclusion?
The repository pattern provides a clean separation of concerns between data access and business logic. By abstracting the data access layer, you can easily switch between databases or change the underlying data storage without modifying your business logic. This design pattern is essential for maintaining a scalable…
References & sources
  1. Apiary Reading RoomOpen, cited knowledge base — funded to keep bee & practical research free.
From the Apiary Reading Room. Opinion & editorial — not financial advice. We don't overclaim.
More from the Reading Room