feat: add new group members endpoint with filtering and pagination (#23067)

Partially addresses #21813 (still need to make changes to the "add user"
button to be complete)

Since there are a lot of user tests already, I moved them into
`coderdtest` to be shared.
This commit is contained in:
Asher
2026-03-20 12:43:03 -08:00
committed by GitHub
parent f135ffdb3a
commit 24ab216dd1
22 changed files with 1742 additions and 724 deletions
+146
View File
@@ -1520,6 +1520,12 @@ const docTemplate = `{
"name": "group",
"in": "path",
"required": true
},
{
"type": "boolean",
"description": "Exclude members from the response",
"name": "exclude_members",
"in": "query"
}
],
"responses": {
@@ -1613,6 +1619,65 @@ const docTemplate = `{
]
}
},
"/groups/{group}/members": {
"get": {
"produces": [
"application/json"
],
"tags": [
"Enterprise"
],
"summary": "Get group members by group ID",
"operationId": "get-group-members-by-group-id",
"parameters": [
{
"type": "string",
"description": "Group id",
"name": "group",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Member search query",
"name": "q",
"in": "query"
},
{
"type": "string",
"format": "uuid",
"description": "After ID",
"name": "after_id",
"in": "query"
},
{
"type": "integer",
"description": "Page limit",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Page offset",
"name": "offset",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/codersdk.GroupMembersResponse"
}
}
},
"security": [
{
"CoderSessionToken": []
}
]
}
},
"/init-script/{os}/{arch}": {
"get": {
"produces": [
@@ -3388,6 +3453,73 @@ const docTemplate = `{
]
}
},
"/organizations/{organization}/groups/{groupName}/members": {
"get": {
"produces": [
"application/json"
],
"tags": [
"Enterprise"
],
"summary": "Get group members by organization and group name",
"operationId": "get-group-members-by-organization-and-group-name",
"parameters": [
{
"type": "string",
"format": "uuid",
"description": "Organization ID",
"name": "organization",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Group name",
"name": "groupName",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Member search query",
"name": "q",
"in": "query"
},
{
"type": "string",
"format": "uuid",
"description": "After ID",
"name": "after_id",
"in": "query"
},
{
"type": "integer",
"description": "Page limit",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Page offset",
"name": "offset",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/codersdk.GroupMembersResponse"
}
}
},
"security": [
{
"CoderSessionToken": []
}
]
}
},
"/organizations/{organization}/members": {
"get": {
"produces": [
@@ -15749,6 +15881,20 @@ const docTemplate = `{
}
}
},
"codersdk.GroupMembersResponse": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"users": {
"type": "array",
"items": {
"$ref": "#/definitions/codersdk.ReducedUser"
}
}
}
},
"codersdk.GroupSource": {
"type": "string",
"enum": [
+138
View File
@@ -1323,6 +1323,12 @@
"name": "group",
"in": "path",
"required": true
},
{
"type": "boolean",
"description": "Exclude members from the response",
"name": "exclude_members",
"in": "query"
}
],
"responses": {
@@ -1406,6 +1412,61 @@
]
}
},
"/groups/{group}/members": {
"get": {
"produces": ["application/json"],
"tags": ["Enterprise"],
"summary": "Get group members by group ID",
"operationId": "get-group-members-by-group-id",
"parameters": [
{
"type": "string",
"description": "Group id",
"name": "group",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Member search query",
"name": "q",
"in": "query"
},
{
"type": "string",
"format": "uuid",
"description": "After ID",
"name": "after_id",
"in": "query"
},
{
"type": "integer",
"description": "Page limit",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Page offset",
"name": "offset",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/codersdk.GroupMembersResponse"
}
}
},
"security": [
{
"CoderSessionToken": []
}
]
}
},
"/init-script/{os}/{arch}": {
"get": {
"produces": ["text/plain"],
@@ -2975,6 +3036,69 @@
]
}
},
"/organizations/{organization}/groups/{groupName}/members": {
"get": {
"produces": ["application/json"],
"tags": ["Enterprise"],
"summary": "Get group members by organization and group name",
"operationId": "get-group-members-by-organization-and-group-name",
"parameters": [
{
"type": "string",
"format": "uuid",
"description": "Organization ID",
"name": "organization",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Group name",
"name": "groupName",
"in": "path",
"required": true
},
{
"type": "string",
"description": "Member search query",
"name": "q",
"in": "query"
},
{
"type": "string",
"format": "uuid",
"description": "After ID",
"name": "after_id",
"in": "query"
},
{
"type": "integer",
"description": "Page limit",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Page offset",
"name": "offset",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/codersdk.GroupMembersResponse"
}
}
},
"security": [
{
"CoderSessionToken": []
}
]
}
},
"/organizations/{organization}/members": {
"get": {
"produces": ["application/json"],
@@ -14257,6 +14381,20 @@
}
}
},
"codersdk.GroupMembersResponse": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"users": {
"type": "array",
"items": {
"$ref": "#/definitions/codersdk.ReducedUser"
}
}
}
},
"codersdk.GroupSource": {
"type": "string",
"enum": ["user", "oidc"],