Esempio n. 1
0
        public VEVENT RandomlyAttend(VEVENT @event, IEnumerable<ATTENDEE> attendees)
        {
            var max = attendees.Count();
            var atts = attendees as IList<ATTENDEE> ?? attendees.ToList();
            @event.Attendees.AddRange(Pick<ATTENDEE>
                .UniqueRandomList(With.Between(1, max)).From(atts));

            return @event;
        }
Esempio n. 2
0
        public void Post(PatchEvents request)
        {
            try
            {
                var source = new VEVENT
                {
                    Start = request.Start,
                    Classification = request.Classification,
                    Description = request.Description,
                    GeoPosition = request.Position,
                    Location = request.Location,
                    Organizer = request.Organizer,
                    Priority = request.Priority,
                    Sequence = request.Sequence,
                    Status = request.Status,
                    Summary = request.Summary,
                    Transparency = request.Transparency,
                    Url = request.Url,
                    RecurrenceRule = request.RecurrenceRule,
                    End = request.End,
                    Duration = request.Duration,
                    Attachments = request.Attachments,
                    Attendees = request.Attendees,
                    Categories = request.Categories,
                    Comments = request.Comments,
                    Contacts = request.Contacts,
                    ExceptionDates = request.ExceptionDates,
                    RequestStatuses = request.RequestStatuses,
                    Resources = request.Resources,
                    RelatedTos = request.RelatedTos,
                    Alarms = request.Alarms,
                };

                var fields = new List<string>();
                if (source.Start != default(DATE_TIME)) fields.Add("Start");
                if (source.Classification != default(CLASS)) fields.Add("Classification");
                if (source.Description != null) fields.Add("Description");
                if (source.GeoPosition != default(GEO)) fields.Add("Position");
                if (source.Location != null) fields.Add("Location");
                if (source.Organizer != null) fields.Add("Organizer");
                if (source.Priority != default(PRIORITY)) fields.Add("Priority");
                if (source.Sequence != default(int)) fields.Add("Sequence");
                if (source.Status != default(STATUS)) fields.Add("Status");
                if (source.Summary != null) fields.Add("Summary");
                if (source.Transparency != default(TRANSP)) fields.Add("Transparency");
                if (source.Url != default(URL)) fields.Add("Url");
                if (source.RecurrenceRule != null) fields.Add("RecurrenceRule");
                if (source.End != default(DATE_TIME)) fields.Add("End");
                if (source.Duration != default(DURATION)) fields.Add("Duration");
                if (source.Categories != null) fields.Add("Categories");
                if (source.Attachments != null) fields.Add("Attachments");
                if (source.Attendees != null) fields.Add("Attendees");
                if (source.Comments != null) fields.Add("Comments");
                if (source.Contacts != null) fields.Add("Contacts");
                if (source.ExceptionDates != null) fields.Add("ExceptionDates");
                if (source.RequestStatuses != null) fields.Add("RequestStatuses");
                if (source.Resources != null) fields.Add("Resources");
                if (source.RelatedTos != null) fields.Add("RelatedTos");
                if (source.Alarms != null) fields.Add("Alarms");
                
                eventRepository.Patch(source, fields, request.EventIds);

                var cacheKey = keyBuilder.Build(request, x => x.EventIds).ToString();
                RequestContext.RemoveFromCache(Cache, cacheKey);
            }
            catch (InvalidOperationException ex)
            {
                logger.Error(ex.ToString());
                throw;
            }
            catch (ApplicationException ex)
            {
                logger.Error(ex.ToString());
                throw;
            }
            catch (Exception ex)
            {
                logger.Error(ex.ToString()); 
                throw;
            }
        }
        public VEVENT Hydrate(VEVENT dry)
        {
            using (var db = factory.OpenDbConnection())
            {
                var organizers = db.Select<ORGANIZER, VEVENT, REL_EVENTS_ORGANIZERS>(
                    r => r.OrganizerId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                if (!organizers.NullOrEmpty()) dry.Organizer = organizers.First();

                var recurs = db.Select<RECUR, VEVENT, REL_EVENTS_RECURS>(
                    r => r.RecurId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                if (!recurs.NullOrEmpty()) dry.RecurrenceRule = recurs.First();

                var attachbins = db.Select<ATTACH_BINARY, VEVENT, REL_EVENTS_ATTACHBINS>(
                    r => r.AttachmentId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                if (!attachbins.NullOrEmpty()) dry.Attachments.MergeRange(attachbins);

                var attachuris = db.Select<ATTACH_URI, VEVENT, REL_EVENTS_ATTACHURIS>(
                    r => r.AttachmentId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                if (!attachuris.NullOrEmpty()) dry.Attachments.MergeRange(attachuris);

                var attendees = db.Select<ATTENDEE, VEVENT, REL_EVENTS_ATTENDEES>(
                    r => r.AttendeeId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                if (!attendees.NullOrEmpty()) dry.Attendees.MergeRange(attendees);

                var comments = db.Select<COMMENT, VEVENT, REL_EVENTS_COMMENTS>(
                    r => r.CommentId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                if (!comments.NullOrEmpty()) dry.Comments.MergeRange(comments);

                var contacts = db.Select<CONTACT, VEVENT, REL_EVENTS_CONTACTS>(
                    r => r.ContactId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                if (!contacts.NullOrEmpty()) dry.Contacts.MergeRange(contacts);

                var rdates = db.Select<RDATE, VEVENT, REL_EVENTS_RDATES>(
                    r => r.RecurrenceDateId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                if (!rdates.NullOrEmpty()) dry.RecurrenceDates.MergeRange(rdates);

                var exdates = db.Select<EXDATE, VEVENT, REL_EVENTS_EXDATES>(
                    r => r.ExceptionDateId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                if (!exdates.NullOrEmpty()) dry.ExceptionDates.MergeRange(exdates);

                var relatedtos = db.Select<RELATEDTO, VEVENT, REL_EVENTS_RELATEDTOS>(
                    r => r.RelatedToId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                dry.RelatedTos.MergeRange(relatedtos);

                var reqstats = db.Select<REQUEST_STATUS, VEVENT, REL_EVENTS_REQSTATS>(
                    r => r.ReqStatsId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                dry.RequestStatuses.MergeRange(reqstats);

                var resources = db.Select<RESOURCES, VEVENT, REL_EVENTS_RESOURCES>(
                    r => r.ResourcesId,
                    r => r.EventId,
                    e => e.Id == dry.Id);
                if (!resources.NullOrEmpty()) dry.Resources.MergeRange(resources);

                var raalarms = db.Select<REL_EVENTS_AUDIO_ALARMS>(q => q.EventId == dry.Id);
                if (!raalarms.NullOrEmpty())
                {
                    dry.Alarms.MergeRange(aalarmrepository.FindAll(raalarms.Select(x => x.AlarmId).ToList()));
                }

                var rdalarms = db.Select<REL_EVENTS_DISPLAY_ALARMS>(q => q.EventId == dry.Id);
                if (!rdalarms.NullOrEmpty())
                {
                    dry.Alarms.MergeRange(dalarmrepository.FindAll(rdalarms.Select(x => x.AlarmId).ToList()));
                }

                var realarms = db.Select<REL_EVENTS_EMAIL_ALARMS>(q => q.EventId == dry.Id);
                if (!realarms.NullOrEmpty())
                {
                    dry.Alarms.MergeRange(ealarmrepository.FindAll(realarms.Select(x => x.AlarmId).ToList()));
                } 
            }

            return dry;
        }
        public void Save(VEVENT entity)
        {
            #region retrieve attributes of entity

            var organizer = entity.Organizer;
            var recur = entity.RecurrenceRule;
            var attendees = entity.Attendees;
            var attachbins = entity.Attachments.OfType<ATTACH_BINARY>().ToList();
            var attachuris = entity.Attachments.OfType<ATTACH_URI>().ToList();
            var contacts = entity.Contacts;
            var comments = entity.Comments;
            var rdates = entity.RecurrenceDates;
            var exdates = entity.ExceptionDates;
            var relateds = entity.RelatedTos;
            var resources = entity.Resources;
            var reqstats = entity.RequestStatuses;
            var aalarms = entity.Alarms.OfType<AUDIO_ALARM>().ToList();
            var dalarms = entity.Alarms.OfType<DISPLAY_ALARM>().ToList();
            var ealarms = entity.Alarms.OfType<EMAIL_ALARM>().ToList();

            #endregion retrieve attributes of entity

            #region save event and its attributes

            using (var db = factory.OpenDbConnection())
            {
                db.Save(entity);

                var ororgs = db.Select<REL_EVENTS_ORGANIZERS>(q => q.EventId == entity.Id);
                var orrecurs = db.Select<REL_EVENTS_RECURS>(q => q.EventId == entity.Id);
                var orattendees = db.Select<REL_EVENTS_ATTENDEES>(q => q.EventId == entity.Id);
                var orattachbins = db.Select<REL_EVENTS_ATTACHBINS>(q => q.EventId == entity.Id);
                var orattachuris = db.Select<REL_EVENTS_ATTACHURIS>(q => q.EventId == entity.Id);
                var orcontacts = db.Select<REL_EVENTS_CONTACTS>(q => q.EventId == entity.Id);
                var orcomments = db.Select<REL_EVENTS_COMMENTS>(q => q.EventId == entity.Id);
                var orrdates = db.Select<REL_EVENTS_RDATES>(q => q.EventId == entity.Id);
                var orexdates = db.Select<REL_EVENTS_EXDATES>(q => q.EventId == entity.Id);
                var orrelateds = db.Select<REL_EVENTS_RELATEDTOS>(q => q.EventId == entity.Id);
                var orresources = db.Select<REL_EVENTS_RESOURCES>(q => q.EventId == entity.Id);
                var orreqstats = db.Select<REL_EVENTS_REQSTATS>(q => q.EventId == entity.Id);
                var oraalarms = db.Select<REL_EVENTS_AUDIO_ALARMS>(q => q.EventId == entity.Id);
                var ordalarms = db.Select<REL_EVENTS_DISPLAY_ALARMS>(q => q.EventId == entity.Id);
                var orealarms = db.Select<REL_EVENTS_EMAIL_ALARMS>(q => q.EventId == entity.Id);

                if (organizer != null)
                {
                    db.Save(organizer);
                    var rorg = new REL_EVENTS_ORGANIZERS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        OrganizerId = organizer.Id
                    };

                    db.MergeAll<REL_EVENTS_ORGANIZERS, Guid>(rorg.ToSingleton(), ororgs);
                }
                else db.RemoveAll<REL_EVENTS_ORGANIZERS, Guid>(ororgs);

                if (recur != null)
                {
                    db.Save(recur);
                    var rrecur = new REL_EVENTS_RECURS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        RecurId = recur.Id
                    };

                    db.MergeAll<REL_EVENTS_RECURS, Guid>(rrecur.ToSingleton(), orrecurs);
                }
                else db.RemoveAll<REL_EVENTS_RECURS, Guid>(orrecurs);

                if (!attendees.NullOrEmpty())
                {
                    db.SaveAll(attendees.Distinct());
                    var rattendees = attendees.Select(x => new REL_EVENTS_ATTENDEES
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AttendeeId = x.Id
                    });

                    db.MergeAll<REL_EVENTS_ATTENDEES, Guid>(rattendees, orattendees);
                }
                else db.RemoveAll<REL_EVENTS_ATTENDEES, Guid>(orattendees);

                if (!attachbins.NullOrEmpty())
                {
                    db.SaveAll(attachbins.Distinct());
                    var rattachbins = attachbins.Select(x => new REL_EVENTS_ATTACHBINS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AttachmentId = x.Id
                    });
                    db.MergeAll<REL_EVENTS_ATTACHBINS, Guid>(rattachbins, orattachbins);
                }
                else db.RemoveAll<REL_EVENTS_ATTACHBINS, Guid>(orattachbins);

                if (!attachuris.NullOrEmpty())
                {
                    db.SaveAll(attachuris.Distinct());
                    var rattachuris = attachuris.Select(x => new REL_EVENTS_ATTACHURIS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AttachmentId = x.Id
                    });
                    db.MergeAll(rattachuris, orattachuris);
                }
                else db.RemoveAll(orattachuris);

                if (!contacts.NullOrEmpty())
                {
                    db.SaveAll(contacts.Distinct());
                    var rcontacts = contacts.Select(x => new REL_EVENTS_CONTACTS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        ContactId = x.Id
                    });
                    db.MergeAll(rcontacts, orcontacts);
                }
                else db.RemoveAll(orcontacts);

                if (!comments.NullOrEmpty())
                {
                    db.SaveAll(comments.Distinct());
                    var rcomments = comments.Select(x => new REL_EVENTS_COMMENTS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        CommentId = x.Id
                    });
                    db.MergeAll(rcomments, orcomments);
                }
                else db.RemoveAll(orcomments);

                if (!rdates.NullOrEmpty())
                {
                    db.SaveAll(rdates.Distinct());
                    var rrdates = rdates.Select(x => new REL_EVENTS_RDATES
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        RecurrenceDateId = x.Id
                    });
                    db.MergeAll(rrdates, orrdates);
                }
                else db.RemoveAll(orrdates);

                if (!exdates.NullOrEmpty())
                {
                    db.SaveAll(exdates.Distinct());
                    var rexdates = exdates.Select(x => new REL_EVENTS_EXDATES
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        ExceptionDateId = x.Id
                    });
                    db.MergeAll(rexdates, orexdates);
                }
                else db.RemoveAll(orexdates);

                if (!relateds.NullOrEmpty())
                {
                    db.SaveAll(relateds.Distinct());
                    var rrelateds = relateds.Select(x => new REL_EVENTS_RELATEDTOS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        RelatedToId = x.Id
                    });
                    db.MergeAll(rrelateds, orrelateds);
                }
                else db.RemoveAll(orrelateds);

                if (!resources.NullOrEmpty())
                {
                    db.SaveAll(resources.Distinct());
                    var rresources = resources.Select(x => new REL_EVENTS_RESOURCES
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        ResourcesId = x.Id
                    });
                    db.MergeAll(rresources, orresources);
                }
                else db.RemoveAll(orresources);

                if (!reqstats.NullOrEmpty())
                {
                    db.SaveAll(reqstats.Distinct());
                    var rreqstats = reqstats.Select(x => new REL_EVENTS_REQSTATS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        ReqStatsId = x.Id
                    });
                    db.MergeAll(rreqstats, orreqstats);
                }
                else db.RemoveAll(orreqstats);

                if (!aalarms.NullOrEmpty())
                {
                    aalarmrepository.SaveAll(aalarms.Distinct());
                    var raalarms = aalarms.Select(x => new REL_EVENTS_AUDIO_ALARMS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AlarmId = x.Id
                    });
                    db.MergeAll(raalarms, oraalarms);
                }
                else db.RemoveAll(orealarms);

                if (!dalarms.NullOrEmpty())
                {
                    dalarmrepository.SaveAll(dalarms.Distinct());
                    var rdalarms = dalarms.Select(x => new REL_EVENTS_DISPLAY_ALARMS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AlarmId = x.Id
                    });
                    db.MergeAll(rdalarms, ordalarms);
                }
                else db.RemoveAll(ordalarms);

                if (!ealarms.NullOrEmpty())
                {
                    ealarmrepository.SaveAll(ealarms.Distinct());
                    var realarms = ealarms.Select(x => new REL_EVENTS_EMAIL_ALARMS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AlarmId = x.Id
                    });
                    db.MergeAll(realarms, orealarms);
                }
                else db.RemoveAll(orealarms); 
            }

            #endregion save event and its attributes
        }
        public void Patch(VEVENT source, IEnumerable<string> fields, IEnumerable<Guid> keys = null)
        {
            #region construct anonymous fields using expression lambdas

            Expression<Func<VEVENT, object>> primitives = x => new
            {
                x.Uid,
                x.Start,
                x.Created,
                x.Description,
                x.Classification,
                Position = x.GeoPosition,
                x.LastModified,
                x.Location,
                x.Priority,
                x.Sequence,
                x.Status,
                x.Summary,
                x.Transparency,
                x.Url,
                x.End,
                x.Categories,
                x.Duration,
                x.RecurrenceRule
            };

            Expression<Func<VEVENT, object>> relations = x => new
            {
                x.Attendees,
                x.Attachments,
                x.Contacts,
                x.Comments,
                x.RecurrenceDates,
                x.ExceptionDates,
                x.RelatedTos,
                x.Resources,
                x.RequestStatuses,
                x.Alarms,
                x.Organizer,
                x.RecurrenceId,
            };

            //4. Get list of selected relationals
            var selection = fields as IList<string> ?? fields.ToList();
            var srelation = relations.GetMemberNames().Intersect(selection, StringComparer.OrdinalIgnoreCase);

            //5. Get list of selected primitives
            var sprimitives = primitives.GetMemberNames().Intersect(selection, StringComparer.OrdinalIgnoreCase);

            #endregion construct anonymous fields using expression lambdas

            using (var db = factory.OpenDbConnection())
            {
                var okeys = (keys != null)
                    ? db.SelectParam<VEVENT, Guid>(q => q.Id, p => Sql.In(p.Id, keys.ToArray())).ToArray()
                    : db.SelectParam<VEVENT, Guid>(q => q.Id).ToArray();

                if (!srelation.NullOrEmpty())
                {
                    Expression<Func<VEVENT, object>> orgexpr = y => y.Organizer;
                    Expression<Func<VEVENT, object>> recurexpr = y => y.RecurrenceRule;
                    Expression<Func<VEVENT, object>> attendsexpr = y => y.Attendees;
                    Expression<Func<VEVENT, object>> attachsexpr = y => y.Attachments;
                    Expression<Func<VEVENT, object>> contactsexpr = y => y.Contacts;
                    Expression<Func<VEVENT, object>> commentsexpr = y => y.Comments;
                    Expression<Func<VEVENT, object>> rdatesexpr = y => y.RecurrenceDates;
                    Expression<Func<VEVENT, object>> exdatesexpr = y => y.ExceptionDates;
                    Expression<Func<VEVENT, object>> relatedtosexpr = y => y.RelatedTos;
                    Expression<Func<VEVENT, object>> resourcesexpr = y => y.Resources;
                    Expression<Func<VEVENT, object>> reqstatsexpr = y => y.RequestStatuses;
                    Expression<Func<VEVENT, object>> alarmsexpr = y => y.Alarms;


                    #region save relational attributes of entities

                    if (selection.Contains(orgexpr.GetMemberName()))
                    {
                        var ororgs = db.Select<REL_EVENTS_ORGANIZERS>(q => Sql.In(q.EventId, okeys));
                        if (source.Organizer != null)
                        {
                            db.Save(source.Organizer);
                            var rorgs = okeys.Select(x => new REL_EVENTS_ORGANIZERS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                OrganizerId = source.Organizer.Id
                            });
                            db.RemoveAll(ororgs);
                            db.SaveAll(rorgs);
                        }
                        else db.RemoveAll(ororgs);
                    }

                    if (selection.Contains(recurexpr.GetMemberName()))
                    {
                        var orrecurs = db.Select<REL_EVENTS_RECURS>(q => Sql.In(q.EventId, okeys));
                        if (source.RecurrenceRule != null)
                        {
                            db.Save(source.RecurrenceRule);
                            var rrecurs = okeys.Select(x => new REL_EVENTS_RECURS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                RecurId = source.RecurrenceRule.Id
                            });
                            db.RemoveAll(orrecurs);
                            db.SaveAll(rrecurs);
                        }
                        else db.RemoveAll(orrecurs);
                    }

                    if (selection.Contains(attendsexpr.GetMemberName()))
                    {
                        var orattendees = db.Select<REL_EVENTS_ATTENDEES>(q => Sql.In(q.EventId, okeys));
                        if (!source.Attendees.NullOrEmpty())
                        {
                            db.SaveAll(source.Attendees.Distinct());
                            var rattendees = okeys.SelectMany(x => source.Attendees.Select(y => new REL_EVENTS_ATTENDEES
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AttendeeId = y.Id
                            }));
                            db.RemoveAll(orattendees);
                            db.SaveAll(rattendees);
                        }
                        db.RemoveAll(orattendees);
                    }

                    if (selection.Contains(attachsexpr.GetMemberName()))
                    {
                        var attachbins = source.Attachments.OfType<ATTACH_BINARY>();
                        var attachuris = source.Attachments.OfType<ATTACH_URI>();

                        var orattachbins = db.Select<REL_EVENTS_ATTACHBINS>(q => Sql.In(q.EventId, okeys));
                        if (attachbins.Any())
                        {
                            db.SaveAll(attachbins);
                            var rattachbins = okeys.SelectMany(x => attachbins.Select(y => new REL_EVENTS_ATTACHBINS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AttachmentId = y.Id
                            }));

                            db.RemoveAll(orattachbins);
                            db.SaveAll(rattachbins);
                        }
                        else db.RemoveAll(orattachbins);

                        var orattachuris = db.Select<REL_EVENTS_ATTACHURIS>(q => Sql.In(q.EventId, okeys));
                        if (attachuris.Any())
                        {
                            db.SaveAll(attachuris);
                            var rattachuris = okeys.SelectMany(x => attachuris.Select(y => new REL_EVENTS_ATTACHURIS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AttachmentId = y.Id
                            }));
                            db.RemoveAll(orattachuris);
                            db.SaveAll(rattachuris);
                        }
                        else db.RemoveAll(orattachuris);
                    }


                    if (selection.Contains(contactsexpr.GetMemberName()))
                    {
                        var orcontacts = db.Select<REL_EVENTS_CONTACTS>(q => Sql.In(q.EventId, okeys));
                        if (!source.Contacts.NullOrEmpty())
                        {
                            db.SaveAll(source.Contacts.Distinct());
                            var rcontacts = okeys.SelectMany(x => source.Contacts.Select(y => new REL_EVENTS_CONTACTS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                ContactId = y.Id
                            }));
                            db.RemoveAll(orcontacts);
                            db.SaveAll(rcontacts);
                        }
                        else db.RemoveAll(orcontacts);
                    }

                    if (selection.Contains(commentsexpr.GetMemberName()))
                    {
                        var orcomments = db.Select<REL_EVENTS_COMMENTS>(q => Sql.In(q.EventId, okeys));
                        if (!source.Comments.NullOrEmpty())
                        {
                            db.SaveAll(source.Comments.Distinct());
                            var rcomments = okeys.SelectMany(x => source.Comments.Select(y => new REL_EVENTS_COMMENTS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                CommentId = y.Id
                            }));
                            db.RemoveAll(orcomments);
                            db.SaveAll(rcomments);
                        }
                        else db.RemoveAll(orcomments);
                    }

                    if (selection.Contains(rdatesexpr.GetMemberName()))
                    {
                        var orrdates = db.Select<REL_EVENTS_RDATES>(q => Sql.In(q.EventId, okeys));
                        if (!source.RecurrenceDates.NullOrEmpty())
                        {
                            db.SaveAll(source.RecurrenceDates.Distinct());
                            var rrdates = okeys.SelectMany(x => source.RecurrenceDates.Select(y => new REL_EVENTS_RDATES
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                RecurrenceDateId = y.Id
                            }));
                            db.RemoveAll(orrdates);
                            db.SaveAll(rrdates);
                        }
                        else db.RemoveAll(orrdates);
                    }

                    if (selection.Contains(exdatesexpr.GetMemberName()))
                    {
                        var orexdates = db.Select<REL_EVENTS_EXDATES>(q => Sql.In(q.EventId, okeys));
                        if (!source.ExceptionDates.NullOrEmpty())
                        {
                            db.SaveAll(source.ExceptionDates.Distinct());
                            var rexdates = okeys.SelectMany(x => source.ExceptionDates.Select(y => new REL_EVENTS_EXDATES
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                ExceptionDateId = y.Id
                            }));
                            db.RemoveAll(orexdates);
                            db.SaveAll(rexdates);
                        }
                        else db.RemoveAll(orexdates);
                    }

                    if (selection.Contains(relatedtosexpr.GetMemberName()))
                    {
                        var orrelatedtos = db.Select<REL_EVENTS_RELATEDTOS>(q => Sql.In(q.EventId, okeys));
                        if (!source.RelatedTos.NullOrEmpty())
                        {
                            db.SaveAll(source.RelatedTos.Distinct());
                            var rrelatedtos = okeys.SelectMany(x => source.RelatedTos.Select(y => new REL_EVENTS_RELATEDTOS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                RelatedToId = y.Id
                            }));

                            db.RemoveAll(orrelatedtos);
                            db.SaveAll(rrelatedtos);
                        }
                        else db.RemoveAll(orrelatedtos);
                    }

                    if (selection.Contains(resourcesexpr.GetMemberName()))
                    {
                        var orresources = db.Select<REL_EVENTS_RESOURCES>(q => Sql.In(q.EventId, okeys));
                        if (!source.Resources.NullOrEmpty())
                        {
                            db.SaveAll(source.Resources.Distinct());
                            var rresources = okeys.SelectMany(x => source.Resources.Select(y => new REL_EVENTS_RESOURCES
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                ResourcesId = y.Id
                            }));
                            db.RemoveAll(orresources);
                            db.SaveAll(rresources);
                        }
                        else db.RemoveAll(orresources);
                    }

                    if (selection.Contains(reqstatsexpr.GetMemberName()))
                    {
                        var orreqstats = db.Select<REL_EVENTS_REQSTATS>(q => Sql.In(q.EventId, okeys));
                        if (!source.RequestStatuses.NullOrEmpty())
                        {
                            db.SaveAll(source.RequestStatuses.Distinct());
                            var rreqstats = okeys.SelectMany(x => source.RequestStatuses.Select(y => new REL_EVENTS_REQSTATS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                ReqStatsId = y.Id
                            }));
                            db.RemoveAll(orreqstats);
                            db.SaveAll(rreqstats);
                        }
                        else db.RemoveAll(orreqstats);
                    }

                    if (selection.Contains(alarmsexpr.GetMemberName()))
                    {
                        var aalarms = source.Alarms.OfType<AUDIO_ALARM>();
                        var ealarms = source.Alarms.OfType<EMAIL_ALARM>();
                        var dalarms = source.Alarms.OfType<DISPLAY_ALARM>();

                        var oraalarms = db.Select<REL_EVENTS_AUDIO_ALARMS>(q => Sql.In(q.EventId, okeys));
                        if (aalarms.Any())
                        {
                            aalarmrepository.SaveAll(aalarms);
                            var raalarms = okeys.SelectMany(x => source.Alarms.Select(y => new REL_EVENTS_AUDIO_ALARMS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AlarmId = y.Id
                            }));
                            db.RemoveAll(oraalarms);
                            db.SaveAll(raalarms);
                        }
                        else db.RemoveAll(oraalarms);

                        var ordalarms = db.Select<REL_EVENTS_DISPLAY_ALARMS>(q => Sql.In(q.EventId, okeys));
                        if (dalarms.Any())
                        {
                            dalarmrepository.SaveAll(dalarms);
                            var rdalarms = okeys.SelectMany(x => dalarms.Select(y => new REL_EVENTS_DISPLAY_ALARMS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AlarmId = y.Id
                            }));
                            db.RemoveAll(ordalarms);
                            db.SaveAll(rdalarms);
                        }
                        else db.RemoveAll(ordalarms);

                        var orealarms = db.Select<REL_EVENTS_EMAIL_ALARMS>(q => Sql.In(q.EventId, okeys));
                        if (ealarms.Any())
                        {
                            ealarmrepository.SaveAll(ealarms);
                            var realarms = okeys.SelectMany(x => ealarms.Select(y => new REL_EVENTS_EMAIL_ALARMS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AlarmId = y.Id
                            }));

                            db.RemoveAll(orealarms);
                            db.SaveAll(realarms);
                        }
                        else db.RemoveAll(orealarms);
                    }

                    #endregion save relational attributes of entities
                }

                var sprimitivelist = sprimitives as IList<string> ?? sprimitives.ToList();
                if (!sprimitivelist.NullOrEmpty())
                {
                    var patchstr = $"f => new {{ {string.Join(", ", sprimitivelist.Select(x => $"f.{x}"))} }}";

                    var patchexpr = patchstr.CompileToExpressionFunc<VEVENT, object>(
                        CodeDomLanguage.csharp,
                        "System.dll", "System.Core.dll",
                        typeof(CalendarWriter).Assembly.Location,
                        typeof(VEVENT).Assembly.Location,
                        typeof(IContainsKey<Guid>).Assembly.Location);

                    if (!okeys.NullOrEmpty()) db.UpdateOnly(source, patchexpr, q => Sql.In(q.Id, okeys.ToArray()));
                    else db.UpdateOnly(source, patchexpr);
                } 
            }
        }
 public VEVENT Dehydrate(VEVENT @event)
 {
     if (@event.Organizer != null) @event.Organizer = null;
     if (@event.RecurrenceRule != null) @event.RecurrenceRule = null;
     if (@event.Attendees.Any()) @event.Attendees.Clear();
     if (@event.Attachments.Any()) @event.Attachments.Clear();
     if (@event.Contacts.Any()) @event.Contacts.Clear();
     if (@event.Comments.Any()) @event.Comments.Clear();
     if (@event.RecurrenceDates.Any()) @event.RecurrenceDates.Clear();
     if (@event.ExceptionDates.Any()) @event.ExceptionDates.Clear();
     if (@event.RelatedTos.Any()) @event.RelatedTos.Clear();
     if (@event.RequestStatuses.Any()) @event.RequestStatuses.Clear();
     if (@event.Resources.Any()) @event.Resources.Clear();
     if (@event.Alarms.Any()) @event.Alarms.Clear();
     return @event;
 }
