/
impl_mutes_service.go
150 lines (140 loc) · 4.96 KB
/
impl_mutes_service.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package impl
import (
"context"
"errors"
"net/http"
"github.com/UsagiBooru/accounts-server/gen"
"github.com/UsagiBooru/accounts-server/models/mongomodels"
"github.com/UsagiBooru/accounts-server/utils/request"
"github.com/UsagiBooru/accounts-server/utils/response"
"go.mongodb.org/mongo-driver/mongo"
"gopkg.in/go-playground/validator.v9"
)
// MutesApiImplService is type of implemented api service (http.Handler)
type MutesApiImplService struct {
gen.MutesApiService
md *mongo.Client
ah mongomodels.MongoAccountHelper
mh mongomodels.MongoMuteHelper
validate *validator.Validate
}
// NewMutesApiImplService creates mutes api service
func NewMutesApiImplService(md *mongo.Client) gen.MutesApiServicer {
return &MutesApiImplService{
MutesApiService: gen.MutesApiService{},
md: md,
ah: mongomodels.NewMongoAccountHelper(md),
mh: mongomodels.NewMongoMuteHelper(md),
validate: validator.New(),
}
}
// AddMute - Add mute
func (s *MutesApiImplService) AddMute(ctx context.Context, accountID int32, muteStruct gen.MuteStruct) (gen.ImplResponse, error) {
// Validate struct
err := s.validate.Struct(s.mh.ToMongo(muteStruct))
if err != nil {
return response.NewRequestErrorWithMessage(err.Error()), nil
}
// Get issuerId/ issuerPermission
issuerID, issuerPermission, err := request.GetHeaders(ctx)
if err != nil {
return response.NewInternalError(), err
}
// Validate permission
if err := request.ValidatePermission(issuerPermission, issuerID, accountID); err != nil {
return response.NewPermissionErrorWithMessage(err.Error()), err
}
// Find target account
_, err = s.ah.FindAccount(mongomodels.AccountID(accountID))
if err != nil {
return response.NewNotFoundErrorWithMessage("specified account was not found"), nil
}
// Find mute does already exists
err = s.mh.FindDuplicatedMute(muteStruct.TargetType, muteStruct.TargetID, mongomodels.AccountID(issuerID))
if err != nil {
return response.NewConflictedError(), nil
}
// Use transaction to prevent duplicate request
var newMute *mongomodels.MongoMuteStruct
err = s.md.UseSession(ctx, func(sc mongo.SessionContext) error {
err := sc.StartTransaction()
if err != nil {
return err
}
// Get muteIDSeq
muteSequenceHelper := mongomodels.NewMongoSequenceHelper(s.md, "accounts", "muteID")
seq, err := muteSequenceHelper.GetSeq()
if err != nil {
return err
}
// Create new mute
newMute, err = s.mh.CreateMute(
seq+1,
mongomodels.AccountID(accountID),
muteStruct.TargetType,
muteStruct.TargetID,
)
if err != nil {
return err
}
// Update seq
if err := muteSequenceHelper.UpdateSeq(); err != nil {
return err
}
return sc.CommitTransaction(sc)
})
if err != nil {
return response.NewInternalError(), err
}
return gen.Response(200, newMute.ToOpenApi()), nil
}
// DeleteMute - Delete mute
func (s *MutesApiImplService) DeleteMute(ctx context.Context, accountID int32, muteID int32) (gen.ImplResponse, error) {
// Get issuerId/ issuerPermission
issuerID, issuerPermission, err := request.GetHeaders(ctx)
if err != nil {
return response.NewInternalError(), err
}
if err := request.ValidatePermission(issuerPermission, issuerID, accountID); err != nil {
return response.NewPermissionErrorWithMessage(err.Error()), err
}
// Delete mute
err = s.mh.DeleteMute(muteID, mongomodels.AccountID(accountID))
if err != nil {
return response.NewNotFoundError(), nil
}
return gen.Response(204, nil), nil
}
// GetMute - Get mute
func (s *MutesApiImplService) GetMute(ctx context.Context, accountID int32, muteID int32) (gen.ImplResponse, error) {
// Get issuerId/ issuerPermission
issuerID, issuerPermission, err := request.GetHeaders(ctx)
if err != nil {
return response.NewInternalError(), err
}
if err := request.ValidatePermission(issuerPermission, issuerID, accountID); err != nil {
return response.NewPermissionErrorWithMessage(err.Error()), err
}
// Find mute
mute, err := s.mh.FindMute(muteID)
if err != nil {
return response.NewNotFoundError(), nil
}
return gen.Response(200, mute.ToOpenApi()), nil
}
// GetMutes - Get mute list
func (s *MutesApiImplService) GetMutes(ctx context.Context, accountID int32) (gen.ImplResponse, error) {
// Get issuerId/ issuerPermission
issuerID, issuerPermission, err := request.GetHeaders(ctx)
if err != nil {
return response.NewInternalError(), err
}
if err := request.ValidatePermission(issuerPermission, issuerID, accountID); err != nil {
return response.NewPermissionErrorWithMessage(err.Error()), err
}
//TODO: Uncomment the next line to return gen.Response Response(200, GetMutesResponse{}) or use other options such as http.Ok ...
//return gen.Response(200, GetMutesResponse{}), nil
//TODO: Uncomment the next line to return gen.Response Response(404, GeneralMessageResponse{}) or use other options such as http.Ok ...
//return gen.Response(404, GeneralMessageResponse{}), nil
return gen.Response(http.StatusNotImplemented, nil), errors.New("GetMutes method not implemented")
}