Ejemplo n.º 1
0
        public bool Check(string keyId, string lockId, DateTime dateTime)
        {
            dateTime = dateTime.ToUniversalTime();
            logger.LogInformation("key {Key} , Lock {Lock}, DateTime {DateTime}", keyId, lockId, dateTime);

            LockSystem system = lockSystem;

            Key  key   = system.QueryKey(keyId);
            Lock @lock = system.QueryLock(lockId);

            var @event = new Event(this.idGenerator.NewId(TableIds.Event, system.Events.Count() + 1),
                                   dateTime, key, @lock, system.HasAccess(key, @lock, dateTime));

            // statementObserver.OnNext(new Statement(TOPIC_RESPONSE, 4711,
            //  $"EK,{@event.Lock.Id},{@event.Key.Id},{@event.IsOpen}"));

            lockSystem.SetValue(x => x.AddEvent(@event));
            return(@event.EventType == EventType.Authorized_Access);
        }
Ejemplo n.º 2
0
        private void Receive(string replyTo, int jobId, string message)
        {
            this.logger.LogInformation($"Receive('{replyTo}', {jobId.ToHex()}, '{message.Shorten()}')");

            LockSystem systemBefore = lockSystem;
            LockSystem systemAfter  = message.Split("\n")
                                      .Where(x => !string.IsNullOrWhiteSpace(x))
                                      .Aggregate(systemBefore, (accu, current) =>
            {
                int index   = current.IndexOf(',');
                string head = index == -1 ? current : current.Substring(0, index);
                if (head.Equals("LE"))
                {
                    return(ListEvents(accu, replyTo, jobId, null));
                }
                else if (head.Equals("LD"))
                {
                    return(ListData(accu, replyTo, jobId));
                }
                else
                {
                    return(accu.DefineStatement(current));
                }
            });

            lockSystem.SetValue(x => systemAfter);

            if (systemBefore != systemAfter)
            {
                var statements = LockSystem.CreatedEntities(systemBefore, systemAfter).Select(entity =>
                {
                    switch (entity)
                    {
                    case Key key:
                        return(DefinedKey(key));

                    case Lock @lock:
                        return(DefinedLock(@lock));

                    case AccessPolicy accessPolicy:
                        return(DefinedAccessPolicy(accessPolicy));

                    case PolicyAssignment assignment:
                        return(DefinedAssignment(assignment));

                    default:
                        throw new ArgumentException(
                            message: "Missing 'DefinedXXX' operation for entity",
                            paramName: nameof(entity));
                    }
                }).Concat(LockSystem.RemovedEntities(systemBefore, systemAfter).Select(entity =>
                {
                    switch (entity)
                    {
                    case Key key:
                        return(RemovedKey(key));

                    case Lock @lock:
                        return(RemovedLock(@lock));

                    default:
                        throw new ArgumentException(
                            message: "Missing 'RemovedXXX' operation for entity",
                            paramName: nameof(entity));
                    }
                })).Concat(LockSystem.UpdatedEntities(systemBefore, systemAfter).Select(entity =>
                {
                    switch (entity)
                    {
                    case Key key:
                        return(UpdatedKey(key));

                    case Lock @lock:
                        return(UpdatedLock(@lock));

                    default:
                        throw new ArgumentException(
                            message: "Missing 'UpdatedXXX' operation for entity",
                            paramName: nameof(entity));
                    }
                }));

                if (!statements.IsEmpty())
                {
                    statements
                    .ToObservable()
                    .Aggregate((accu, current) => accu + "\n" + current)
                    .Select(s => new Statement(replyTo, jobId, s))
                    .Subscribe(this.statementObserver);
                }
            }
        }