Esempio n. 7
0
        public VEVENT Hydrate(VEVENT dry)
        {
            if (dry != null)
            {
                var rrecurs = redis.As<REL_EVENTS_RECURS>().GetAll().Where(x => x.EventId == dry.Id).ToList();
                if (!rrecurs.NullOrEmpty())
                {
                    dry.RecurrenceRule = redis.As<RECUR>().GetById(rrecurs.FirstOrDefault().RecurId);
                }

                var rorgs = redis.As<REL_EVENTS_ORGANIZERS>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rorgs.NullOrEmpty())
                {
                    dry.Organizer = redis.As<ORGANIZER>().GetById(rorgs.FirstOrDefault().OrganizerId);
                }

                var rattachbins = redis.As<REL_EVENTS_ATTACHBINS>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rattachbins.NullOrEmpty())
                {
                    dry.Attachments.MergeRange(redis.As<ATTACH_BINARY>().GetByIds(rattachbins.Select(x => x.AttachmentId).ToList()));
                }

                var rattachuris = redis.As<REL_EVENTS_ATTACHURIS>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rattachuris.NullOrEmpty())
                {
                    dry.Attachments.MergeRange(redis.As<ATTACH_URI>().GetByIds(rattachuris.Select(x => x.AttachmentId).ToList()));
                }

                var rattendees = redis.As<REL_EVENTS_ATTENDEES>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rattendees.NullOrEmpty())
                {
                    dry.Attendees.MergeRange(redis.As<ATTENDEE>().GetByIds(rattendees.Select(x => x.AttendeeId).ToList()));
                }

                var rcomments = redis.As<REL_EVENTS_COMMENTS>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rcomments.NullOrEmpty())
                {
                    dry.Comments.MergeRange(redis.As<COMMENT>().GetByIds(rcomments.Select(x => x.CommentId).ToList()));
                }

                var rcontacts = redis.As<REL_EVENTS_CONTACTS>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rcontacts.NullOrEmpty())
                {
                    dry.Contacts.MergeRange(redis.As<CONTACT>().GetByIds(rcontacts.Select(x => x.ContactId).ToList()));
                }

                var rrdates = redis.As<REL_EVENTS_RDATES>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rrdates.NullOrEmpty())
                {
                    dry.RecurrenceDates.MergeRange(redis.As<RDATE>().GetByIds(rrdates.Select(x => x.RecurrenceDateId).ToList()));
                }

                var rexdates = redis.As<REL_EVENTS_EXDATES>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rexdates.NullOrEmpty())
                {
                    dry.ExceptionDates.MergeRange(redis.As<EXDATE>().GetByIds(rexdates.Select(x => x.ExceptionDateId).ToList()));
                }

                var rrelatedtos = redis.As<REL_EVENTS_RELATEDTOS>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rrelatedtos.NullOrEmpty())
                {
                    dry.RelatedTos.MergeRange(redis.As<RELATEDTO>().GetByIds(rrelatedtos.Select(x => x.RelatedToId).ToList()));
                }

                var rreqstats = redis.As<REL_EVENTS_REQSTATS>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rreqstats.NullOrEmpty())
                {
                    dry.RequestStatuses.MergeRange(redis.As<REQUEST_STATUS>().GetByIds(rreqstats.Select(x => x.ReqStatsId).ToList()));
                }

                var rresources = redis.As<REL_EVENTS_RESOURCES>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rresources.NullOrEmpty())
                {
                    dry.Resources.MergeRange(redis.As<RESOURCES>().GetByIds(rresources.Select(x => x.ResourcesId).ToList()));
                }

                var raalarms = redis.As<REL_EVENTS_AUDIO_ALARMS>().GetAll().Where(x => x.EventId == dry.Id);
                if (!raalarms.NullOrEmpty())
                {
                    dry.Alarms.MergeRange(aalarmrepository.FindAll(raalarms.Select(x => x.AlarmId).ToList()));
                }

                var rdalarms = redis.As<REL_EVENTS_DISPLAY_ALARMS>().GetAll().Where(x => x.EventId == dry.Id);
                if (!rdalarms.NullOrEmpty())
                {
                    dry.Alarms.MergeRange(dalarmrepository.FindAll(rdalarms.Select(x => x.AlarmId).ToList()));
                }

                var realarms = redis.As<REL_EVENTS_EMAIL_ALARMS>().GetAll().Where(x => x.EventId == dry.Id);
                if (!realarms.NullOrEmpty())
                {
                    dry.Alarms.MergeRange(ealarmrepository
                        .HydrateAll(ealarmrepository.FindAll(realarms.Select(x => x.AlarmId).ToList())));
                }

                //TODO: retrieve IANA and x- properties of events during hydration
            }

            return dry ?? dry;
        }
