Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

B 22561 add col filtering office users main #14970

Draft
wants to merge 9 commits into
base: main
Choose a base branch
from
2 changes: 1 addition & 1 deletion pkg/handlers/adminapi/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func NewAdminAPI(handlerConfig handlers.HandlerConfig) *adminops.MymoveAPI {

adminAPI.OfficeUsersIndexOfficeUsersHandler = IndexOfficeUsersHandler{
handlerConfig,
fetch.NewListFetcher(queryBuilder),
officeuser.NewOfficeUsersListFetcher(queryBuilder),
query.NewQueryFilter,
pagination.NewPagination,
}
Expand Down
84 changes: 59 additions & 25 deletions pkg/handlers/adminapi/office_users.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package adminapi

import (
"encoding/json"
"errors"
"fmt"

"github.com/go-openapi/runtime/middleware"
"github.com/gobuffalo/pop/v6"
"github.com/gofrs/uuid"
"go.uber.org/zap"

Expand Down Expand Up @@ -108,18 +111,51 @@ func payloadForOfficeUserModel(o models.OfficeUser) *adminmessages.OfficeUser {
// IndexOfficeUsersHandler returns a list of office users via GET /office_users
type IndexOfficeUsersHandler struct {
handlers.HandlerConfig
services.ListFetcher
services.OfficeUserListFetcher
services.NewQueryFilter
services.NewPagination
}

var officeUserFilterConverters = map[string]func(string) []services.QueryFilter{
"search": func(content string) []services.QueryFilter {
nameSearch := fmt.Sprintf("%s%%", content)
return []services.QueryFilter{
query.NewQueryFilter("email", "ILIKE", fmt.Sprintf("%%%s%%", content)),
query.NewQueryFilter("first_name", "ILIKE", nameSearch),
query.NewQueryFilter("last_name", "ILIKE", nameSearch),
var officeUserFilterConverters = map[string]func(string) func(*pop.Query){
"search": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
firstSearch, lastSearch, emailSearch := fmt.Sprintf("%%%s%%", content), fmt.Sprintf("%%%s%%", content), fmt.Sprintf("%%%s%%", content)
query.Where("(office_users.first_name ILIKE ? OR office_users.last_name ILIKE ? OR office_users.email ILIKE ?) AND office_users.status = 'APPROVED'", firstSearch, lastSearch, emailSearch)
}
},
"email": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
emailSearch := fmt.Sprintf("%%%s%%", content)
query.Where("office_users.email ILIKE ? AND office_users.status = 'APPROVED'", emailSearch)
}
},
"phone": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
phoneSearch := fmt.Sprintf("%%%s%%", content)
query.Where("office_users.telephone ILIKE ? AND office_users.status = 'APPROVED'", phoneSearch)
}
},
"firstName": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
firstNameSearch := fmt.Sprintf("%%%s%%", content)
query.Where("office_users.first_name ILIKE ? AND office_users.status = 'APPROVED'", firstNameSearch)
}
},
"lastName": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
lastNameSearch := fmt.Sprintf("%%%s%%", content)
query.Where("office_users.last_name ILIKE ? AND office_users.status = 'APPROVED'", lastNameSearch)
}
},
"office": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
officeSearch := fmt.Sprintf("%%%s%%", content)
query.Where("transportation_offices.name ILIKE ? AND office_users.status = 'APPROVED'", officeSearch)
}
},
"active": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
query.Where("office_users.active = ? AND office_users.status = 'APPROVED'", content)
}
},
}
Expand All @@ -128,27 +164,25 @@ var officeUserFilterConverters = map[string]func(string) []services.QueryFilter{
func (h IndexOfficeUsersHandler) Handle(params officeuserop.IndexOfficeUsersParams) middleware.Responder {
return h.AuditableAppContextFromRequestWithErrors(params.HTTPRequest,
func(appCtx appcontext.AppContext) (middleware.Responder, error) {
// Here is where NewQueryFilter will be used to create Filters from the 'filter' query param
queryFilters := generateQueryFilters(appCtx.Logger(), params.Filter, officeUserFilterConverters)
var filtersMap map[string]string
if params.Filter != nil && *params.Filter != "" {
err := json.Unmarshal([]byte(*params.Filter), &filtersMap)
if err != nil {
return handlers.ResponseForError(appCtx.Logger(), errors.New("invalid filter format")), err
}
}

// Add a filter for approved status
queryFilters = append(queryFilters, query.NewQueryFilter("status", "=", "APPROVED"))
var filterFuncs []func(*pop.Query)
for key, filterFunc := range officeUserFilterConverters {
if filterValue, exists := filtersMap[key]; exists {
filterFuncs = append(filterFuncs, filterFunc(filterValue))
}
}

pagination := h.NewPagination(params.Page, params.PerPage)
ordering := query.NewQueryOrder(params.Sort, params.Order)

queryAssociations := query.NewQueryAssociationsPreload([]services.QueryAssociation{
query.NewQueryAssociation("User.Roles"),
query.NewQueryAssociation("User.Privileges"),
})

var officeUsers models.OfficeUsers
err := h.ListFetcher.FetchRecordList(appCtx, &officeUsers, queryFilters, queryAssociations, pagination, ordering)
if err != nil {
return handlers.ResponseForError(appCtx.Logger(), err), err
}

totalOfficeUsersCount, err := h.ListFetcher.FetchRecordCount(appCtx, &officeUsers, queryFilters)
officeUsers, count, err := h.OfficeUserListFetcher.FetchOfficeUsersList(appCtx, filterFuncs, pagination, ordering)
if err != nil {
return handlers.ResponseForError(appCtx.Logger(), err), err
}
Expand All @@ -161,7 +195,7 @@ func (h IndexOfficeUsersHandler) Handle(params officeuserop.IndexOfficeUsersPara
payload[i] = payloadForOfficeUserModel(s)
}

return officeuserop.NewIndexOfficeUsersOK().WithContentRange(fmt.Sprintf("office users %d-%d/%d", pagination.Offset(), pagination.Offset()+queriedOfficeUsersCount, totalOfficeUsersCount)).WithPayload(payload), nil
return officeuserop.NewIndexOfficeUsersOK().WithContentRange(fmt.Sprintf("office users %d-%d/%d", pagination.Offset(), pagination.Offset()+queriedOfficeUsersCount, count)).WithPayload(payload), nil
})
}

Expand Down
Loading
Loading