Skip to content

Commit a264412

Browse files
authored
feat(organization): add organization and membership rules (#146)
Because - we need to add rules and constraints for organization and membership This commit - add organization and membership rules - refactor error handling
1 parent fa8a18a commit a264412

File tree

14 files changed

+493
-725
lines changed

14 files changed

+493
-725
lines changed

cmd/init/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"database/sql"
66
"encoding/json"
7+
"errors"
78
"fmt"
89
"log"
910
"time"
@@ -85,7 +86,7 @@ func createDefaultUser(ctx context.Context, db *gorm.DB) error {
8586
return nil
8687
}
8788

88-
if s, ok := status.FromError(err); !ok || s.Code() != codes.NotFound {
89+
if !errors.Is(err, gorm.ErrRecordNotFound) {
8990
return status.Errorf(codes.Internal, "error %v", err)
9091
}
9192

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ require (
1717
github.com/instill-ai/protogen-go v0.3.3-alpha.0.20231129095217-f8d4e5951d35
1818
github.com/instill-ai/usage-client v0.2.4-alpha.0.20231019203021-70410a0a8061
1919
github.com/instill-ai/x v0.3.0-alpha
20-
github.com/jackc/pgx/v5 v5.3.0
2120
github.com/knadh/koanf v1.4.4
2221
github.com/mennanov/fieldmask-utils v0.5.0
2322
github.com/openfga/go-sdk v0.2.3
@@ -71,6 +70,7 @@ require (
7170
github.com/influxdata/line-protocol/v2 v2.2.1 // indirect
7271
github.com/jackc/pgpassfile v1.0.0 // indirect
7372
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
73+
github.com/jackc/pgx/v5 v5.3.0 // indirect
7474
github.com/jinzhu/inflection v1.0.0 // indirect
7575
github.com/jinzhu/now v1.1.5 // indirect
7676
github.com/klauspost/asmfmt v1.3.2 // indirect

pkg/acl/acl.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func (c *ACLClient) GetOrganizationUserMembership(orgUID uuid.UUID, userUID uuid
105105
for _, tuple := range *data.Tuples {
106106
return *tuple.Key.Relation, nil
107107
}
108-
return "", fmt.Errorf("no permission")
108+
return "", ErrMembershipNotFound
109109
}
110110

111111
func (c *ACLClient) GetOrganizationUsers(orgUID uuid.UUID) ([]*Relation, error) {

pkg/acl/errors.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package acl
2+
3+
import "errors"
4+
5+
var ErrMembershipNotFound = errors.New("membership not found")

pkg/handler/errors.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package handler
2+
3+
import "errors"
4+
5+
var ErrCheckUpdateImmutableFields = errors.New("update immutable fields error")
6+
var ErrCheckOutputOnlyFields = errors.New("can not contain output only fields")
7+
var ErrCheckRequiredFields = errors.New("required fields missing")
8+
var ErrFieldMask = errors.New("field mask error")
9+
var ErrResourceID = errors.New("resource ID error")
10+
var ErrUpdateMask = errors.New("update mask error")

pkg/handler/privatehandler.go

Lines changed: 7 additions & 188 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@ package handler
22

33
import (
44
"context"
5-
"fmt"
65
"strings"
76

87
"github.com/gofrs/uuid"
98
"go.einride.tech/aip/filtering"
109
"google.golang.org/genproto/googleapis/rpc/errdetails"
11-
"google.golang.org/grpc/codes"
12-
"google.golang.org/grpc/status"
1310

1411
"github.com/instill-ai/mgmt-backend/pkg/logger"
1512
"github.com/instill-ai/mgmt-backend/pkg/service"
@@ -35,7 +32,6 @@ func NewPrivateHandler(s service.Service) mgmtPB.MgmtPrivateServiceServer {
3532

3633
// ListUsersAdmin lists all users
3734
func (h *PrivateHandler) ListUsersAdmin(ctx context.Context, req *mgmtPB.ListUsersAdminRequest) (*mgmtPB.ListUsersAdminResponse, error) {
38-
logger, _ := logger.GetZapLogger(ctx)
3935

4036
pageSize := req.GetPageSize()
4137
if pageSize == 0 {
@@ -46,34 +42,7 @@ func (h *PrivateHandler) ListUsersAdmin(ctx context.Context, req *mgmtPB.ListUse
4642

4743
pbUsers, totalSize, nextPageToken, err := h.Service.ListUsersAdmin(ctx, int(pageSize), req.GetPageToken(), filtering.Filter{})
4844
if err != nil {
49-
sta := status.Convert(err)
50-
switch sta.Code() {
51-
case codes.InvalidArgument:
52-
st, e := sterr.CreateErrorBadRequest(
53-
"list user error", []*errdetails.BadRequest_FieldViolation{
54-
{
55-
Field: "ListUsersAdminRequest.page_token",
56-
Description: sta.Message(),
57-
},
58-
})
59-
if e != nil {
60-
logger.Error(e.Error())
61-
}
62-
return &mgmtPB.ListUsersAdminResponse{}, st.Err()
63-
default:
64-
st, e := sterr.CreateErrorResourceInfo(
65-
sta.Code(),
66-
"list user error",
67-
"user",
68-
"",
69-
"",
70-
sta.Message(),
71-
)
72-
if e != nil {
73-
logger.Error(e.Error())
74-
}
75-
return &mgmtPB.ListUsersAdminResponse{}, st.Err()
76-
}
45+
return nil, err
7746
}
7847

7948
resp := mgmtPB.ListUsersAdminResponse{
@@ -86,40 +55,12 @@ func (h *PrivateHandler) ListUsersAdmin(ctx context.Context, req *mgmtPB.ListUse
8655

8756
// GetUserAdmin gets a user
8857
func (h *PrivateHandler) GetUserAdmin(ctx context.Context, req *mgmtPB.GetUserAdminRequest) (*mgmtPB.GetUserAdminResponse, error) {
89-
logger, _ := logger.GetZapLogger(ctx)
9058

9159
id := strings.TrimPrefix(req.GetName(), "users/")
9260

9361
pbUser, err := h.Service.GetUserAdmin(ctx, id)
9462
if err != nil {
95-
sta := status.Convert(err)
96-
switch sta.Code() {
97-
case codes.InvalidArgument:
98-
st, e := sterr.CreateErrorBadRequest(
99-
"get user error", []*errdetails.BadRequest_FieldViolation{
100-
{
101-
Field: "GetUserAdminRequest.name",
102-
Description: sta.Message(),
103-
},
104-
})
105-
if e != nil {
106-
logger.Error(e.Error())
107-
}
108-
return &mgmtPB.GetUserAdminResponse{}, st.Err()
109-
default:
110-
st, e := sterr.CreateErrorResourceInfo(
111-
sta.Code(),
112-
"get user error",
113-
"user",
114-
fmt.Sprintf("id %s", id),
115-
"",
116-
sta.Message(),
117-
)
118-
if e != nil {
119-
logger.Error(e.Error())
120-
}
121-
return &mgmtPB.GetUserAdminResponse{}, st.Err()
122-
}
63+
return nil, err
12364
}
12465

12566
resp := mgmtPB.GetUserAdminResponse{
@@ -152,34 +93,7 @@ func (h *PrivateHandler) LookUpUserAdmin(ctx context.Context, req *mgmtPB.LookUp
15293

15394
pbUser, err := h.Service.GetUserByUIDAdmin(ctx, uid)
15495
if err != nil {
155-
sta := status.Convert(err)
156-
switch sta.Code() {
157-
case codes.InvalidArgument:
158-
st, e := sterr.CreateErrorBadRequest(
159-
"look up user error", []*errdetails.BadRequest_FieldViolation{
160-
{
161-
Field: "LookUpUserAdminRequest.permalink",
162-
Description: sta.Message(),
163-
},
164-
})
165-
if e != nil {
166-
logger.Error(e.Error())
167-
}
168-
return &mgmtPB.LookUpUserAdminResponse{}, st.Err()
169-
default:
170-
st, e := sterr.CreateErrorResourceInfo(
171-
sta.Code(),
172-
"look up user error",
173-
"user",
174-
fmt.Sprintf("uid %s", uid),
175-
"",
176-
sta.Message(),
177-
)
178-
if e != nil {
179-
logger.Error(e.Error())
180-
}
181-
return &mgmtPB.LookUpUserAdminResponse{}, st.Err()
182-
}
96+
return nil, err
18397
}
18498

18599
resp := mgmtPB.LookUpUserAdminResponse{
@@ -190,7 +104,6 @@ func (h *PrivateHandler) LookUpUserAdmin(ctx context.Context, req *mgmtPB.LookUp
190104

191105
// ListOrganizationsAdmin lists all organizations
192106
func (h *PrivateHandler) ListOrganizationsAdmin(ctx context.Context, req *mgmtPB.ListOrganizationsAdminRequest) (*mgmtPB.ListOrganizationsAdminResponse, error) {
193-
logger, _ := logger.GetZapLogger(ctx)
194107

195108
pageSize := req.GetPageSize()
196109
if pageSize == 0 {
@@ -201,34 +114,7 @@ func (h *PrivateHandler) ListOrganizationsAdmin(ctx context.Context, req *mgmtPB
201114

202115
pbOrganizations, totalSize, nextPageToken, err := h.Service.ListOrganizationsAdmin(ctx, int(pageSize), req.GetPageToken(), filtering.Filter{})
203116
if err != nil {
204-
sta := status.Convert(err)
205-
switch sta.Code() {
206-
case codes.InvalidArgument:
207-
st, e := sterr.CreateErrorBadRequest(
208-
"list organization error", []*errdetails.BadRequest_FieldViolation{
209-
{
210-
Field: "ListOrganizationsAdminRequest.page_token",
211-
Description: sta.Message(),
212-
},
213-
})
214-
if e != nil {
215-
logger.Error(e.Error())
216-
}
217-
return &mgmtPB.ListOrganizationsAdminResponse{}, st.Err()
218-
default:
219-
st, e := sterr.CreateErrorResourceInfo(
220-
sta.Code(),
221-
"list organization error",
222-
"organization",
223-
"",
224-
"",
225-
sta.Message(),
226-
)
227-
if e != nil {
228-
logger.Error(e.Error())
229-
}
230-
return &mgmtPB.ListOrganizationsAdminResponse{}, st.Err()
231-
}
117+
return nil, err
232118
}
233119

234120
resp := mgmtPB.ListOrganizationsAdminResponse{
@@ -241,40 +127,12 @@ func (h *PrivateHandler) ListOrganizationsAdmin(ctx context.Context, req *mgmtPB
241127

242128
// GetOrganizationAdmin gets a organization
243129
func (h *PrivateHandler) GetOrganizationAdmin(ctx context.Context, req *mgmtPB.GetOrganizationAdminRequest) (*mgmtPB.GetOrganizationAdminResponse, error) {
244-
logger, _ := logger.GetZapLogger(ctx)
245130

246131
id := strings.TrimPrefix(req.GetName(), "organizations/")
247132

248133
pbOrganization, err := h.Service.GetOrganizationAdmin(ctx, id)
249134
if err != nil {
250-
sta := status.Convert(err)
251-
switch sta.Code() {
252-
case codes.InvalidArgument:
253-
st, e := sterr.CreateErrorBadRequest(
254-
"get organization error", []*errdetails.BadRequest_FieldViolation{
255-
{
256-
Field: "GetOrganizationAdminRequest.name",
257-
Description: sta.Message(),
258-
},
259-
})
260-
if e != nil {
261-
logger.Error(e.Error())
262-
}
263-
return &mgmtPB.GetOrganizationAdminResponse{}, st.Err()
264-
default:
265-
st, e := sterr.CreateErrorResourceInfo(
266-
sta.Code(),
267-
"get organization error",
268-
"organization",
269-
fmt.Sprintf("id %s", id),
270-
"",
271-
sta.Message(),
272-
)
273-
if e != nil {
274-
logger.Error(e.Error())
275-
}
276-
return &mgmtPB.GetOrganizationAdminResponse{}, st.Err()
277-
}
135+
return nil, err
278136
}
279137

280138
resp := mgmtPB.GetOrganizationAdminResponse{
@@ -285,56 +143,17 @@ func (h *PrivateHandler) GetOrganizationAdmin(ctx context.Context, req *mgmtPB.G
285143

286144
// LookUpOrganizationAdmin gets a organization by permalink
287145
func (h *PrivateHandler) LookUpOrganizationAdmin(ctx context.Context, req *mgmtPB.LookUpOrganizationAdminRequest) (*mgmtPB.LookUpOrganizationAdminResponse, error) {
288-
logger, _ := logger.GetZapLogger(ctx)
289146

290147
uidStr := strings.TrimPrefix(req.GetPermalink(), "organizations/")
291148
// Validation: `uid` in request is valid
292149
uid, err := uuid.FromString(uidStr)
293150
if err != nil {
294-
st, e := sterr.CreateErrorBadRequest(
295-
"look up organization invalid uuid error", []*errdetails.BadRequest_FieldViolation{
296-
{
297-
Field: "LookUpOrganizationAdminRequest.permalink",
298-
Description: err.Error(),
299-
},
300-
},
301-
)
302-
if e != nil {
303-
logger.Error(e.Error())
304-
}
305-
return &mgmtPB.LookUpOrganizationAdminResponse{}, st.Err()
151+
return nil, err
306152
}
307153

308154
pbOrganization, err := h.Service.GetOrganizationByUIDAdmin(ctx, uid)
309155
if err != nil {
310-
sta := status.Convert(err)
311-
switch sta.Code() {
312-
case codes.InvalidArgument:
313-
st, e := sterr.CreateErrorBadRequest(
314-
"look up organization error", []*errdetails.BadRequest_FieldViolation{
315-
{
316-
Field: "LookUpOrganizationAdminRequest.permalink",
317-
Description: sta.Message(),
318-
},
319-
})
320-
if e != nil {
321-
logger.Error(e.Error())
322-
}
323-
return &mgmtPB.LookUpOrganizationAdminResponse{}, st.Err()
324-
default:
325-
st, e := sterr.CreateErrorResourceInfo(
326-
sta.Code(),
327-
"look up organization error",
328-
"organization",
329-
fmt.Sprintf("uid %s", uid),
330-
"",
331-
sta.Message(),
332-
)
333-
if e != nil {
334-
logger.Error(e.Error())
335-
}
336-
return &mgmtPB.LookUpOrganizationAdminResponse{}, st.Err()
337-
}
156+
return nil, err
338157
}
339158

340159
resp := mgmtPB.LookUpOrganizationAdminResponse{

0 commit comments

Comments
 (0)