package visitroute import ( "fmt" "sync" "time" "bitbucket.org/nemt/nemt-portal-api/application/applicationservice" "bitbucket.org/nemt/nemt-portal-api/application/third/eligibility/bcbsi" "bitbucket.org/nemt/nemt-portal-api/application/viewmodel" "bitbucket.org/nemt/nemt-portal-api/infra/auth" "bitbucket.org/nemt/nemt-portal-api/infra/config" "bitbucket.org/nemt/nemt-portal-api/server/router/routeutils" "bitbucket.org/nemt/nemt-portal-api/server/validation" "github.com/labstack/echo" ) var ( instance *controller once sync.Once ) type controller struct { svc *applicationservice.Service cfg *config.Config bcbsi *bcbsi.Service } func controllerInstance(svc *applicationservice.Service, cfg *config.Config) *controller { once.Do(func() { instance = &controller{ svc: svc, cfg: cfg, bcbsi: bcbsi.New(cfg), } }) return instance } func (c *controller) handle(ctx echo.Context) error { var visit viewmodel.Visit if err := ctx.Bind(&visit); err != nil { fmt.Println(err) return routeutils.ResponseAPIValidationError(ctx, "invalid parameters") } user, err := auth.GetUserDetail(ctx, c.cfg) if err != nil { return routeutils.HandleAPIError(ctx, err) } provider, err := c.svc.Provider.GetByUUID(visit.Provider.ProviderUUID, user) if err != nil { fmt.Println(err) return routeutils.ResponseAPIValidationError(ctx, "invalid provider") } if validationErrors := validation.ValidateVisit(&visit, &user); len(validationErrors) > 0 { return routeutils.ResponseAPICustomValidationError(ctx, "visit validation failed", validationErrors) } eligibility := viewmodel.Eligibility{} eligibility.Provider.ProviderNPI = provider.InternalID eligibility.Provider.ProviderName = provider.Name eligibility.TrackingID = *visit.User.Member eligibility.Subscriber.SubscriberID = *visit.User.Member eligibility.Subscriber.PatientType = *visit.User.Type eligibility.Subscriber.Name.First = visit.User.First eligibility.Subscriber.Name.Last = visit.User.Last eligibility.Subscriber.DemographicInfo.DateOfBirth = *visit.User.BirthDate eligibility.Subscriber.DemographicInfo.Gender = *visit.User.Gender eligibility.ServiceInfo.DateOfService = time.Now() eligibility.ServiceInfo.ServiceTypeCodes = []string{"30"} resp, err := c.bcbsi.BXE.Get271(eligibility) if err != nil { fmt.Println(err) return routeutils.ResponseAPIValidationError(ctx, err.Error()) } return routeutils.ResponseAPIOK(ctx, resp) } func (c *controller) handleGetByID(ctx echo.Context) error { visit_uuid := ctx.Param("visit_uuid") if visit_uuid == "" { return routeutils.ResponseAPIValidationError(ctx, "visit_uuid param is mandatory") } user, err := auth.GetUserDetail(ctx, c.cfg) if err != nil { return routeutils.HandleAPIError(ctx, err) } resp, err := c.svc.Visits.GetByUUID(visit_uuid, user) if err != nil { return routeutils.HandleAPIError(ctx, err) } return routeutils.ResponseAPIOK(ctx, resp) } func (c *controller) handleGetAll(ctx echo.Context) error { user, err := auth.GetUserDetail(ctx, c.cfg) if err != nil { return routeutils.HandleAPIError(ctx, err) } resp, err := c.svc.Visits.GetAll(user) if err != nil { return routeutils.HandleAPIError(ctx, err) } return routeutils.ResponseAPIOK(ctx, resp) }