Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -2404,7 +2404,7 @@
"Organizations"
],
"summary": "List organizations",
"description": "Lists every organization the authenticated user can access, both the ones they own and the ones they are a member of, newest first. Results are paginated: `page` defaults to 1 and `limit` defaults to 10, with a hard maximum of 100. Out-of-range values are clamped silently rather than rejected.",
"description": "Lists every organization the authenticated user can access, both the ones they own and the ones they are a member of, newest first. Results are paginated: `page` defaults to 1 and `limit` defaults to 10. There is no upper bound on `limit`, so a sufficiently large value returns the whole collection in a single request. Values below the minimum fall back to the defaults rather than being rejected.",
"operationId": "listOrganizations",
"parameters": [
{
Expand Down Expand Up @@ -2572,7 +2572,7 @@
"Organization Invitations"
],
"summary": "List invitations",
"description": "Lists the invitations for an organization, newest first. Results are paginated: `page` defaults to 1 and `limit` defaults to 10, with a hard maximum of 100. Out-of-range values are clamped silently rather than rejected.",
"description": "Lists the invitations for an organization, newest first. Results are paginated: `page` defaults to 1 and `limit` defaults to 10. There is no upper bound on `limit`, so a sufficiently large value returns the whole collection in a single request. Values below the minimum fall back to the defaults rather than being rejected.",
"operationId": "listOrganizationInvitations",
"parameters": [
{
Expand Down Expand Up @@ -2840,7 +2840,7 @@
"Organization Members"
],
"summary": "List members",
"description": "Lists the members of an organization, newest first. Results are paginated: `page` defaults to 1 and `limit` defaults to 10, with a hard maximum of 100. Out-of-range values are clamped silently rather than rejected.",
"description": "Lists the members of an organization, newest first. Results are paginated: `page` defaults to 1 and `limit` defaults to 10. There is no upper bound on `limit`, so a sufficiently large value returns the whole collection in a single request. Values below the minimum fall back to the defaults rather than being rejected.",
"operationId": "listOrganizationMembers",
"parameters": [
{
Expand Down Expand Up @@ -3090,7 +3090,7 @@
"Organization Teams"
],
"summary": "List teams",
"description": "Lists the teams within an organization, newest first. Results are paginated: `page` defaults to 1 and `limit` defaults to 10, with a hard maximum of 100. Out-of-range values are clamped silently rather than rejected.",
"description": "Lists the teams within an organization, newest first. Results are paginated: `page` defaults to 1 and `limit` defaults to 10. There is no upper bound on `limit`, so a sufficiently large value returns the whole collection in a single request. Values below the minimum fall back to the defaults rather than being rejected.",
"operationId": "listOrganizationTeams",
"parameters": [
{
Expand Down Expand Up @@ -3300,7 +3300,7 @@
"Organization Team Members"
],
"summary": "List team members",
"description": "Lists the members of a team, newest first. Results are paginated: `page` defaults to 1 and `limit` defaults to 10, with a hard maximum of 100. Out-of-range values are clamped silently rather than rejected.",
"description": "Lists the members of a team, newest first. Results are paginated: `page` defaults to 1 and `limit` defaults to 10. There is no upper bound on `limit`, so a sufficiently large value returns the whole collection in a single request. Values below the minimum fall back to the defaults rather than being rejected.",
"operationId": "listOrganizationTeamMembers",
"parameters": [
{
Expand Down
46 changes: 36 additions & 10 deletions plugins/organizations/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,18 @@ func (a *API) CreateOrganization(ctx context.Context, actor *models.Actor, reque
return a.organizationService.CreateOrganization(ctx, actor, request)
}

func (a *API) GetAllOrganizations(ctx context.Context, actor *models.Actor, params pagination.Params) (*types.ListOrganizationsResponse, error) {
return a.organizationService.GetAllOrganizations(ctx, actor, params)
func (a *API) ListAllOrganizations(ctx context.Context, actor *models.Actor, params pagination.Params) (*types.ListOrganizationsResponse, error) {
return a.organizationService.ListAllOrganizations(ctx, actor, params)
}

func (a *API) GetAllOrganizations(ctx context.Context, actor *models.Actor) ([]types.Organization, error) {
return a.organizationService.GetAllOrganizations(ctx, actor)
}

// GetAllOrganizationsUnscoped returns every organization in the system with no
// access filtering. Authorize the caller before using it.
func (a *API) GetAllOrganizationsUnscoped(ctx context.Context) ([]types.Organization, error) {
return a.organizationService.GetAllOrganizationsUnscoped(ctx)
}

func (a *API) GetOrganizationByID(ctx context.Context, actor *models.Actor, organizationID string) (*types.Organization, error) {
Expand All @@ -82,8 +92,12 @@ func (a *API) CreateInvitation(ctx context.Context, actor *models.Actor, organiz
return a.invitationService.CreateOrganizationInvitation(ctx, actor, organizationID, request, redirectURL)
}

func (a *API) GetAllInvitations(ctx context.Context, actor *models.Actor, organizationID string, params pagination.Params) (*types.ListOrganizationInvitationsResponse, error) {
return a.invitationService.GetAllOrganizationInvitationsByOrgIDWithOrg(ctx, organizationID, params)
func (a *API) ListAllInvitations(ctx context.Context, actor *models.Actor, organizationID string, params pagination.Params) (*types.ListOrganizationInvitationsResponse, error) {
return a.invitationService.ListAllOrganizationInvitationsByOrgIDWithOrg(ctx, organizationID, params)
}

func (a *API) GetAllInvitations(ctx context.Context, actor *models.Actor, organizationID string) ([]types.GetOrganizationInvitationResponse, error) {
return a.invitationService.GetAllOrganizationInvitationsByOrgIDWithOrg(ctx, organizationID)
}

func (a *API) GetInvitation(ctx context.Context, actor *models.Actor, organizationID string, invitationID string) (*types.GetOrganizationInvitationResponse, error) {
Expand Down Expand Up @@ -116,8 +130,12 @@ func (a *API) AddMember(ctx context.Context, actor *models.Actor, organizationID
return a.memberService.AddMember(ctx, actor, organizationID, request)
}

func (a *API) GetAllMembers(ctx context.Context, actor *models.Actor, organizationID string, params pagination.Params) (*types.ListOrganizationMembersResponse, error) {
return a.memberService.GetAllMembers(ctx, actor, organizationID, params)
func (a *API) ListAllMembers(ctx context.Context, actor *models.Actor, organizationID string, params pagination.Params) (*types.ListOrganizationMembersResponse, error) {
return a.memberService.ListAllMembers(ctx, actor, organizationID, params)
}

func (a *API) GetAllMembers(ctx context.Context, actor *models.Actor, organizationID string) ([]types.OrganizationMemberResponse, error) {
return a.memberService.GetAllMembers(ctx, actor, organizationID)
}

func (a *API) GetMember(ctx context.Context, actor *models.Actor, organizationID string, memberID string) (*types.OrganizationMemberResponse, error) {
Expand All @@ -142,8 +160,12 @@ func (a *API) CreateTeam(ctx context.Context, actor *models.Actor, organizationI
return a.teamService.CreateTeam(ctx, actor, organizationID, request)
}

func (a *API) GetAllTeams(ctx context.Context, actor *models.Actor, organizationID string, params pagination.Params) (*types.ListOrganizationTeamsResponse, error) {
return a.teamService.GetAllTeams(ctx, actor, organizationID, params)
func (a *API) ListAllTeams(ctx context.Context, actor *models.Actor, organizationID string, params pagination.Params) (*types.ListOrganizationTeamsResponse, error) {
return a.teamService.ListAllTeams(ctx, actor, organizationID, params)
}

func (a *API) GetAllTeams(ctx context.Context, actor *models.Actor, organizationID string) ([]types.OrganizationTeam, error) {
return a.teamService.GetAllTeams(ctx, actor, organizationID)
}

func (a *API) GetTeam(ctx context.Context, actor *models.Actor, organizationID string, teamID string) (*types.OrganizationTeam, error) {
Expand All @@ -164,8 +186,12 @@ func (a *API) AddTeamMember(ctx context.Context, actor *models.Actor, organizati
return a.teamMemberService.AddTeamMember(ctx, actor, organizationID, teamID, request)
}

func (a *API) GetAllTeamMembers(ctx context.Context, actor *models.Actor, organizationID string, teamID string, params pagination.Params) (*types.ListOrganizationTeamMembersResponse, error) {
return a.teamMemberService.GetAllTeamMembers(ctx, actor, organizationID, teamID, params)
func (a *API) ListAllTeamMembers(ctx context.Context, actor *models.Actor, organizationID string, teamID string, params pagination.Params) (*types.ListOrganizationTeamMembersResponse, error) {
return a.teamMemberService.ListAllTeamMembers(ctx, actor, organizationID, teamID, params)
}

func (a *API) GetAllTeamMembers(ctx context.Context, actor *models.Actor, organizationID string, teamID string) ([]types.OrganizationTeamMemberResponse, error) {
return a.teamMemberService.GetAllTeamMembers(ctx, actor, organizationID, teamID)
}

func (a *API) GetTeamMember(ctx context.Context, actor *models.Actor, organizationID string, teamID string, memberID string) (*types.OrganizationTeamMemberResponse, error) {
Expand Down
6 changes: 3 additions & 3 deletions plugins/organizations/handlers/organization_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,17 @@ func (h *CreateOrganizationHandler) Handle() http.HandlerFunc {
}
}

type GetAllOrganizationsHandler struct {
type ListAllOrganizationsHandler struct {
UseCases *orgusecases.UseCases
}

func (h *GetAllOrganizationsHandler) Handle() http.HandlerFunc {
func (h *ListAllOrganizationsHandler) Handle() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
reqCtx, _ := models.GetRequestContext(ctx)
actor := reqCtx.Actor
paginationParams := pagination.ParseFromRequest(r)
organizations, err := h.UseCases.GetAllOrganizations(ctx, actor, paginationParams)
organizations, err := h.UseCases.ListAllOrganizations(ctx, actor, paginationParams)
if err != nil {
orgconstants.HandleError(err, reqCtx)
return
Expand Down
8 changes: 4 additions & 4 deletions plugins/organizations/handlers/organization_handlers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ func TestCreateOrganizationHandler(t *testing.T) {
}
}

func TestGetAllOrganizationsHandler(t *testing.T) {
func TestListAllOrganizationsHandler(t *testing.T) {
t.Parallel()

tests := []organizationHandlerCase{
Expand All @@ -193,7 +193,7 @@ func TestGetAllOrganizationsHandler(t *testing.T) {
name: "service_error",
userID: new("user-1"),
prepare: func(f *organizationHandlerFixture) {
f.service.On("GetAllOrganizations", mock.Anything, "user-1", pagination.Params{Page: pagination.DefaultPage, Limit: pagination.DefaultLimit}).
f.service.On("ListAllOrganizations", mock.Anything, "user-1", pagination.Params{Page: pagination.DefaultPage, Limit: pagination.DefaultLimit}).
Return((*orgtypes.ListOrganizationsResponse)(nil), errors.New("some error")).Once()
},
expectedStatus: http.StatusBadRequest,
Expand All @@ -203,7 +203,7 @@ func TestGetAllOrganizationsHandler(t *testing.T) {
name: "success",
userID: new("user-1"),
prepare: func(f *organizationHandlerFixture) {
f.service.On("GetAllOrganizations", mock.Anything, "user-1", pagination.Params{Page: pagination.DefaultPage, Limit: pagination.DefaultLimit}).
f.service.On("ListAllOrganizations", mock.Anything, "user-1", pagination.Params{Page: pagination.DefaultPage, Limit: pagination.DefaultLimit}).
Return(&orgtypes.ListOrganizationsResponse{
Data: []orgtypes.Organization{{ID: "org-1", OwnerID: "user-1", Name: "Acme Inc", Slug: "acme-inc"}},
Pagination: pagination.New(1, 10, 1),
Expand All @@ -230,7 +230,7 @@ func TestGetAllOrganizationsHandler(t *testing.T) {
tt.prepare(fixture)
}

handler := &GetAllOrganizationsHandler{UseCases: newOrgUseCases(fixture.service)}
handler := &ListAllOrganizationsHandler{UseCases: newOrgUseCases(fixture.service)}
req, w, reqCtx := fixture.newRequest(t, http.MethodGet, "/organizations", nil, tt.userID, "")
if tt.name == "missing_user" {
reqCtx.SetJSONResponse(http.StatusUnauthorized, map[string]any{"message": "Unauthorized"})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,19 @@ func (h *CreateOrganizationInvitationHandler) Handle() http.HandlerFunc {
}
}

type GetAllOrganizationInvitationsHandler struct {
type ListAllOrganizationInvitationsHandler struct {
UseCases *orgusecases.UseCases
}

func (h *GetAllOrganizationInvitationsHandler) Handle() http.HandlerFunc {
func (h *ListAllOrganizationInvitationsHandler) Handle() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
reqCtx, _ := models.GetRequestContext(ctx)
actor := reqCtx.Actor

organizationID := r.PathValue("organization_id")
paginationParams := pagination.ParseFromRequest(r)
invitations, err := h.UseCases.GetAllOrganizationInvitations(ctx, actor, organizationID, paginationParams)
invitations, err := h.UseCases.ListAllOrganizationInvitations(ctx, actor, organizationID, paginationParams)
if err != nil {
orgconstants.HandleError(err, reqCtx)
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,11 +163,11 @@ func TestCreateOrganizationInvitationHandler(t *testing.T) {
})
}

func TestGetAllOrganizationInvitationsHandler(t *testing.T) {
func TestListAllOrganizationInvitationsHandler(t *testing.T) {
t.Parallel()

runOrganizationInvitationHandlerCases(t, http.MethodGet, "/organizations/org-1/invitations", func(fixture *organizationInvitationHandlerFixture) http.HandlerFunc {
return (&GetAllOrganizationInvitationsHandler{UseCases: newInvitationUseCases(fixture.orgSvc, fixture.service)}).Handle()
return (&ListAllOrganizationInvitationsHandler{UseCases: newInvitationUseCases(fixture.orgSvc, fixture.service)}).Handle()
}, []organizationInvitationHandlerCase{
{
name: "missing_user",
Expand All @@ -180,7 +180,7 @@ func TestGetAllOrganizationInvitationsHandler(t *testing.T) {
userID: new("user-1"),
organizationID: "org-1",
prepare: func(fixture *organizationInvitationHandlerFixture) {
fixture.service.On("GetAllOrganizationInvitationsByOrgIDWithOrg", mock.Anything, "org-1", pagination.Params{Page: pagination.DefaultPage, Limit: pagination.DefaultLimit}).
fixture.service.On("ListAllOrganizationInvitationsByOrgIDWithOrg", mock.Anything, "org-1", pagination.Params{Page: pagination.DefaultPage, Limit: pagination.DefaultLimit}).
Return((*orgtypes.ListOrganizationInvitationsResponse)(nil), errors.New("some error")).Once()
},
expectedStatus: http.StatusBadRequest,
Expand All @@ -191,7 +191,7 @@ func TestGetAllOrganizationInvitationsHandler(t *testing.T) {
userID: new("user-1"),
organizationID: "org-1",
prepare: func(fixture *organizationInvitationHandlerFixture) {
fixture.service.On("GetAllOrganizationInvitationsByOrgIDWithOrg", mock.Anything, "org-1", pagination.Params{Page: pagination.DefaultPage, Limit: pagination.DefaultLimit}).
fixture.service.On("ListAllOrganizationInvitationsByOrgIDWithOrg", mock.Anything, "org-1", pagination.Params{Page: pagination.DefaultPage, Limit: pagination.DefaultLimit}).
Return(&orgtypes.ListOrganizationInvitationsResponse{
Data: []orgtypes.GetOrganizationInvitationResponse{
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,19 @@ func (h *AddOrganizationMemberHandler) Handle() http.HandlerFunc {
}
}

type GetAllOrganizationMembersHandler struct {
type ListAllOrganizationMembersHandler struct {
UseCases *orgusecases.UseCases
}

func (h *GetAllOrganizationMembersHandler) Handle() http.HandlerFunc {
func (h *ListAllOrganizationMembersHandler) Handle() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
reqCtx, _ := models.GetRequestContext(ctx)
actor := reqCtx.Actor

organizationID := r.PathValue("organization_id")
paginationParams := pagination.ParseFromRequest(r)
members, err := h.UseCases.GetAllMembers(ctx, actor, organizationID, paginationParams)
members, err := h.UseCases.ListAllMembers(ctx, actor, organizationID, paginationParams)
if err != nil {
orgconstants.HandleError(err, reqCtx)
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,13 +160,13 @@ func TestAddOrganizationMemberHandler(t *testing.T) {
})
}

func TestGetAllOrganizationMembersHandler(t *testing.T) {
func TestListAllOrganizationMembersHandler(t *testing.T) {
t.Parallel()

defaultParams := pagination.Params{Page: pagination.DefaultPage, Limit: pagination.DefaultLimit}

runOrganizationMemberHandlerCases(t, http.MethodGet, "/organizations/org-1/members", func(fixture *organizationMemberHandlerFixture) http.HandlerFunc {
return (&GetAllOrganizationMembersHandler{UseCases: newMemberUseCases(fixture.service)}).Handle()
return (&ListAllOrganizationMembersHandler{UseCases: newMemberUseCases(fixture.service)}).Handle()
}, []organizationMemberHandlerCase{
{
name: "missing_user",
Expand All @@ -179,7 +179,7 @@ func TestGetAllOrganizationMembersHandler(t *testing.T) {
userID: new("user-1"),
organizationID: "org-1",
prepare: func(fixture *organizationMemberHandlerFixture) {
fixture.service.On("GetAllMembers", mock.Anything, "user-1", "org-1", defaultParams).
fixture.service.On("ListAllMembers", mock.Anything, "user-1", "org-1", defaultParams).
Return((*orgtypes.ListOrganizationMembersResponse)(nil), errors.New("some error")).Once()
},
expectedStatus: http.StatusBadRequest,
Expand All @@ -190,7 +190,7 @@ func TestGetAllOrganizationMembersHandler(t *testing.T) {
userID: new("user-1"),
organizationID: "org-1",
prepare: func(fixture *organizationMemberHandlerFixture) {
fixture.service.On("GetAllMembers", mock.Anything, "user-1", "org-1", defaultParams).
fixture.service.On("ListAllMembers", mock.Anything, "user-1", "org-1", defaultParams).
Return(&orgtypes.ListOrganizationMembersResponse{
Data: []orgtypes.OrganizationMemberResponse{{ID: "mem-1", OrganizationID: "org-1", Role: "member"}},
Pagination: pagination.New(1, 10, 25),
Expand All @@ -207,7 +207,7 @@ func TestGetAllOrganizationMembersHandler(t *testing.T) {
})
}

func TestGetAllOrganizationMembersHandlerParsesPagination(t *testing.T) {
func TestListAllOrganizationMembersHandlerParsesPagination(t *testing.T) {
t.Parallel()

tests := []struct {
Expand All @@ -227,14 +227,14 @@ func TestGetAllOrganizationMembersHandlerParsesPagination(t *testing.T) {
t.Parallel()

runOrganizationMemberHandlerCases(t, http.MethodGet, "/organizations/org-1/members"+tt.query, func(fixture *organizationMemberHandlerFixture) http.HandlerFunc {
return (&GetAllOrganizationMembersHandler{UseCases: newMemberUseCases(fixture.service)}).Handle()
return (&ListAllOrganizationMembersHandler{UseCases: newMemberUseCases(fixture.service)}).Handle()
}, []organizationMemberHandlerCase{
{
name: "forwards_parsed_params",
userID: new("user-1"),
organizationID: "org-1",
prepare: func(fixture *organizationMemberHandlerFixture) {
fixture.service.On("GetAllMembers", mock.Anything, "user-1", "org-1", tt.expectedParams).
fixture.service.On("ListAllMembers", mock.Anything, "user-1", "org-1", tt.expectedParams).
Return(&orgtypes.ListOrganizationMembersResponse{
Data: []orgtypes.OrganizationMemberResponse{},
Pagination: pagination.New(1, 10, 0),
Expand Down
Loading