├── .gitignore ├── README.md ├── service ├── domain │ └── domain.go ├── service.go └── pokemon.go └── repository ├── model └── model.go ├── repository.go └── db.go /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # repository-pattern-go 2 | An implementation of the Repository pattern in Golang 3 | -------------------------------------------------------------------------------- /service/domain/domain.go: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | type Pokemon interface { 4 | Name string 5 | Type string 6 | Height string 7 | Weight string 8 | } 9 | -------------------------------------------------------------------------------- /service/service.go: -------------------------------------------------------------------------------- 1 | package service 2 | 3 | type Service interface { 4 | ListPokemon func () ([]model.Pokemon, err) 5 | GetPokemon func () (model.Pokemon, err) 6 | } 7 | -------------------------------------------------------------------------------- /repository/model/model.go: -------------------------------------------------------------------------------- 1 | package model 2 | 3 | type Pokemon struct { 4 | Id int 5 | Identifier string 6 | SpeciesID int 7 | Height int 8 | Weight int 9 | BaseExperience int 10 | Order int 11 | IsDefault bool 12 | } 13 | -------------------------------------------------------------------------------- /service/pokemon.go: -------------------------------------------------------------------------------- 1 | package service 2 | 3 | import( 4 | "log" 5 | 6 | "github.com/censhin/repository-pattern-go/repository" 7 | "github.com/censhin/repository-pattern-go/repository/db" 8 | "github.com/censhin/repository-pattern-go/service/domain" 9 | ) 10 | 11 | func ListPokemon() ([]domain.Pokemon, err) { 12 | var data []domain.Pokemon 13 | err := repository.List(&data, db.ListPokemonQuery) 14 | return data, err 15 | } 16 | 17 | func GetPokemon(ID string) (domain.Pokemon, err) { 18 | var data domain.Pokemon 19 | err := repository.Get(ID, &data, db.PokemonQuery) 20 | return data, err 21 | } 22 | -------------------------------------------------------------------------------- /repository/repository.go: -------------------------------------------------------------------------------- 1 | package repository 2 | 3 | type Repository interface { 4 | List func(dest interface{}, query string) error 5 | Get func(ID string, dest interface{}, query string) error 6 | Create func(data interface{}, query string) error 7 | Update func(ID string, data interface{}, query string) error 8 | Delete func(ID string, query string) error 9 | } 10 | 11 | func List(dest interface{}, query string) error { 12 | err := dbList(dest, query) 13 | if err != nil { 14 | return err 15 | } 16 | return nil 17 | } 18 | 19 | func Get(ID string, dest interface{}, query string) error { 20 | err := dbGet(ID, dest, query) 21 | if err != nil { 22 | return err 23 | } 24 | return nil 25 | } 26 | 27 | func Create(data interface{}, query string) error { 28 | err := dbCreate(data, query) 29 | if err != nil { 30 | return err 31 | } 32 | return nil 33 | } 34 | 35 | func Update(ID string, data interface{}, query string) error { 36 | err := dbUpdate(ID, data, query) 37 | if err != nil { 38 | return err 39 | } 40 | return nil 41 | } 42 | 43 | func Delete(ID string, query string) error { 44 | err := dbDelete(ID, query) 45 | if err != nil { 46 | return err 47 | } 48 | return nil 49 | } 50 | -------------------------------------------------------------------------------- /repository/db.go: -------------------------------------------------------------------------------- 1 | package repository 2 | 3 | import( 4 | "github.com/jmoiron/sqlx" 5 | ) 6 | 7 | struct database type { 8 | conn *sqlx.DB 9 | } 10 | 11 | func connect(driverName string, dataSourceName string) (*sqlx.DB, error) { 12 | db, err := sqlx.Connect(driverName, dataSourceName) 13 | if err != nil { 14 | log.Error(err) 15 | return nil, err 16 | } 17 | return db, nil 18 | } 19 | 20 | func (db database) dbList(dest interface{}, query string) error { 21 | err := db.conn.Select(dest, query) 22 | if err != nil { 23 | return err 24 | } 25 | return nil 26 | } 27 | 28 | func (db database) dbGet(ID string, dest interface{}, query string) error { 29 | err := db.conn.Select(dest, query, ID) 30 | if err != nil { 31 | return err 32 | } 33 | return nil 34 | } 35 | 36 | func (db database) dbCreate(data interface{}, query string) error { 37 | err := db.conn.Query(query, data) 38 | if err != nil { 39 | return err 40 | } 41 | return nil 42 | } 43 | 44 | func (db database) dbUpdate(ID string, data interface{}, query string) error { 45 | err := db.conn.Query(query, ID, data) 46 | if err != nil { 47 | return err 48 | } 49 | return nil 50 | } 51 | 52 | func (db database) dbDelete(query string) error { 53 | err := db.conn.Query(query, ID) 54 | if err != nil { 55 | return err 56 | } 57 | return nil 58 | } 59 | --------------------------------------------------------------------------------