/
providers.go
125 lines (105 loc) · 3.46 KB
/
providers.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package config
import (
"context"
"embed"
"fmt"
"io/fs"
"net/http"
"os"
"github.com/bufbuild/connect-go"
"github.com/sirupsen/logrus"
"github.com/tierklinik-dobersberg/apis/gen/go/tkd/calendar/v1/calendarv1connect"
idmv1 "github.com/tierklinik-dobersberg/apis/gen/go/tkd/idm/v1"
"github.com/tierklinik-dobersberg/apis/gen/go/tkd/idm/v1/idmv1connect"
"github.com/tierklinik-dobersberg/apis/pkg/overlayfs"
"github.com/tierklinik-dobersberg/rosterd/database"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"google.golang.org/protobuf/types/known/fieldmaskpb"
)
type Providers struct {
Users idmv1connect.UserServiceClient
Roles idmv1connect.RoleServiceClient
Notify idmv1connect.NotifyServiceClient
Calendar calendarv1connect.CalendarServiceClient
Holidays calendarv1connect.HolidayServiceClient
Templates fs.FS
Datastore *database.DatabaseImpl
Config *ServiceConfig
}
func NewProviders(ctx context.Context, cfg *ServiceConfig, httpClient *http.Client, template embed.FS) (*Providers, error) {
fileSystems := []fs.FS{template}
if cfg.TemplatesDir != "" {
overwrite := os.DirFS(cfg.TemplatesDir)
fileSystems = []fs.FS{
overwrite,
template,
}
}
clientOptions := options.Client().
ApplyURI(cfg.DatabaseURL).
SetAppName("rosterd")
mongoClient, err := mongo.Connect(ctx, clientOptions)
if err != nil {
return nil, fmt.Errorf("failed to create mongodb client: %w", err)
}
if err := mongoClient.Ping(ctx, nil); err != nil {
return nil, fmt.Errorf("failed to ping mongodb: %w", err)
}
db, err := database.NewDatabase(
ctx,
mongoClient.Database(cfg.DatabaseName),
logrus.NewEntry(logrus.StandardLogger()),
)
if err != nil {
return nil, fmt.Errorf("failed to perpare database: %w", err)
}
p := &Providers{
Config: cfg,
Users: idmv1connect.NewUserServiceClient(httpClient, cfg.IdentityProvider),
Roles: idmv1connect.NewRoleServiceClient(httpClient, cfg.IdentityProvider),
Notify: idmv1connect.NewNotifyServiceClient(httpClient, cfg.IdentityProvider),
Calendar: calendarv1connect.NewCalendarServiceClient(httpClient, cfg.CalendarService),
Holidays: calendarv1connect.NewHolidayServiceClient(httpClient, cfg.CalendarService),
Templates: overlayfs.NewFS(fileSystems...),
Datastore: db,
}
return p, nil
}
func (p *Providers) FetchAllUserIds(ctx context.Context) ([]string, error) {
allUsers, err := p.Users.ListUsers(ctx, connect.NewRequest(&idmv1.ListUsersRequest{
FieldMask: &fieldmaskpb.FieldMask{
Paths: []string{"users.user.id"},
},
}))
if err != nil {
return nil, fmt.Errorf("failed to fetch Users: %w", err)
}
userIds := make([]string, len(allUsers.Msg.Users))
for idx, u := range allUsers.Msg.Users {
userIds[idx] = u.User.Id
}
return userIds, nil
}
func (p *Providers) VerifyUserExists(ctx context.Context, id string) error {
_, err := p.Users.GetUser(ctx, connect.NewRequest(&idmv1.GetUserRequest{
Search: &idmv1.GetUserRequest_Id{
Id: id,
},
FieldMask: &fieldmaskpb.FieldMask{
Paths: []string{"profile.user.id"},
},
}))
return err
}
func (p *Providers) FetchAllUserProfiles(ctx context.Context) ([]*idmv1.Profile, error) {
res, err := p.Users.ListUsers(ctx, connect.NewRequest(&idmv1.ListUsersRequest{
FieldMask: &fieldmaskpb.FieldMask{
Paths: []string{"users.user.id", "users.user.username", "users.roles", "users.user.primary_mail", "users.user.display_name"},
},
}))
if err != nil {
return nil, err
}
return res.Msg.Users, nil
}