minhajuddinkhan / gatewaygo

go implementation for the gateway microservice

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

gatewaygo

Some concurrency through go. 😂

package mappers

import (
	"sync"

	"github.com/minhajuddinkhan/gatewaygo/models"
	"github.com/minhajuddinkhan/gatewaygo/queue"
	"github.com/minhajuddinkhan/gatewaygo/targets"
)

//GetMappedFragments GetMappedFragments
func GetMappedFragments(subscription models.Subscriptions, data []byte) ([]queue.Fragment, error) {

	finished := make(chan bool, 1)
	errChannel := make(chan error)
	nsqFragmentCh := make(chan queue.Fragment)

	var wg sync.WaitGroup
	wg.Add(len(subscription.Endpoint.DependentURLs))

	for _, dependentURL := range subscription.Endpoint.DependentURLs {

		go func(dependentURL models.Endpoints, b []byte, destinationCode string) {
			defer wg.Done()
			target, _ := targets.GetTarget(
				subscription.Source.Name,
				dependentURL.Event.DataModel.Name,
				dependentURL.Event.Name,
				subscription.Source.AuthParams)

			res, err := target.ToFHIR(b, destinationCode)
			if err != nil {
				errChannel <- err
				return
			}
			nsqFragmentCh <- queue.Fragment{
				DataModel:  dependentURL.Event.DataModel.Name,
				EndpointID: dependentURL.ID,
				Data:       res,
				Endpoint:   dependentURL,
			}

		}(dependentURL, data, subscription.Source.DestinationCode)
	}
	go func() { wg.Wait(); close(finished) }()

	fragments := []queue.Fragment{}
	wait := true
	for wait {
		select {
		case f := <-nsqFragmentCh:
			fragments = append(fragments, f)
		case <-finished:
			wait = false
			return fragments, nil
		case err := <-errChannel:
			wait = false
			return nil, err
		}

	}
	return fragments, nil

}

About

go implementation for the gateway microservice


Languages

Language:Go 100.0%