public async Task <ActionResult <IEnumerable <PlaceProductWithPlace> > > ListPlaceProductByPlace(
            [FromQuery] string placeId
            )
        {
            try
            {
                var place = await placeRepository.GetPlace(placeId);

                if (place == null)
                {
                    throw new Exception("Place not found");
                }
                var pp = await placeProviderRepository.GetPlaceProvider(place.PlaceProviderId);

                if (pp == null)
                {
                    throw new Exception("Place provider not found");
                }
                var ret = await placeRepository.ListPlaceProductByPlace(placeId);

                var places2 = IPlaceProviderRepository.ExtendByAllProducts(ret, pp, new string[] { placeId });
                return(Ok(places2.Select(ppr => ppr.ToExtendedModel(placeProviderRepository).Result)));
            }
            catch (Exception exc)
            {
                logger.LogError(exc, exc.Message);

                return(BadRequest(new ProblemDetails()
                {
                    Detail = exc.Message
                }));
            }
        }
        public async Task <ActionResult <IEnumerable <PlaceProduct> > > ListPlaceProductByPlaceProvider(
            [FromQuery] string placeProviderId
            )
        {
            try
            {
                var pp = await placeProviderRepository.GetPlaceProvider(placeProviderId);

                if (pp == null)
                {
                    throw new Exception("Place provider not found");
                }
                var ret = await placeRepository.ListPlaceProductByPlaceProvider(pp);

                var places = await placeRepository.ListAll();

                return(Ok(IPlaceProviderRepository.ExtendByAllProducts(ret, pp, places.Where(pp => pp.PlaceProviderId == placeProviderId).Select(p => p.Id).ToArray())));
            }
            catch (Exception exc)
            {
                logger.LogError(exc, exc.Message);

                return(BadRequest(new ProblemDetails()
                {
                    Detail = exc.Message
                }));
            }
        }
Ejemplo n.º 3
0
        public async Task <ActionResult <IEnumerable <PlaceProductWithPlace> > > ListPlaceProduct()
        {
            try
            {
                var pp = await placeProviderRepository.GetPlaceProvider(User.GetPlaceProvider());

                if (pp == null)
                {
                    throw new Exception("Place provider not found");
                }
                var ret = await placeRepository.ListPlaceProductByPlaceProvider(pp);

                var places = await placeRepository.ListAll();

                var places2 = IPlaceProviderRepository.ExtendByAllProducts(ret, pp, places.Where(pp => pp.PlaceProviderId == User.GetPlaceProvider()).Select(p => p.Id).ToArray());

                return(Ok(places2.Select(ppr => ppr.ToExtendedModel(placeProviderRepository).Result)));
            }
            catch (ArgumentException exc)
            {
                logger.LogError(exc.Message);
                return(BadRequest(new ProblemDetails()
                {
                    Detail = exc.Message
                }));
            }
            catch (Exception exc)
            {
                logger.LogError(exc, exc.Message);
                return(BadRequest(new ProblemDetails()
                {
                    Detail = exc.Message
                }));
            }
        }
