示例#1
0
        public async Task <int> RegisterInstance(bool isMaster)
        {
            string currentIp = GetCurrentExternalIP();

            //instance exists
            _logger.LogInformation($"Registering instance with IP: {currentIp}");
            var existingInstance = _instanceRepository.GetAll(n => n.IP == currentIp).FirstOrDefault();

            if (existingInstance != null)
            {
                existingInstance.IsDown   = false;
                existingInstance.IsMaster = isMaster;
                await _instanceRepository.Update(existingInstance);

                return(existingInstance.Id);
            }
            else
            {
                //adding instance
                var newInstance = await _instanceRepository.Create(new Instance()
                {
                    IP          = currentIp,
                    IsAvailable = true,
                    IsDown      = false,
                    IsMaster    = isMaster
                });

                return(newInstance.Id);
            }
        }
示例#2
0
        public async Task <ActionResult <Instance> > Post(string appId, [FromBody] Instance instance)
        {
            (Application appInfo, ActionResult appInfoError) = await GetApplicationOrErrorAsync(appId);

            int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId);

            if (appInfoError != null)
            {
                return(appInfoError);
            }

            if (string.IsNullOrWhiteSpace(instance.InstanceOwner.PartyId))
            {
                return(BadRequest("Cannot create an instance without an instanceOwner.PartyId."));
            }

            // Checking that user is authorized to instantiate.
            XacmlJsonRequestRoot request  = DecisionHelper.CreateDecisionRequest(appInfo.Org, appInfo.Id.Split('/')[1], HttpContext.User, "instantiate", instanceOwnerPartyId, null);
            XacmlJsonResponse    response = await _pdp.GetDecisionForRequest(request);

            if (response?.Response == null)
            {
                _logger.LogInformation($"// Instances Controller // Authorization of instantiation failed with request: {JsonConvert.SerializeObject(request)}.");
                return(Forbid());
            }

            bool authorized = DecisionHelper.ValidatePdpDecision(response.Response, HttpContext.User);

            if (!authorized)
            {
                return(Forbid());
            }

            Instance storedInstance = new Instance();

            try
            {
                DateTime creationTime = DateTime.UtcNow;
                string   userId       = GetUserId();

                Instance instanceToCreate = CreateInstanceFromTemplate(appInfo, instance, creationTime, userId);
                storedInstance = await _instanceRepository.Create(instanceToCreate);
                await DispatchEvent(InstanceEventType.Created, storedInstance);

                _logger.LogInformation($"Created instance: {storedInstance.Id}");
                storedInstance.SetPlatformSelflink(_storageBaseAndHost);

                return(Created(storedInstance.SelfLinks.Platform, storedInstance));
            }
            catch (Exception storageException)
            {
                _logger.LogError($"Unable to create {appId} instance for {instance.InstanceOwner.PartyId} due to {storageException}");

                // compensating action - delete instance
                await _instanceRepository.Delete(storedInstance);

                _logger.LogError($"Deleted instance {storedInstance.Id}");
                return(StatusCode(500, $"Unable to create {appId} instance for {instance.InstanceOwner.PartyId} due to {storageException.Message}"));
            }
        }
示例#3
0
        public async Task <ActionResult> Post(string appId, [FromBody] Instance instance)
        {
            // check if metadata exists
            Application appInfo = GetApplicationOrError(appId, out ActionResult appInfoError);

            if (appInfoError != null)
            {
                return(appInfoError);
            }

            if (string.IsNullOrWhiteSpace(instance.InstanceOwner.PartyId))
            {
                return(BadRequest("Cannot create an instance without an instanceOwner.PartyId."));
            }

            Instance storedInstance = new Instance();

            try
            {
                DateTime creationTime = DateTime.UtcNow;
                string   userId       = GetUserId();

                Instance instanceToCreate = CreateInstanceFromTemplate(appInfo, instance, creationTime, userId);
                storedInstance = await _instanceRepository.Create(instanceToCreate);
                await DispatchEvent(InstanceEventType.Created.ToString(), storedInstance);

                _logger.LogInformation($"Created instance: {storedInstance.Id}");

                AddSelfLinks(Request, storedInstance);

                return(Created(storedInstance.SelfLinks.Platform, storedInstance));
            }
            catch (Exception storageException)
            {
                _logger.LogError($"Unable to create {appId} instance for {instance.InstanceOwner.PartyId} due to {storageException}");

                // compensating action - delete instance
                await _instanceRepository.Delete(storedInstance);

                _logger.LogError($"Deleted instance {storedInstance.Id}");
                return(StatusCode(500, $"Unable to create {appId} instance for {instance.InstanceOwner.PartyId} due to {storageException.Message}"));
            }
        }
