From a6a2021aa48b96b6bc35bcd8427ee7a1d9df3ce9 Mon Sep 17 00:00:00 2001 From: Otieno Calvine Date: Tue, 12 Oct 2021 17:14:58 +0300 Subject: [PATCH] chore: add fetch all facilities api Signed-off-by: Otieno Calvine --- pkg/onboarding/application/dto/input.go | 54 +++++++++ pkg/onboarding/application/dto/output.go | 17 +++ .../database/postgres/gorm/mock/gorm_mock.go | 23 ++++ .../database/postgres/gorm/query.go | 17 ++- .../database/postgres/mock/pg_mock.go | 18 +++ .../database/postgres/pg_query.go | 35 ++++++ .../database/postgres/pg_query_test.go | 98 +++++++++++++++++ .../infrastructure/infrastructure.go | 4 + pkg/onboarding/infrastructure/repository.go | 26 ++++- .../presentation/graph/facility.graphql | 4 + .../presentation/graph/facility.resolvers.go | 8 ++ .../presentation/graph/generated/generated.go | 103 ++++++++++++++++++ .../presentation/graph/profile.resolvers.go | 7 -- pkg/onboarding/usecases/facility/facility.go | 54 ++++----- 14 files changed, 434 insertions(+), 34 deletions(-) create mode 100644 pkg/onboarding/infrastructure/database/postgres/pg_query.go create mode 100644 pkg/onboarding/infrastructure/database/postgres/pg_query_test.go diff --git a/pkg/onboarding/application/dto/input.go b/pkg/onboarding/application/dto/input.go index a3367582..ff95b3a3 100644 --- a/pkg/onboarding/application/dto/input.go +++ b/pkg/onboarding/application/dto/input.go @@ -1,5 +1,11 @@ package dto +import ( + "net/url" + + "github.com/savannahghi/enumutils" +) + // FacilityInput describes the facility input type FacilityInput struct { Name string `json:"name"` @@ -8,3 +14,51 @@ type FacilityInput struct { County string `json:"county"` Description string `json:"description"` } + +// FacilityFilterInput is used to supply filter parameters for healthcare facility filter inputs +type FacilityFilterInput struct { + Search *string `json:"search"` + Name *string `json:"name"` + MFLCode *string `json:"code"` +} + +// ToURLValues transforms the filter input to `url.Values` +func (i *FacilityFilterInput) ToURLValues() (values url.Values) { + vals := url.Values{} + if i.Search != nil { + vals.Add("search", *i.Search) + } + if i.Name != nil { + vals.Add("name", *i.Name) + } + if i.MFLCode != nil { + vals.Add("code", *i.MFLCode) + } + return vals +} + +// FacilitySortInput is used to supply sort input for healthcare facility list queries +type FacilitySortInput struct { + Name *enumutils.SortOrder `json:"name"` + MFLCode *enumutils.SortOrder `json:"code"` +} + +// ToURLValues transforms the filter input to `url.Values` +func (i *FacilitySortInput) ToURLValues() (values url.Values) { + vals := url.Values{} + if i.Name != nil { + if *i.Name == enumutils.SortOrderAsc { + vals.Add("order_by", "name") + } else { + vals.Add("order_by", "-name") + } + } + if i.MFLCode != nil { + if *i.Name == enumutils.SortOrderAsc { + vals.Add("code", "number") + } else { + vals.Add("code", "-number") + } + } + return vals +} diff --git a/pkg/onboarding/application/dto/output.go b/pkg/onboarding/application/dto/output.go index 76d3a172..04e4468d 100644 --- a/pkg/onboarding/application/dto/output.go +++ b/pkg/onboarding/application/dto/output.go @@ -1 +1,18 @@ package dto + +import ( + "github.com/savannahghi/firebasetools" + "github.com/savannahghi/onboarding-service/pkg/onboarding/domain" +) + +// FacilityEdge is used to serialize GraphQL Relay edges for healthcare facilities +type FacilityEdge struct { + Cursor *string `json:"cursor"` + Node *domain.Facility `json:"node"` +} + +// FacilityConnection is used to serialize GraphQL Relay connections for healthcare facilities +type FacilityConnection struct { + Edges []*FacilityEdge `json:"edges"` + PageInfo *firebasetools.PageInfo `json:"pageInfo"` +} diff --git a/pkg/onboarding/infrastructure/database/postgres/gorm/mock/gorm_mock.go b/pkg/onboarding/infrastructure/database/postgres/gorm/mock/gorm_mock.go index 5aea5838..2e4edfa7 100644 --- a/pkg/onboarding/infrastructure/database/postgres/gorm/mock/gorm_mock.go +++ b/pkg/onboarding/infrastructure/database/postgres/gorm/mock/gorm_mock.go @@ -12,6 +12,7 @@ import ( type GormMock struct { CreateFacilityFn func(ctx context.Context, facility *gorm.Facility) (*gorm.Facility, error) RetrieveFn func(id *int64) (*gorm.Facility, error) + GetFacilitiesFn func(ctx context.Context) ([]gorm.Facility, error) } // NewGormMock initializes a new instance of `GormMock` then mocking the case of success. @@ -48,6 +49,23 @@ func NewGormMock() *GormMock { Description: description, }, nil }, + GetFacilitiesFn: func(ctx context.Context) ([]gorm.Facility, error) { + var facilities []gorm.Facility + facilityID := int64(1) + name := "Kanairo One" + code := "KN001" + county := "Kanairo" + description := "This is just for mocking" + facilities = append(facilities, gorm.Facility{ + FacilityID: &facilityID, + Name: name, + Code: code, + Active: true, + County: county, + Description: description, + }) + return facilities, nil + }, } } @@ -60,3 +78,8 @@ func (gm *GormMock) CreateFacility(ctx context.Context, facility *gorm.Facility) func (gm *GormMock) Retrieve(id *int64) (*gorm.Facility, error) { return gm.RetrieveFn(id) } + +// GetFacilities mocks the implementation of `gorm's` GetFacilities method. +func (gm *GormMock) GetFacilities(ctx context.Context) ([]gorm.Facility, error) { + return gm.GetFacilitiesFn(ctx) +} diff --git a/pkg/onboarding/infrastructure/database/postgres/gorm/query.go b/pkg/onboarding/infrastructure/database/postgres/gorm/query.go index dc7e77d6..0f736c7c 100644 --- a/pkg/onboarding/infrastructure/database/postgres/gorm/query.go +++ b/pkg/onboarding/infrastructure/database/postgres/gorm/query.go @@ -1,15 +1,18 @@ package gorm import ( + "context" "fmt" + "log" ) // Query contains all the db query methods type Query interface { Retrieve(id *int64) (*Facility, error) + GetFacilities(ctx context.Context) ([]Facility, error) } -// Retrieve ... +// Retrieve fetches a single facility func (db *PGInstance) Retrieve(id *int64) (*Facility, error) { var facility Facility if err := db.DB.Where(&Facility{FacilityID: id}).First(&facility).Error; err != nil { @@ -17,3 +20,15 @@ func (db *PGInstance) Retrieve(id *int64) (*Facility, error) { } return &facility, nil } + +// GetFacilities fetches all the healthcare facilities in the platform. +func (db *PGInstance) GetFacilities(ctx context.Context) ([]Facility, error) { + var facility []Facility + facilities := db.DB.Find(&facility).Error + log.Printf("these are the facilities %v", facilities) + // if err != nil { + // return nil, fmt.Errorf("failed to query all facilities %v", err) + // } + log.Printf("these are the facilities %v", facility) + return facility, nil +} diff --git a/pkg/onboarding/infrastructure/database/postgres/mock/pg_mock.go b/pkg/onboarding/infrastructure/database/postgres/mock/pg_mock.go index 9f9b752b..c7a086e7 100644 --- a/pkg/onboarding/infrastructure/database/postgres/mock/pg_mock.go +++ b/pkg/onboarding/infrastructure/database/postgres/mock/pg_mock.go @@ -10,6 +10,7 @@ import ( // PostgresMock struct implements mocks of `postgres's` internal methods. type PostgresMock struct { CreateFacilityFn func(ctx context.Context, facility *dto.FacilityInput) (*domain.Facility, error) + GetFacilitiesFn func(ctx context.Context) ([]*domain.Facility, error) } // NewPostgresMock initializes a new instance of `GormMock` then mocking the case of success. @@ -30,6 +31,23 @@ func NewPostgresMock() *PostgresMock { Description: description, }, nil }, + GetFacilitiesFn: func(ctx context.Context) ([]*domain.Facility, error) { + id := int64(1) + name := "Kanairo One" + code := "KN001" + county := "Kanairo" + description := "This is just for mocking" + return []*domain.Facility{ + { + ID: id, + Name: name, + Code: code, + Active: true, + County: county, + Description: description, + }, + }, nil + }, } } diff --git a/pkg/onboarding/infrastructure/database/postgres/pg_query.go b/pkg/onboarding/infrastructure/database/postgres/pg_query.go new file mode 100644 index 00000000..259fa498 --- /dev/null +++ b/pkg/onboarding/infrastructure/database/postgres/pg_query.go @@ -0,0 +1,35 @@ +package postgres + +import ( + "context" + "fmt" + + "github.com/savannahghi/onboarding-service/pkg/onboarding/domain" +) + +//GetFacilities returns a slice of healthcare facilities in the platform. +func (d *OnboardingDb) GetFacilities(ctx context.Context) ([]*domain.Facility, error) { + var facility []*domain.Facility + facilities, err := d.query.GetFacilities(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get facilities: %v", err) + } + + if len(facilities) == 0 { + return facility, nil + } + for _, m := range facilities { + singleFacility := domain.Facility{ + ID: int64(m.ID), + Name: m.Name, + Code: m.Code, + Active: m.Active, + County: m.County, + Description: m.Description, + } + + facility = append(facility, &singleFacility) + } + + return facility, nil +} diff --git a/pkg/onboarding/infrastructure/database/postgres/pg_query_test.go b/pkg/onboarding/infrastructure/database/postgres/pg_query_test.go new file mode 100644 index 00000000..98697527 --- /dev/null +++ b/pkg/onboarding/infrastructure/database/postgres/pg_query_test.go @@ -0,0 +1,98 @@ +package postgres + +import ( + "context" + "fmt" + "testing" + + "github.com/savannahghi/onboarding-service/pkg/onboarding/domain" + "github.com/savannahghi/onboarding-service/pkg/onboarding/infrastructure/database/postgres/gorm" + gormMock "github.com/savannahghi/onboarding-service/pkg/onboarding/infrastructure/database/postgres/gorm/mock" +) + +func TestOnboardingDb_GetFacilities(t *testing.T) { + ctx := context.Background() + id := int64(1) + name := "Kanairo One" + code := "KN001" + county := "Kanairo" + description := "This is just for mocking" + + facility := &domain.Facility{ + ID: id, + Name: name, + Code: code, + Active: true, + County: county, + Description: description, + } + + facilityData := []*domain.Facility{} + facilityData = append(facilityData, facility) + type args struct { + ctx context.Context + } + tests := []struct { + name string + args args + want []*domain.Facility + wantErr bool + }{ + { + name: "happy case - valid payload", + args: args{ctx: ctx}, + want: facilityData, + wantErr: false, + }, + { + name: "sad case - facility want data not given", + args: args{ctx: ctx}, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var fakeGorm = gormMock.NewGormMock() + d := NewOnboardingDb(fakeGorm, fakeGorm) + + if tt.name == "sad case - facility want data not given" { + fakeGorm.GetFacilitiesFn = func(ctx context.Context) ([]gorm.Facility, error) { + return nil, fmt.Errorf("failed to get facilities") + } + } + if tt.name == "happy case - valid payload" { + fakeGorm.GetFacilitiesFn = func(ctx context.Context) ([]gorm.Facility, error) { + var facilities []gorm.Facility + facilityID := int64(1) + name := "Kanairo One" + code := "KN001" + county := "Kanairo" + description := "This is just for mocking" + facilities = append(facilities, gorm.Facility{ + FacilityID: &facilityID, + Name: name, + Code: code, + Active: true, + County: county, + Description: description, + }) + return facilities, nil + } + } + got, err := d.GetFacilities(tt.args.ctx) + if (err != nil) != tt.wantErr { + t.Errorf("OnboardingDb.GetFacilities() error = %v, wantErr %v", err, tt.wantErr) + return + } + if tt.wantErr && got != nil { + t.Errorf("expected facilities to be nil for %v", tt.name) + return + } + + if !tt.wantErr && got == nil { + t.Errorf("expected facilities not to be nil for %v", tt.name) + return + } + }) + } +} diff --git a/pkg/onboarding/infrastructure/infrastructure.go b/pkg/onboarding/infrastructure/infrastructure.go index 75acec17..27476190 100644 --- a/pkg/onboarding/infrastructure/infrastructure.go +++ b/pkg/onboarding/infrastructure/infrastructure.go @@ -21,6 +21,7 @@ const ( // It combines each individual service implementation type Infrastructure struct { Create + Query libOnboardingUsecase.LoginUseCases libOnboardingUsecase.SignUpUseCases engagementSvc.ServiceEngagementImpl @@ -31,6 +32,7 @@ type Infrastructure struct { // It combines each individual service implementation type Interactor struct { Create + Query libOnboardingUsecase.LoginUseCases libOnboardingUsecase.SignUpUseCases engagementSvc.ServiceEngagementImpl @@ -56,9 +58,11 @@ func NewInteractor() Interactor { } db := pg.NewOnboardingDb(postgres, postgres) create := NewServiceCreateImpl(*db) + query := NewServiceQueryImpl(*db) return Interactor{ create, + query, login, signup, *engagement, diff --git a/pkg/onboarding/infrastructure/repository.go b/pkg/onboarding/infrastructure/repository.go index 8bef575f..6ff233c8 100644 --- a/pkg/onboarding/infrastructure/repository.go +++ b/pkg/onboarding/infrastructure/repository.go @@ -27,7 +27,31 @@ func NewServiceCreateImpl(on pg.OnboardingDb) Create { } } -// CreateFacility is responsible from creating a representation of a facility +// CreateFacility is responsible for creating a representation of a facility func (f ServiceCreateImpl) CreateFacility(ctx context.Context, facility dto.FacilityInput) (*domain.Facility, error) { return f.onboarding.CreateFacility(ctx, &facility) } + +// Query represents a contract that contains all `get` ops to the database +// +// All the contracts for get operations are assembled here +type Query interface { + GetFacilities(ctx context.Context) ([]*domain.Facility, error) +} + +// ServiceQueryImpl represents create contract implementation object +type ServiceQueryImpl struct { + onboarding pg.OnboardingDb +} + +// NewServiceQueryImpl returns new instance of ServiceQueryImpl +func NewServiceQueryImpl(on pg.OnboardingDb) Query { + return &ServiceQueryImpl{ + onboarding: on, + } +} + +//GetFacilities is responsible for returning a slice of healthcare facilities in the platform. +func (q ServiceQueryImpl) GetFacilities(ctx context.Context) ([]*domain.Facility, error) { + return q.onboarding.GetFacilities(ctx) +} diff --git a/pkg/onboarding/presentation/graph/facility.graphql b/pkg/onboarding/presentation/graph/facility.graphql index 2d1d335d..909a6960 100644 --- a/pkg/onboarding/presentation/graph/facility.graphql +++ b/pkg/onboarding/presentation/graph/facility.graphql @@ -1,4 +1,8 @@ extend type Mutation { createFacility(input: FacilityInput!): Facility! +} + +extend type Query { + fetchFacilities: [Facility] } \ No newline at end of file diff --git a/pkg/onboarding/presentation/graph/facility.resolvers.go b/pkg/onboarding/presentation/graph/facility.resolvers.go index ffedf5b5..52a34b6e 100644 --- a/pkg/onboarding/presentation/graph/facility.resolvers.go +++ b/pkg/onboarding/presentation/graph/facility.resolvers.go @@ -15,7 +15,15 @@ func (r *mutationResolver) CreateFacility(ctx context.Context, input dto.Facilit return r.interactor.FacilityUsecase.CreateFacility(ctx, input) } +func (r *queryResolver) FetchFacilities(ctx context.Context) ([]*domain.Facility, error) { + return r.interactor.FacilityUsecase.FetchFacilities(ctx) +} + // Mutation returns generated.MutationResolver implementation. func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} } +// Query returns generated.QueryResolver implementation. +func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} } + type mutationResolver struct{ *Resolver } +type queryResolver struct{ *Resolver } diff --git a/pkg/onboarding/presentation/graph/generated/generated.go b/pkg/onboarding/presentation/graph/generated/generated.go index 6b938e02..d4f25739 100644 --- a/pkg/onboarding/presentation/graph/generated/generated.go +++ b/pkg/onboarding/presentation/graph/generated/generated.go @@ -191,6 +191,7 @@ type ComplexityRoot struct { Query struct { DummyQuery func(childComplexity int) int + FetchFacilities func(childComplexity int) int FetchUserNavigationActions func(childComplexity int) int FindRoleByName func(childComplexity int, roleName *string) int FindUserByPhone func(childComplexity int, phoneNumber string) int @@ -308,6 +309,7 @@ type MutationResolver interface { DeactivateRole(ctx context.Context, roleID string) (*dto.RoleOutput, error) } type QueryResolver interface { + FetchFacilities(ctx context.Context) ([]*domain1.Facility, error) TestQuery(ctx context.Context) (*bool, error) DummyQuery(ctx context.Context) (*bool, error) UserProfile(ctx context.Context) (*profileutils.UserProfile, error) @@ -1128,6 +1130,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Query.DummyQuery(childComplexity), true + case "Query.fetchFacilities": + if e.complexity.Query.FetchFacilities == nil { + break + } + + return e.complexity.Query.FetchFacilities(childComplexity), true + case "Query.fetchUserNavigationActions": if e.complexity.Query.FetchUserNavigationActions == nil { break @@ -1598,6 +1607,10 @@ var sources = []*ast.Source{ {Name: "pkg/onboarding/presentation/graph/facility.graphql", Input: ` extend type Mutation { createFacility(input: FacilityInput!): Facility! +} + +extend type Query { + fetchFacilities: [Facility] }`, BuiltIn: false}, {Name: "pkg/onboarding/presentation/graph/input.graphql", Input: `input FacilityInput { name: String! @@ -6037,6 +6050,38 @@ func (ec *executionContext) _Permission_allowed(ctx context.Context, field graph return ec.marshalNBoolean2bool(ctx, field.Selections, res) } +func (ec *executionContext) _Query_fetchFacilities(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Query", + Field: field, + Args: nil, + IsMethod: true, + IsResolver: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().FetchFacilities(rctx) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]*domain1.Facility) + fc.Result = res + return ec.marshalOFacility2ᚕᚖgithubᚗcomᚋsavannahghiᚋonboardingᚑserviceᚋpkgᚋonboardingᚋdomainᚐFacility(ctx, field.Selections, res) +} + func (ec *executionContext) _Query_testQuery(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { defer func() { if r := recover(); r != nil { @@ -10326,6 +10371,17 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Query") + case "fetchFacilities": + field := field + out.Concurrently(i, func() (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_fetchFacilities(ctx, field) + return res + }) case "testQuery": field := field out.Concurrently(i, func() (res graphql.Marshaler) { @@ -12126,6 +12182,53 @@ func (ec *executionContext) marshalODate2ᚖgithubᚗcomᚋsavannahghiᚋscalaru return v } +func (ec *executionContext) marshalOFacility2ᚕᚖgithubᚗcomᚋsavannahghiᚋonboardingᚑserviceᚋpkgᚋonboardingᚋdomainᚐFacility(ctx context.Context, sel ast.SelectionSet, v []*domain1.Facility) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalOFacility2ᚖgithubᚗcomᚋsavannahghiᚋonboardingᚑserviceᚋpkgᚋonboardingᚋdomainᚐFacility(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + return ret +} + +func (ec *executionContext) marshalOFacility2ᚖgithubᚗcomᚋsavannahghiᚋonboardingᚑserviceᚋpkgᚋonboardingᚋdomainᚐFacility(ctx context.Context, sel ast.SelectionSet, v *domain1.Facility) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._Facility(ctx, sel, v) +} + func (ec *executionContext) unmarshalOFilterParam2ᚕᚖgithubᚗcomᚋsavannahghiᚋfirebasetoolsᚐFilterParam(ctx context.Context, v interface{}) ([]*firebasetools.FilterParam, error) { if v == nil { return nil, nil diff --git a/pkg/onboarding/presentation/graph/profile.resolvers.go b/pkg/onboarding/presentation/graph/profile.resolvers.go index f5d42aeb..23fcf47b 100644 --- a/pkg/onboarding/presentation/graph/profile.resolvers.go +++ b/pkg/onboarding/presentation/graph/profile.resolvers.go @@ -6,8 +6,6 @@ package graph import ( "context" "fmt" - - "github.com/savannahghi/onboarding-service/pkg/onboarding/presentation/graph/generated" ) func (r *mutationResolver) TestMutation(ctx context.Context) (*bool, error) { @@ -17,8 +15,3 @@ func (r *mutationResolver) TestMutation(ctx context.Context) (*bool, error) { func (r *queryResolver) TestQuery(ctx context.Context) (*bool, error) { panic(fmt.Errorf("not implemented")) } - -// Query returns generated.QueryResolver implementation. -func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} } - -type queryResolver struct{ *Resolver } diff --git a/pkg/onboarding/usecases/facility/facility.go b/pkg/onboarding/usecases/facility/facility.go index c79ba572..68aee3be 100644 --- a/pkg/onboarding/usecases/facility/facility.go +++ b/pkg/onboarding/usecases/facility/facility.go @@ -3,6 +3,7 @@ package facility import ( "context" + "github.com/savannahghi/firebasetools" "github.com/savannahghi/onboarding-service/pkg/onboarding/application/dto" "github.com/savannahghi/onboarding-service/pkg/onboarding/domain" "github.com/savannahghi/onboarding-service/pkg/onboarding/infrastructure" @@ -10,7 +11,7 @@ import ( // UseCasesFacility ... type UseCasesFacility interface { - // IFacilityList + IFacilityList IFacilityRetrieve IFacilityCreate IFacilityUpdate @@ -49,18 +50,19 @@ type IFacilityReactivate interface { Reactivate(id string) (*domain.Facility, error) } -// // IFacilityList contains the method to list of facilities -// type IFacilityList interface { -// // TODO Document: callers should specify active -// List( -// // search -// searchTerm *string, -// // filter -// filter []*domain.FilterParam, -// // paginate -// page int, -// ) (*domain.FacilityPage, error) -// } +// IFacilityList contains the method to list of facilities +type IFacilityList interface { + // // TODO Document: callers should specify active + // List( + // // search + // searchTerm *string, + // // filter + // filter []*domain.FilterParam, + // // paginate + // page int, + // ) (*domain.FacilityPage, error) + FetchFacilities(ctx context.Context) ([]*domain.Facility, error) +} // IFacilityRetrieve contains the method to retrieve a facility type IFacilityRetrieve interface { @@ -105,20 +107,22 @@ func (f *UseCaseFacilityImpl) Reactivate(id string) (*domain.Facility, error) { return nil, nil } -// // List returns a list if health facility -// // TODO Document: callers should specify active -// func (f *UseCaseFacilityImpl) List( -// // search -// searchTerm *string, -// // filter -// filter []*domain.FilterParam, -// // paginate -// page int, -// ) (*domain.FacilityPage, error) { -// return nil, nil -// } +// List returns a list if health facility +// TODO Document: callers should specify active +func (f *UseCaseFacilityImpl) List( + pagination *firebasetools.PaginationInput, + filter []*dto.FacilityFilterInput, + sort []*dto.FacilitySortInput, +) (*dto.FacilityConnection, error) { + return nil, nil +} // Retrieve find the health facility by ID func (f *UseCaseFacilityImpl) Retrieve(id string) (*domain.Facility, error) { return nil, nil } + +// FetchFacilities fetches healthcare facilities in platform +func (f *UseCaseFacilityImpl) FetchFacilities(ctx context.Context) ([]*domain.Facility, error) { + return f.Infrastructure.GetFacilities(ctx) +}