Ejemplo n.º 4
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="localizer"></param>
 /// <param name="configuration"></param>
 /// <param name="loggerFactory"></param>
 /// <param name="logger"></param>
 /// <param name="slotRepository"></param>
 /// <param name="placeRepository"></param>
 /// <param name="userRepository"></param>
 /// <param name="visitorRepository"></param>
 /// <param name="placeProviderRepository"></param>
 /// <param name="mojeEZdravie"></param>
 /// <param name="emailSender"></param>
 /// <param name="smsSender"></param>
 public AdminController(
     IStringLocalizer <AdminController> localizer,
     IConfiguration configuration,
     ILoggerFactory loggerFactory,
     ILogger <AdminController> logger,
     ISlotRepository slotRepository,
     IPlaceRepository placeRepository,
     IUserRepository userRepository,
     IVisitorRepository visitorRepository,
     IPlaceProviderRepository placeProviderRepository,
     IMojeEZdravie mojeEZdravie,
     IEmailSender emailSender,
     ISMSSender smsSender
     )
 {
     this.localizer               = localizer;
     this.loggerFactory           = loggerFactory;
     this.logger                  = logger;
     this.slotRepository          = slotRepository;
     this.placeRepository         = placeRepository;
     this.userRepository          = userRepository;
     this.configuration           = configuration;
     this.visitorRepository       = visitorRepository;
     this.placeProviderRepository = placeProviderRepository;
     this.mojeEZdravie            = mojeEZdravie;
     this.emailSender             = emailSender;
     this.smsSender               = smsSender;
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="localizer"></param>
 /// <param name="configuration"></param>
 /// <param name="loggerFactory"></param>
 /// <param name="redisCacheClient"></param>
 /// <param name="emailSender"></param>
 /// <param name="smsSender"></param>
 /// <param name="placeRepository"></param>
 /// <param name="slotRepository"></param>
 /// <param name="placeProviderRepository"></param>
 /// <param name="userRepository"></param>
 public VisitorRepository(
     IStringLocalizer <Repository.RedisRepository.VisitorRepository> localizer,
     IConfiguration configuration,
     ILoggerFactory loggerFactory,
     IRedisCacheClient redisCacheClient,
     IEmailSender emailSender,
     ISMSSender smsSender,
     IPlaceRepository placeRepository,
     ISlotRepository slotRepository,
     IPlaceProviderRepository placeProviderRepository,
     IUserRepository userRepository
     ) : base(
         localizer,
         configuration,
         loggerFactory.CreateLogger <Repository.RedisRepository.VisitorRepository>(),
         redisCacheClient,
         emailSender,
         smsSender,
         placeRepository,
         slotRepository,
         placeProviderRepository,
         userRepository
         )
 {
     logger             = loggerFactory.CreateLogger <VisitorRepository>();
     this.configuration = configuration;
 }
Ejemplo n.º 6
0
        /// <summary>
        /// Returns true if the user is currently in the role of PP Admin and acts on behalf of specific place.
        /// </summary>
        /// <param name="user"></param>
        /// <param name="userRepository"></param>
        /// <param name="placeProviderRepository"></param>
        /// <param name="placeRepository"></param>
        /// <param name="placeId"></param>
        /// <returns></returns>
        public static async Task <bool> IsPlaceAdmin(
            this ClaimsPrincipal user,
            IUserRepository userRepository,
            IPlaceProviderRepository placeProviderRepository,
            IPlaceRepository placeRepository,
            string placeId
            )
        {
            var place = await placeRepository.GetPlace(placeId);

            if (place == null)
            {
                return(false);
            }
            if (user.IsAdmin(userRepository))
            {
                return(true);
            }
            var pp = GetPlaceProvider(user);

            if (pp != place.PlaceProviderId)
            {
                return(false);
            }
            return(await placeProviderRepository.InAnyGroup(user.GetEmail(), pp, new string[] { Groups.PPAdmin }));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Extend
        /// </summary>
        /// <param name="placeProviderRepository"></param>
        /// <returns></returns>
        internal async Task <PlaceProductWithPlace> ToExtendedModel(IPlaceProviderRepository placeProviderRepository)
        {
            var pp = await placeProviderRepository.GetPlaceProvider(PlaceProviderId);

            return(new PlaceProductWithPlace()
            {
                Id = this.Id,
                CustomPrice = this.CustomPrice,
                From = From,
                InsuranceOnly = InsuranceOnly,
                CollectInsurance = CollectInsurance,
                CollectEmployeeNo = CollectEmployeeNo,
                CollectNationality = CollectNationality,
                EmployeesOnly = EmployeesOnly,
                EmployeesRegistration = EmployeesRegistration,
                SchoolOnly = SchoolOnly,
                EHealthDefault = EHealthDefault,
                PlaceId = PlaceId,
                PlaceProviderId = PlaceProviderId,
                Price = Price,
                PriceCurrency = PriceCurrency,
                Product = pp?.Products?.FirstOrDefault(pr => pr.Id == ProductId),
                ProductId = ProductId,
                Until = Until,
            });
        }
Ejemplo n.º 8
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="localizer"></param>
 /// <param name="logger"></param>
 /// <param name="userRepository"></param>
 /// <param name="placeProviderRepository"></param>
 public UserController(
     IStringLocalizer <UserController> localizer,
     ILogger <PlaceController> logger,
     IUserRepository userRepository,
     IPlaceProviderRepository placeProviderRepository
     )
 {
     this.localizer               = localizer;
     this.logger                  = logger;
     this.userRepository          = userRepository;
     this.placeProviderRepository = placeProviderRepository;
 }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="configuration"></param>
 /// <param name="localizer"></param>
 /// <param name="logger"></param>
 /// <param name="placeProviderRepository"></param>
 /// <param name="placeRepository"></param>
 /// <param name="userRepository"></param>
 public PlaceProviderController(
     IConfiguration configuration,
     IStringLocalizer <PlaceProviderController> localizer,
     ILogger <PlaceProviderController> logger,
     IPlaceProviderRepository placeProviderRepository,
     IPlaceRepository placeRepository,
     IUserRepository userRepository
     )
 {
     this.configuration           = configuration;
     this.localizer               = localizer;
     this.logger                  = logger;
     this.placeRepository         = placeRepository;
     this.userRepository          = userRepository;
     this.placeProviderRepository = placeProviderRepository;
 }
Ejemplo n.º 10
0
 /// <summary>
 /// constructor
 /// </summary>
 /// <param name="logger"></param>
 /// <param name="visitorRepository"></param>
 /// <param name="userRepository"></param>
 /// <param name="placeProviderRepository"></param>
 /// <param name="configuration"></param>
 /// <param name="captchaValidator"></param>
 public VisitorController(
     ILogger <VisitorController> logger,
     IVisitorRepository visitorRepository,
     IUserRepository userRepository,
     IPlaceProviderRepository placeProviderRepository,
     IConfiguration configuration,
     GoogleReCaptcha.V3.Interface.ICaptchaValidator captchaValidator
     )
 {
     this.logger                  = logger;
     this.visitorRepository       = visitorRepository;
     this.configuration           = configuration;
     this.captchaValidator        = captchaValidator;
     this.userRepository          = userRepository;
     this.placeProviderRepository = placeProviderRepository;
 }
Ejemplo n.º 11
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="configuration"></param>
 /// <param name="localizer"></param>
 /// <param name="logger"></param>
 /// <param name="visitorRepository"></param>
 /// <param name="userRepository"></param>
 /// <param name="placeProviderRepository"></param>
 /// <param name="captchaValidator"></param>
 public ResultController(
     IConfiguration configuration,
     IStringLocalizer <ResultController> localizer,
     ILogger <ResultController> logger,
     IVisitorRepository visitorRepository,
     IUserRepository userRepository,
     IPlaceProviderRepository placeProviderRepository,
     ICaptchaValidator captchaValidator
     )
 {
     this.configuration           = configuration;
     this.localizer               = localizer;
     this.logger                  = logger;
     this.visitorRepository       = visitorRepository;
     this.userRepository          = userRepository;
     this.placeProviderRepository = placeProviderRepository;
     this.captchaValidator        = captchaValidator;
 }
Ejemplo n.º 12
0
        /// <summary>
        /// Extend
        /// </summary>
        /// <param name="placeProviderRepository"></param>
        /// <returns></returns>
        internal async Task <PlaceProductWithPlace> ToExtendedModel(IPlaceProviderRepository placeProviderRepository)
        {
            var pp = await placeProviderRepository.GetPlaceProvider(PlaceProviderId);

            return(new PlaceProductWithPlace()
            {
                Id = this.Id,
                CustomPrice = this.CustomPrice,
                From = From,
                InsuranceOnly = InsuranceOnly,
                PlaceId = PlaceId,
                PlaceProviderId = PlaceProviderId,
                Price = Price,
                PriceCurrency = PriceCurrency,
                Product = pp?.Products?.FirstOrDefault(pr => pr.Id == ProductId),
                ProductId = ProductId,
                Until = Until,
            });
        }
Ejemplo n.º 13
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="localizer"></param>
 /// <param name="configuration"></param>
 /// <param name="logger"></param>
 /// <param name="redisCacheClient"></param>
 /// <param name="emailSender"></param>
 /// <param name="smsSender"></param>
 /// <param name="placeRepository"></param>
 /// <param name="placeProviderRepository"></param>
 public UserRepository(
     IStringLocalizer <UserRepository> localizer,
     IConfiguration configuration,
     ILogger <UserRepository> logger,
     IRedisCacheClient redisCacheClient,
     IEmailSender emailSender,
     ISMSSender smsSender,
     IPlaceRepository placeRepository,
     IPlaceProviderRepository placeProviderRepository
     )
 {
     this.localizer               = localizer;
     this.logger                  = logger;
     this.redisCacheClient        = redisCacheClient;
     this.emailSender             = emailSender;
     this.smsSender               = smsSender;
     this.configuration           = configuration;
     this.placeRepository         = placeRepository;
     this.placeProviderRepository = placeProviderRepository;
 }
Ejemplo n.º 14
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="localizer"></param>
 /// <param name="configuration"></param>
 /// <param name="logger"></param>
 /// <param name="slotRepository"></param>
 /// <param name="placeRepository"></param>
 /// <param name="userRepository"></param>
 /// <param name="visitorRepository"></param>
 /// <param name="placeProviderRepository"></param>
 public AdminController(
     IStringLocalizer <AdminController> localizer,
     IConfiguration configuration,
     ILogger <AdminController> logger,
     ISlotRepository slotRepository,
     IPlaceRepository placeRepository,
     IUserRepository userRepository,
     IVisitorRepository visitorRepository,
     IPlaceProviderRepository placeProviderRepository
     )
 {
     this.localizer               = localizer;
     this.logger                  = logger;
     this.slotRepository          = slotRepository;
     this.placeRepository         = placeRepository;
     this.userRepository          = userRepository;
     this.configuration           = configuration;
     this.visitorRepository       = visitorRepository;
     this.placeProviderRepository = placeProviderRepository;
 }
Ejemplo n.º 15
0
        /// <summary>
        /// ListPlaceProductByCategory
        /// </summary>
        /// <param name="category"></param>
        /// <returns></returns>
        public async Task <IEnumerable <PlaceProduct> > ListPlaceProductByCategory(string category)
        {
            var ret = new List <PlaceProduct>();

            foreach (var ppId in await ListPPIdsByCategory(category))
            {
                var pp = await GetPlaceProvider(ppId);

                if (pp.Products.Any(p => p.Category == category))
                {
                    ret.AddRange(await placeRepository.ListPlaceProductByPlaceProvider(pp));
                }
                var places = await placeRepository.ListAll();

                var placesIds = places.Where(ppobj => ppobj.PlaceProviderId == pp.PlaceProviderId).Select(p => p.Id).ToArray();

                ret = IPlaceProviderRepository.ExtendByAllProducts(ret, pp, placesIds);
            }

            return(ret);
        }
Ejemplo n.º 16
0
 /// <summary>
 /// constructor
 /// </summary>
 /// <param name="localizer"></param>
 /// <param name="localizer2"></param>
 /// <param name="configuration"></param>
 /// <param name="loggerFactory"></param>
 /// <param name="redisCacheClient"></param>
 /// <param name="emailSender"></param>
 /// <param name="smsSender"></param>
 /// <param name="placeRepository"></param>
 /// <param name="placeProviderRepository"></param>
 public UserRepository(
     IStringLocalizer <UserRepository> localizer,
     IStringLocalizer <Repository.RedisRepository.UserRepository> localizer2,
     IConfiguration configuration,
     ILoggerFactory loggerFactory,
     IRedisCacheClient redisCacheClient,
     IEmailSender emailSender,
     ISMSSender smsSender,
     IPlaceRepository placeRepository,
     IPlaceProviderRepository placeProviderRepository
     ) : base(
         localizer2,
         configuration,
         loggerFactory.CreateLogger <Repository.RedisRepository.UserRepository>(),
         redisCacheClient,
         emailSender,
         smsSender,
         placeRepository,
         placeProviderRepository
         )
 {
     this.localizer = localizer;
     this.placeProviderRepository = placeProviderRepository;
 }
Ejemplo n.º 17
0
        /// <summary>
        /// Returns true if the user is currently in the role of PP Admin.
        /// </summary>
        /// <param name="user"></param>
        /// <param name="userRepository"></param>
        /// <param name="placeProviderRepository"></param>
        /// <returns></returns>
        public static async Task <bool> IsPlaceProviderAdmin(this ClaimsPrincipal user, IUserRepository userRepository, IPlaceProviderRepository placeProviderRepository)
        {
            if (user.IsAdmin(userRepository))
            {
                return(true);
            }
            var pp = GetPlaceProvider(user);

            return(await placeProviderRepository.InAnyGroup(user.GetEmail(), pp, new string[] { Groups.PPAdmin }));
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Check if user has role Data exporter
        /// </summary>
        /// <param name="user"></param>
        /// <param name="userRepository"></param>
        /// <param name="placeProviderRepository"></param>
        /// <returns></returns>
        public static bool IsDataExporter(this ClaimsPrincipal user, IUserRepository userRepository, IPlaceProviderRepository placeProviderRepository)
        {
            if (user is null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            if (userRepository is null)
            {
                throw new ArgumentNullException(nameof(userRepository));
            }

            var email = user.GetEmail();
            var pp    = user.GetPlaceProvider();

            if (!string.IsNullOrEmpty(pp))
            {
                if (placeProviderRepository.InAnyGroup(email, pp, new string[] { Groups.DataExporter }).Result)
                {
                    return(true);
                }
            }
            return(userRepository.InAnyGroup(email, new string[] { Groups.DataExporter }, user.GetPlaceProvider()).Result);
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Accountant or admin is authorized to issue invoice
        /// </summary>
        /// <param name="user"></param>
        /// <param name="userRepository"></param>
        /// <param name="placeProviderRepository"></param>
        /// <param name="placeProviderId"></param>
        /// <returns></returns>
        public static bool IsAuthorizedToIssueInvoice(this ClaimsPrincipal user, IUserRepository userRepository, IPlaceProviderRepository placeProviderRepository, string placeProviderId)
        {
            if (user is null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            if (userRepository is null)
            {
                throw new ArgumentNullException(nameof(userRepository));
            }
            if (placeProviderRepository is null)
            {
                throw new ArgumentNullException(nameof(placeProviderRepository));
            }
            if (string.IsNullOrEmpty(placeProviderId))
            {
                throw new ArgumentNullException(nameof(placeProviderId));
            }

            var email = user.GetEmail();

            return(placeProviderRepository.InAnyGroup(email, placeProviderId, new string[] { Groups.Admin, Groups.Accountant }).Result);
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Log in as company
        /// </summary>
        /// <param name="user"></param>
        /// <param name="userRepository"></param>
        /// <param name="placeProviderRepository"></param>
        /// <param name="placeProviderId"></param>
        /// <returns></returns>
        public static async Task <bool> IsAuthorizedToLogAsCompany(this ClaimsPrincipal user, IUserRepository userRepository, IPlaceProviderRepository placeProviderRepository, string placeProviderId)
        {
            if (user is null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            if (userRepository is null)
            {
                throw new ArgumentNullException(nameof(userRepository));
            }
            if (user.IsAdmin(userRepository))
            {
                return(true);
            }

            if (placeProviderRepository is null)
            {
                throw new ArgumentNullException(nameof(placeProviderRepository));
            }
            if (string.IsNullOrEmpty(placeProviderId))
            {
                throw new ArgumentNullException(nameof(placeProviderId));
            }

            var email = user.GetEmail();

            var pp = await placeProviderRepository.GetPlaceProvider(placeProviderId);

            if (pp == null)
            {
                return(false);
            }
            if (pp.Users?.Any(u => u.Email == email) == true)
            {
                return(true);
            }
            return(await placeProviderRepository.InAnyGroup(email, placeProviderId, new string[] { Groups.Admin, Groups.PPAdmin, Groups.Accountant, Groups.DataExporter, Groups.DocumentManager, Groups.MedicLab, Groups.MedicTester, Groups.RegistrationManager }));
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Downloads the visitors from eHealth
        /// </summary>
        /// <param name="placeProviderId"></param>
        /// <param name="managerEmail"></param>
        /// <param name="day"></param>
        /// <param name="visitorRepository"></param>
        /// <param name="placeRepository"></param>
        /// <param name="placeProviderRepository"></param>
        /// <param name="slotRepository"></param>
        /// <param name="loggerFactory"></param>
        /// <returns></returns>
        public async Task <int> DownloadEHealthVisitors(
            string placeProviderId,
            string managerEmail,
            DateTimeOffset day,
            IVisitorRepository visitorRepository,
            IPlaceRepository placeRepository,
            IPlaceProviderRepository placeProviderRepository,
            ISlotRepository slotRepository,
            ILoggerFactory loggerFactory
            )
        {
            var logger = loggerFactory.CreateLogger <MojeEZdravieAbstract>();

            logger.LogInformation($"eHealth: Downloading {placeProviderId} {managerEmail} {day}");
            var rPlaces = (await placeRepository.ListAll())?.Where(p => p.PlaceProviderId == placeProviderId);

            if (rPlaces == null || !rPlaces.Any())
            {
                throw new Exception("This place provider does not have any place defined");
            }
            var pp = await placeProviderRepository.GetPlaceProvider(placeProviderId);

            var product = pp.Products.FirstOrDefault(pr => pr.EHealthDefault == true);

            if (product == null)
            {
                product = pp.Products.FirstOrDefault();
            }

            int ret  = 0;
            var data = await MakeSurePlaceProviderIsAuthenticated(placeProviderId, placeProviderRepository);

            var token  = data.LoginPayload.Session.Token;
            var places = await DriveInQueue(token, day);

            if (places.Payload == null)
            {
                throw new Exception("No places found");
            }

            foreach (var place in places.Payload)
            {
                var rPlace = rPlaces.FirstOrDefault(p => p.EHealthId == place.Id);
                if (rPlace == null)
                {
                    rPlace = rPlaces.FirstOrDefault();
                }

                var list = await PlaceDetail(token, day, place.Id);

                foreach (var person in list.Payload)
                {
                    if (!person.DesignatedDriveinScheduledAt.HasValue)
                    {
                        continue;
                    }
                    if (string.IsNullOrEmpty(person.BirthNumber?.FormatDocument()))
                    {
                        continue;
                    }
                    var slot = await slotRepository.GetCurrentSlot(rPlace.Id, person.DesignatedDriveinScheduledAt.Value);

                    var documentClear = person.BirthNumber.FormatDocument();
                    var existing      = await visitorRepository.GetVisitorByPersonalNumber(documentClear, true);

                    if (existing != null && existing.ChosenPlaceId == rPlace.Id && existing.ChosenSlot == slot.SlotId)
                    {
                        continue; // already exists
                    }

                    var visitor = new Visitor()
                    {
                        ChosenSlot           = slot.SlotId,
                        ChosenPlaceId        = rPlace.Id,
                        Product              = product.Id,
                        FirstName            = person.FirstName,
                        LastName             = person.LastName,
                        RC                   = person.BirthNumber,
                        Insurance            = person.HealthInsuranceCompany,
                        PersonTrackingNumber = person.PersonTrackingNumber,
                        Gender               = person.Gender,
                        Street               = person.Street,
                        StreetNo             = person.StreetNumber,
                        City                 = person.City,
                        ZIP                  = person.PostalCode,
                        Phone                = person.PrimaryPhone,
                        Language             = "sk",
                        Result               = TestResult.NotTaken,
                        DownloadedAt         = DateTimeOffset.UtcNow
                    };
                    var newRegistration = await visitorRepository.Register(visitor, managerEmail, false);

                    logger.LogInformation($"eHealth: Visitor downloaded {visitor.Id} {visitor.RC.GetSHA256Hash()}");
                    ret++;
                }
            }
            return(ret);
        }
Ejemplo n.º 22
0
        private async Task <PlaceProviderSensitiveData> MakeSurePlaceProviderIsAuthenticated(string placeProviderId, IPlaceProviderRepository placeProviderRepository)
        {
            var data = await placeProviderRepository.GetPlaceProviderSensitiveData(placeProviderId);

            if (data.SessionValidity == null || data.SessionValidity.ValidThru.AddMinutes(10) < DateTimeOffset.Now)
            {
                // session is going to expire
                if (data.SessionValidity == null || data.SessionValidity.ValidThru.AddMinutes(10) < DateTimeOffset.Now)
                {
                    if (data.SessionValidity == null || data.SessionValidity.ValidThru.AddMinutes(1) < DateTimeOffset.Now)
                    {
                        // expired .. login again
                        data.LoginPayload = (await Authenticate(data.EZdravieUser, data.EZdraviePass))?.Payload;
                        if (string.IsNullOrEmpty(data.LoginPayload.User.Login))
                        {
                            throw new Exception("Unable to authenticate to ehealth");
                        }
                    }

                    // extend session
                    var extendSessionRequest = new ExtendSessionRequest()
                    {
                        AccessId = data.LoginPayload.Session.SessionId,
                        UserId   = data.LoginPayload.User.Id
                    };
                    data.SessionValidity = await Extendsession(data.LoginPayload.Session.Token, extendSessionRequest);

                    if (data.SessionValidity == null)
                    {
                        data.SessionValidity = new ExtendSessionResponse()
                        {
                            ValidThru = data.LoginPayload.Session.ValidThru
                        };
                    }
                    if (data.SessionValidity.ValidThru.AddMinutes(1) < DateTimeOffset.Now)
                    {
                        throw new Exception("Unable to prolong the session");
                    }

                    await placeProviderRepository.SetPlaceProviderSensitiveData(data, false);
                }
            }
            return(data);
        }
Ejemplo n.º 23
0
        /// <summary>
        /// Send visitor registered in rychlejsie or downloaded from eHealth to eHealth system
        ///
        /// Returns true if successful, False or Exception if not successful
        /// </summary>
        /// <param name="visitor"></param>
        /// <param name="placeProviderId"></param>
        /// <param name="placeProviderRepository"></param>
        /// <param name="configuration"></param>
        /// <returns></returns>
        public async Task <bool> SendResultToEHealth(
            Visitor visitor,
            string placeProviderId,
            IPlaceProviderRepository placeProviderRepository,
            IConfiguration configuration
            )
        {
            await SendResultToEHealth(visitor);

            var data = await MakeSurePlaceProviderIsAuthenticated(placeProviderId, placeProviderRepository);

            if (visitor.PersonType == "foreign")
            {
                throw new Exception("Only residents supported right now");
            }
            // session is valid

            if (string.IsNullOrEmpty(visitor.RC))
            {
                throw new Exception("Error - invalid personal number");
            }

            var check = await this.CheckPerson(data.LoginPayload.Session.Token, visitor.RC);

            if (check?.CfdId > 0)
            {
                // ok
            }
            else
            {
                if (configuration["AllowEHealthRegistration"] != "1")
                {
                    return(false);
                }
                var personData = await RegisterPerson(data.LoginPayload.Session.Token, RegisterPersonRequest.FromVisitor(visitor, data.LoginPayload));

                check = await this.CheckPerson(data.LoginPayload.Session.Token, visitor.RC);

                if (check?.CfdId > 0)
                {
                    // ok
                }
                else
                {
                    throw new Exception("Unable to process visitor in ehealth - not found in search");
                }
            }

            var driveIn = await DriveInQueue(data.LoginPayload.Session.Token, DateTimeOffset.Now);

            var place = driveIn.Payload.OrderByDescending(p => p.DailyCapacity).FirstOrDefault();

            var t     = DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss");
            var input = new DriveInRequest()
            {
                DesignatedDriveinCity         = place.City,
                DesignatedDriveinId           = place.Id,
                DesignatedDriveinLatitude     = place.Latitude,
                DesignatedDriveinLongitude    = place.Longitude,
                DesignatedDriveinScheduledAt  = t,
                DesignatedDriveinStreetName   = place.StreetName,
                DesignatedDriveinStreetNumber = place.StreetNumber,
                DesignatedDriveinTitle        = place.Title,
                DesignatedDriveinZipCode      = place.ZipCode,
                MedicalAssessedAt             = t,
                State  = "SD",
                Triage = "2",
            };
            var addPersonToPlace = await AddPersonToTestingPlace(data.LoginPayload.Session.Token, check.CfdId, input);

            if (addPersonToPlace != "1")
            {
                throw new Exception("Unexpected error returned while adding person to place");
            }

            string result;

            switch (visitor.Result)
            {
            case TestResult.PositiveWaitingForCertificate:
            case TestResult.PositiveCertificateTaken:
                result = "POSITIVE";
                break;

            case TestResult.NegativeWaitingForCertificate:
            case TestResult.NegativeCertificateTaken:
            case TestResult.NegativeCertificateTakenTypo:
                result = "NEGATIVE";
                break;

            default:
                throw new Exception($"Unable to determine state: {visitor.Result}");
            }

            var setResultRequest = new CovidMassTesting.Model.EZdravie.Request.SetResultRequest()
            {
                Id                   = 0,
                UserId               = data.LoginPayload.User.Id,
                CovidFormDataId      = check.CfdId,
                FinalResult          = result,
                ScreeningFinalResult = result,
                SpecimenId           = visitor.TestingSet,
                SpecimenCollectedAt  = visitor.TestingTime.Value.ToString("yyyy-MM-dd HH:mm:ss"),
                ScreeningEndedAt     = visitor.TestResultTime?.ToString("yyyy-MM-dd HH:mm:ss") ?? visitor.TestingTime.Value.ToString("yyyy-MM-dd HH:mm:ss"),
            };
            var setResult = await SetTestResultToPerson(data.LoginPayload.Session.Token, setResultRequest);

            return(setResult[0][0].HttpStatusCode == 200);
        }