示例#4
0
        public async Task <ActionResult> Create(Instance model)
        {
            // check model state exists
            if (!ModelState.IsValid)
            {
                return(RedirectToAction("Index"));
            }

            // async new instance object to the db
            var result = await _repository.Create(model);

            // check if successful and return to appropriate view/error message
            if (!result.Success)
            {
                ModelState.AddModelError("", result.Message);
                return(View(model));
            }
            else
            {
                return(RedirectToAction("Index"));
            }
        }
        public async Task <ActionResult> Post(string appId, int?instanceOwnerId)
        {
            // check if metadata exists
            Application appInfo = GetApplicationOrError(appId, out ActionResult appInfoError);

            if (appInfoError != null)
            {
                return(appInfoError);
            }

            List <Part> parts = ReadAndCheckContent(Request, appInfo, out ActionResult contentError);

            if (contentError != null)
            {
                return(contentError);
            }

            // extract instance template. it should, if it exists, be first part in list
            Instance instanceTemplate = await ExtractInstanceTemplateFromParts(parts);

            // get instanceOwnerId from one out of three possible places
            int ownerId = GetOrLookupInstanceOwnerId(instanceOwnerId, instanceTemplate, out ActionResult instanceOwnerIdError);

            if (instanceOwnerIdError != null)
            {
                return(instanceOwnerIdError);
            }

            if (instanceTemplate == null)
            {
                instanceTemplate = new Instance();
            }

            Instance storedInstance = null;

            try
            {
                DateTime creationTime = DateTime.UtcNow;
                string   userId       = null;

                Instance instanceToCreate = CreateInstanceFromTemplate(appInfo, instanceTemplate, ownerId, creationTime, userId);
                storedInstance = await _instanceRepository.Create(instanceToCreate);
                await DispatchEvent(InstanceEventType.Created.ToString(), storedInstance);

                logger.LogInformation($"Created instance: {storedInstance.Id}");

                if (parts.Any())
                {
                    storedInstance = await SaveDataElementsAndUpdateInstance(parts, storedInstance, creationTime, userId);
                }

                AddSelfLinks(Request, storedInstance);

                return(Ok(storedInstance));
            }
            catch (Exception storageException)
            {
                logger.LogError($"Unable to create {appId} instance for {ownerId} due to {storageException}");

                // compensating action - delete instance
                await _instanceRepository.Delete(storedInstance);

                logger.LogError($"Deleted instance {storedInstance.Id}");

                return(StatusCode(500, $"Unable to create {appId} instance for {ownerId} due to {storageException.Message}"));
            }
        }
示例#6
0
        public async Task <ActionResult> Post(string appId, int?instanceOwnerId, [FromBody] Instance instanceTemplate)
        {
            // check if metadata exists
            Application appInfo = GetApplicationOrError(appId, out ActionResult appInfoErrorResult);

            if (appInfoErrorResult != null)
            {
                return(appInfoErrorResult);
            }

            // get instanceOwnerId from three possible places
            int ownerId = GetOrLookupInstanceOwnerId(instanceOwnerId, instanceTemplate, out ActionResult instanceOwnerErrorResult);

            if (instanceOwnerErrorResult != null)
            {
                return(instanceOwnerErrorResult);
            }

            if (instanceTemplate == null)
            {
                instanceTemplate = new Instance();
            }

            DateTime creationTime = DateTime.UtcNow;

            string org      = appInfo.Org;
            string userName = GetUser(User);

            Instance createdInstance = createdInstance = new Instance()
            {
                InstanceOwnerId = ownerId.ToString(),

                CreatedBy           = userName,
                CreatedDateTime     = creationTime,
                LastChangedBy       = userName,
                LastChangedDateTime = creationTime,
                AppId = appId,
                Org   = org,

                VisibleDateTime   = DateTimeHelper.ConvertToUniversalTime(instanceTemplate.VisibleDateTime),
                DueDateTime       = DateTimeHelper.ConvertToUniversalTime(instanceTemplate.DueDateTime),
                Labels            = instanceTemplate.Labels,
                PresentationField = instanceTemplate.PresentationField,

                InstanceState = new InstanceState {
                    IsArchived = false, IsDeleted = false, IsMarkedForHardDelete = false
                },
            };

            if (instanceTemplate.Process != null)
            {
                createdInstance.Process = instanceTemplate.Process;
            }
            else
            {
                createdInstance.Process = new ProcessState {
                    CurrentTask = "FormFilling_1", IsComplete = false
                };
            }

            try
            {
                Instance result = await _instanceRepository.Create(createdInstance);

                SetSelfLinks(result);

                return(Ok(result));
            }
            catch (Exception e)
            {
                logger.LogError($"Unable to create {appId} instance for {ownerId} due to {e}");
                return(StatusCode(500, $"Unable to create {appId} instance for {ownerId} due to {e}"));
            }
        }