Esempio n. 8
0
        public void Save(VEVENT entity)
        {
            var keys = redis.As<VEVENT>().GetAllKeys().ToArray();
            var guids = keys.Select(x => new Guid(x));
            if (!keys.NullOrEmpty())
            {
                redis.Watch(keys);
            }

            #region retrieve attributes of event

            var recur = entity.RecurrenceRule;
            var organizer = entity.Organizer;
            var attendees = entity.Attendees;
            var attachbins = entity.Attachments.OfType<ATTACH_BINARY>();
            var attachuris = entity.Attachments.OfType<ATTACH_URI>();
            var contacts = entity.Contacts;
            var comments = entity.Comments;
            var rdates = entity.RecurrenceDates;
            var exdates = entity.ExceptionDates;
            var relatedtos = entity.RelatedTos;
            var resources = entity.Resources;
            var reqstats = entity.RequestStatuses;
            var aalarms = entity.Alarms.OfType<AUDIO_ALARM>();
            var dalarms = entity.Alarms.OfType<DISPLAY_ALARM>();
            var ealarms = entity.Alarms.OfType<EMAIL_ALARM>();

            #endregion retrieve attributes of event

            manager.ExecTrans(transaction =>
            {
                var orrecurs = redis.As<REL_EVENTS_RECURS>().GetAll().Where(x => x.EventId == entity.Id);
                var ororgs = redis.As<REL_EVENTS_ORGANIZERS>().GetAll().Where(x => x.EventId == entity.Id);
                var orattendees = redis.As<REL_EVENTS_ATTENDEES>().GetAll().Where(x => x.EventId == entity.Id);
                var orattachbins = redis.As<REL_EVENTS_ATTACHBINS>().GetAll().Where(x => x.EventId == entity.Id);
                var orattachuris = redis.As<REL_EVENTS_ATTACHURIS>().GetAll().Where(x => x.EventId == entity.Id);
                var orcontacts = redis.As<REL_EVENTS_CONTACTS>().GetAll().Where(x => x.EventId == entity.Id);
                var orcomments = redis.As<REL_EVENTS_COMMENTS>().GetAll().Where(x => x.EventId == entity.Id);
                var orrdates = redis.As<REL_EVENTS_RDATES>().GetAll().Where(x => x.EventId == entity.Id);
                var orexdates = redis.As<REL_EVENTS_EXDATES>().GetAll().Where(x => x.EventId == entity.Id);
                var orrelatedtos = redis.As<REL_EVENTS_RELATEDTOS>().GetAll().Where(x => x.EventId == entity.Id);
                var orresources = redis.As<REL_EVENTS_RESOURCES>().GetAll().Where(x => x.EventId == entity.Id);
                var orreqstats = redis.As<REL_EVENTS_REQSTATS>().GetAll().Where(x => x.EventId == entity.Id);
                var oraalarms = redis.As<REL_EVENTS_AUDIO_ALARMS>().GetAll().Where(x => x.EventId == entity.Id);
                var ordalarms = redis.As<REL_EVENTS_DISPLAY_ALARMS>().GetAll().Where(x => x.EventId == entity.Id);
                var orealarms = redis.As<REL_EVENTS_EMAIL_ALARMS>().GetAll().Where(x => x.EventId == entity.Id);
                if (organizer != null)
                {
                    transaction.QueueCommand(x => x.Store(organizer));
                    var rorganizer = new REL_EVENTS_ORGANIZERS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        OrganizerId = organizer.Id,
                    };

                    redis.MergeAll(rorganizer.ToSingleton(), ororgs, transaction);
                }
                else redis.RemoveAll(ororgs, transaction);

                if (recur != null)
                {
                    transaction.QueueCommand(x => x.Store(recur));
                    var rrecur = new REL_EVENTS_RECURS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        RecurId = recur.Id,
                    };

                    redis.MergeAll(rrecur.ToSingleton(), orrecurs, transaction);
                }
                else redis.RemoveAll(orrecurs, transaction);

                if (!attendees.NullOrEmpty())
                {
                    transaction.QueueCommand(x => x.StoreAll(attendees));
                    var rattendees = attendees.Select(x => new REL_EVENTS_ATTENDEES
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AttendeeId = x.Id,
                    });

                    redis.MergeAll(rattendees, orattendees, transaction);
                }
                else redis.RemoveAll(orattendees, transaction);

                if (!attachbins.NullOrEmpty())
                {
                    transaction.QueueCommand(x => x.StoreAll(attachbins.Distinct()));
                    var rattachbins = attachbins.Select(x => new REL_EVENTS_ATTACHBINS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AttachmentId = x.Id,
                    });

                    redis.MergeAll(rattachbins, orattachbins, transaction);
                }
                else redis.RemoveAll(orattachbins, transaction);

                if (!attachuris.NullOrEmpty())
                {
                    transaction.QueueCommand(x => x.StoreAll(attachuris.Distinct()));
                    var rattachuris = attachuris.Select(x => new REL_EVENTS_ATTACHURIS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AttachmentId = x.Id,
                    });

                    redis.MergeAll(rattachuris, orattachuris, transaction);
                }
                else redis.RemoveAll(orattachuris, transaction);

                if (!contacts.NullOrEmpty())
                {
                    transaction.QueueCommand(x => x.StoreAll(contacts.Distinct()));
                    var rcontacts = contacts.Select(x => new REL_EVENTS_CONTACTS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        ContactId = x.Id,
                    });

                    redis.MergeAll(rcontacts, orcontacts, transaction);
                }
                else redis.RemoveAll(orcontacts, transaction);

                if (!comments.NullOrEmpty())
                {
                    transaction.QueueCommand(x => x.StoreAll(comments.Distinct()));
                    var rcomments = comments.Select(x => new REL_EVENTS_COMMENTS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        CommentId = x.Id,
                    });

                    redis.MergeAll(rcomments, orcomments, transaction);
                }
                else redis.RemoveAll(orcomments, transaction);

                if (!rdates.NullOrEmpty())
                {
                    transaction.QueueCommand(x => x.StoreAll(rdates.Distinct()));
                    var rrdates = rdates.Select(x => new REL_EVENTS_RDATES
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        RecurrenceDateId = x.Id,
                    });
                    redis.MergeAll(rrdates, orrdates, transaction);
                }
                else redis.RemoveAll(orrdates, transaction);

                if (!exdates.NullOrEmpty())
                {
                    transaction.QueueCommand(x => x.StoreAll(exdates.Distinct()));
                    var rexdates = exdates.Select(x => new REL_EVENTS_EXDATES
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        ExceptionDateId = x.Id,
                    });

                    redis.MergeAll(rexdates, orexdates, transaction);
                }
                else redis.RemoveAll(oraalarms, transaction);

                if (!relatedtos.NullOrEmpty())
                {
                    transaction.QueueCommand(x => x.StoreAll(relatedtos.Distinct()));
                    var rrelatedtos = relatedtos.Select(x => new REL_EVENTS_RELATEDTOS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        RelatedToId = x.Id,
                    });
                    redis.MergeAll(rrelatedtos, orrelatedtos, transaction);
                }
                else redis.RemoveAll(oraalarms, transaction);
                if (!resources.NullOrEmpty())
                {
                    transaction.QueueCommand(x => x.StoreAll(resources.Distinct()));
                    var rresources = resources.Select(x => new REL_EVENTS_RESOURCES
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        ResourcesId = x.Id,
                    });
                    redis.MergeAll(rresources, orresources, transaction);
                }
                else redis.RemoveAll(oraalarms, transaction);

                if (!reqstats.NullOrEmpty())
                {
                    transaction.QueueCommand(x => x.StoreAll(reqstats.Distinct()));
                    var rreqstats = reqstats.Select(x => new REL_EVENTS_REQSTATS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        ReqStatsId = x.Id,
                    });
                    redis.MergeAll(rreqstats, orreqstats, transaction);
                }
                else redis.RemoveAll(orreqstats, transaction);

                if (!aalarms.NullOrEmpty())
                {
                    aalarmrepository.SaveAll(aalarms.Distinct());
                    var raalarms = aalarms.Select(x => new REL_EVENTS_AUDIO_ALARMS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AlarmId = x.Id
                    });
                    redis.MergeAll(raalarms, oraalarms, transaction);
                }
                else redis.RemoveAll(oraalarms, transaction);

                if (!dalarms.NullOrEmpty())
                {
                    dalarmrepository.SaveAll(dalarms.Distinct());
                    var rdalarms = dalarms.Select(x => new REL_EVENTS_DISPLAY_ALARMS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AlarmId = x.Id
                    });
                    redis.MergeAll(rdalarms, ordalarms, transaction);
                }
                else redis.RemoveAll(ordalarms, transaction);

                if (!ealarms.NullOrEmpty())
                {
                    ealarmrepository.SaveAll(ealarms.Distinct());
                    var realarms = ealarms.Select(x => new REL_EVENTS_EMAIL_ALARMS
                    {
                        Id = keygenerator.GetNext(),
                        EventId = entity.Id,
                        AlarmId = x.Id
                    });
                    redis.MergeAll(realarms, orealarms, transaction);
                }
                else redis.RemoveAll(orealarms, transaction);

                transaction.QueueCommand(x => x.Store(Dehydrate(entity)));
            });
        }
