Skip to content

Commit 0c53d84

Browse files
committed
impr: separates db operations from business logic created
repository for these things and then used it in services to perform db operations.
1 parent 58b320c commit 0c53d84

File tree

3 files changed

+227
-184
lines changed

3 files changed

+227
-184
lines changed

main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515

1616
userspb "2k4sm/grpc-crud/proto/users"
1717
"2k4sm/grpc-crud/src/db"
18+
"2k4sm/grpc-crud/src/repositories"
1819
"2k4sm/grpc-crud/src/services"
1920
)
2021

@@ -34,7 +35,8 @@ func main() {
3435
}
3536

3637
grpcServer := grpc.NewServer()
37-
userService := services.NewUserService(session)
38+
userRepo := repositories.NewUserRepository(session)
39+
userService := services.NewUserService(userRepo)
3840
userspb.RegisterUsersServer(grpcServer, userService)
3941

4042
log.Println("Serving gRPC on localhost:8080")

src/repositories/userRepositories.go

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package repositories
2+
3+
import (
4+
"2k4sm/grpc-crud/src/models"
5+
"context"
6+
7+
"github.com/scylladb/gocqlx/qb"
8+
"github.com/scylladb/gocqlx/table"
9+
"github.com/scylladb/gocqlx/v2"
10+
)
11+
12+
type UserRepository interface {
13+
CreateUser(ctx context.Context, user *models.User) (bool, error)
14+
GetUserByEmail(ctx context.Context, email string) (*models.User, error)
15+
GetUserByPhone(ctx context.Context, phone string) (*models.User, error)
16+
GetUserByEmailAndPhone(ctx context.Context, email, phone string) (*models.User, error)
17+
UpdateUserAccess(ctx context.Context, email string, access string) error
18+
UpdateUser(ctx context.Context, user *models.User, fields []string) error
19+
DeleteUser(ctx context.Context, email string) error
20+
}
21+
22+
type UserRepositoryImpl struct {
23+
session *gocqlx.Session
24+
table *table.Table
25+
}
26+
27+
func NewUserRepository(session *gocqlx.Session) UserRepository {
28+
return &UserRepositoryImpl{
29+
session: session,
30+
table: table.New(models.UserMetadata),
31+
}
32+
}
33+
34+
func (r *UserRepositoryImpl) CreateUser(ctx context.Context, user *models.User) (bool, error) {
35+
stmt, names := qb.Insert(r.table.Name()).
36+
Columns("email", "first_name", "last_name", "ph_number", "gender", "dob", "access").
37+
Unique().
38+
ToCql()
39+
40+
executor := r.session.Query(stmt, names).BindStruct(user)
41+
return executor.ExecCASRelease()
42+
}
43+
44+
func (r *UserRepositoryImpl) GetUserByEmail(ctx context.Context, email string) (*models.User, error) {
45+
stmt, names := qb.Select(r.table.Name()).
46+
Columns("email", "first_name", "last_name", "ph_number", "gender", "dob", "access").
47+
Where(qb.Eq("email")).
48+
ToCql()
49+
50+
executor := r.session.Query(stmt, names).BindMap(qb.M{"email": email})
51+
52+
var user models.User
53+
if err := executor.GetRelease(&user); err != nil {
54+
return nil, err
55+
}
56+
57+
return &user, nil
58+
}
59+
60+
func (r *UserRepositoryImpl) GetUserByPhone(ctx context.Context, phone string) (*models.User, error) {
61+
stmt, names := qb.Select(r.table.Name()).
62+
Columns("email", "first_name", "last_name", "ph_number", "gender", "dob", "access").
63+
Where(qb.Eq("ph_number")).
64+
ToCql()
65+
66+
executor := r.session.Query(stmt, names).BindMap(qb.M{"ph_number": phone})
67+
68+
var user models.User
69+
if err := executor.GetRelease(&user); err != nil {
70+
return nil, err
71+
}
72+
73+
return &user, nil
74+
}
75+
76+
func (r *UserRepositoryImpl) GetUserByEmailAndPhone(ctx context.Context, email, phone string) (*models.User, error) {
77+
stmt, names := qb.Select(r.table.Name()).
78+
Columns("email", "first_name", "last_name", "ph_number", "gender", "dob", "access").
79+
Where(qb.Eq("email"), qb.Eq("ph_number")).
80+
ToCql()
81+
82+
executor := r.session.Query(stmt, names).BindMap(qb.M{
83+
"email": email,
84+
"ph_number": phone,
85+
})
86+
87+
var user models.User
88+
if err := executor.GetRelease(&user); err != nil {
89+
return nil, err
90+
}
91+
92+
return &user, nil
93+
}
94+
95+
func (r *UserRepositoryImpl) UpdateUserAccess(ctx context.Context, email string, access string) error {
96+
stmt, names := qb.Update(r.table.Name()).
97+
Set("access").
98+
Where(qb.Eq("email")).
99+
ToCql()
100+
101+
executor := r.session.Query(stmt, names).BindMap(qb.M{
102+
"access": access,
103+
"email": email,
104+
})
105+
106+
return executor.ExecRelease()
107+
}
108+
109+
func (r *UserRepositoryImpl) UpdateUser(ctx context.Context, user *models.User, fields []string) error {
110+
updateBuilder := qb.Update(r.table.Name())
111+
112+
for _, field := range fields {
113+
updateBuilder = updateBuilder.Set(field)
114+
}
115+
116+
stmt, names := updateBuilder.
117+
Where(qb.Eq("email")).
118+
ToCql()
119+
120+
executor := r.session.Query(stmt, names).BindStruct(user)
121+
return executor.ExecRelease()
122+
}
123+
124+
func (r *UserRepositoryImpl) DeleteUser(ctx context.Context, email string) error {
125+
stmt, names := qb.Delete(r.table.Name()).
126+
Where(qb.Eq("email")).
127+
ToCql()
128+
129+
executor := r.session.Query(stmt, names).BindMap(qb.M{"email": email})
130+
return executor.ExecRelease()
131+
}

0 commit comments

Comments
 (0)