public async Task <IActionResult> Create([FromBody] RawTrigger raw)
        {
            Trigger trigger;
            var     invalidInput = new Response <string>();

            trigger = null;

            if (raw == null)
            {
                return(this.UnprocessableEntity(invalidInput));
            }

            var type = raw.Type;

            if (string.IsNullOrEmpty(raw.SensorId) || !ObjectId.TryParse(raw.SensorId, out _))
            {
                invalidInput.AddError("Invalid value in the 'sensorId' field.");
                return(this.UnprocessableEntity(invalidInput));
            }

            var auth = await this.AuthenticateUserForSensor(raw.SensorId).ConfigureAwait(false);

            if (!auth)
            {
                return(this.CreateNotAuthorizedResult());
            }

            if (type == TriggerType.EdgeTrigger)
            {
                trigger = CreateNumberTrigger(raw);
            }
            else if (type == TriggerType.Regex)
            {
                trigger = CreateNaturalLanguageTrigger(raw, invalidInput);
            }

            if (trigger == null)
            {
                return(this.UnprocessableEntity(invalidInput));
            }

            trigger.Type = type;
            await this.m_triggers.CreateAsync(trigger).ConfigureAwait(false);

            await this.m_mqtt.PublishCommandAsync(CommandType.AddSensor, raw.SensorId).ConfigureAwait(false);

            return(this.CreatedAtAction(nameof(this.GetById), new { triggerId = trigger.ID },
                                        new Response <Trigger>(trigger)));
        }
        private static Trigger CreateNaturalLanguageTrigger(RawTrigger raw, Response <string> errorResponse)
        {
            if (string.IsNullOrEmpty(raw.FormalLanguage))
            {
                errorResponse.AddError("Missing a formal language definition!");
                return(null);
            }

            var trigger = new Trigger {
                FormalLanguage = raw.FormalLanguage,
                SensorID       = raw.SensorId,
                KeyValue       = nameof(Message.Data)
            };

            return(trigger);
        }
        private static Trigger CreateNumberTrigger(RawTrigger raw)
        {
            if ((raw.LowerEdge != null || raw.UpperEdge != null) && raw.KeyValue == null)
            {
                return(null);
            }

            if (string.IsNullOrEmpty(raw.KeyValue))
            {
                return(null);
            }

            var trigger = new Trigger {
                KeyValue  = raw.KeyValue,
                UpperEdge = raw.UpperEdge,
                LowerEdge = raw.LowerEdge,
                SensorID  = raw.SensorId,
            };

            return(trigger);
        }