Esempio n. 9
0
        public void Patch(VEVENT source, IEnumerable<string> fields, IEnumerable<Guid> keys = null)
        {
            #region construct anonymous fields using expression lambdas

            var selection = fields as IList<string> ?? fields.ToList();

            Expression<Func<VEVENT, object>> primitives = x => new
            {
                x.Uid,
                x.Start,
                x.Created,
                x.Description,
                Position = x.GeoPosition,
                x.LastModified,
                x.Location,
                x.Priority,
                x.Sequence,
                x.Status,
                x.Summary,
                x.Transparency,
                x.Url,
                x.End,
                x.Duration,
                x.Categories,
                x.RecurrenceId,
            };

            Expression<Func<VEVENT, object>> relations = x => new
            {
                x.Organizer,
                x.RecurrenceRule,
                x.Attendees,
                x.Attachments,
                x.Contacts,
                x.Comments,
                x.RecurrenceDates,
                x.ExceptionDates,
                x.RelatedTos,
                x.Resources,
                x.RequestStatuses,
                x.Alarms
            };

            //4. Get list of selected relationals
            var srelation = relations.GetMemberNames().Intersect(selection);

            //5. Get list of selected primitives
            var sprimitives = primitives.GetMemberNames().Intersect(selection);

            #endregion construct anonymous fields using expression lambdas

            var eclient = redis.As<VEVENT>();
            if (!keys.NullOrEmpty()) redis.Watch(keys.Select(x => x.ToString()).ToArray());

            var entities = !keys.NullOrEmpty() ? eclient.GetByIds(keys).ToList() : eclient.GetAll().ToList();
            if (entities.NullOrEmpty()) return;

            var okeys = entities.Select(x => x.Id).ToArray();

            if (!srelation.NullOrEmpty())
            {
                Expression<Func<VEVENT, object>> orgexpr = x => x.Organizer;
                Expression<Func<VEVENT, object>> recurexpr = x => x.RecurrenceRule;
                Expression<Func<VEVENT, object>> attendsexpr = y => y.Attendees;
                Expression<Func<VEVENT, object>> attachsexpr = y => y.Attachments;
                Expression<Func<VEVENT, object>> contactsexpr = y => y.Contacts;
                Expression<Func<VEVENT, object>> commentsexpr = y => y.Comments;
                Expression<Func<VEVENT, object>> rdatesexpr = y => y.RecurrenceDates;
                Expression<Func<VEVENT, object>> exdatesexpr = y => y.ExceptionDates;
                Expression<Func<VEVENT, object>> relatedtosexpr = y => y.RelatedTos;
                Expression<Func<VEVENT, object>> resourcesexpr = y => y.Resources;
                Expression<Func<VEVENT, object>> reqstatsexpr = y => y.RequestStatuses;
                Expression<Func<VEVENT, object>> alarmexpr = y => y.Alarms;

                manager.ExecTrans(transaction =>
                {
                    #region save relational aggregate attributes of entities

                    var ororgs = redis.As<REL_EVENTS_ORGANIZERS>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orrecurs = redis.As<REL_EVENTS_RECURS>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orattendees = redis.As<REL_EVENTS_ATTENDEES>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orattachbins = redis.As<REL_EVENTS_ATTACHBINS>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orattachuris = redis.As<REL_EVENTS_ATTACHURIS>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orcontacts = redis.As<REL_EVENTS_CONTACTS>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orcomments = redis.As<REL_EVENTS_COMMENTS>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orrdates = redis.As<REL_EVENTS_RDATES>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orexdates = redis.As<REL_EVENTS_EXDATES>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orrelatedtos = redis.As<REL_EVENTS_RELATEDTOS>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orresources = redis.As<REL_EVENTS_RESOURCES>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orreqstats = redis.As<REL_EVENTS_REQSTATS>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var oraalarms = redis.As<REL_EVENTS_AUDIO_ALARMS>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var ordalarms = redis.As<REL_EVENTS_DISPLAY_ALARMS>().GetAll().Where(x => okeys.Contains(x.EventId));
                    var orealarms = redis.As<REL_EVENTS_EMAIL_ALARMS>().GetAll().Where(x => okeys.Contains(x.EventId));

                    if (selection.Contains(orgexpr.GetMemberName()))
                    {
                        if (source.Organizer != null)
                        {
                            var rorgs = okeys.Select(x => new REL_EVENTS_ORGANIZERS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                OrganizerId = source.Organizer.Id
                            });

                            redis.MergeAll(rorgs, ororgs, transaction);
                            transaction.QueueCommand(x => x.Store(source.Organizer));
                        }
                        else redis.RemoveAll(ororgs, transaction);
                    }

                    if (selection.Contains(recurexpr.GetMemberName()))
                    {
                        if (source.RecurrenceRule != null)
                        {
                            var rrecurs = okeys.Select(x => new REL_EVENTS_RECURS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                RecurId = source.RecurrenceRule.Id
                            });

                            redis.MergeAll(rrecurs, orrecurs, transaction);
                            transaction.QueueCommand(x => x.Store(source.RecurrenceRule));
                        }
                        else redis.RemoveAll(orrecurs, transaction);
                    }

                    if (selection.Contains(attendsexpr.GetMemberName()))
                    {
                        var attendees = source.Attendees;

                        if (!attendees.NullOrEmpty())
                        {
                            var rattendees = okeys.SelectMany(x => attendees.Select(y => new REL_EVENTS_ATTENDEES
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AttendeeId = y.Id
                            }));

                            redis.MergeAll(rattendees, orattendees, transaction);
                            transaction.QueueCommand(x => x.StoreAll(attendees.Distinct()));
                        }
                        else redis.RemoveAll(orattendees, transaction);
                    }

                    if (selection.Contains(attachsexpr.GetMemberName()))
                    {
                        var attachbins = source.Attachments.OfType<ATTACH_BINARY>();
                        if (attachbins.Any())
                        {
                            transaction.QueueCommand(x => x.StoreAll(attachbins));
                            var rattachbins = okeys.SelectMany(x => attachbins.Select(y => new REL_EVENTS_ATTACHBINS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AttachmentId = y.Id
                            }));

                            redis.MergeAll(rattachbins, orattachbins, transaction);
                        }
                        else redis.RemoveAll(orattachbins, transaction);

                        var attachuris = source.Attachments.OfType<ATTACH_URI>();
                        if (!attachuris.NullOrEmpty())
                        {
                            transaction.QueueCommand(x => x.StoreAll(attachuris));
                            var rattachuris = okeys.SelectMany(x => attachuris.Select(y => new REL_EVENTS_ATTACHURIS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AttachmentId = y.Id
                            }));
                            redis.MergeAll(rattachuris, orattachuris, transaction);
                        }
                        else redis.RemoveAll(orattachuris, transaction);
                    }

                    if (selection.Contains(contactsexpr.GetMemberName()))
                    {
                        var contacts = source.Contacts;
                        if (!contacts.NullOrEmpty())
                        {
                            transaction.QueueCommand(x => x.StoreAll(contacts.Distinct()));
                            var rcontacts = okeys.SelectMany(x => contacts.Select(y => new REL_EVENTS_CONTACTS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                ContactId = y.Id
                            }));
                            redis.MergeAll(rcontacts, orcontacts, transaction);
                        }
                        else redis.RemoveAll(orcontacts, transaction);
                    }

                    if (selection.Contains(commentsexpr.GetMemberName()))
                    {
                        var comments = source.Contacts;
                        if (!comments.NullOrEmpty())
                        {
                            transaction.QueueCommand(x => x.StoreAll(comments.Distinct()));
                            var rcomments = okeys.SelectMany(x => comments.Select(y => new REL_EVENTS_COMMENTS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                CommentId = y.Id
                            }));
                            redis.MergeAll(rcomments, orcomments, transaction);
                        }
                        else redis.RemoveAll(orcomments, transaction);
                    }

                    if (selection.Contains(rdatesexpr.GetMemberName()))
                    {
                        var rdates = source.Contacts;
                        if (!rdates.NullOrEmpty())
                        {
                            transaction.QueueCommand(x => x.StoreAll(rdates.Distinct()));
                            var rrdates = okeys.SelectMany(x => rdates.Select(y => new REL_EVENTS_RDATES
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                RecurrenceDateId = y.Id
                            }));
                            redis.MergeAll(rrdates, orrdates, transaction);
                        }
                        else redis.RemoveAll(orrdates, transaction);
                    }

                    if (selection.Contains(exdatesexpr.GetMemberName()))
                    {
                        var exdates = source.ExceptionDates;
                        if (!exdates.NullOrEmpty())
                        {
                            transaction.QueueCommand(x => x.StoreAll(exdates.Distinct()));
                            var rexdates = okeys.SelectMany(x => exdates.Select(y => new REL_EVENTS_EXDATES
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                ExceptionDateId = y.Id
                            }));
                            redis.MergeAll(rexdates, orexdates, transaction);
                        }
                        else redis.RemoveAll(orexdates, transaction);
                    }

                    if (selection.Contains(relatedtosexpr.GetMemberName()))
                    {
                        var relatedtos = source.RelatedTos;
                        if (!relatedtos.NullOrEmpty())
                        {
                            transaction.QueueCommand(x => x.StoreAll(relatedtos.Distinct()));
                            var rrelatedtos = okeys.SelectMany(x => relatedtos.Select(y => new REL_EVENTS_RELATEDTOS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                RelatedToId = y.Id
                            }));

                            redis.MergeAll(rrelatedtos, orrelatedtos, transaction);
                        }
                        else redis.RemoveAll(orrelatedtos, transaction);
                    }

                    if (selection.Contains(resourcesexpr.GetMemberName()))
                    {
                        var resources = source.Resources;
                        if (!resources.NullOrEmpty())
                        {
                            transaction.QueueCommand(x => x.StoreAll(resources.Distinct()));
                            var rresources = okeys.SelectMany(x => resources.Select(y => new REL_EVENTS_RESOURCES
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                ResourcesId = y.Id
                            }));
                            redis.MergeAll(rresources, orresources, transaction);
                        }
                        else redis.RemoveAll(orresources, transaction);
                    }

                    if (selection.Contains(reqstatsexpr.GetMemberName()))
                    {
                        var reqstats = source.RequestStatuses;
                        if (!reqstats.NullOrEmpty())
                        {
                            transaction.QueueCommand(x => x.StoreAll(reqstats.Distinct()));
                            var rreqstats = okeys.SelectMany(x => reqstats.Select(y => new REL_EVENTS_REQSTATS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                ReqStatsId = y.Id
                            }));

                            redis.MergeAll(rreqstats, orreqstats, transaction);
                        }
                        else redis.RemoveAll(orreqstats, transaction);
                    }
                    if (selection.Contains(alarmexpr.GetMemberName()))
                    {
                        var aalarms = source.Alarms.OfType<AUDIO_ALARM>();
                        if (aalarms.Any())
                        {
                            aalarmrepository.SaveAll(aalarms);
                            var raalarms = okeys.SelectMany(x => aalarms.Select(y => new REL_EVENTS_AUDIO_ALARMS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AlarmId = y.Id
                            }));
                            redis.MergeAll(raalarms, oraalarms, transaction);
                        }
                        else redis.RemoveAll(orealarms, transaction);

                        var dalarms = source.Alarms.OfType<DISPLAY_ALARM>();
                        if (dalarms.Any())
                        {
                            dalarmrepository.SaveAll(dalarms);
                            var rdalarms = okeys.SelectMany(x => dalarms.Select(y => new REL_EVENTS_DISPLAY_ALARMS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AlarmId = y.Id
                            }));
                            redis.MergeAll(rdalarms, ordalarms, transaction);
                        }
                        else redis.RemoveAll(ordalarms, transaction);

                        var ealarms = source.Alarms.OfType<EMAIL_ALARM>();
                        if (ealarms.Any())
                        {
                            ealarmrepository.SaveAll(ealarms);
                            var realarms = okeys.SelectMany(x => ealarms.Select(y => new REL_EVENTS_EMAIL_ALARMS
                            {
                                Id = keygenerator.GetNext(),
                                EventId = x,
                                AlarmId = y.Id
                            }));
                            redis.MergeAll(realarms, orealarms, transaction);
                        }
                        else redis.RemoveAll(orealarms, transaction);
                    }

                    #endregion save relational aggregate attributes of entities
                });
            }

            #region save (insert or update non-relational attributes

            if (!sprimitives.NullOrEmpty())
            {
                Expression<Func<VEVENT, object>> startexpr = x => x.Start;
                Expression<Func<VEVENT, object>> classexpr = x => x.Classification;
                Expression<Func<VEVENT, object>> descexpr = x => x.Description;
                Expression<Func<VEVENT, object>> posexpr = x => x.GeoPosition;
                Expression<Func<VEVENT, object>> locexpr = x => x.Location;
                Expression<Func<VEVENT, object>> priexpr = x => x.Priority;
                Expression<Func<VEVENT, object>> seqexpr = x => x.Sequence;
                Expression<Func<VEVENT, object>> statexpr = x => x.Status;
                Expression<Func<VEVENT, object>> summexpr = x => x.Summary;
                Expression<Func<VEVENT, object>> transpexpr = x => x.Transparency;
                Expression<Func<VEVENT, object>> urlexpr = x => x.Url;
                Expression<Func<VEVENT, object>> rridexpr = x => x.RecurrenceId;
                Expression<Func<VEVENT, object>> endexpr = x => x.End;
                Expression<Func<VEVENT, object>> durexpr = x => x.Duration;
                Expression<Func<VEVENT, object>> catexpr = x => x.Categories;

                entities.ForEach(x =>
                {
                    if (selection.Contains(startexpr.GetMemberName())) x.Start = source.Start;
                    if (selection.Contains(classexpr.GetMemberName())) x.Classification = source.Classification;
                    if (selection.Contains(descexpr.GetMemberName())) x.Description = source.Description;
                    if (selection.Contains(posexpr.GetMemberName())) x.GeoPosition = source.GeoPosition;
                    if (selection.Contains(locexpr.GetMemberName())) x.Location = source.Location;
                    if (selection.Contains(priexpr.GetMemberName())) x.Priority = source.Priority;
                    if (selection.Contains(seqexpr.GetMemberName())) x.Sequence = source.Sequence;
                    if (selection.Contains(statexpr.GetMemberName())) x.Status = source.Status;
                    if (selection.Contains(summexpr.GetMemberName())) x.Summary = source.Summary;
                    if (selection.Contains(transpexpr.GetMemberName())) x.Transparency = source.Transparency;
                    if (selection.Contains(urlexpr.GetMemberName())) x.Url = source.Url;
                    if (selection.Contains(rridexpr.GetMemberName())) x.RecurrenceId = source.RecurrenceId;
                    if (selection.Contains(endexpr.GetMemberName())) x.End = source.End;
                    if (selection.Contains(durexpr.GetMemberName())) x.Duration = source.Duration;
                    if (selection.Contains(catexpr.GetMemberName())) x.Categories = source.Categories;
                });

                manager.ExecTrans(transaction =>
                {
                    transaction.QueueCommand(x => x.StoreAll(DehydrateAll(entities)));
                });
            }

            #endregion save (insert or update non-relational attributes
        }
