This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
backend/internal/graphql/dataloader/dataloader.go

71 lines
1.9 KiB
Go

package dataloader
import (
"context"
"time"
"gitea.dwysokinski.me/zdam-egzamin-zawodowy/backend/internal/profession"
"gitea.dwysokinski.me/zdam-egzamin-zawodowy/backend/internal/model"
"gitea.dwysokinski.me/zdam-egzamin-zawodowy/backend/internal/qualification"
)
const (
wait = 2 * time.Millisecond
)
type Config struct {
ProfessionRepo profession.Repository
QualificationRepo qualification.Repository
}
type DataLoader struct {
QualificationByID *QualificationLoader
QualificationsByProfessionID *QualificationSliceByProfessionIDLoader
}
func New(cfg Config) *DataLoader {
return &DataLoader{
QualificationByID: NewQualificationLoader(QualificationLoaderConfig{
Wait: wait,
Fetch: func(ids []int) ([]*model.Qualification, []error) {
qualificationsNotInOrder, _, err := cfg.QualificationRepo.Fetch(context.Background(), &qualification.FetchConfig{
Filter: &model.QualificationFilter{
ID: ids,
},
Count: false,
})
if err != nil {
return nil, []error{err}
}
qualificationByID := make(map[int]*model.Qualification)
for _, qualification := range qualificationsNotInOrder {
qualificationByID[qualification.ID] = qualification
}
qualifications := make([]*model.Qualification, len(ids))
for i, id := range ids {
qualifications[i] = qualificationByID[id]
}
return qualifications, nil
},
}),
QualificationsByProfessionID: NewQualificationSliceByProfessionIDLoader(QualificationSliceByProfessionIDLoaderConfig{
Wait: wait,
Fetch: func(ids []int) ([][]*model.Qualification, []error) {
m, err := cfg.ProfessionRepo.GetAssociatedQualifications(context.Background(), ids...)
if err != nil {
return nil, []error{err}
}
qualifications := make([][]*model.Qualification, len(ids))
for i, id := range ids {
qualifications[i] = m[id]
}
return qualifications, nil
},
}),
}
}