项目作者: b-b3rn4rd

项目描述 :
Golang repository design pattern
高级语言: Go
项目地址: git://github.com/b-b3rn4rd/repository-design-pattern.git
创建时间: 2018-05-25T05:52:23Z
项目社区:https://github.com/b-b3rn4rd/repository-design-pattern

开源协议:

下载


repository-design-pattern

The repository design pattern that has following characteristics

  • Easy to register new repositories with minimal repetitive code
  • Single database connection (aws session) across all repositories
  • Parent struct that contains shared fields
  • Each repository must implement standard Restful methods, however can contain any additional functions
  • All repositories are stored in a registry and can be passed down the application as a single struct

Example:

main.go

  1. logger := logrus.New()
  2. logger.SetLevel(logrus.DebugLevel)
  3. sess := session.Must(session.NewSessionWithOptions(session.Options{
  4. SharedConfigState: session.SharedConfigEnable,
  5. }))
  6. rr := repository.NewRepositoryRegistry(
  7. dynamo.New(sess),
  8. logger,
  9. &repository.UserRepository{},
  10. )
  11. users, err := rr.MustRepository("UserRepository").List()
  12. if err != nil {
  13. logger.WithError(err).Fatal("an error has occurred")
  14. }
  15. fmt.Println(users)

UserRepository.go

  1. package repository
  2. import (
  3. "github.com/b-b3rn4rd/repository-design-pattern/model"
  4. "github.com/pkg/errors"
  5. )
  6. type UserRepository struct {
  7. DynamoRepository
  8. }
  9. func (r *UserRepository) List() (interface{}, error) {
  10. r.logger.Debug("listing all users")
  11. var users []model.User
  12. err := r.db.Table("User").Scan().All(&users)
  13. if err != nil {
  14. return nil, errors.Wrap(err, "error while listing users")
  15. }
  16. return users, nil
  17. }
  18. func (r *UserRepository) Get(id interface{}) (interface{}, error) {
  19. r.logger.WithField("id", id).Debug("retrieving single user")
  20. var user []model.User
  21. err := r.db.Table("User").Get("Id", id).One(&user)
  22. if err != nil {
  23. return nil, errors.Wrap(err, "error while retrieving single user")
  24. }
  25. return user, nil
  26. }
  27. func (r *UserRepository) Create(entity interface{}) (interface{}, error) {
  28. r.logger.WithField("user", entity).Debug("create user")
  29. err := r.db.Table("User").Put(entity.(model.User)).Run()
  30. if err != nil {
  31. return false, errors.Wrap(err, "error while creating user")
  32. }
  33. return true, nil
  34. }
  35. func (r *UserRepository) Update(id interface{}, entity interface{}) (bool, error) {
  36. r.logger.WithField("user", entity).Debug("update user")
  37. err := r.db.Table("User").Update("Id", id).Set("Email", entity.(model.User).Email).Run()
  38. if err != nil {
  39. return false, errors.Wrap(err, "error while updating user")
  40. }
  41. return true, nil
  42. }
  43. func (r *UserRepository) Delete(id interface{}) (bool, error) {
  44. r.logger.WithField("id", id).Debug("delete user")
  45. err := r.db.Table("User").Delete("Id", id).Run()
  46. if err != nil {
  47. return false, errors.Wrap(err, "error while deleting user")
  48. }
  49. return false, nil
  50. }
  51. func (r *UserRepository) GetGroups(id interface{}) (interface{}, error) {
  52. r.logger.WithField("id", id).Debug("get user groups")
  53. return nil, errors.New("error retrieving user's groups")
  54. }