/
repository.go
89 lines (74 loc) 路 2.9 KB
/
repository.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//
// Simple REST API
//
// Copyright 漏 2020. All rights reserved.
//
package user
import (
"github.com/moemoe89/go-clean-arch-ratu/api/v1/api_struct/model"
"fmt"
"github.com/jmoiron/sqlx"
)
// Repository represent the repositories
type Repository interface {
Get(filter map[string]interface{}, where, orderBy, selectField string) ([]*model.UserModel, error)
Count(filter map[string]interface{}, where string) (int, error)
Create(userReq *model.UserModel) (*model.UserModel, error)
GetByID(id, selectField string) (*model.UserModel, error)
Update(userReq *model.UserModel) (*model.UserModel, error)
Delete(id string) error
}
type mysqlRepository struct {
DBRead *sqlx.DB
DBWrite *sqlx.DB
}
// NewMysqlRepository will create an object that represent the Repository interface
func NewMysqlRepository(DBRead *sqlx.DB, DBWrite *sqlx.DB) Repository {
return &mysqlRepository{DBRead, DBWrite}
}
func (m *mysqlRepository) Get(filter map[string]interface{}, where, orderBy, selectField string) ([]*model.UserModel, error) {
users := []*model.UserModel{}
if len(selectField) == 0 {
selectField = model.UserSelectField
}
query := fmt.Sprintf("SELECT %s FROM users %s ORDER BY %s LIMIT :limit OFFSET :offset", selectField, where, orderBy)
namedQuery, args, _ := m.DBRead.BindNamed(query, filter)
err := m.DBRead.Select(&users, namedQuery, args...)
return users, err
}
func (m *mysqlRepository) Count(filter map[string]interface{}, where string) (int, error) {
var count int
query := fmt.Sprintf("SELECT COUNT(id) FROM users %s", where)
namedQuery, args, _ := m.DBRead.BindNamed(query, filter)
err := m.DBRead.Get(&count, namedQuery, args...)
return count, err
}
func (m *mysqlRepository) Create(user *model.UserModel) (*model.UserModel, error) {
_, err := m.DBWrite.NamedExec(`INSERT INTO users (id, name, email, phone, address, created_at, updated_at) VALUES (:id, :name, :email, :phone, :address, UTC_TIMESTAMP(), UTC_TIMESTAMP())`, user)
return user, err
}
func (m *mysqlRepository) GetByID(id, selectField string) (*model.UserModel, error) {
where := "WHERE deleted_at IS NULL"
filter := map[string]interface{}{}
where += " AND id = :id"
filter["id"] = id
user := &model.UserModel{}
if len(selectField) == 0 {
selectField = model.UserSelectField
}
query := fmt.Sprintf("SELECT %s FROM users %s", selectField, where)
namedQuery, args, _ := m.DBRead.BindNamed(query, filter)
err := m.DBRead.Get(user, namedQuery, args...)
return user, err
}
func (m *mysqlRepository) Update(user *model.UserModel) (*model.UserModel, error) {
_, err := m.DBWrite.NamedExec(`UPDATE users SET name = :name, email = :email, phone = :phone, address = :address, updated_at = UTC_TIMESTAMP() WHERE id = :id`, user)
return user, err
}
func (m *mysqlRepository) Delete(id string) error {
user := &model.UserModel{
ID: id,
}
_, err := m.DBWrite.NamedExec(`UPDATE users SET deleted_at = UTC_TIMESTAMP() WHERE id = :id`, user)
return err
}