-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathregistry.go
89 lines (75 loc) · 2.3 KB
/
registry.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
package main
import (
"trackpump/adapter/controller"
"trackpump/adapter/filestorage"
"trackpump/adapter/id"
"trackpump/adapter/notification"
"trackpump/adapter/password"
"trackpump/adapter/persistence"
"trackpump/auth"
"trackpump/domain/repository"
"trackpump/storage"
"trackpump/usecase"
"trackpump/usecase/service"
"cloud.google.com/go/datastore"
)
type registry struct {
client *datastore.Client
storageClient *storage.PCloudClient
repository repository.UserRepository
email string
password string
}
// Registry is an interface
type Registry interface {
NewAppController() controller.AppController
getRepository() repository.UserRepository
}
// NewRegistry returns a new registry
func NewRegistry(client *datastore.Client, storageClient *storage.PCloudClient, email string, password string) Registry {
var repository repository.UserRepository
if client == nil {
repository = persistence.NewInMemoryRepository()
} else {
repository = persistence.NewDatastoreRepository(client)
}
return ®istry{
client: client,
storageClient: storageClient,
repository: repository,
email: email,
password: password,
}
}
// injecting company repository
func (r *registry) getRepository() repository.UserRepository {
return r.repository
}
// injecting id service
func (r *registry) getIDService() service.IDService {
return id.New()
}
// injecting password service
func (r *registry) getPasswordService() service.PasswordService {
return password.New()
}
// injecting auth service
func (r *registry) getAuthService() *auth.Auth {
return auth.New()
}
// injecting notification service
func (r *registry) getNotificationService() service.Notification {
return notification.NewNotificationService(r.email, r.password)
}
// injecting storage service
func (r *registry) getStorageService() service.Storage {
return filestorage.NewPcloudStorage(r.storageClient)
}
// injecting company use cases
func (r *registry) newCompanyUseCases() usecase.UseCases {
return usecase.New(r.getRepository(), r.getPasswordService(), r.getIDService(), r.getStorageService(), r.getNotificationService())
}
// injecting customer controller
func (r *registry) NewAppController() controller.AppController {
return controller.NewUsersController(r.newCompanyUseCases(), r.getAuthService())
}