125 lines
3.1 KiB
Go
125 lines
3.1 KiB
Go
package eligibilityroute
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"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"
|
|
"github.com/labstack/echo"
|
|
)
|
|
|
|
var (
|
|
instance *controller
|
|
once sync.Once
|
|
)
|
|
|
|
type controller struct {
|
|
cfg *config.Config
|
|
svc *applicationservice.Service
|
|
bcbsi *bcbsi.Service
|
|
}
|
|
|
|
func controllerInstance(cfg *config.Config, svc *applicationservice.Service) *controller {
|
|
once.Do(func() {
|
|
instance = &controller{
|
|
cfg: cfg,
|
|
svc: svc,
|
|
bcbsi: bcbsi.New(cfg),
|
|
}
|
|
})
|
|
return instance
|
|
}
|
|
|
|
func (c *controller) rangeIn(low, hi int) string {
|
|
result := low + rand.Intn(hi-low)
|
|
return fmt.Sprintf("%v", result)
|
|
}
|
|
|
|
func (c *controller) generatePassword(n int) string {
|
|
const (
|
|
charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
)
|
|
|
|
return c.stringWithCharset(n, charset)
|
|
}
|
|
|
|
func (c *controller) stringWithCharset(length int, charset string) string {
|
|
b := make([]byte, length)
|
|
var seededRand *rand.Rand = rand.New(
|
|
rand.NewSource(time.Now().UnixNano()))
|
|
for i := range b {
|
|
b[i] = charset[seededRand.Intn(len(charset))]
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
func (c *controller) handleEligibility(ctx echo.Context) error {
|
|
var eligibility viewmodel.Eligibility
|
|
|
|
if err := ctx.Bind(&eligibility); err != nil {
|
|
return routeutils.HandleAPIError(ctx, err)
|
|
}
|
|
|
|
authUser, err := auth.GetUserDetail(ctx, c.cfg)
|
|
if err != nil {
|
|
return routeutils.HandleAPIError(ctx, err)
|
|
}
|
|
|
|
var provider viewmodel.ProviderResp
|
|
provider, err = c.svc.Provider.GetByNPI(eligibility.RawProvider.FivePartKeyGroups[0].ProviderNum, authUser)
|
|
if err != nil {
|
|
return routeutils.HandleAPIError(ctx, err)
|
|
}
|
|
|
|
if provider.ProviderUUID == "" {
|
|
org := viewmodel.Organization{
|
|
Type: viewmodel.OrganizationType{
|
|
Key: "provider",
|
|
Name: "Provider",
|
|
},
|
|
Name: eligibility.RawProvider.OrgName,
|
|
Description: eligibility.RawProvider.OrgName,
|
|
Main: false,
|
|
Author: authUser,
|
|
LastEditor: authUser,
|
|
Reference: eligibility.RawProvider,
|
|
}
|
|
|
|
org, err = c.svc.Organization.AddOrganization(org, authUser)
|
|
if err != nil {
|
|
return routeutils.HandleAPIError(ctx, err)
|
|
}
|
|
|
|
provider, err = c.svc.Provider.GetByOrganization(org.UUID, authUser)
|
|
if err != nil {
|
|
return routeutils.HandleAPIError(ctx, err)
|
|
}
|
|
}
|
|
|
|
user, err := c.svc.Users.CheckAndCreateMember(eligibility.User, provider, authUser)
|
|
if err != nil {
|
|
if validationError, ok := err.(*viewmodel.ValidationError); ok {
|
|
if len(validationError.Errors) > 0 {
|
|
return routeutils.ResponseAPICustomValidationError(ctx, validationError.Message, validationError.Errors)
|
|
} else {
|
|
return routeutils.ResponseAPIServiceError(ctx, validationError.Message)
|
|
}
|
|
} else {
|
|
return routeutils.HandleAPIError(ctx, err)
|
|
}
|
|
}
|
|
|
|
if authUser.Profiles[0].Key == "VIRPT" {
|
|
return ctx.JSON(204, nil)
|
|
} else {
|
|
return ctx.JSON(200, user)
|
|
}
|
|
}
|