/
invite_request.go
134 lines (111 loc) · 4.29 KB
/
invite_request.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
126
127
128
129
130
131
132
133
134
package backend
import (
"context"
"github.com/delphis-inc/delphisbe/internal/util"
"go.uber.org/multierr"
"github.com/delphis-inc/delphisbe/graph/model"
"github.com/sirupsen/logrus"
)
func (d *delphisBackend) GetDiscussionRequestAccessByID(ctx context.Context, id string) (*model.DiscussionAccessRequest, error) {
return d.db.GetDiscussionRequestAccessByID(ctx, id)
}
func (d *delphisBackend) GetDiscussionAccessRequestsByDiscussionID(ctx context.Context, discussionID string) ([]*model.DiscussionAccessRequest, error) {
iter := d.db.GetDiscussionAccessRequestsByDiscussionID(ctx, discussionID)
return d.db.AccessRequestIterCollect(ctx, iter)
}
func (d *delphisBackend) GetDiscussionAccessRequestByDiscussionIDUserID(ctx context.Context, discussionID string, userID string) (*model.DiscussionAccessRequest, error) {
return d.db.GetDiscussionAccessRequestByDiscussionIDUserID(ctx, discussionID, userID)
}
func (d *delphisBackend) GetSentDiscussionAccessRequestsByUserID(ctx context.Context, userID string) ([]*model.DiscussionAccessRequest, error) {
iter := d.db.GetSentDiscussionAccessRequestsByUserID(ctx, userID)
return d.db.AccessRequestIterCollect(ctx, iter)
}
func (d *delphisBackend) RequestAccessToDiscussion(ctx context.Context, userID, discussionID string) (*model.DiscussionAccessRequest, error) {
request := model.DiscussionAccessRequest{
ID: util.UUIDv4(),
UserID: userID,
DiscussionID: discussionID,
Status: model.InviteRequestStatusPending,
}
// Check if user already has access
dua, err := d.GetDiscussionUserAccess(ctx, discussionID, userID)
if err != nil {
logrus.WithError(err).Error("failed to get discussion user access")
return nil, err
}
if dua != nil && dua.State == model.DiscussionUserAccessStateActive {
logrus.Infof("user already has access ")
return nil, nil
}
// TODO: Should block users from spamming requests?
// Begin tx
tx, err := d.db.BeginTx(ctx)
if err != nil {
logrus.WithError(err).Error("failed to begin tx")
return nil, err
}
requestObj, err := d.db.PutDiscussionAccessRequestRecord(ctx, tx, request)
if err != nil {
logrus.WithError(err).Error("failed to put request record")
// Rollback on errors
if txErr := d.db.RollbackTx(ctx, tx); txErr != nil {
logrus.WithError(txErr).Error("failed to rollback tx")
return nil, multierr.Append(err, txErr)
}
return nil, err
}
// Commit transaction
if err := d.db.CommitTx(ctx, tx); err != nil {
logrus.WithError(err).Error("failed to commit post tx")
return nil, err
}
return requestObj, nil
}
func (d *delphisBackend) RespondToRequestAccess(ctx context.Context, requestID string, response model.InviteRequestStatus, invitingParticipantID string) (*model.DiscussionAccessRequest, error) {
request := model.DiscussionAccessRequest{
ID: requestID,
Status: response,
}
// Begin tx
tx, err := d.db.BeginTx(ctx)
if err != nil {
logrus.WithError(err).Error("failed to begin tx")
return nil, err
}
// Update access request record
requestObj, err := d.db.UpdateDiscussionAccessRequestRecord(ctx, tx, request)
if err != nil {
logrus.WithError(err).Error("failed to update request record")
// Rollback on errors
if txErr := d.db.RollbackTx(ctx, tx); txErr != nil {
logrus.WithError(txErr).Error("failed to rollback tx")
return nil, multierr.Append(err, txErr)
}
return nil, err
}
// If user has accepted the request, update discussion_user_access_table to allow user to create participant when they join.
if response == model.InviteRequestStatusAccepted {
input := model.DiscussionUserAccess{
DiscussionID: requestObj.DiscussionID,
UserID: requestObj.UserID,
State: model.DiscussionUserAccessStateActive,
NotifSetting: model.DiscussionUserNotificationSettingEverything,
RequestID: &requestObj.ID,
}
if _, err := d.db.UpsertDiscussionUserAccess(ctx, tx, input); err != nil {
logrus.WithError(err).Error("failed to update user access")
// Rollback on errors
if txErr := d.db.RollbackTx(ctx, tx); txErr != nil {
logrus.WithError(txErr).Error("failed to rollback tx")
return nil, multierr.Append(err, txErr)
}
return nil, err
}
}
// Commit transaction
if err := d.db.CommitTx(ctx, tx); err != nil {
logrus.WithError(err).Error("failed to commit post tx")
return nil, err
}
return requestObj, nil
}