@Summary Paginated organization members @ID paginated-organization-members @Security CoderSessionToken @Produce json @Tags Members @Param organization path string true "Organization ID" @Param q query string false "Member search query" @Param after_id query string false "After ID" format(uuid) @Para
(rw http.ResponseWriter, r *http.Request)
| 274 | // @Success 200 {object} []codersdk.PaginatedMembersResponse |
| 275 | // @Router /api/v2/organizations/{organization}/paginated-members [get] |
| 276 | func (api *API) paginatedMembers(rw http.ResponseWriter, r *http.Request) { |
| 277 | var ( |
| 278 | ctx = r.Context() |
| 279 | organization = httpmw.OrganizationParam(r) |
| 280 | ) |
| 281 | |
| 282 | filterQuery := r.URL.Query().Get("q") |
| 283 | userFilterParams, filterErrs := searchquery.Users(filterQuery) |
| 284 | if len(filterErrs) > 0 { |
| 285 | httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ |
| 286 | Message: "Invalid member search query.", |
| 287 | Validations: filterErrs, |
| 288 | }) |
| 289 | return |
| 290 | } |
| 291 | |
| 292 | paginationParams, ok := ParsePagination(rw, r) |
| 293 | if !ok { |
| 294 | return |
| 295 | } |
| 296 | |
| 297 | paginatedMemberRows, err := api.Database.PaginatedOrganizationMembers(ctx, database.PaginatedOrganizationMembersParams{ |
| 298 | AfterID: paginationParams.AfterID, |
| 299 | OrganizationID: organization.ID, |
| 300 | IncludeSystem: false, |
| 301 | Search: userFilterParams.Search, |
| 302 | Name: userFilterParams.Name, |
| 303 | Status: userFilterParams.Status, |
| 304 | IsServiceAccount: userFilterParams.IsServiceAccount, |
| 305 | RbacRole: userFilterParams.RbacRole, |
| 306 | LastSeenBefore: userFilterParams.LastSeenBefore, |
| 307 | LastSeenAfter: userFilterParams.LastSeenAfter, |
| 308 | CreatedAfter: userFilterParams.CreatedAfter, |
| 309 | CreatedBefore: userFilterParams.CreatedBefore, |
| 310 | GithubComUserID: userFilterParams.GithubComUserID, |
| 311 | LoginType: userFilterParams.LoginType, |
| 312 | // #nosec G115 - Pagination offsets are small and fit in int32 |
| 313 | OffsetOpt: int32(paginationParams.Offset), |
| 314 | // #nosec G115 - Pagination limits are small and fit in int32 |
| 315 | LimitOpt: int32(paginationParams.Limit), |
| 316 | }) |
| 317 | if httpapi.Is404Error(err) { |
| 318 | httpapi.ResourceNotFound(rw) |
| 319 | return |
| 320 | } |
| 321 | if err != nil { |
| 322 | httpapi.InternalServerError(rw, err) |
| 323 | return |
| 324 | } |
| 325 | |
| 326 | memberRows := make([]database.OrganizationMembersRow, len(paginatedMemberRows)) |
| 327 | for i, pRow := range paginatedMemberRows { |
| 328 | memberRows[i] = database.OrganizationMembersRow{ |
| 329 | OrganizationMember: pRow.OrganizationMember, |
| 330 | Username: pRow.Username, |
| 331 | AvatarURL: pRow.AvatarURL, |
| 332 | Name: pRow.Name, |
| 333 | Email: pRow.Email, |
nothing calls this directly
no test coverage detected