Esempio n. 10
0
        public static List<VEVENT> GetNextOccurences(this IList<VEVENT> vevents, IKeyGenerator<Guid> keyGenerator, uint window = 6)
        {
            if (vevents.NullOrEmpty()) return vevents.ToList();

            var first = vevents.First();
            var last = vevents.Last();

            var copy = new VEVENT(first)
            {
                Start = last.Start,
                End = last.End
            };

            return copy.GenerateOccurrences(keyGenerator, window);
        }
Esempio n. 11
0
        public static List<VEVENT> GenerateOccurrences(this VEVENT vevent, IKeyGenerator<Guid> keyGenerator, uint window = 6)
        {
            if (keyGenerator == null) throw new ArgumentNullException(nameof(keyGenerator));

            var occurrences = new List<VEVENT> { vevent };
            var dates = vevent.RecurrenceRule.GenerateRecurrences(vevent.Start, window).ToList();
            if (vevent.RecurrenceDates.Any())
            {
                var recurrentDates = vevent
                    .RecurrenceDates
                    .Where(x => x.DateTimes.Any())
                    .SelectMany(x => x.DateTimes);

                var recurrentPeriods = vevent
                    .RecurrenceDates
                    .Where(x => x.Periods.Any())
                    .SelectMany(x => x.Periods);

                var recurrentDatesList = recurrentDates as IList<DATE_TIME> ?? recurrentDates.ToList();
                if (recurrentDatesList.Any())
                {
                    dates.AddRange(recurrentDatesList);
                }

                var recurrentPeriodsList = recurrentPeriods as IList<PERIOD> ?? recurrentPeriods.ToList();
                if (recurrentPeriodsList.Any())
                {
                    dates.AddRange(recurrentPeriodsList.Select(x => x.Start));
                }
            }

            if (vevent.ExceptionDates.Any())
            {
                var exdates = vevent
                    .ExceptionDates
                    .Where(x => x.DateTimes.Any())
                    .SelectMany(x => x.DateTimes);

                var exceptionDatesList = exdates as IList<DATE_TIME> ?? exdates.ToList();
                if (exceptionDatesList.Any())
                    dates = dates.Except(exceptionDatesList).ToList();
            }

            foreach (var date in dates.Except(vevent.Start.ToSingleton()))
            {
                var now = DateTime.UtcNow.AsDATE_TIME();
                var instance = new VEVENT(vevent)
                {
                    Id = keyGenerator.GetNext(),
                    Created = now,
                    Datestamp = now,
                    LastModified = now,
                    Start = date,
                    End = date + vevent.Duration,
                    RecurrenceRule = null
                };

                instance.RecurrenceId = new RECURRENCE_ID
                {
                    Id = instance.Id,
                    Range = RANGE.THISANDFUTURE,
                    TimeZoneId = date.TimeZoneId,
                    Value = instance.Start
                };
                occurrences.Add(instance);
            }

            return occurrences;
        }